Exemplo n.º 1
0
    public static void On_SMSG_CHAR_ENUM(ref Packets.PacketClass Packet)
    {
        Console.WriteLine("[{0}][World] Received Character List.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
        var NumChars = Packet.GetInt8();

        if (NumChars > 0)
        {
            for (byte i = 1, loopTo = NumChars; i <= loopTo; i++)
            {
                var GUID        = Packet.GetUInt64();
                var Name        = Packet.GetString();
                var Race        = Packet.GetInt8();
                var Classe      = Packet.GetInt8();
                var Gender      = Packet.GetInt8();
                var Skin        = Packet.GetInt8();
                var Face        = Packet.GetInt8();
                var HairStyle   = Packet.GetInt8();
                var HairColor   = Packet.GetInt8();
                var FacialHair  = Packet.GetInt8();
                var Level       = Packet.GetInt8();
                var Zone        = Packet.GetInt32();
                var Map         = Packet.GetInt32();
                var PosX        = Packet.GetFloat();
                var PosY        = Packet.GetFloat();
                var PosZ        = Packet.GetFloat();
                var GuildID     = Packet.GetUInt32();
                var PlayerState = Packet.GetUInt32();
                var RestState   = Packet.GetInt8();
                var PetInfoID   = Packet.GetUInt32();
                var PetLevel    = Packet.GetUInt32();
                var PetFamilyID = Packet.GetUInt32();
                Console.WriteLine("[{0}][World] Logging in with character [{1}].", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"), Name);
                Worldserver.CharacterGUID = GUID;
                Packets.PacketClass Response = new(OPCODES.CMSG_PLAYER_LOGIN);
                Response.AddUInt64(GUID);
                Worldserver.Send(Response);
                Response.Dispose();
                break;

                // Skip the equipment
                Packet.Offset += 20 * 9;
            }
        }
        else
        {
            Console.WriteLine("[{0}][World] No characters found.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
        }
    }
Exemplo n.º 2
0
    public static void On_SMSG_MESSAGECHAT(ref Packets.PacketClass Packet)
    {
        ChatMsg   msgType     = (ChatMsg)Packet.GetInt8();
        LANGUAGES msgLanguage = (LANGUAGES)Packet.GetInt32();

        switch (msgType)
        {
        case ChatMsg.CHAT_MSG_WHISPER:
        {
            var SenderGuid = (ulong)Packet.GetInt64();
            var ByteCount  = Packet.GetInt32();
            var Message    = Packet.GetString();
            var ChatFlag   = Packet.GetInt8();
            Console.WriteLine("Answer: " + Message);
            break;
        }
        }
    }
Exemplo n.º 3
0
 public void On_CMSG_PETITION_QUERY(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     checked
     {
         if (packet.Data.Length - 1 < 17)
         {
             return;
         }
         packet.GetInt16();
         int   PetitionGUID = packet.GetInt32();
         ulong itemGuid     = packet.GetUInt64();
         WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_PETITION_QUERY [pGUID={3} iGUID={2:X}]", client.IP, client.Port, itemGuid, PetitionGUID);
         DataTable MySQLQuery = new();
         WorldServiceLocator._WorldServer.CharacterDatabase.Query("SELECT * FROM petitions WHERE petition_itemGuid = " + Conversions.ToString(itemGuid - WorldServiceLocator._Global_Constants.GUID_ITEM) + ";", ref MySQLQuery);
         if (MySQLQuery.Rows.Count != 0)
         {
             Packets.PacketClass response = new(Opcodes.SMSG_PETITION_QUERY_RESPONSE);
             response.AddInt32(MySQLQuery.Rows[0].As <int>("petition_id"));
             response.AddUInt64(MySQLQuery.Rows[0].As <ulong>("petition_owner"));
             response.AddString(MySQLQuery.Rows[0].As <string>("petition_name"));
             response.AddInt8(0);
             if (MySQLQuery.Rows[0].As <byte>("petition_type") == 9)
             {
                 response.AddInt32(9);
                 response.AddInt32(9);
                 response.AddInt32(0);
             }
             else
             {
                 response.AddInt32(MySQLQuery.Rows[0].As <byte>("petition_type") - 1);
                 response.AddInt32(MySQLQuery.Rows[0].As <byte>("petition_type") - 1);
                 response.AddInt32(MySQLQuery.Rows[0].As <byte>("petition_type"));
             }
             response.AddInt32(0);
             response.AddInt32(0);
             response.AddInt32(0);
             response.AddInt32(0);
             response.AddInt16(0);
             response.AddInt32(0);
             response.AddInt32(0);
             response.AddInt32(0);
             response.AddInt32(0);
             if (MySQLQuery.Rows[0].As <byte>("petition_type") == 9)
             {
                 response.AddInt32(0);
             }
             else
             {
                 response.AddInt32(1);
             }
             client.Send(ref response);
             response.Dispose();
         }
     }
 }
Exemplo n.º 4
0
 public void On_CMSG_TUTORIAL_FLAG(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     checked
     {
         if (packet.Data.Length - 1 >= 9)
         {
             packet.GetInt16();
             var Flag = packet.GetInt32();
             WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_TUTORIAL_FLAG [flag={2}]", client.IP, client.Port, Flag);
             client.Character.TutorialFlags[Flag / 8] = (byte)(client.Character.TutorialFlags[Flag / 8] + (1 << (7 - (Flag % 8))));
             client.Character.SaveCharacter();
         }
     }
 }
Exemplo n.º 5
0
 public void On_CMSG_MAIL_MARK_AS_READ(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     checked
     {
         if (packet.Data.Length - 1 >= 17)
         {
             packet.GetInt16();
             var GameObjectGUID = packet.GetUInt64();
             var MailID         = packet.GetInt32();
             WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_MAIL_MARK_AS_READ [MailID={2}]", client.IP, client.Port, MailID);
             var MailTime = (int)(WorldServiceLocator._Functions.GetTimestamp(DateAndTime.Now) + 259200L);
             WorldServiceLocator._WorldServer.CharacterDatabase.Update(string.Format("UPDATE characters_mail SET mail_read = 1, mail_time = {1} WHERE mail_id = {0} AND mail_read < 2;", MailID, MailTime));
         }
     }
 }
Exemplo n.º 6
0
 public void On_CMSG_WORLD_TELEPORT(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_WORLD_TELEPORT", client.IP, client.Port);
     if (client.Access >= AccessLevel.GameMaster)
     {
         packet.GetInt16();
         int   Time = packet.GetInt32();
         uint  Map  = packet.GetUInt32();
         float X    = packet.GetFloat();
         float Y    = packet.GetFloat();
         float Z    = packet.GetFloat();
         float O    = packet.GetFloat();
         client.Character.Teleport(X, Y, Z, O, checked ((int)Map));
     }
 }
Exemplo n.º 7
0
 public void On_CMSG_MAIL_DELETE(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     if (checked (packet.Data.Length - 1) >= 17)
     {
         packet.GetInt16();
         var GameObjectGUID = packet.GetUInt64();
         var MailID         = packet.GetInt32();
         WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_MAIL_DELETE [MailID={2}]", client.IP, client.Port, MailID);
         WorldServiceLocator._WorldServer.CharacterDatabase.Update($"DELETE FROM characters_mail WHERE mail_id = {MailID};");
         Packets.PacketClass response = new(Opcodes.SMSG_SEND_MAIL_RESULT);
         response.AddInt32(MailID);
         response.AddInt32(4);
         response.AddInt32(0);
         client.Send(ref response);
         response.Dispose();
     }
 }
Exemplo n.º 8
0
 public void On_CMSG_OFFER_PETITION(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     if (checked (packet.Data.Length - 1) >= 21)
     {
         packet.GetInt16();
         int   PetitionType = packet.GetInt32();
         ulong itemGuid     = packet.GetUInt64();
         ulong GUID         = packet.GetUInt64();
         if (WorldServiceLocator._WorldServer.CHARACTERs.ContainsKey(GUID) && WorldServiceLocator._WorldServer.CHARACTERs[GUID].IsHorde == client.Character.IsHorde)
         {
             WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_OFFER_PETITION [GUID={2:X} Petition={3}]", client.IP, client.Port, GUID, itemGuid);
             Dictionary <ulong, WS_PlayerData.CharacterObject> cHARACTERs;
             ulong key;
             WS_PlayerData.CharacterObject objCharacter = (cHARACTERs = WorldServiceLocator._WorldServer.CHARACTERs)[key = GUID];
             SendPetitionSignatures(ref objCharacter, itemGuid);
             cHARACTERs[key] = objCharacter;
         }
     }
 }
Exemplo n.º 9
0
 public void On_CMSG_EMOTE(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     if (checked (packet.Data.Length - 1) >= 9)
     {
         packet.GetInt16();
         var emoteID = packet.GetInt32();
         WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_EMOTE [{2}]", client.IP, client.Port, emoteID);
         Packets.PacketClass response = new(Opcodes.SMSG_EMOTE);
         try
         {
             response.AddInt32(emoteID);
             response.AddUInt64(client.Character.GUID);
             client.Character.SendToNearPlayers(ref response);
         }
         finally
         {
             response.Dispose();
         }
     }
 }
Exemplo n.º 10
0
 public void On_CMSG_MAIL_RETURN_TO_SENDER(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     checked
     {
         if (packet.Data.Length - 1 >= 17)
         {
             packet.GetInt16();
             var GameObjectGUID = packet.GetUInt64();
             var MailID         = packet.GetInt32();
             WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_MAIL_RETURN_TO_SENDER [MailID={2}]", client.IP, client.Port, MailID);
             var MailTime = (int)(WorldServiceLocator._Functions.GetTimestamp(DateAndTime.Now) + 2592000L);
             WorldServiceLocator._WorldServer.CharacterDatabase.Update(string.Format("UPDATE characters_mail SET mail_time = {1}, mail_read = 0, mail_receiver = (mail_receiver + mail_sender), mail_sender = (mail_receiver - mail_sender), mail_receiver = (mail_receiver - mail_sender) WHERE mail_id = {0};", MailID, MailTime));
             Packets.PacketClass response = new(Opcodes.SMSG_SEND_MAIL_RESULT);
             response.AddInt32(MailID);
             response.AddInt32(3);
             response.AddInt32(0);
             client.Send(ref response);
             response.Dispose();
         }
     }
 }
Exemplo n.º 11
0
    public void On_CMSG_MAIL_TAKE_ITEM(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
    {
        checked
        {
            if (packet.Data.Length - 1 < 17)
            {
                return;
            }
            packet.GetInt16();
            var GameObjectGUID = packet.GetUInt64();
            var MailID         = packet.GetInt32();
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_MAIL_TAKE_ITEM [MailID={2}]", client.IP, client.Port, MailID);
            try
            {
                DataTable MySQLQuery = new();
                WorldServiceLocator._WorldServer.CharacterDatabase.Query($"SELECT mail_cod, mail_sender, item_guid FROM characters_mail WHERE mail_id = {MailID} AND mail_receiver = {client.Character.GUID};", ref MySQLQuery);
                if (MySQLQuery.Rows.Count == 0)
                {
                    Packets.PacketClass response4 = new(Opcodes.SMSG_SEND_MAIL_RESULT);
                    response4.AddInt32(MailID);
                    response4.AddInt32(2);
                    response4.AddInt32(6);
                    client.Send(ref response4);
                    response4.Dispose();
                    return;
                }
                if (!Operators.ConditionalCompareObjectNotEqual(MySQLQuery.Rows[0]["mail_cod"], 0, TextCompare: false))
                {
                    goto IL_02b9;
                }
                if (Operators.ConditionalCompareObjectLess(client.Character.Copper, MySQLQuery.Rows[0]["mail_cod"], TextCompare: false))
                {
                    Packets.PacketClass noMoney = new(Opcodes.SMSG_SEND_MAIL_RESULT);
                    noMoney.AddInt32(MailID);
                    noMoney.AddInt32(0);
                    noMoney.AddInt32(3);
                    client.Send(ref noMoney);
                    noMoney.Dispose();
                    return;
                }
                ref var copper = ref client.Character.Copper;
                copper = Conversions.ToUInteger(Operators.SubtractObject(copper, MySQLQuery.Rows[0]["mail_cod"]));
                WorldServiceLocator._WorldServer.CharacterDatabase.Update($"UPDATE characters_mail SET mail_cod = 0 WHERE mail_id = {MailID};");
                var MailTime = (int)(WorldServiceLocator._Functions.GetTimestamp(DateAndTime.Now) + 2592000L);
                WorldServiceLocator._WorldServer.CharacterDatabase.Update(string.Format("INSERT INTO characters_mail (mail_sender, mail_receiver, mail_subject, mail_body, mail_item_guid, mail_money, mail_COD, mail_time, mail_read, mail_type) VALUES \r\n                        ({0},{1},'{2}','{3}',{4},{5},{6},{7},{8},{9});", client.Character.GUID, MySQLQuery.Rows[0]["mail_sender"], "", "", 0, MySQLQuery.Rows[0]["mail_cod"], 0, MailTime, MailReadInfo.COD, 0));
IL_02b9:
                if (Operators.ConditionalCompareObjectEqual(MySQLQuery.Rows[0]["item_guid"], 0, TextCompare: false))
                {
                    Packets.PacketClass response3 = new(Opcodes.SMSG_SEND_MAIL_RESULT);
                    response3.AddInt32(MailID);
                    response3.AddInt32(2);
                    response3.AddInt32(6);
                    client.Send(ref response3);
                    response3.Dispose();
                    return;
                }
                var tmpItem = WorldServiceLocator._WS_Items.LoadItemByGUID(MySQLQuery.Rows[0].As <ulong>("item_guid"));
                tmpItem.OwnerGUID = client.Character.GUID;
                tmpItem.Save();
                if (client.Character.ItemADD(ref tmpItem))
                {
                    WorldServiceLocator._WorldServer.CharacterDatabase.Update($"UPDATE characters_mail SET item_guid = 0 WHERE mail_id = {MailID};");
                    WorldServiceLocator._WorldServer.CharacterDatabase.Update($"DELETE FROM mail_items WHERE mail_id = {MailID};");
                    Packets.PacketClass response2 = new(Opcodes.SMSG_SEND_MAIL_RESULT);
                    response2.AddInt32(MailID);
                    response2.AddInt32(2);
                    response2.AddInt32(0);
                    client.Send(ref response2);
                    response2.Dispose();
                }
                else
                {
                    tmpItem.Dispose();
                    Packets.PacketClass response = new(Opcodes.SMSG_SEND_MAIL_RESULT);
                    response.AddInt32(MailID);
                    response.AddInt32(2);
                    response.AddInt32(1);
                    client.Send(ref response);
                    response.Dispose();
                }
                client.Character.Save();
            }
Exemplo n.º 12
0
        public void On_CMSG_MESSAGECHAT(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
        {
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_MESSAGECHAT", client.IP, client.Port);
            if (checked (packet.Data.Length - 1) < 14 && client.Character != null)
            {
                return;
            }
            packet.GetInt16();
            ChatMsg   msgType     = (ChatMsg)packet.GetInt32();
            LANGUAGES msgLanguage = (LANGUAGES)packet.GetInt32();

            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_MESSAGECHAT [{2}:{3}]", client.IP, client.Port, msgType, msgLanguage);
            if (client.Character.Spell_Language != (LANGUAGES)(-1))
            {
                msgLanguage = client.Character.Spell_Language;
            }
            switch (msgType)
            {
            case ChatMsg.CHAT_MSG_SAY:
            case ChatMsg.CHAT_MSG_YELL:
            case ChatMsg.CHAT_MSG_WHISPER:
            case ChatMsg.CHAT_MSG_EMOTE:
            {
                string Message3 = packet.GetString();
                if (Message3.StartsWith(WorldServiceLocator._ConfigurationProvider.GetConfiguration().CommandCharacter) && client.Character.Access > AccessLevel.Player)
                {
                    Message3 = Message3.Remove(0, 1);
                    Packets.PacketClass toCommand = WorldServiceLocator._Functions.BuildChatMessage(2147483647uL, Message3, ChatMsg.CHAT_MSG_SYSTEM, LANGUAGES.LANG_GLOBAL);
                    try
                    {
                        client.Send(ref toCommand);
                    }
                    finally
                    {
                        toCommand.Dispose();
                    }
                    WorldServiceLocator._WS_Commands.OnCommand(ref client, Message3);
                }
                else
                {
                    client.Character.SendChatMessage(ref client.Character, Message3, msgType, (int)msgLanguage, "", SendToMe: true);
                }
                break;
            }

            case ChatMsg.CHAT_MSG_AFK:
            {
                string Message = packet.GetString();
                if ((Operators.CompareString(Message, "", TextCompare: false) == 0 || !client.Character.AFK) && !client.Character.IsInCombat)
                {
                    client.Character.AFK = !client.Character.AFK;
                    if (client.Character.AFK && client.Character.DND)
                    {
                        client.Character.DND = false;
                    }
                    client.Character.SetUpdateFlag(190, (int)client.Character.cPlayerFlags);
                    client.Character.SendCharacterUpdate();
                }
                break;
            }

            case ChatMsg.CHAT_MSG_DND:
            {
                string Message2 = packet.GetString();
                if (Operators.CompareString(Message2, "", TextCompare: false) == 0 || !client.Character.DND)
                {
                    client.Character.DND = !client.Character.DND;
                    if (client.Character.DND && client.Character.AFK)
                    {
                        client.Character.AFK = false;
                    }
                    client.Character.SetUpdateFlag(190, (int)client.Character.cPlayerFlags);
                    client.Character.SendCharacterUpdate();
                }
                break;
            }

            case ChatMsg.CHAT_MSG_PARTY:
            case ChatMsg.CHAT_MSG_RAID:
            case ChatMsg.CHAT_MSG_CHANNEL:
            case ChatMsg.CHAT_MSG_RAID_LEADER:
            case ChatMsg.CHAT_MSG_RAID_WARNING:
                WorldServiceLocator._WorldServer.Log.WriteLine(LogType.WARNING, "This chat message type should not be here!");
                break;

            default:
                WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "[{0}:{1}] Unknown chat message [msgType={2}, msgLanguage={3}]", client.IP, client.Port, msgType, msgLanguage);
                WorldServiceLocator._Packets.DumpPacket(packet.Data, client);
                break;
            }
        }
Exemplo n.º 13
0
 public void On_CMSG_PETITION_BUY(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     checked
     {
         if (packet.Data.Length - 1 < 26)
         {
             return;
         }
         packet.GetInt16();
         ulong GUID = packet.GetUInt64();
         packet.GetInt64();
         packet.GetInt32();
         string Name = packet.GetString();
         if (packet.Data.Length - 1 < 26 + Name.Length + 40 + 2 + 1 + 4 + 4)
         {
             return;
         }
         packet.GetInt64();
         packet.GetInt64();
         packet.GetInt64();
         packet.GetInt64();
         packet.GetInt64();
         packet.GetInt16();
         packet.GetInt8();
         int Index = packet.GetInt32();
         packet.GetInt32();
         if (!WorldServiceLocator._WorldServer.WORLD_CREATUREs.ContainsKey(GUID) || (WorldServiceLocator._WorldServer.WORLD_CREATUREs[GUID].CreatureInfo.cNpcFlags & 0x200) == 0)
         {
             return;
         }
         WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_PETITION_BUY [GuildName={2}]", client.IP, client.Port, Name);
         if ((ulong)client.Character.GuildID != 0)
         {
             return;
         }
         int       CharterID    = WorldServiceLocator._Global_Constants.PETITION_GUILD;
         int       CharterPrice = WorldServiceLocator._Global_Constants.PETITION_GUILD_PRICE;
         DataTable q            = new();
         WorldServiceLocator._WorldServer.CharacterDatabase.Query($"SELECT guild_id FROM guilds WHERE guild_name = '{Name}'", ref q);
         if (q.Rows.Count > 0)
         {
             SendGuildResult(ref client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_NAME_EXISTS, Name);
         }
         q.Clear();
         if (!WorldServiceLocator._Functions.ValidateGuildName(Name))
         {
             SendGuildResult(ref client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_NAME_INVALID, Name);
         }
         if (!WorldServiceLocator._WorldServer.ITEMDatabase.ContainsKey(CharterID))
         {
             Packets.PacketClass response2 = new(Opcodes.SMSG_BUY_FAILED);
             response2.AddUInt64(GUID);
             response2.AddInt32(CharterID);
             response2.AddInt8(0);
             client.Send(ref response2);
             response2.Dispose();
             return;
         }
         if (client.Character.Copper < CharterPrice)
         {
             Packets.PacketClass response = new(Opcodes.SMSG_BUY_FAILED);
             response.AddUInt64(GUID);
             response.AddInt32(CharterID);
             response.AddInt8(2);
             client.Send(ref response);
             response.Dispose();
             return;
         }
         ref uint copper = ref client.Character.Copper;
         copper = (uint)(copper - CharterPrice);
         client.Character.SetUpdateFlag(1176, client.Character.Copper);
         client.Character.SendCharacterUpdate(toNear: false);
         ItemObject tmpItem = new(CharterID, client.Character.GUID)
         {
             StackCount = 1
         };
         tmpItem.AddEnchantment((int)(tmpItem.GUID - WorldServiceLocator._Global_Constants.GUID_ITEM), 0);
         if (client.Character.ItemADD(ref tmpItem))
         {
             WorldServiceLocator._WorldServer.CharacterDatabase.Update(string.Format("INSERT INTO petitions (petition_id, petition_itemGuid, petition_owner, petition_name, petition_type, petition_signedMembers) VALUES ({0}, {0}, {1}, '{2}', {3}, 0);", tmpItem.GUID - WorldServiceLocator._Global_Constants.GUID_ITEM, client.Character.GUID - WorldServiceLocator._Global_Constants.GUID_PLAYER, Name, 9));
         }
         else
         {
             tmpItem.Delete();
         }
     }
 }
Exemplo n.º 14
0
    public void On_CMSG_ACTIVATETAXI(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
    {
        if (checked (packet.Data.Length - 1) < 21)
        {
            return;
        }
        packet.GetInt16();
        var guid    = packet.GetUInt64();
        var srcNode = packet.GetInt32();
        var dstNode = packet.GetInt32();

        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_ACTIVATETAXI [taxiGUID={2:X} srcNode={3} dstNode={4}]", client.IP, client.Port, guid, srcNode, dstNode);
        if (!WorldServiceLocator._WorldServer.WORLD_CREATUREs.ContainsKey(guid) || (WorldServiceLocator._WorldServer.WORLD_CREATUREs[guid].CreatureInfo.cNpcFlags & 8) == 0)
        {
            SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXINOVENDORNEARBY);
            return;
        }
        if (client.Character.LogoutTimer != null)
        {
            SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXIPLAYERBUSY);
            return;
        }
        if (((uint)client.Character.cUnitFlags & 4u) != 0)
        {
            SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXINOTSTANDING);
            return;
        }
        if ((int)client.Character.ShapeshiftForm > 0 && client.Character.ShapeshiftForm != ShapeshiftForm.FORM_BERSERKERSTANCE && client.Character.ShapeshiftForm != ShapeshiftForm.FORM_BATTLESTANCE && client.Character.ShapeshiftForm != ShapeshiftForm.FORM_DEFENSIVESTANCE && client.Character.ShapeshiftForm != ShapeshiftForm.FORM_SHADOW)
        {
            SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXIPLAYERSHAPESHIFTED);
            return;
        }
        if (client.Character.Mount != 0)
        {
            SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXIPLAYERALREADYMOUNTED);
            return;
        }
        if (!WorldServiceLocator._WS_DBCDatabase.TaxiNodes.ContainsKey(srcNode) || !WorldServiceLocator._WS_DBCDatabase.TaxiNodes.ContainsKey(dstNode))
        {
            SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXINOSUCHPATH);
            return;
        }
        int mount;

        if (client.Character.IsHorde)
        {
            if (!WorldServiceLocator._WorldServer.CREATURESDatabase.ContainsKey(WorldServiceLocator._WS_DBCDatabase.TaxiNodes[srcNode].HordeMount))
            {
                mount = new CreatureInfo(WorldServiceLocator._WS_DBCDatabase.TaxiNodes[srcNode].HordeMount).GetFirstModel;
            }
            else
            {
                mount = WorldServiceLocator._WorldServer.CREATURESDatabase[WorldServiceLocator._WS_DBCDatabase.TaxiNodes[srcNode].HordeMount].ModelA1;
            }
        }
        else if (!WorldServiceLocator._WorldServer.CREATURESDatabase.ContainsKey(WorldServiceLocator._WS_DBCDatabase.TaxiNodes[srcNode].AllianceMount))
        {
            mount = new CreatureInfo(WorldServiceLocator._WS_DBCDatabase.TaxiNodes[srcNode].AllianceMount).GetFirstModel;
        }
        else
        {
            mount = WorldServiceLocator._WorldServer.CREATURESDatabase[WorldServiceLocator._WS_DBCDatabase.TaxiNodes[srcNode].AllianceMount].ModelA2;
        }
        if (mount == 0)
        {
            SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXIUNSPECIFIEDSERVERERROR);
            return;
        }
        checked
        {
            int totalCost   = default;
            var discountMod = client.Character.GetDiscountMod(WorldServiceLocator._WorldServer.WORLD_CREATUREs[guid].Faction);
            foreach (var taxiPath in WorldServiceLocator._WS_DBCDatabase.TaxiPaths)
            {
                if (taxiPath.Value.TFrom == srcNode && taxiPath.Value.TTo == dstNode)
                {
                    totalCost = (int)Math.Round(totalCost + (taxiPath.Value.Price * discountMod));
                    break;
                }
            }
            if (client.Character.Copper < totalCost)
            {
                SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXINOTENOUGHMONEY);
                return;
            }
            ref var copper = ref client.Character.Copper;
            copper = (uint)(copper - totalCost);
            client.Character.TaxiNodes.Clear();
            client.Character.TaxiNodes.Enqueue(srcNode);
            client.Character.TaxiNodes.Enqueue(dstNode);
            SendActivateTaxiReply(ref client, ActivateTaxiReplies.ERR_TAXIOK);
            TaxiTake(client.Character, mount);
            TaxiMove(client.Character, discountMod);
        }
Exemplo n.º 15
0
            public void HandleResponse(ref Packets.PacketClass p)
            {
                foreach (CheatCheck Check in Checks)
                {
                    switch (Check.Type)
                    {
                    case CheckTypes.MEM_CHECK:
                    {
                        byte   result = p.GetInt8();
                        byte[] bytes  = p.GetByteArray();
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] [{0}] Result={1} Bytes=0x{2}", Check.Type, result, BitConverter.ToString(bytes).Replace("-", ""));
                        break;
                    }

                    case CheckTypes.PAGE_CHECK_A_B:
                    {
                        byte result2 = p.GetInt8();
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] [{0}] Result={1}", Check.Type, result2);
                        break;
                    }

                    case CheckTypes.MPQ_CHECK:
                    {
                        byte   result3 = p.GetInt8();
                        byte[] hash    = p.GetByteArray();
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] [{0}] Result={1} Hash=0x{2}", Check.Type, result3, BitConverter.ToString(hash).Replace("-", ""));
                        break;
                    }

                    case CheckTypes.LUA_STR_CHECK:
                    {
                        byte   unk  = p.GetInt8();
                        string data = p.GetString2();
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] [{0}] Result={1} Data={2}", Check.Type, unk, data);
                        break;
                    }

                    case CheckTypes.DRIVER_CHECK:
                    {
                        byte result4 = p.GetInt8();
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] [{0}] Result={1}", Check.Type, result4);
                        break;
                    }

                    case CheckTypes.TIMING_CHECK:
                    {
                        byte result5 = p.GetInt8();
                        int  time    = p.GetInt32();
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] [{0}] Result={1} Time={2}", Check.Type, result5, time);
                        break;
                    }

                    case CheckTypes.PROC_CHECK:
                    {
                        byte result6 = p.GetInt8();
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] [{0}] Result={1}", Check.Type, result6);
                        break;
                    }

                    case CheckTypes.MODULE_CHECK:
                        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] [{0}]", Check.Type);
                        break;
                    }
                }
                Reset();
            }
Exemplo n.º 16
0
    public void On_CMSG_TEXT_EMOTE(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
    {
        checked
        {
            if (packet.Data.Length - 1 < 21 && client.Character != null)
            {
                return;
            }
            packet.GetInt16();
            var TextEmote = packet.GetInt32();
            var Unk       = packet.GetInt32();
            var GUID      = packet.GetUInt64();
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_TEXT_EMOTE [TextEmote={2} Unk={3}]", client.IP, client.Port, TextEmote, Unk);
            if (WorldServiceLocator._CommonGlobalFunctions.GuidIsCreature(GUID) && WorldServiceLocator._WorldServer.WORLD_CREATUREs.ContainsKey(GUID))
            {
                ref var character = ref client.Character;
                ulong   key;
                Dictionary <ulong, WS_Creatures.CreatureObject> WORLD_CREATUREs;
                var creature = (WORLD_CREATUREs = WorldServiceLocator._WorldServer.WORLD_CREATUREs)[key = GUID];
                WorldServiceLocator._WorldServer.ALLQUESTS.OnQuestDoEmote(ref character, ref creature, TextEmote);
                WORLD_CREATUREs[key] = creature;
                if (WorldServiceLocator._WorldServer.WORLD_CREATUREs[GUID].aiScript is not null and WS_Creatures_AI.GuardAI)
                {
                    ((WS_Creatures_AI.GuardAI)WorldServiceLocator._WorldServer.WORLD_CREATUREs[GUID].aiScript).OnEmote(TextEmote);
                }
            }
            if (WorldServiceLocator._WS_DBCDatabase.EmotesText.ContainsKey(TextEmote))
            {
                switch (WorldServiceLocator._WS_DBCDatabase.EmotesState[WorldServiceLocator._WS_DBCDatabase.EmotesText[TextEmote]])
                {
                case 0:
                    client.Character.DoEmote(WorldServiceLocator._WS_DBCDatabase.EmotesText[TextEmote]);
                    break;

                case 2:
                    client.Character.cEmoteState = WorldServiceLocator._WS_DBCDatabase.EmotesText[TextEmote];
                    client.Character.SetUpdateFlag(148, client.Character.cEmoteState);
                    client.Character.SendCharacterUpdate();
                    break;

                default:
                    break;
                }
            }
            var secondName = "";
            if (decimal.Compare(new decimal(GUID), 0m) > 0)
            {
                if (WorldServiceLocator._WorldServer.CHARACTERs.ContainsKey(GUID))
                {
                    secondName = WorldServiceLocator._WorldServer.CHARACTERs[GUID].Name;
                }
                else if (WorldServiceLocator._WorldServer.WORLD_CREATUREs.ContainsKey(GUID))
                {
                    secondName = WorldServiceLocator._WorldServer.WORLD_CREATUREs[GUID].Name;
                }
            }
            Packets.PacketClass SMSG_TEXT_EMOTE = new(Opcodes.SMSG_TEXT_EMOTE);
            try
            {
                SMSG_TEXT_EMOTE.AddUInt64(client.Character.GUID);
                SMSG_TEXT_EMOTE.AddInt32(TextEmote);
                SMSG_TEXT_EMOTE.AddInt32(255);
                SMSG_TEXT_EMOTE.AddInt32(secondName.Length + 1);
                SMSG_TEXT_EMOTE.AddString(secondName);
                client.Character.SendToNearPlayers(ref SMSG_TEXT_EMOTE);
            }
            finally
            {
                SMSG_TEXT_EMOTE.Dispose();
            }
        }