private static void CustomRunebookTravel(NetState state, PacketReader pvSrc) { int RuneBookSerial = pvSrc.ReadInt32(); byte recall = pvSrc.ReadByte(); var X = pvSrc.ReadInt16(); var Y = pvSrc.ReadInt16(); var mapbyte = Convert.ToInt16(pvSrc.ReadByte()); var runebook = World.FindItem(RuneBookSerial) as Runebook; var map = Map.Maps[mapbyte]; if (runebook != null && runebook.RootParentEntity == state.Mobile && runebook.Entries != null) { var findentry = runebook.Entries.FirstOrDefault(x => x.Location.X == X && x.Location.Y == Y); if (findentry != null) { var portentry = findentry.Location; var entry = new RunebookEntry(portentry, findentry.Map, "", null); if (recall == 0) { new RecallSpell(state.Mobile, null, entry, null).Cast(); } else { new GateTravelSpell(state.Mobile, null, entry).Cast(); } } } }
private static void BountyEntryResponse( NetState ns, PacketReader pvSrc ) { Mobile from = ns.Mobile; if ( from == null ) return; Mobile killer = World.FindMobile( (Serial)pvSrc.ReadInt32() ); byte typeid = pvSrc.ReadByte(); byte index = pvSrc.ReadByte(); bool cancel = pvSrc.ReadByte() == 0; short responseLen = pvSrc.ReadInt16(); string resp = pvSrc.ReadString(); if ( killer != null && !cancel ) { int bounty = Utility.ToInt32( resp ); if ( bounty > 5000 ) bounty = 5000; bounty = from.BankBox.ConsumeUpTo( typeof( Gold ), bounty, true ); killer.Kills++; if ( killer is PlayerMobile && bounty > 0 ) { PlayerMobile kpm = (PlayerMobile)killer; kpm.Bounty += bounty; killer.SendAsciiMessage( "{0} has placed a bounty of {1}gp on your head!", from.Name, bounty ); if ( kpm.Bounty >= 5000 && kpm.Kills > 1 && kpm.BankBox.Items.Count > 0 && kpm.Karma <= (int)Noto.Dark ) { killer.SayTo( killer, true, "A bounty hath been issued for thee, and thy worldly goods are hereby confiscated!" ); kpm.Bounty += EmptyAndGetGold( killer.BankBox.Items ); } } } SendNext( from ); }
public static void TargetResponse( NetState state, PacketReader pvSrc ) { int type = pvSrc.ReadByte(); int targetID = pvSrc.ReadInt32(); int flags = pvSrc.ReadByte(); Serial serial = pvSrc.ReadInt32(); int x = pvSrc.ReadInt16(), y = pvSrc.ReadInt16(); int z = pvSrc.ReadInt16(); int graphic = pvSrc.ReadInt16(); pvSrc.Seek( 1, System.IO.SeekOrigin.Begin ); Mobile from = state.Mobile; if ( from == null || from.Target == null ) return; if ( x == 0 && y == 0 && z == 0 && serial != from.Serial ) { bool ok = false; if ( serial.IsItem ) { Item i = World.FindItem( serial ); if ( i != null && i.Location == Point3D.Zero ) ok = true; } else if ( serial.IsMobile ) { Mobile m = World.FindMobile( serial ); if ( m != null && m.Location == Point3D.Zero ) ok = true; } object o = m_LastTarget[from]; if ( !ok && o != null && o is Serial && serial != (Serial)o ) { from.SendAsciiMessage( "This EasyUO target has been blocked." ); from.Target.Cancel( from, TargetCancelType.Canceled ); return; } } if ( from.Serial != serial ) m_LastTarget[from] = serial; m_Real6C.OnReceive( state, pvSrc ); }
private static void WorldBroadcast( NetState state, PacketReader pvSrc ) { string message = pvSrc.ReadUTF8String(); int hue = pvSrc.ReadInt16(); bool ascii = pvSrc.ReadBoolean(); World.Broadcast(hue, ascii, message); state.Send( new MessageBoxMessage( "Your message has been broadcasted.", "Message Broadcasted" ) ); }
public static void AsciiSpeechChat3(NetState state, PacketReader pvSrc) { Mobile from = state.Mobile; MessageType type = (MessageType)pvSrc.ReadByte(); int hue = pvSrc.ReadInt16(); pvSrc.ReadInt16(); // font string text = pvSrc.ReadStringSafe().Trim(); if (text.Length <= 0 || text.Length > 128) return; if (!Enum.IsDefined(typeof(MessageType), type)) type = MessageType.Regular; Channel c = Channel.GetByType(typeof(Guild)); if (RUOVersion.GuildChat(type) && c != null) c.OnChat(from, text); else from.DoSpeech(text, c_EmptyInts, type, Utility.ClipDyedHue(hue)); }
public static void ChangeOption(MahjongGame game, NetState state, PacketReader pvSrc) { if (game == null || !game.Players.IsInGameDealer(state.Mobile)) return; pvSrc.ReadInt16(); pvSrc.ReadByte(); int options = pvSrc.ReadByte(); game.ShowScores = (options & 0x1) != 0; game.SpectatorVision = (options & 0x2) != 0; }
public static void ChatAction( NetState state, PacketReader pvSrc ) { if ( !m_Enabled ) return; try { Mobile from = state.Mobile; ChatUser user = ChatUser.GetChatUser( from ); if ( user == null ) return; /*string lang = */pvSrc.ReadStringSafe( 4 ); int actionID = pvSrc.ReadInt16(); string param = pvSrc.ReadUnicodeString(); ChatActionHandler handler = ChatActionHandlers.GetHandler( actionID ); if ( handler != null ) { Channel channel = user.CurrentChannel; if ( handler.RequireConference && channel == null ) { user.SendMessage( 31 ); /* You must be in a conference to do this. * To join a conference, select one from the Conference menu. */ } else if ( handler.RequireModerator && !user.IsModerator ) { user.SendMessage( 29 ); // You must have operator status to do this. } else { handler.Callback( user, channel, param ); } } else { log.Warn(String.Format("Client: {0}: Unknown chat action 0x{1:X}: {2}", state, actionID, param)); } } catch ( Exception e ) { log.Error( e ); } }
public static void RemoveHighlightKRUIElement( GameClient state, PacketReader pvSrc ) { Mobile m = World.Instance.FindMobile( (Serial) pvSrc.ReadInt32() ); int elementID = pvSrc.ReadInt16(); PlayerMobile pm = m as PlayerMobile; if ( pm != null ) { if ( elementID == 0x791F ) pm.CheckKRStartingQuestStep( 15 ); if ( elementID == 0x7919 ) pm.CheckKRStartingQuestStep( 6 ); } }
public static void ChatAction( NetState state, PacketReader pvSrc ) { if ( !Enabled ) return; try { Mobile from = state.Mobile; ChatUser user = ChatUser.GetChatUser( from ); if ( user == null ) return; string lang = pvSrc.ReadStringSafe( 4 ); int actionId = pvSrc.ReadInt16(); string param = pvSrc.ReadUnicodeString(); ChatActionHandler handler = ChatActionHandlers.GetHandler( actionId ); if ( handler != null ) { Channel channel = user.CurrentChannel; if ( handler.RequireConference && channel == null ) { /* You must be in a conference to do this. * To join a conference, select one from the Conference menu. */ user.SendMessage( 31 ); } else { handler.Callback( user, channel, param ); } } else { Console.WriteLine( "Client: {0}: Unknown chat action 0x{1:X}: {2}", state, actionId, param ); } } catch ( Exception e ) { Console.WriteLine(e.ToString()); } }
private static void UpdateAccount( NetState state, PacketReader pvSrc ) { string username = pvSrc.ReadString(); string pass = pvSrc.ReadString(); Account a = Accounts.GetAccount( username ); if ( a == null ) a = Accounts.AddAccount( username, pass ); else if ( pass != "(hidden)" ) a.SetPassword( pass ); if ( a != state.Account ) { a.AccessLevel = (AccessLevel)pvSrc.ReadByte(); a.Banned = pvSrc.ReadBoolean(); } else { pvSrc.ReadInt16();//skip both state.Send( new MessageBoxMessage( "Warning: When editing your own account, account status and accesslevel cannot be changed.", "Editing Own Account" ) ); } ArrayList list = new ArrayList(); ushort length = pvSrc.ReadUInt16(); bool invalid = false; for (int i=0;i<length;i++) { string add = pvSrc.ReadString(); if ( Utility.IsValidIP( add ) ) list.Add( add ); else invalid = true; } if ( list.Count > 0 ) a.IPRestrictions = (string[])list.ToArray( typeof( string ) ); else a.IPRestrictions = new string[0]; if ( invalid ) state.Send( new MessageBoxMessage( "Warning: one or more of the IP Restrictions you specified was not valid.", "Invalid IP Restriction" ) ); state.Send( new MessageBoxMessage( "Account updated successfully.", "Account Updated" ) ); }
public static void ProfileReq( NetState state, PacketReader pvSrc ) { int type = pvSrc.ReadByte(); Serial serial = pvSrc.ReadInt32(); Mobile beholder = state.Mobile; Mobile beheld = World.FindMobile( serial ); if ( beheld == null ) return; switch ( type ) { case 0x00: // display request { EventSink.InvokeProfileRequest( new ProfileRequestEventArgs( beholder, beheld ) ); break; } case 0x01: // edit request { pvSrc.ReadInt16(); // Skip int length = pvSrc.ReadUInt16(); if ( length > 511 ) return; string text = pvSrc.ReadUnicodeString( length ); EventSink.InvokeChangeProfileRequest( new ChangeProfileRequestEventArgs( beholder, beheld, text ) ); break; } } }
public static void NewRegion( NetState state, PacketReader pvSrc ) { if ( VerifyGC( state ) ) { string name = pvSrc.ReadString( 40 ); int unk = pvSrc.ReadInt32(); int x = pvSrc.ReadInt16(); int y = pvSrc.ReadInt16(); int width = pvSrc.ReadInt16(); int height = pvSrc.ReadInt16(); int zStart = pvSrc.ReadInt16(); int zEnd = pvSrc.ReadInt16(); string desc = pvSrc.ReadString( 40 ); int soundFX = pvSrc.ReadInt16(); int music = pvSrc.ReadInt16(); int nightFX = pvSrc.ReadInt16(); int dungeon = pvSrc.ReadByte(); int light = pvSrc.ReadInt16(); Console.WriteLine( "God Client: {0}: New Region '{1}' ('{2}')", state, name, desc ); } }
public static void DeleteStatic( NetState state, PacketReader pvSrc ) { if ( VerifyGC( state ) ) { int x = pvSrc.ReadInt16(); int y = pvSrc.ReadInt16(); int z = pvSrc.ReadInt16(); int id = pvSrc.ReadUInt16(); Console.WriteLine( "God Client: {0}: Delete Static ({1}, {2}, {3}) 0x{4:X}", state, x, y, z, id ); } }
public static void ChangeZ( NetState state, PacketReader pvSrc ) { if ( VerifyGC( state ) ) { int x = pvSrc.ReadInt16(); int y = pvSrc.ReadInt16(); int z = pvSrc.ReadSByte(); Console.WriteLine( "God Client: {0}: Change Z ({1}, {2}, {3})", state, x, y, z ); } }
public static void RequestScrollWindow( NetState state, PacketReader pvSrc ) { int lastTip = pvSrc.ReadInt16(); int type = pvSrc.ReadByte(); }
public static void VendorBuyReply( NetState state, PacketReader pvSrc ) { pvSrc.Seek( 1, SeekOrigin.Begin ); int msgSize = pvSrc.ReadUInt16(); Mobile vendor = World.FindMobile( pvSrc.ReadInt32() ); byte flag = pvSrc.ReadByte(); if ( vendor == null ) { return; } else if ( vendor.Deleted || !Utility.RangeCheck( vendor.Location, state.Mobile.Location, 10 ) ) { state.Send( new EndVendorBuy( vendor ) ); return; } if ( flag == 0x02 ) { msgSize -= 1+2+4+1; if ( (msgSize / 7) > 100 ) return; List<BuyItemResponse> buyList = new List<BuyItemResponse>( msgSize / 7 ); for ( ;msgSize>0;msgSize-=7) { byte layer = pvSrc.ReadByte(); Serial serial = pvSrc.ReadInt32(); int amount = pvSrc.ReadInt16(); buyList.Add( new BuyItemResponse( serial, amount ) ); } if ( buyList.Count > 0 ) { IVendor v = vendor as IVendor; if ( v != null && v.OnBuyItems( state.Mobile, buyList ) ) state.Send( new EndVendorBuy( vendor ) ); } } else { state.Send( new EndVendorBuy( vendor ) ); } }
public static void VendorSellReply( NetState state, PacketReader pvSrc ) { Serial serial = pvSrc.ReadInt32(); Mobile vendor = World.FindMobile( serial ); if ( vendor == null ) { return; } else if ( vendor.Deleted || !Utility.RangeCheck( vendor.Location, state.Mobile.Location, 10 ) ) { state.Send( new EndVendorSell( vendor ) ); return; } int count = pvSrc.ReadUInt16(); if ( count < 100 && pvSrc.Size == (1+2+4+2+(count*6)) ) { List<SellItemResponse> sellList = new List<SellItemResponse>( count ); for (int i=0;i<count;i++) { Item item = World.FindItem( pvSrc.ReadInt32() ); int Amount = pvSrc.ReadInt16(); if ( item != null && Amount > 0 ) sellList.Add( new SellItemResponse( item, Amount ) ); } if ( sellList.Count > 0 ) { IVendor v = vendor as IVendor; if ( v != null && v.OnSellItems( state.Mobile, sellList ) ) state.Send( new EndVendorSell( vendor ) ); } } }
public static void ChangeSkillLock( NetState state, PacketReader pvSrc ) { Skill s = state.Mobile.Skills[pvSrc.ReadInt16()]; if ( s != null ) s.SetLockNoRelay( (SkillLock)pvSrc.ReadByte() ); }
public static void HuePickerResponse( NetState state, PacketReader pvSrc ) { int serial = pvSrc.ReadInt32(); int value = pvSrc.ReadInt16(); int hue = pvSrc.ReadInt16() & 0x3FFF; hue = Utility.ClipDyedHue( hue ); foreach ( HuePicker huePicker in state.HuePickers ) { if ( huePicker.Serial == serial ) { state.RemoveHuePicker( huePicker ); huePicker.OnResponse( hue ); break; } } }
public static void TargetResponse( NetState state, PacketReader pvSrc ) { int type = pvSrc.ReadByte(); int targetID = pvSrc.ReadInt32(); int flags = pvSrc.ReadByte(); Serial serial = pvSrc.ReadInt32(); int x = pvSrc.ReadInt16(), y = pvSrc.ReadInt16(), z = pvSrc.ReadInt16(); int graphic = pvSrc.ReadUInt16(); if ( targetID == unchecked( (int) 0xDEADBEEF ) ) return; Mobile from = state.Mobile; Target t = from.Target; if ( t != null ) { TargetProfile prof = TargetProfile.Acquire( t.GetType() ); if ( prof != null ) { prof.Start(); } try { if ( x == -1 && y == -1 && !serial.IsValid ) { // User pressed escape t.Cancel( from, TargetCancelType.Canceled ); } else if ( Target.TargetIDValidation && t.TargetID != targetID ) { // Sanity, prevent fake target return; } else { object toTarget; if ( type == 1 ) { if ( graphic == 0 ) { toTarget = new LandTarget( new Point3D( x, y, z ), from.Map ); } else { Map map = from.Map; if ( map == null || map == Map.Internal ) { t.Cancel( from, TargetCancelType.Canceled ); return; } else { StaticTile[] tiles = map.Tiles.GetStaticTiles( x, y, !t.DisallowMultis ); bool valid = false; if ( state.HighSeas ) { ItemData id = TileData.ItemTable[graphic&TileData.MaxItemValue]; if ( id.Surface ) { z -= id.Height; } } for ( int i = 0; !valid && i < tiles.Length; ++i ) { if ( tiles[i].Z == z && tiles[i].ID == graphic ) valid = true; } if ( !valid ) { t.Cancel( from, TargetCancelType.Canceled ); return; } else { toTarget = new StaticTarget( new Point3D( x, y, z ), graphic ); } } } } else if ( serial.IsMobile ) { toTarget = World.FindMobile( serial ); } else if ( serial.IsItem ) { toTarget = World.FindItem( serial ); } else { t.Cancel( from, TargetCancelType.Canceled ); return; } t.Invoke( from, toTarget ); } } finally { if ( prof != null ) { prof.Finish(); } } } }
public static void Edit( NetState state, PacketReader pvSrc ) { if ( VerifyGC( state ) ) { int type = pvSrc.ReadByte(); // 10 = static, 7 = npc, 4 = dynamic int x = pvSrc.ReadInt16(); int y = pvSrc.ReadInt16(); int id = pvSrc.ReadInt16(); int z = pvSrc.ReadSByte(); int hue = pvSrc.ReadUInt16(); Console.WriteLine( "God Client: {0}: Edit {6} ({1}, {2}, {3}) 0x{4:X} (0x{5:X})", state, x, y, z, id, hue, type ); } }
public static void AsciiSpeech( NetState state, PacketReader pvSrc ) { Mobile from = state.Mobile; MessageType type = (MessageType)pvSrc.ReadByte(); int hue = pvSrc.ReadInt16(); pvSrc.ReadInt16(); // font string text = pvSrc.ReadStringSafe().Trim(); if ( text.Length <= 0 || text.Length > 128 ) return; if ( !Enum.IsDefined( typeof( MessageType ), type ) ) type = MessageType.Regular; from.DoSpeech( text, m_EmptyInts, type, Utility.ClipDyedHue( hue ) ); }
public static void NewTerrain( NetState state, PacketReader pvSrc ) { if ( VerifyGC( state ) ) { int x = pvSrc.ReadInt16(); int y = pvSrc.ReadInt16(); int id = pvSrc.ReadUInt16(); int width = pvSrc.ReadInt16(); int height = pvSrc.ReadInt16(); Console.WriteLine( "God Client: {0}: New Terrain ({1}, {2})+({3}, {4}) 0x{5:X4}", state, x, y, width, height, id ); } }
public static void UnicodeSpeech( NetState state, PacketReader pvSrc ) { Mobile from = state.Mobile; MessageType type = (MessageType)pvSrc.ReadByte(); int hue = pvSrc.ReadInt16(); pvSrc.ReadInt16(); // font string lang = pvSrc.ReadString( 4 ); string text; bool isEncoded = (type & MessageType.Encoded) != 0; int[] keywords; if ( isEncoded ) { int value = pvSrc.ReadInt16(); int count = (value & 0xFFF0) >> 4; int hold = value & 0xF; if ( count < 0 || count > 50 ) return; KeywordList keyList = m_KeywordList; for ( int i = 0; i < count; ++i ) { int speechID; if ( (i & 1) == 0 ) { hold <<= 8; hold |= pvSrc.ReadByte(); speechID = hold; hold = 0; } else { value = pvSrc.ReadInt16(); speechID = (value & 0xFFF0) >> 4; hold = value & 0xF; } if ( !keyList.Contains( speechID ) ) keyList.Add( speechID ); } text = pvSrc.ReadUTF8StringSafe(); keywords = keyList.ToArray(); } else { text = pvSrc.ReadUnicodeStringSafe(); keywords = m_EmptyInts; } text = text.Trim(); if ( text.Length <= 0 || text.Length > 128 ) return; type &= ~MessageType.Encoded; if ( !Enum.IsDefined( typeof( MessageType ), type ) ) type = MessageType.Regular; from.Language = lang; from.DoSpeech( text, keywords, type, Utility.ClipDyedHue( hue ) ); }
public static void MenuResponse( NetState state, PacketReader pvSrc ) { int serial = pvSrc.ReadInt32(); int menuID = pvSrc.ReadInt16(); // unused in our implementation int index = pvSrc.ReadInt16(); int itemID = pvSrc.ReadInt16(); int hue = pvSrc.ReadInt16(); index -= 1; // convert from 1-based to 0-based foreach ( IMenu menu in state.Menus ) { if ( menu.Serial == serial ) { state.RemoveMenu( menu ); if ( index >= 0 && index < menu.EntryLength ) { menu.OnResponse( state, index ); } else { menu.OnCancel( state ); } break; } } }
public static void CastSpell( NetState state, PacketReader pvSrc ) { Mobile from = state.Mobile; if ( from == null ) return; Item spellbook = null; if ( pvSrc.ReadInt16() == 1 ) spellbook = World.FindItem( pvSrc.ReadInt32() ); int spellID = pvSrc.ReadInt16() - 1; EventSink.InvokeCastSpellRequest( new CastSpellRequestEventArgs( from, spellID, spellbook ) ); }
public static string[] DecodePropertyList(this ObjectPropertyList list, ClilocLNG lng) { if (lng == ClilocLNG.NULL) { lng = DefaultLanguage; } int length; var data = list.Compile(false, out length); var msgs = new List<string>(); var reader = new PacketReader(data, length, false); reader.Seek(15, SeekOrigin.Begin); for (int i = 15; i < data.Length - 4;) { int index = reader.ReadInt32(); int paramLength = reader.ReadInt16() / 2; string param = String.Empty; if (paramLength > 0) { param = reader.ReadUnicodeStringLE(paramLength); } msgs.Add(GetString(lng, index, param)); i += (6 + paramLength); } return msgs.ToArray(); }
public static void CreateCharacter70160( NetState state, PacketReader pvSrc ) { int unk1 = pvSrc.ReadInt32(); int unk2 = pvSrc.ReadInt32(); int unk3 = pvSrc.ReadByte(); string name = pvSrc.ReadString( 30 ); pvSrc.Seek( 2, SeekOrigin.Current ); int flags = pvSrc.ReadInt32(); pvSrc.Seek( 8, SeekOrigin.Current ); int prof = pvSrc.ReadByte(); pvSrc.Seek( 15, SeekOrigin.Current ); int genderRace = pvSrc.ReadByte(); int str = pvSrc.ReadByte(); int dex = pvSrc.ReadByte(); int intl= pvSrc.ReadByte(); int is1 = pvSrc.ReadByte(); int vs1 = pvSrc.ReadByte(); int is2 = pvSrc.ReadByte(); int vs2 = pvSrc.ReadByte(); int is3 = pvSrc.ReadByte(); int vs3 = pvSrc.ReadByte(); int is4 = pvSrc.ReadByte(); int vs4 = pvSrc.ReadByte(); int hue = pvSrc.ReadUInt16(); int hairVal = pvSrc.ReadInt16(); int hairHue = pvSrc.ReadInt16(); int hairValf= pvSrc.ReadInt16(); int hairHuef= pvSrc.ReadInt16(); pvSrc.ReadByte(); int cityIndex = pvSrc.ReadByte(); int charSlot = pvSrc.ReadInt32(); int clientIP = pvSrc.ReadInt32(); int shirtHue = pvSrc.ReadInt16(); int pantsHue = pvSrc.ReadInt16(); /* 0x00, 0x01 0x02, 0x03 -> Human Male, Human Female 0x04, 0x05 -> Elf Male, Elf Female 0x05, 0x06 -> Gargoyle Male, Gargoyle Female */ bool female = ((genderRace % 2) != 0); Race race = null; byte raceID = (byte)(genderRace < 4 ? 0 : ((genderRace / 2) - 1)); race = Race.Races[raceID]; if( race == null ) race = Race.DefaultRace; CityInfo[] info = state.CityInfo; IAccount a = state.Account; if ( info == null || a == null || cityIndex < 0 || cityIndex >= info.Length ) { state.Dispose(); } else { // Check if anyone is using this account for ( int i = 0; i < a.Length; ++i ) { Mobile check = a[i]; if ( check != null && check.Map != Map.Internal ) { Console.WriteLine( "Login: {0}: Account in use", state ); state.Send( new PopupMessage( PMMessage.CharInWorld ) ); return; } } state.Flags = (ClientFlags)flags; CharacterCreatedEventArgs args = new CharacterCreatedEventArgs( state, a, name, female, hue, str, dex, intl, info[cityIndex], new SkillNameValue[4] { new SkillNameValue( (SkillName)is1, vs1 ), new SkillNameValue( (SkillName)is2, vs2 ), new SkillNameValue( (SkillName)is3, vs3 ), new SkillNameValue( (SkillName)is4, vs4 ), }, shirtHue, pantsHue, hairVal, hairHue, hairValf, hairHuef, prof, race ); state.Send( new ClientVersionReq() ); state.BlockAllPackets = true; EventSink.InvokeCharacterCreated( args ); Mobile m = args.Mobile; if ( m != null ) { state.Mobile = m; m.NetState = state; new LoginTimer( state, m ).Start(); } else { state.BlockAllPackets = false; state.Dispose(); } } }
public static void OnReceive(NetState state, PacketReader pvSrc) { pvSrc.ReadByte(); // 1: <4.0.1a, 2>=4.0.1a HardwareInfo info = new HardwareInfo(); info.m_InstanceID = pvSrc.ReadInt32(); info.m_OSMajor = pvSrc.ReadInt32(); info.m_OSMinor = pvSrc.ReadInt32(); info.m_OSRevision = pvSrc.ReadInt32(); info.m_CpuManufacturer = pvSrc.ReadByte(); info.m_CpuFamily = pvSrc.ReadInt32(); info.m_CpuModel = pvSrc.ReadInt32(); info.m_CpuClockSpeed = pvSrc.ReadInt32(); info.m_CpuQuantity = pvSrc.ReadByte(); info.m_PhysicalMemory = pvSrc.ReadInt32(); info.m_ScreenWidth = pvSrc.ReadInt32(); info.m_ScreenHeight = pvSrc.ReadInt32(); info.m_ScreenDepth = pvSrc.ReadInt32(); info.m_DXMajor = pvSrc.ReadInt16(); info.m_DXMinor = pvSrc.ReadInt16(); info.m_VCDescription = pvSrc.ReadUnicodeStringLESafe(64); info.m_VCVendorID = pvSrc.ReadInt32(); info.m_VCDeviceID = pvSrc.ReadInt32(); info.m_VCMemory = pvSrc.ReadInt32(); info.m_Distribution = pvSrc.ReadByte(); info.m_ClientsRunning = pvSrc.ReadByte(); info.m_ClientsInstalled = pvSrc.ReadByte(); info.m_PartialInstalled = pvSrc.ReadByte(); info.m_Language = pvSrc.ReadUnicodeStringLESafe(4); info.m_Unknown = pvSrc.ReadStringSafe(64); info.m_TimeReceived = DateTime.Now; Account acct = state.Account as Account; if (acct != null) acct.HardwareInfo = info; }
public static void PlayServer( NetState state, PacketReader pvSrc ) { int index = pvSrc.ReadInt16(); ServerInfo[] info = state.ServerInfo; IAccount a = state.Account; if ( info == null || a == null || index < 0 || index >= info.Length ) { state.Dispose(); } else { ServerInfo si = info[index]; state.m_AuthID = PlayServerAck.m_AuthID = GenerateAuthID( state ); state.SentFirstPacket = false; state.Send( new PlayServerAck( si ) ); } }