Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        /// <summary>
        /// </summary>
        /// <param name="message">
        /// </param>
        /// <param name="client">
        /// </param>
        protected override void Read(CharacterActionMessage message, IZoneClient client)
        {
            LogUtil.Debug(DebugInfoDetail.NetworkMessages, "Reading CharacterActionMessage");

            // var actionNum = (int)characterAction.Action;
            // int unknown1 = message.Unknown1;
            // int args1 = message.Parameter1;
            // int nanoId = message.Parameter2;
            // short unknown2 = message.Unknown2;

            IdentityType targetIdentityType = message.Target.Type;

            switch (message.Action)
            {
            case CharacterActionType.CastNano:

                // Cast nano
                // CastNanoSpell

                // TODO: This has to be delayed (Casting attack speed) and needs to move to some other part
                // TODO: Check nanoskill requirements
                // TODO: Lower current nano points/check if enough nano points

                client.Controller.CastNano(message.Parameter2, message.Target);

                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 CharacterActionType.Search:

                // If action == search
                /* Msg 110:136744723 = "No hidden objects found." */
                // TODO: SEARCH!!
                FeedbackMessageHandler.Default.Send(client.Controller.Character, 110, 136744723);
                break;

            case CharacterActionType.InfoRequest:

                // If action == Info Request
                IInstancedEntity tPlayer = client.Controller.Character.Playfield.FindByIdentity(message.Target);

                // TODO: Think of a new method to distinguish players from mobs (NPCFamily for example)
                var tChar = tPlayer as Character;
                if (tChar != null)
                {
                    // Is it a Character object? (player and npcs)
                    CharacterInfoPacketMessageHandler.Default.Send(client.Controller.Character, tChar);
                }
                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 CharacterActionType.Logout:

                // If action == Logout
                // Start 30 second logout timer if client is not a GM (statid 215)
                if (client.Controller.Character.Stats[StatIds.gmlevel].Value == 0)
                {
                    client.Controller.Character.StartLogoutTimer();
                }
                else
                {
                    // If client is a GM, disconnect without timer
                    client.Controller.Character.StartLogoutTimer(1000);
                }

                break;

            case CharacterActionType.StopLogout:

                // If action == Stop Logout
                // Stop current logout timer and send stop logout packet
                client.Controller.Character.StopLogoutTimer();
                client.Controller.Character.UpdateMoveType((byte)client.Controller.Character.PreviousMoveMode);
                client.Controller.Character.Playfield.Announce(message);
                break;

            case CharacterActionType.StandUp:
            {
                // If action == Stand
                client.Controller.Character.UpdateMoveType(37);
                client.Controller.Character.Playfield.Announce(message);

                if (client.Controller.Character.InLogoutTimerPeriod())
                {
                    this.Send(client.Controller.Character, this.StopLogout(client.Controller.Character), true);
                    client.Controller.Character.StopLogoutTimer();
                }

                // Send stand up packet, and cancel timer/send stop logout packet if timer is enabled
                // ((ZoneClient)client).StandCancelLogout();
            }

            break;

            case CharacterActionType.TeamKickMember:
            {
                // Kick Team Member
            }

            break;

            case CharacterActionType.LeaveTeam:
            {
                // Leave Team

                /*
                 *                              var team = new TeamClass();
                 *                              team.LeaveTeam(client);
                 */
            }

            break;

            case CharacterActionType.TransferLeader:
            {
                // Transfer Team Leadership
            }

            break;

            case CharacterActionType.TeamRequestInvite:
            {
                // Team Join Request
                // Send Team Invite Request To Target Player

                /*
                 *                              var team = new TeamClass();
                 *                              team.SendTeamRequest(client, packet.Target);
                 */
            }

            break;

            case CharacterActionType.TeamRequestReply:
            {
                /*
                 *                               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 CharacterActionType.DeleteItem:     // Remove/Delete item
                ItemDao.Instance.Delete(
                    new
                {
                    containertype     = (int)targetIdentityType,
                    containerinstance = client.Controller.Character.Identity.Instance,
                    Id = message.Target.Instance
                });
                client.Controller.Character.BaseInventory.RemoveItem(
                    (int)targetIdentityType,
                    message.Target.Instance);

                this.AcknowledgeDelete(client.Controller.Character, message);
                break;

            case CharacterActionType.Split:     // Split?
                IItem it =
                    client.Controller.Character.BaseInventory.Pages[(int)targetIdentityType][message.Target.Instance
                    ];
                it.MultipleCount -= message.Parameter2;
                Item newItem = new Item(it.Quality, it.LowID, it.HighID);
                newItem.MultipleCount = message.Parameter2;

                client.Controller.Character.BaseInventory.Pages[(int)targetIdentityType].Add(
                    client.Controller.Character.BaseInventory.Pages[(int)targetIdentityType].FindFreeSlot(),
                    newItem);
                client.Controller.Character.BaseInventory.Pages[(int)targetIdentityType].Write();

                // Does it need to Acknowledge? Need to check that - Algorithman
                break;

            case CharacterActionType.AcceptTeamRequest:
                client.Controller.Character.BaseInventory.Pages[(int)targetIdentityType][message.Target.Instance]
                .MultipleCount +=
                    client.Controller.Character.BaseInventory.Pages[(int)targetIdentityType][message.Parameter2]
                    .MultipleCount;
                client.Controller.Character.BaseInventory.Pages[(int)targetIdentityType].Remove(message.Parameter2);
                client.Controller.Character.BaseInventory.Pages[(int)targetIdentityType].Write();
                this.Acknowledge(client.Controller.Character, message);
                break;

            // ###################################################################################
            // 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 CharacterActionType.StartSneak:

                // TODO: IF SNEAKING IS ALLOWED RUN THIS CODE.
                // TODO: Insert perception checks on receiving characters/mobs and then dont send to playfield
                // Send Action 162 : Enable Sneak

                this.Send(client.Controller.Character, this.Sneak(client.Controller.Character), true);

                // End of Enable sneak
                // TODO: IF SNEAKING IS NOT ALLOWED SEND REJECTION PACKET
                break;

            case CharacterActionType.UseItemOnItem:
            {
                Identity item1 = message.Target;
                var      item2 = new Identity {
                    Type = (IdentityType)message.Parameter1, Instance = message.Parameter2
                };

                client.Controller.Character.TradeSkillSource = new TradeSkillInfo(
                    0,
                    (int)item1.Type,
                    item1.Instance);
                client.Controller.Character.TradeSkillTarget = new TradeSkillInfo(
                    1,
                    (int)item2.Type,
                    item2.Instance);
                TradeSkillReceiver.TradeSkillBuildPressed(client, 300);

                break;
            }

            case CharacterActionType.ChangeVisualFlag:
            {
                client.Controller.Character.Stats[StatIds.visualflags].Value = message.Parameter2;

                ChatTextMessageHandler.Default.Send(
                    client.Controller.Character,
                    "Setting Visual Flag to " + message.Parameter2);
                AppearanceUpdateMessageHandler.Default.Send(client.Controller.Character);
            }

            break;

            case CharacterActionType.TradeskillSourceChanged:
                TradeSkillReceiver.TradeSkillSourceChanged(client, message.Parameter1, message.Parameter2);
                break;

            case CharacterActionType.TradeskillTargetChanged:
                TradeSkillReceiver.TradeSkillTargetChanged(client, message.Parameter1, message.Parameter2);
                break;

            case CharacterActionType.TradeskillBuildPressed:
                TradeSkillReceiver.TradeSkillBuildPressed(client, message.Target.Instance);
                break;

            default:
            {
                // unkown
                client.Controller.Character.Playfield.Announce(message);
            }

            break;
            }
        }