/// <summary> /// /// </summary> /// <param name="client"></param> /// <param name="packet"></param> /// <param name="messageNumber"></param> public void Parse(Client client, ref byte[] packet, int messageNumber) { // Some of these messages are never sent from // client to server, but I left them in just // in case I'm wrong about some packet. And to // allow server to log/disconnect clients that // send unexpected messages. *Suiv* int _type = ((int)((packet[20] << 24) + (packet[21] << 16) + (packet[22] << 8) + packet[23])); int _dynID = ((int)((packet[24] << 24) + (packet[25] << 16) + (packet[26] << 8) + packet[27])); Dynel dyn = Misc.FindDynel.FindDynelByID(_type, _dynID); switch (messageNumber) { case 0x000a0c5a: //KnubotNPCDescription break; case 0x052e2f0c: //AddTemplate break; case 0x0639474d: //GridDestinationSelect break; case 0x0C5a5d6d: //WeatherControl break; case 0x0d381f02: //PetToMaster break; case 0x1078735a: //FlushRDBCaches break; case 0x1330734f: //ShopSearchResult break; case 0x145a4f66: //ShopSearchRequest break; case 0x166a435e: //AcceptBSInvite break; case 0x194e4f76: //AddPet break; case 0x195e496e: //SetPos break; case 0x1c3a4f77: //ReflectAttack break; case 0x1d3c0f1c: //SpecialAttackWeapon break; case 0x2001377e: //MentorInvite break; case 0x2049527c: //Action break; case 0x204f4871: //Script break; case 0x206b4b73: //FormatFeedback break; case 0x2103247d: //KnubotAnswer break; case 0x212c487a: //Quest break; case 0x215b5678: //MineFullUpdate break; case 0x2252445f: //LookAt if (dyn != null) { ((Character)dyn).setTarget(ref packet); } break; case 0x25192476: //ShieldAttack break; case 0x25314d6d: //CastNanoSpell break; case 0x253d024c: //ResearchUpdate break; case 0x260f3671: //FollowTarget FollowTarget.Read(ref packet, client, dyn); break; case 0x264b514b: //RelocateDynels break; case 0x264e5f61: //Absorb break; case 0x26515e61: //Reload break; case 0x270a4c62: //KnubotCloseChatWindow break; case 0x271b3a6b: //SimpleCharFullUpdate break; case 0x28251f01: //StartLogout break; case 0x28494070: //Attack break; case 0x28784248: //TeamMemberInfo break; case 0x29304349: //FullCharacter break; case 0x2933154f: //LaserTargetList break; case 0x2a253f5f: //TrapDisarmed break; case 0x2a293d0f: //Fov break; case 0x2b333d6e: //Stat break; case 0x2c2f061c: //QueueUpdate break; case 0x2d212407: //KnubotRejectedItems break; case 0x2e072a78: //PlayerShopFullUpdate break; case 0x2e2a4a6b: //OrgInfoPacket break; case 0x30161355: //n3PlayfieldFullUpdate break; case 0x3115534d: //ResearchRequest break; case 0x3129233b: //AreaFormula break; case 0x3301337a: //InfromPlayer break; case 0x333b2867: //Mail break; case 0x342c1d1d: //ApplySpells break; case 0x343c287f: //Bank break; case 0x353f4f52: //ShopInventory break; case 0x35505644: //TemplateAction break; case 0x36284f6e: //Trade OnTrade.read(ref packet, client, dyn); break; case 0x365a5071: //DoorFullUpdate break; case 0x365e555b: //CityAdvantages break; case 0x3710256c: //HealthDamage break; case 0x371d0542: //FightModeUpdate break; case 0x373e3513: //SetShopName break; case 0x39343c68: //Buff break; case 0x3a1b2c0c: //KnubotTrade break; case 0x3a243f41: //DropTemplate break; case 0x3a322a4a: //GridSelected break; case 0x3b11256f: //SimpleItemFullUpdate break; case 0x3b132d64: //KnubotOpenChatWindow break; case 0x3b1d2268: //WeaponItemFullUpdate break; case 0x3b290771: //SocialActionCmd SocialActionCmd.Read(ref packet, client); break; case 0x3b3b2878: //Raid break; case 0x3c1e2803: //ShadowLevel break; case 0x3c265179: //Clone break; case 0x3d5b4544: //ShopCommission break; case 0x3d746c7c: //ServerPathPosDebugInfo break; case 0x3e205660: //Skill SkillUpdate.Read(ref packet, client); break; case 0x3f3a1914: //LeaveBattle break; case 0x405b4f27: //ShopInfo break; case 0x41624f0d: //AppearanceUpdate break; case 0x43197d22: //n3Teleport break; case 0x435f7023: //PerkUpdate break; case 0x44483b3a: //SendScore break; case 0x445f2a0b: //Resurrect break; case 0x45072a0b: //UpdateClientVisual break; case 0x45273f0a: //HouseDemolishStart break; case 0x455d2938: //PlaySound break; case 0x46002f16: //AttackInfo break; case 0x46312d2e: //TeamMember break; case 0x464d000a: //SpawnMech break; case 0x465a4061: //QuestFullUpdate break; case 0x465a5d73: //ChestItemFullUpdate break; case 0x4727213e: //NanoAttack break; case 0x47483633: //DropDynel break; case 0x47537a24: //ContainerAddItem ContainerAddItem.Do(ref packet, client); break; case 0x49222612: //Visibility break; case 0x4a41203e: //StopFight break; case 0x4b062919: //BattleOver break; case 0x4b5e7202: //InventoryUpdated break; case 0x4c7d403b: //DoorStatusUpdate break; case 0x4d2a3a38: //TeamInvite break; case 0x4d333027: //ShopStatus break; case 0x4d38242e: //InfoPacket break; case 0x4d450114: //SpellList break; case 0x4e536976: //InventoryUpdate break; case 0x4f474e05: //CorpseFullUpdate break; case 0x50544d19: //Feedback break; case 0x51492120: //CharSecSpecAttack break; case 0x52213420: //BankCorpse break; case 0x52526858: //GenericCmd GenericCmd.Read(ref packet, client, dyn); break; case 0x5266632a: //PathMoveCmd break; case 0x540e3b27: //ArriveAtBs break; case 0x54111123: //CharDCMove CharDCMove.Read(ref packet, client); break; case 0x55220726: //PlayfieldAllTowers break; case 0x55682b24: //KnubotFinishTrade break; case 0x55704d3a: //KnubotAnswerList break; case 0x56353038: //StopLogout break; case 0x570c2039: //CharInPlay CharInPlay.Read(ref packet, client); break; case 0x58362220: //ShopUpdate break; case 0x58574239: //MechInfo break; case 0x58742a0f: //RemovePet break; case 0x59210126: //PlayfieldAllCities break; case 0x59313928: //TrapItemFullUpdate break; case 0x5a585f65: //Inspect break; case 0x5b1e052c: //PlayfieldTowerUpdateClient break; case 0x5c240404: //ServerPosDebugInfo break; case 0x5c436609: //QuestAlternative break; case 0x5c4a493a: //FullAuto break; case 0x5c525a7b: ChatCmd.Read(ref packet, client); break; case 0x5c654b28: //MissedAttackInfo break; case 0x5d70532a: //KnubotAppendText break; case 0x5e477770: CharacterAction.Read(ref packet, client); break; case 0x5e5b6007: //HouseDisappeared break; case 0x5f4a4c6c: //Impulse break; case 0x5f4b1a39: //PlayfieldAnarchyF break; case 0x5f4b442a: //ChatText break; case 0x5f52412e: //GameTime break; case 0x60201d0e: //SetWantedDirection break; case 0x62741e15: //AOTransportSignal break; case 0x63333303: //PetCommand break; case 0x64582a07: //OrgServer break; case 0x6e5f566e: //SetStat break; case 0x734e5a7b: //SetName break; case 0x742e2314: //StopMovingCmd break; case 0x754f1115: //SpecialAttackInfo break; case 0x77230927: //GiveQuestToMember break; case 0x7864401d: //KnubotStartTrade break; case 0x7a222202: //GfxTrigger break; case 0x7e00312f: //ShopItemPrice break; case 0x7f405a16: //NewLevel break; case 0x7f4b3108: //OrgClient OrgClient m_OrgClient = new OrgClient(); m_OrgClient.Read(ref packet, client); break; case 0x7f544905: //VendingMachineFullUpdate break; default: client.Server.Warning(client, "Client sent unknown N3Message {0:x8}", messageNumber.ToString()); break; } }
public static void Read(byte[] packet, Client client) { SqlWrapper mys = new SqlWrapper(); // Packet Reader Unknown Values are Returning 0 Integers, Unable to Store Needed Packet data To Reply. #region PacketReader PacketReader packetReader = new PacketReader(packet); Header m_header = packetReader.PopHeader(); // 0 - 28 byte unknown = packetReader.PopByte(); // 29 int actionNum = packetReader.PopInt(); // 30 - 33 int unknown1 = packetReader.PopInt(); // 34 - 37 Identity m_ident = packetReader.PopIdentity(); // 38 - 35 int unknown2 = packetReader.PopInt(); // 36 - 39 int unknown3 = packetReader.PopInt(); // 40 - 43 short unknown4 = packetReader.PopShort(); // 44 - 45 #endregion switch (actionNum) { #region Cast nano case 19: // Cast nano { // CastNanoSpell PacketWriter castNanoSpell = new PacketWriter(); castNanoSpell.PushByte(0xDF); castNanoSpell.PushByte(0xDF); castNanoSpell.PushShort(10); castNanoSpell.PushShort(1); castNanoSpell.PushShort(0); castNanoSpell.PushInt(3086); castNanoSpell.PushInt(client.Character.Id); castNanoSpell.PushInt(0x25314D6D); castNanoSpell.PushIdentity(50000, client.Character.Id); castNanoSpell.PushByte(0); castNanoSpell.PushInt(unknown3); // Nano ID castNanoSpell.PushIdentity(m_ident); // Target castNanoSpell.PushInt(0); castNanoSpell.PushIdentity(50000, client.Character.Id); // Caster byte[] castNanoSpellA = castNanoSpell.Finish(); Announce.Playfield(client.Character.PlayField, castNanoSpellA); // CharacterAction 107 PacketWriter characterAction107 = new PacketWriter(); characterAction107.PushByte(0xDF); characterAction107.PushByte(0xDF); characterAction107.PushShort(10); characterAction107.PushShort(1); characterAction107.PushShort(0); characterAction107.PushInt(3086); characterAction107.PushInt(client.Character.Id); characterAction107.PushInt(0x5E477770); characterAction107.PushIdentity(50000, client.Character.Id); characterAction107.PushByte(0); characterAction107.PushInt(107); characterAction107.PushInt(0); characterAction107.PushInt(0); characterAction107.PushInt(0); characterAction107.PushInt(1); characterAction107.PushInt(unknown3); characterAction107.PushShort(0); byte[] characterAction107A = characterAction107.Finish(); Announce.Playfield(client.Character.PlayField, characterAction107A); // CharacterAction 98 PacketWriter characterAction98 = new PacketWriter(); characterAction98.PushByte(0xDF); characterAction98.PushByte(0xDF); characterAction98.PushShort(10); characterAction98.PushShort(1); characterAction98.PushShort(0); characterAction98.PushInt(3086); characterAction98.PushInt(client.Character.Id); characterAction98.PushInt(0x5E477770); characterAction98.PushIdentity(m_ident); characterAction98.PushByte(0); characterAction98.PushInt(98); characterAction98.PushInt(0); characterAction98.PushInt(0xCF1B); characterAction98.PushInt(unknown3); characterAction98.PushInt(client.Character.Id); characterAction98.PushInt(0x249F0); // duration? characterAction98.PushShort(0); byte[] characterAction98A = characterAction98.Finish(); Announce.Playfield(client.Character.PlayField, characterAction98A); } break; #endregion #region search /* this is here to prevent server crash that is caused by * search action if server doesn't reply if something is * found or not */ case 66: // If action == search { /* Msg 110:136744723 = "No hidden objects found." */ client.SendFeedback(110, 136744723); } break; #endregion #region info case 105: // If action == Info Request { Client tPlayer = null; if ((tPlayer = FindClient.FindClientById(m_ident.Instance)) != null) { #region Titles uint LegacyScore = tPlayer.Character.Stats.PvpRating.StatBaseValue; string LegacyTitle = null; if (LegacyScore < 1400) { LegacyTitle = ""; } else if (LegacyScore < 1500) { LegacyTitle = "Freshman"; } else if (LegacyScore < 1600) { LegacyTitle = "Rookie"; } else if (LegacyScore < 1700) { LegacyTitle = "Apprentice"; } else if (LegacyScore < 1800) { LegacyTitle = "Novice"; } else if (LegacyScore < 1900) { LegacyTitle = "Neophyte"; } else if (LegacyScore < 2000) { LegacyTitle = "Experienced"; } else if (LegacyScore < 2100) { LegacyTitle = "Expert"; } else if (LegacyScore < 2300) { LegacyTitle = "Master"; } else if (LegacyScore < 2500) { LegacyTitle = "Champion"; } else { LegacyTitle = "Grand Master"; } #endregion int orgGoverningForm = 0; SqlWrapper ms = new SqlWrapper(); DataTable dt = ms.ReadDatatable( "SELECT `GovernmentForm` FROM organizations WHERE ID=" + tPlayer.Character.OrgId); if (dt.Rows.Count > 0) { orgGoverningForm = (Int32)dt.Rows[0][0]; } string orgRank = OrgClient.GetRank( orgGoverningForm, tPlayer.Character.Stats.ClanLevel.StatBaseValue); // Uses methods in ZoneEngine\PacketHandlers\OrgClient.cs /* Known packetFlags-- * 0x40 - No org | 0x41 - Org | 0x43 - Org and towers | 0x47 - Org, towers, player has personal towers | 0x50 - No pvp data shown * Bitflags-- * Bit0 = hasOrg, Bit1 = orgTowers, Bit2 = personalTowers, Bit3 = (Int32) time until supression changes (Byte) type of supression level?, Bit4 = noPvpDataShown, Bit5 = hasFaction, Bit6 = ?, Bit 7 = null. */ byte packetFlags = 0x40; // Player has no Org if (tPlayer.Character.OrgId != 0) { packetFlags = 0x41; // Player has Org, no towers } PacketWriter infoPacket = new PacketWriter(); // Start packet header infoPacket.PushByte(0xDF); infoPacket.PushByte(0xDF); infoPacket.PushShort(10); infoPacket.PushShort(1); infoPacket.PushShort(0); infoPacket.PushInt(3086); // sender (server ID) infoPacket.PushInt(client.Character.Id); // receiver infoPacket.PushInt(0x4D38242E); // packet ID infoPacket.PushIdentity(50000, tPlayer.Character.Id); // affected identity infoPacket.PushByte(0); // ? // End packet header infoPacket.PushByte(packetFlags); // Based on flags above infoPacket.PushByte(1); // esi_001? infoPacket.PushByte((byte)tPlayer.Character.Stats.Profession.Value); // Profession infoPacket.PushByte((byte)tPlayer.Character.Stats.Level.Value); // Level infoPacket.PushByte((byte)tPlayer.Character.Stats.TitleLevel.Value); // Titlelevel infoPacket.PushByte((byte)tPlayer.Character.Stats.VisualProfession.Value); // Visual Profession infoPacket.PushShort(0); // Side XP Bonus infoPacket.PushUInt(tPlayer.Character.Stats.Health.Value); // Current Health (Health) infoPacket.PushUInt(tPlayer.Character.Stats.Life.Value); // Max Health (Life) infoPacket.PushInt(0); // BreedHostility? infoPacket.PushUInt(tPlayer.Character.OrgId); // org ID infoPacket.PushShort((short)tPlayer.Character.FirstName.Length); infoPacket.PushBytes(Encoding.ASCII.GetBytes(tPlayer.Character.FirstName)); infoPacket.PushShort((short)tPlayer.Character.LastName.Length); infoPacket.PushBytes(Encoding.ASCII.GetBytes(tPlayer.Character.LastName)); infoPacket.PushShort((short)LegacyTitle.Length); infoPacket.PushBytes(Encoding.ASCII.GetBytes(LegacyTitle)); infoPacket.PushShort(0); // Title 2 // If receiver is in the same org as affected identity, whom is not orgless, send org rank and city playfield if ((client.Character.OrgId == tPlayer.Character.OrgId) && (tPlayer.Character.OrgId != 0)) { infoPacket.PushShort((short)orgRank.Length); infoPacket.PushBytes(Encoding.ASCII.GetBytes(orgRank)); infoPacket.PushInt(0); //infoPacket.PushIdentity(0, 0); // City (50201, Playfield) // Pushed 1 zero to much and screwed info for characters in orgs, but I´ll leave it for later just incase. } infoPacket.PushUInt(tPlayer.Character.Stats.InvadersKilled.Value); // Invaders Killed infoPacket.PushUInt(tPlayer.Character.Stats.KilledByInvaders.Value); // Killed by Invaders infoPacket.PushUInt(tPlayer.Character.Stats.AlienLevel.Value); // Alien Level infoPacket.PushUInt(tPlayer.Character.Stats.PvpDuelKills.Value); // Pvp Duel Kills infoPacket.PushUInt(tPlayer.Character.Stats.PvpDuelDeaths.Value); // Pvp Duel Deaths infoPacket.PushUInt(tPlayer.Character.Stats.PvpProfessionDuelDeaths.Value); // Pvp Profession Duel Kills infoPacket.PushUInt(tPlayer.Character.Stats.PvpRankedSoloKills.Value); // Pvp Solo Kills infoPacket.PushUInt(tPlayer.Character.Stats.PvpRankedSoloDeaths.Value); // Pvp Team Kills infoPacket.PushUInt(tPlayer.Character.Stats.PvpSoloScore.Value); // Pvp Solo Score infoPacket.PushUInt(tPlayer.Character.Stats.PvpTeamScore.Value); // Pvp Team Score infoPacket.PushUInt(tPlayer.Character.Stats.PvpDuelScore.Value); // Pvp Duel Score byte[] infoPacketA = infoPacket.Finish(); client.SendCompressed(infoPacketA); } else { NonPlayerCharacterClass npc = (NonPlayerCharacterClass)FindDynel.FindDynelById(m_ident.Type, m_ident.Instance); if (npc != null) { PacketWriter infoPacket = new PacketWriter(); // Start packet header infoPacket.PushByte(0xDF); infoPacket.PushByte(0xDF); infoPacket.PushShort(10); infoPacket.PushShort(1); infoPacket.PushShort(0); infoPacket.PushInt(3086); // sender (server ID) infoPacket.PushInt(client.Character.Id); // receiver infoPacket.PushInt(0x4D38242E); // packet ID infoPacket.PushIdentity(50000, npc.Id); // affected identity infoPacket.PushByte(0); // ? // End packet header infoPacket.PushByte(0x50); // npc's just have 0x50 infoPacket.PushByte(1); // esi_001? infoPacket.PushByte((byte)npc.Stats.Profession.Value); // Profession infoPacket.PushByte((byte)npc.Stats.Level.Value); // Level infoPacket.PushByte((byte)npc.Stats.TitleLevel.Value); // Titlelevel infoPacket.PushByte((byte)npc.Stats.VisualProfession.Value); // Visual Profession infoPacket.PushShort(0); // no idea for npc's infoPacket.PushUInt(npc.Stats.Health.Value); // Current Health (Health) infoPacket.PushUInt(npc.Stats.Life.Value); // Max Health (Life) infoPacket.PushInt(0); // BreedHostility? infoPacket.PushUInt(0); // org ID infoPacket.PushShort(0); infoPacket.PushShort(0); infoPacket.PushShort(0); infoPacket.PushShort(0); infoPacket.PushInt(0x499602d2); infoPacket.PushInt(0x499602d2); infoPacket.PushInt(0x499602d2); byte[] infoPacketA = infoPacket.Finish(); client.SendCompressed(infoPacketA); } } } break; #endregion #region logout case 120: // If action == Logout { //Start 30 second logout timer if client is not a GM (statid 215) if (client.Character.Stats.GMLevel.Value == 0) { client.startLogoutTimer(); } else // If client is a GM, disconnect without timer { client.Server.DisconnectClient(client); } } break; case 121: // If action == Stop Logout { //Stop current logout timer and send stop logout packet client.Character.UpdateMoveType((byte)client.Character.PreviousMoveMode); client.CancelLogOut(); } break; #endregion #region stand case 87: // If action == Stand { client.Character.UpdateMoveType(37); //Send stand up packet, and cancel timer/send stop logout packet if timer is enabled client.StandCancelLogout(); } break; #endregion #region Team case 22: //Kick Team Member { } break; case 24: //Leave Team { TeamClass team = new TeamClass(); team.LeaveTeam(client); } break; case 25: //Transfer Team Leadership { } break; case 26: //Team Join Request { // Send Team Invite Request To Target Player TeamClass team = new TeamClass(); team.SendTeamRequest(client, m_ident); } break; case 28: //Request Reply { // Check if positive or negative response // if positive TeamClass team = new TeamClass(); uint teamID = TeamClass.GenerateNewTeamId(client, m_ident); // Destination Client 0 = Sender, 1 = Reciever // Reciever Packets /////////////////// // CharAction 15 team.TeamRequestReply(client, m_ident); // CharAction 23 team.TeamRequestReplyCharacterAction23(client, m_ident); // TeamMember Packet team.TeamReplyPacketTeamMember(1, client, m_ident, "Member1"); // TeamMemberInfo Packet team.TeamReplyPacketTeamMemberInfo(1, client, m_ident); // TeamMember Packet team.TeamReplyPacketTeamMember(1, client, m_ident, "Member2"); // Sender Packets ///////////////// // TeamMember Packet team.TeamReplyPacketTeamMember(0, client, m_ident, "Member1"); // TeamMemberInfo Packet team.TeamReplyPacketTeamMemberInfo(0, client, m_ident); // TeamMember Packet team.TeamReplyPacketTeamMember(0, client, m_ident, "Member2"); } break; #endregion #region Delete Item case 0x70: mys.SqlDelete( "DELETE FROM " + client.Character.GetSqlTablefromDynelType() + "inventory WHERE placement=" + m_ident.Instance.ToString() + " AND container=" + m_ident.Type.ToString()); InventoryEntries i_del = client.Character.GetInventoryAt(m_ident.Instance); client.Character.Inventory.Remove(i_del); byte[] action2 = new byte[0x37]; Array.Copy(packet, action2, 0x37); action2[8] = 0x00; action2[9] = 0x00; action2[10] = 0x0C; action2[11] = 0x0E; client.SendCompressed(action2); break; #endregion #region Split item case 0x34: int nextid = client.Character.GetNextFreeInventory(m_ident.Type); InventoryEntries i = client.Character.GetInventoryAt(m_ident.Instance); i.Item.MultipleCount -= unknown3; InventoryEntries i2 = new InventoryEntries(); i2.Item = i.Item.ShallowCopy(); i2.Item.MultipleCount = unknown3; i2.Placement = nextid; client.Character.Inventory.Add(i2); client.Character.WriteInventoryToSql(); break; #endregion #region Join item case 0x35: InventoryEntries j1 = client.Character.GetInventoryAt(m_ident.Instance); InventoryEntries j2 = client.Character.GetInventoryAt(unknown3); j1.Item.MultipleCount += j2.Item.MultipleCount; client.Character.Inventory.Remove(j2); client.Character.WriteInventoryToSql(); byte[] joined = new byte[0x37]; Array.Copy(packet, joined, 0x37); joined[8] = 0x00; joined[9] = 0x00; joined[10] = 0x0C; joined[11] = 0x0E; client.SendCompressed(joined); break; #endregion #region Sneak Action // ################################################################################### // Spandexpants: This is all i have done so far as to make sneak turn on and off, // currently i cannot find a missing packet or link which tells the server the player // has stopped sneaking, hidden packet or something, will come back to later. // ################################################################################### // Sneak Packet Received case 163: { PacketWriter Sneak = new PacketWriter(); // TODO: IF SNEAKING IS ALLOWED RUN THIS CODE. // Send Action 162 : Enable Sneak Sneak.PushByte(0xDF); Sneak.PushByte(0xDF); Sneak.PushShort(0xA); Sneak.PushShort(1); Sneak.PushShort(0); Sneak.PushInt(3086); // Send Sneak.PushInt(client.Character.Id); // Reciever Sneak.PushInt(0x5e477770); // Packet ID Sneak.PushIdentity(50000, client.Character.Id); // TYPE / ID Sneak.PushInt(0); Sneak.PushByte(0xA2); // Action ID Sneak.PushInt(0); Sneak.PushInt(0); Sneak.PushInt(0); Sneak.PushInt(0); Sneak.PushInt(0); Sneak.PushShort(0); byte[] sneakpacket = Sneak.Finish(); client.SendCompressed(sneakpacket); // End of Enable sneak // TODO: IF SNEAKING IS NOT ALLOWED SEND REJECTION PACKET } break; #endregion #region Use Item on Item case 81: { Identity item1 = new Identity(); Identity item2 = new Identity(); item1.Type = m_ident.Type; item1.Instance = m_ident.Instance; item2.Type = unknown2; item2.Instance = unknown3; Tradeskill cts = new Tradeskill(client, item1.Instance, item2.Instance); cts.ClickBuild(); break; } #endregion #region Change Visual Flag case 166: { client.Character.Stats.VisualFlags.Set(unknown3); // client.SendChatText("Setting Visual Flag to "+unknown3.ToString()); AppearanceUpdate.AnnounceAppearanceUpdate(client.Character); break; } #endregion #region Tradeskill Source Changed case 0xdc: TradeSkillReceiver.TradeSkillSourceChanged(client, unknown2, unknown3); break; #endregion #region Tradeskill Target Changed case 0xdd: TradeSkillReceiver.TradeSkillTargetChanged(client, unknown2, unknown3); break; #endregion #region Tradeskill Build Pressed case 0xde: TradeSkillReceiver.TradeSkillBuildPressed(client, m_ident.Instance); break; #endregion #region default default: { byte[] action = new byte[0x37]; Array.Copy(packet, action, 0x37); action[8] = 0x00; action[9] = 0x00; action[10] = 0x0C; action[11] = 0x0E; Announce.Playfield(client.Character.PlayField, action); } break; #endregion } packetReader.Finish(); }
public static void Read(CharacterActionMessage packet, Client client) { var mys = new SqlWrapper(); var actionNum = (int)packet.Action; var unknown1 = packet.Unknown1; var args1 = packet.Parameter1; var args2 = packet.Parameter2; var unknown2 = packet.Unknown2; switch (actionNum) { case 19: { // Cast nano // CastNanoSpell var msg = new CastNanoSpellMessage { Identity = client.Character.Identity, Unknown = 0x00, NanoId = args2, Target = packet.Target, Unknown1 = 0x00000000, Caster = client.Character.Identity }; client.Character.Playfield.Announce(msg); // CharacterAction 107 var characterAction107 = new CharacterActionMessage { Identity = client.Character.Identity, Unknown = 0x00, Action = CharacterActionType.Unknown1, Unknown1 = 0x00000000, Target = Identity.None, Parameter1 = 1, Parameter2 = args2, Unknown2 = 0x0000 }; client.Character.Playfield.Announce(characterAction107); // CharacterAction 98 var characterAction98 = new CharacterActionMessage { Identity = packet.Target, Unknown = 0x00, Action = CharacterActionType.Unknown2, Unknown1 = 0x00000000, Target = new Identity { Type = IdentityType .NanoProgram, Instance = args2 }, Parameter1 = client.Character.Identity.Instance, Parameter2 = 0x249F0, // duration? Unknown2 = 0x0000 }; client.Character.Playfield.Announce(characterAction98); } break; /* this is here to prevent server crash that is caused by * search action if server doesn't reply if something is * found or not */ case 66: { // If action == search /* Msg 110:136744723 = "No hidden objects found." */ // TODO: SEARCH!! SendFeedback.Send(client, 110, 136744723); } break; case 105: { // If action == Info Request IInstancedEntity tPlayer = client.Playfield.FindByIdentity(packet.Target); var tChar = tPlayer as Character; if (tChar != null) { var LegacyScore = tChar.Stats["PvP_Rating"].BaseValue; string LegacyTitle = null; if (LegacyScore < 1400) { LegacyTitle = string.Empty; } else if (LegacyScore < 1500) { LegacyTitle = "Freshman"; } else if (LegacyScore < 1600) { LegacyTitle = "Rookie"; } else if (LegacyScore < 1700) { LegacyTitle = "Apprentice"; } else if (LegacyScore < 1800) { LegacyTitle = "Novice"; } else if (LegacyScore < 1900) { LegacyTitle = "Neophyte"; } else if (LegacyScore < 2000) { LegacyTitle = "Experienced"; } else if (LegacyScore < 2100) { LegacyTitle = "Expert"; } else if (LegacyScore < 2300) { LegacyTitle = "Master"; } else if (LegacyScore < 2500) { LegacyTitle = "Champion"; } else { LegacyTitle = "Grand Master"; } var orgGoverningForm = 0; var ms = new SqlWrapper(); var dt = ms.ReadDatatable( "SELECT `GovernmentForm` FROM organizations WHERE ID=" + tChar.Stats["Clan"].BaseValue); if (dt.Rows.Count > 0) { orgGoverningForm = (Int32)dt.Rows[0][0]; } // Uses methods in ZoneEngine\PacketHandlers\OrgClient.cs /* Known packetFlags-- * 0x40 - No org | 0x41 - Org | 0x43 - Org and towers | 0x47 - Org, towers, player has personal towers | 0x50 - No pvp data shown * Bitflags-- * Bit0 = hasOrg, Bit1 = orgTowers, Bit2 = personalTowers, Bit3 = (Int32) time until supression changes (Byte) type of supression level?, Bit4 = noPvpDataShown, Bit5 = hasFaction, Bit6 = ?, Bit 7 = null. */ int? orgId; string orgRank; InfoPacketType type; if (tPlayer.Stats["Clan"].BaseValue == 0) { type = InfoPacketType.Character; orgId = null; orgRank = null; } else { type = InfoPacketType.CharacterOrg; orgId = (int?)tPlayer.Stats["Clan"].BaseValue; if (client.Character.Stats["Clan"].BaseValue == tPlayer.Stats["Clan"].BaseValue) { orgRank = OrgClient.GetRank( orgGoverningForm, tPlayer.Stats["ClanLevel"].BaseValue); } else { orgRank = string.Empty; } } var info = new CharacterInfoPacket { Unknown1 = 0x01, Profession = (Profession) tPlayer.Stats["Profession"].Value, Level = (byte)tPlayer.Stats["Level"].Value, TitleLevel = (byte)tPlayer.Stats["TitleLevel"].Value, VisualProfession = (Profession) tPlayer.Stats["VisualProfession"].Value, SideXp = 0, Health = tPlayer.Stats["Health"].Value, MaxHealth = tPlayer.Stats["Life"].Value, BreedHostility = 0x00000000, OrganizationId = orgId, FirstName = tChar.FirstName, LastName = tChar.LastName, LegacyTitle = LegacyTitle, Unknown2 = 0x0000, OrganizationRank = orgRank, TowerFields = null, CityPlayfieldId = 0x00000000, Towers = null, InvadersKilled = tPlayer.Stats["InvadersKilled"].Value, KilledByInvaders = tPlayer.Stats["KilledByInvaders"].Value, AiLevel = tPlayer.Stats["AlienLevel"].Value, PvpDuelWins = tPlayer.Stats["PvpDuelKills"].Value, PvpDuelLoses = tPlayer.Stats["PvpDuelDeaths"].Value, PvpProfessionDuelLoses = tPlayer.Stats["PvpProfessionDuelDeaths"].Value, PvpSoloKills = tPlayer.Stats["PvpRankedSoloKills"].Value, PvpTeamKills = tPlayer.Stats["PvpRankedTeamKills"].Value, PvpSoloScore = tPlayer.Stats["PvpSoloScore"].Value, PvpTeamScore = tPlayer.Stats["PvpTeamScore"].Value, PvpDuelScore = tPlayer.Stats["PvpDuelScore"].Value }; var infoPacketMessage = new InfoPacketMessage { Identity = tPlayer.Identity, Unknown = 0x00, Type = type, Info = info }; client.SendCompressed(infoPacketMessage); } else // TODO: NPC's { /* * var npc = * (NonPlayerCharacterClass) * FindDynel.FindDynelById(packet.Target); * if (npc != null) * { * var infoPacket = new PacketWriter(); * * // Start packet header * infoPacket.PushByte(0xDF); * infoPacket.PushByte(0xDF); * infoPacket.PushShort(10); * infoPacket.PushShort(1); * infoPacket.PushShort(0); * infoPacket.PushInt(3086); // sender (server ID) * infoPacket.PushInt(client.Character.Id.Instance); // receiver * infoPacket.PushInt(0x4D38242E); // packet ID * infoPacket.PushIdentity(npc.Id); // affected identity * infoPacket.PushByte(0); // ? * * // End packet header * infoPacket.PushByte(0x50); // npc's just have 0x50 * infoPacket.PushByte(1); // esi_001? * infoPacket.PushByte((byte)npc.Stats.Profession.Value); // Profession * infoPacket.PushByte((byte)npc.Stats.Level.Value); // Level * infoPacket.PushByte((byte)npc.Stats.TitleLevel.Value); // Titlelevel * infoPacket.PushByte((byte)npc.Stats.VisualProfession.Value); // Visual Profession * * infoPacket.PushShort(0); // no idea for npc's * infoPacket.PushUInt(npc.Stats.Health.Value); // Current Health (Health) * infoPacket.PushUInt(npc.Stats.Life.Value); // Max Health (Life) * infoPacket.PushInt(0); // BreedHostility? * infoPacket.PushUInt(0); // org ID * infoPacket.PushShort(0); * infoPacket.PushShort(0); * infoPacket.PushShort(0); * infoPacket.PushShort(0); * infoPacket.PushInt(0x499602d2); * infoPacket.PushInt(0x499602d2); * infoPacket.PushInt(0x499602d2); * var infoPacketA = infoPacket.Finish(); * client.SendCompressed(infoPacketA); * }*/ } } break; case 120: { // If action == Logout // Start 30 second logout timer if client is not a GM (statid 215) if (client.Character.Stats["GMLevel"].Value == 0) { // client.startLogoutTimer(); } else { // If client is a GM, disconnect without timer client.Server.DisconnectClient(client); } } break; case 121: { // If action == Stop Logout // Stop current logout timer and send stop logout packet client.Character.UpdateMoveType((byte)client.Character.PreviousMoveMode); //client.CancelLogOut(); } break; case 87: { // If action == Stand client.Character.UpdateMoveType(37); // Send stand up packet, and cancel timer/send stop logout packet if timer is enabled //client.StandCancelLogout(); } break; case 22: { // Kick Team Member } break; case 24: { // Leave Team /* * var team = new TeamClass(); * team.LeaveTeam(client); */ } break; case 25: { // Transfer Team Leadership } break; case 26: { // Team Join Request // Send Team Invite Request To Target Player /* * var team = new TeamClass(); * team.SendTeamRequest(client, packet.Target); */ } break; case 28: { /* * // Request Reply * // Check if positive or negative response * * // if positive * var team = new TeamClass(); * var teamID = TeamClass.GenerateNewTeamId(client, packet.Target); * * // Destination Client 0 = Sender, 1 = Reciever * * // Reciever Packets * /////////////////// * * // CharAction 15 * team.TeamRequestReply(client, packet.Target); * * // CharAction 23 * team.TeamRequestReplyCharacterAction23(client, packet.Target); * * // TeamMember Packet * team.TeamReplyPacketTeamMember(1, client, packet.Target, "Member1"); * * // TeamMemberInfo Packet * team.TeamReplyPacketTeamMemberInfo(1, client, packet.Target); * * // TeamMember Packet * team.TeamReplyPacketTeamMember(1, client, packet.Target, "Member2"); * * // Sender Packets * ///////////////// * * // TeamMember Packet * team.TeamReplyPacketTeamMember(0, client, packet.Target, "Member1"); * * // TeamMemberInfo Packet * team.TeamReplyPacketTeamMemberInfo(0, client, packet.Target); * * // TeamMember Packet * team.TeamReplyPacketTeamMember(0, client, packet.Target, "Member2"); */ } break; case 0x70: // Remove/Delete item ItemDao.RemoveItem((int)packet.Target.Type, client.Character.Identity.Instance, packet.Target.Instance); client.Character.BaseInventory.RemoveItem((int)packet.Target.Type, packet.Target.Instance); client.SendCompressed(packet); break; case 0x34: // Split? IItem it = client.Character.BaseInventory.Pages[(int)packet.Target.Type][packet.Target.Instance]; it.MultipleCount -= args2; Item newItem = new Item(it.Quality, it.LowID, it.HighID); newItem.MultipleCount = args2; client.Character.BaseInventory.Pages[(int)packet.Target.Type].Add( client.Character.BaseInventory.Pages[(int)packet.Target.Type].FindFreeSlot(), newItem); client.Character.BaseInventory.Pages[(int)packet.Target.Type].Write(); break; #region Join item case 0x35: client.Character.BaseInventory.Pages[(int)packet.Target.Type][packet.Target.Instance].MultipleCount += client.Character.BaseInventory.Pages[(int)packet.Target.Type][args2].MultipleCount; client.Character.BaseInventory.Pages[(int)packet.Target.Type].Remove(args2); client.Character.BaseInventory.Pages[(int)packet.Target.Type].Write(); client.SendCompressed(packet); break; #endregion #region Sneak Action // ################################################################################### // Spandexpants: This is all i have done so far as to make sneak turn on and off, // currently i cannot find a missing packet or link which tells the server the player // has stopped sneaking, hidden packet or something, will come back to later. // ################################################################################### // Sneak Packet Received case 163: { // TODO: IF SNEAKING IS ALLOWED RUN THIS CODE. // Send Action 162 : Enable Sneak var sneak = new CharacterActionMessage { Identity = client.Character.Identity, Unknown = 0x00, Action = CharacterActionType.StartedSneaking, Unknown1 = 0x00000000, Target = Identity.None, Parameter1 = 0, Parameter2 = 0, Unknown2 = 0x0000 }; client.SendCompressed(sneak); // End of Enable sneak // TODO: IF SNEAKING IS NOT ALLOWED SEND REJECTION PACKET } break; #endregion #region Use Item on Item /* * case 81: * { * var item1 = packet.Target; * var item2 = new Identity { Type = (IdentityType)args1, Instance = args2 }; * * var cts = new Tradeskill(client, item1.Instance, item2.Instance); * cts.ClickBuild(); * break; * } */ #endregion #region Change Visual Flag case 166: { client.Character.Stats["VisualFlags"].Value = args2; // client.SendChatText("Setting Visual Flag to "+unknown3.ToString()); AppearanceUpdate.AnnounceAppearanceUpdate(client.Character); break; } #endregion /* #region Tradeskill Source Changed * * case 0xdc: * TradeSkillReceiver.TradeSkillSourceChanged(client, args1, args2); * break; * #endregion * #region Tradeskill Target Changed * * case 0xdd: * TradeSkillReceiver.TradeSkillTargetChanged(client, args1, args2); * break; * #endregion * #region Tradeskill Build Pressed * * case 0xde: * TradeSkillReceiver.TradeSkillBuildPressed(client, packet.Target.Instance); * break; * #endregion */ #region default default: { client.Playfield.Announce(packet); } break; #endregion } }
/// <summary> /// /// </summary> /// <param name="client"></param> /// <param name="packet"></param> /// <param name="messageNumber"></param> public void Parse(Client client, ref byte[] packet, int messageNumber) { // Some of these messages are never sent from // client to server, but I left them in just // in case I'm wrong about some packet. And to // allow server to log/disconnect clients that // send unexpected messages. *Suiv* int _type = ((int)((packet[20] << 24) + (packet[21] << 16) + (packet[22] << 8) + packet[23])); int _dynID = ((int)((packet[24] << 24) + (packet[25] << 16) + (packet[26] << 8) + packet[27])); Dynel dyn = Misc.FindDynel.FindDynelByID(_type,_dynID); switch (messageNumber) { case 0x000a0c5a: //KnubotNPCDescription break; case 0x052e2f0c: //AddTemplate break; case 0x0639474d: //GridDestinationSelect break; case 0x0C5a5d6d: //WeatherControl break; case 0x0d381f02: //PetToMaster break; case 0x1078735a: //FlushRDBCaches break; case 0x1330734f: //ShopSearchResult break; case 0x145a4f66: //ShopSearchRequest break; case 0x166a435e: //AcceptBSInvite break; case 0x194e4f76: //AddPet break; case 0x195e496e: //SetPos break; case 0x1c3a4f77: //ReflectAttack break; case 0x1d3c0f1c: //SpecialAttackWeapon break; case 0x2001377e: //MentorInvite break; case 0x2049527c: //Action break; case 0x204f4871: //Script break; case 0x206b4b73: //FormatFeedback break; case 0x2103247d: //KnubotAnswer break; case 0x212c487a: //Quest break; case 0x215b5678: //MineFullUpdate break; case 0x2252445f: //LookAt if (dyn!=null) ((Character)dyn).setTarget(ref packet); break; case 0x25192476: //ShieldAttack break; case 0x25314d6d: //CastNanoSpell break; case 0x253d024c: //ResearchUpdate break; case 0x260f3671: //FollowTarget FollowTarget.Read(ref packet, client, dyn); break; case 0x264b514b: //RelocateDynels break; case 0x264e5f61: //Absorb break; case 0x26515e61: //Reload break; case 0x270a4c62: //KnubotCloseChatWindow break; case 0x271b3a6b: //SimpleCharFullUpdate break; case 0x28251f01: //StartLogout break; case 0x28494070: //Attack break; case 0x28784248: //TeamMemberInfo break; case 0x29304349: //FullCharacter break; case 0x2933154f: //LaserTargetList break; case 0x2a253f5f: //TrapDisarmed break; case 0x2a293d0f: //Fov break; case 0x2b333d6e: //Stat break; case 0x2c2f061c: //QueueUpdate break; case 0x2d212407: //KnubotRejectedItems break; case 0x2e072a78: //PlayerShopFullUpdate break; case 0x2e2a4a6b: //OrgInfoPacket break; case 0x30161355: //n3PlayfieldFullUpdate break; case 0x3115534d: //ResearchRequest break; case 0x3129233b: //AreaFormula break; case 0x3301337a: //InfromPlayer break; case 0x333b2867: //Mail break; case 0x342c1d1d: //ApplySpells break; case 0x343c287f: //Bank break; case 0x353f4f52: //ShopInventory break; case 0x35505644: //TemplateAction break; case 0x36284f6e: //Trade OnTrade.read(ref packet, client, dyn); break; case 0x365a5071: //DoorFullUpdate break; case 0x365e555b: //CityAdvantages break; case 0x3710256c: //HealthDamage break; case 0x371d0542: //FightModeUpdate break; case 0x373e3513: //SetShopName break; case 0x39343c68: //Buff break; case 0x3a1b2c0c: //KnubotTrade break; case 0x3a243f41: //DropTemplate break; case 0x3a322a4a: //GridSelected break; case 0x3b11256f: //SimpleItemFullUpdate break; case 0x3b132d64: //KnubotOpenChatWindow break; case 0x3b1d2268: //WeaponItemFullUpdate break; case 0x3b290771: //SocialActionCmd SocialActionCmd.Read(ref packet, client); break; case 0x3b3b2878: //Raid break; case 0x3c1e2803: //ShadowLevel break; case 0x3c265179: //Clone break; case 0x3d5b4544: //ShopCommission break; case 0x3d746c7c: //ServerPathPosDebugInfo break; case 0x3e205660: //Skill SkillUpdate.Read(ref packet,client); break; case 0x3f3a1914: //LeaveBattle break; case 0x405b4f27: //ShopInfo break; case 0x41624f0d: //AppearanceUpdate break; case 0x43197d22: //n3Teleport break; case 0x435f7023: //PerkUpdate break; case 0x44483b3a: //SendScore break; case 0x445f2a0b: //Resurrect break; case 0x45072a0b: //UpdateClientVisual break; case 0x45273f0a: //HouseDemolishStart break; case 0x455d2938: //PlaySound break; case 0x46002f16: //AttackInfo break; case 0x46312d2e: //TeamMember break; case 0x464d000a: //SpawnMech break; case 0x465a4061: //QuestFullUpdate break; case 0x465a5d73: //ChestItemFullUpdate break; case 0x4727213e: //NanoAttack break; case 0x47483633: //DropDynel break; case 0x47537a24: //ContainerAddItem ContainerAddItem.Do(ref packet, client); break; case 0x49222612: //Visibility break; case 0x4a41203e: //StopFight break; case 0x4b062919: //BattleOver break; case 0x4b5e7202: //InventoryUpdated break; case 0x4c7d403b: //DoorStatusUpdate break; case 0x4d2a3a38: //TeamInvite break; case 0x4d333027: //ShopStatus break; case 0x4d38242e: //InfoPacket break; case 0x4d450114: //SpellList break; case 0x4e536976: //InventoryUpdate break; case 0x4f474e05: //CorpseFullUpdate break; case 0x50544d19: //Feedback break; case 0x51492120: //CharSecSpecAttack break; case 0x52213420: //BankCorpse break; case 0x52526858: //GenericCmd GenericCmd.Read(ref packet, client, dyn); break; case 0x5266632a: //PathMoveCmd break; case 0x540e3b27: //ArriveAtBs break; case 0x54111123: //CharDCMove CharDCMove.Read(ref packet, client); break; case 0x55220726: //PlayfieldAllTowers break; case 0x55682b24: //KnubotFinishTrade break; case 0x55704d3a: //KnubotAnswerList break; case 0x56353038: //StopLogout break; case 0x570c2039: //CharInPlay CharInPlay.Read(ref packet, client); break; case 0x58362220: //ShopUpdate break; case 0x58574239: //MechInfo break; case 0x58742a0f: //RemovePet break; case 0x59210126: //PlayfieldAllCities break; case 0x59313928: //TrapItemFullUpdate break; case 0x5a585f65: //Inspect break; case 0x5b1e052c: //PlayfieldTowerUpdateClient break; case 0x5c240404: //ServerPosDebugInfo break; case 0x5c436609: //QuestAlternative break; case 0x5c4a493a: //FullAuto break; case 0x5c525a7b: ChatCmd.Read(ref packet, client); break; case 0x5c654b28: //MissedAttackInfo break; case 0x5d70532a: //KnubotAppendText break; case 0x5e477770: CharacterAction.Read(ref packet, client); break; case 0x5e5b6007: //HouseDisappeared break; case 0x5f4a4c6c: //Impulse break; case 0x5f4b1a39: //PlayfieldAnarchyF break; case 0x5f4b442a: //ChatText break; case 0x5f52412e: //GameTime break; case 0x60201d0e: //SetWantedDirection break; case 0x62741e15: //AOTransportSignal break; case 0x63333303: //PetCommand break; case 0x64582a07: //OrgServer break; case 0x6e5f566e: //SetStat break; case 0x734e5a7b: //SetName break; case 0x742e2314: //StopMovingCmd break; case 0x754f1115: //SpecialAttackInfo break; case 0x77230927: //GiveQuestToMember break; case 0x7864401d: //KnubotStartTrade break; case 0x7a222202: //GfxTrigger break; case 0x7e00312f: //ShopItemPrice break; case 0x7f405a16: //NewLevel break; case 0x7f4b3108: //OrgClient OrgClient m_OrgClient = new OrgClient(); m_OrgClient.Read(ref packet, client); break; case 0x7f544905: //VendingMachineFullUpdate break; default: client.Server.Warning(client, "Client sent unknown N3Message {0:x8}", messageNumber.ToString()); break; } }