using System; using System.Collections; using System.Net; using System.Net.Sockets; using System.Xml; using System.Timers; using System.IO; using System.Threading; using Foole.Crypt; using Foole.Utils; using Foole.WoW; namespace BoogieBot.Common { public enum ChatMsg { CHAT_MSG_ADDON = -1, CHAT_MSG_SAY = 0x00, CHAT_MSG_PARTY = 0x01, CHAT_MSG_RAID = 0x02, CHAT_MSG_GUILD = 0x03, CHAT_MSG_OFFICER = 0x04, CHAT_MSG_YELL = 0x05, CHAT_MSG_WHISPER = 0x06, CHAT_MSG_WHISPER_INFORM = 0x07, CHAT_MSG_EMOTE = 0x08, CHAT_MSG_TEXT_EMOTE = 0x09, CHAT_MSG_SYSTEM = 0x0A, CHAT_MSG_MONSTER_SAY = 0x0B, CHAT_MSG_MONSTER_YELL = 0x0C, CHAT_MSG_MONSTER_EMOTE = 0x0D, CHAT_MSG_CHANNEL = 0x0E, CHAT_MSG_CHANNEL_JOIN = 0x0F, CHAT_MSG_CHANNEL_LEAVE = 0x10, CHAT_MSG_CHANNEL_LIST = 0x11, CHAT_MSG_CHANNEL_NOTICE = 0x12, CHAT_MSG_CHANNEL_NOTICE_USER = 0x13, CHAT_MSG_AFK = 0x14, CHAT_MSG_DND = 0x15, CHAT_MSG_IGNORED = 0x16, CHAT_MSG_SKILL = 0x17, CHAT_MSG_LOOT = 0x18, CHAT_MSG_COMBAT_MISC_INFO = 0x19, CHAT_MSG_MONSTER_WHISPER = 0x1A, CHAT_MSG_COMBAT_SELF_HITS = 0x1B, CHAT_MSG_COMBAT_SELF_MISSES = 0x1C, CHAT_MSG_COMBAT_PET_HITS = 0x1D, CHAT_MSG_COMBAT_PET_MISSES = 0x1E, CHAT_MSG_COMBAT_PARTY_HITS = 0x1F, CHAT_MSG_COMBAT_PARTY_MISSES = 0x20, CHAT_MSG_COMBAT_FRIENDLYPLAYER_HITS = 0x21, CHAT_MSG_COMBAT_FRIENDLYPLAYER_MISSES = 0x22, CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS = 0x23, CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES = 0x24, CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS = 0x25, CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES = 0x26, CHAT_MSG_COMBAT_CREATURE_VS_PARTY_HITS = 0x27, CHAT_MSG_COMBAT_CREATURE_VS_PARTY_MISSES = 0x28, CHAT_MSG_COMBAT_CREATURE_VS_CREATURE_HITS = 0x29, CHAT_MSG_COMBAT_CREATURE_VS_CREATURE_MISSES = 0x2A, CHAT_MSG_COMBAT_FRIENDLY_DEATH = 0x2B, CHAT_MSG_COMBAT_HOSTILE_DEATH = 0x2C, CHAT_MSG_COMBAT_XP_GAIN = 0x2D, CHAT_MSG_SPELL_SELF_DAMAGE = 0x2E, CHAT_MSG_SPELL_SELF_BUFF = 0x2F, CHAT_MSG_SPELL_PET_DAMAGE = 0x30, CHAT_MSG_SPELL_PET_BUFF = 0x31, CHAT_MSG_SPELL_PARTY_DAMAGE = 0x32, CHAT_MSG_SPELL_PARTY_BUFF = 0x33, CHAT_MSG_SPELL_FRIENDLYPLAYER_DAMAGE = 0x34, CHAT_MSG_SPELL_FRIENDLYPLAYER_BUFF = 0x35, CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE = 0x36, CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF = 0x37, CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE = 0x38, CHAT_MSG_SPELL_CREATURE_VS_SELF_BUFF = 0x39, CHAT_MSG_SPELL_CREATURE_VS_PARTY_DAMAGE = 0x3A, CHAT_MSG_SPELL_CREATURE_VS_PARTY_BUFF = 0x3B, CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE = 0x3C, CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF = 0x3D, CHAT_MSG_SPELL_TRADESKILLS = 0x3E, CHAT_MSG_SPELL_DAMAGESHIELDS_ON_SELF = 0x3F, CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS = 0x40, CHAT_MSG_SPELL_AURA_GONE_SELF = 0x41, CHAT_MSG_SPELL_AURA_GONE_PARTY = 0x42, CHAT_MSG_SPELL_AURA_GONE_OTHER = 0x43, CHAT_MSG_SPELL_ITEM_ENCHANTMENTS = 0x44, CHAT_MSG_SPELL_BREAK_AURA = 0x45, CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE = 0x46, CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS = 0x47, CHAT_MSG_SPELL_PERIODIC_PARTY_DAMAGE = 0x48, CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS = 0x49, CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_DAMAGE = 0x4A, CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS = 0x4B, CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE = 0x4C, CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS = 0x4D, CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE = 0x4E, CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS = 0x4F, CHAT_MSG_SPELL_FAILED_LOCALPLAYER = 0x50, CHAT_MSG_COMBAT_HONOR_GAIN = 0x51, CHAT_MSG_BG_EVENT_NEUTRAL = 0x52, CHAT_MSG_BG_EVENT_ALLIANCE = 0x53, CHAT_MSG_BG_EVENT_HORDE = 0x54, CHAT_MSG_COMBAT_FACTION_CHANGE = 0x55, CHAT_MSG_MONEY = 0x56, CHAT_MSG_RAID_LEADER = 0x57, CHAT_MSG_RAID_WARNING = 0x58, CHAT_MSG_FOREIGN_TELL = 0x59, CHAT_MSG_RAID_BOSS_EMOTE = 0x5A, CHAT_MSG_FILTERED = 0x5B, CHAT_MSG_BATTLEGROUND = 0x5C, CHAT_MSG_BATTLEGROUND_LEADER = 0x5D, CHAT_MSG_MONSTER_PARTY = 0x5E, CHAT_MSG_RESTRICTED = 0x5F, }; public delegate void ChatCB(ChatQueue que, string Username); public struct ChatQueue { public WoWGuid GUID; public byte Type; public UInt32 Language; public string Channel; public UInt32 Length; public string Message; public byte AFK; }; // Where is Undead Gutterspeak ? 4 or 5? Also PLEASE make sure NUM_LANGUAGES is correctly updated as it is used. public enum Languages { LANG_UNIVERSAL = 0x00, LANG_ORCISH = 0x01, LANG_DARNASSIAN = 0x02, LANG_TAURAHE = 0x03, LANG_DWARVISH = 0x06, LANG_COMMON = 0x07, LANG_DEMONIC = 0x08, LANG_TITAN = 0x09, LANG_THELASSIAN = 0x0A, LANG_DRACONIC = 0x0B, LANG_KALIMAG = 0x0C, LANG_GNOMISH = 0x0D, LANG_TROLL = 0x0E, LANG_GUTTERSPEAK = 0x21, LANG_DRAENEI = 0x23, NUM_LANGUAGES = 0x24 }; partial class WorldServerClient { private ArrayList ChatQueued = new ArrayList(); public ArrayList ChannelList = new ArrayList(); private void Handle_MessageChat(WoWReader wr) { byte Type = wr.ReadByte(); UInt32 Language = wr.ReadUInt32(); string channel = null; UInt64 guid = 0; WoWGuid fguid = null, fguid2 = null; UInt32 pvp_rank = 0; if ((ChatMsg)Type == ChatMsg.CHAT_MSG_CHANNEL) { channel = wr.ReadString(); pvp_rank = wr.ReadUInt32(); } guid = wr.ReadUInt64(); fguid = new WoWGuid(guid); wr.ReadInt32(); fguid2 = new WoWGuid(wr.ReadUInt64()); UInt32 Length = wr.ReadUInt32(); string Message = wr.ReadString(); byte afk = wr.ReadByte(); string username = null; ChatQueue que = new ChatQueue() ; que.GUID = fguid; que.Type = Type; que.Language = Language; if ((ChatMsg)Type == ChatMsg.CHAT_MSG_CHANNEL) que.Channel = channel; que.Length = Length; que.Message = Message; que.AFK = afk; if (fguid.GetOldGuid() == 0) { username = "System"; } else { username = BoogieCore.world.getObjectName(fguid); } if (username == null) { ChatQueued.Add(que); QueryName(guid); return; } Event e = new Event(EventType.EVENT_CHAT, Time.GetTime(), que, username); BoogieCore.Event(e); } public void SendChatMsg(ChatMsg Type, Languages Language, string Message) { if (Type != ChatMsg.CHAT_MSG_WHISPER || Type != ChatMsg.CHAT_MSG_CHANNEL) SendChatMsg(Type, Language, Message, ""); else BoogieCore.Log(LogType.Error, "Got whisper message to send without destination"); } public void SendChatMsg(ChatMsg Type, Languages Language, string Message, string To) { WoWWriter wr = new WoWWriter(OpCode.CMSG_MESSAGECHAT); wr.Write((UInt32)Type); wr.Write((UInt32)Language); if ((Type == ChatMsg.CHAT_MSG_WHISPER || Type == ChatMsg.CHAT_MSG_CHANNEL) && To != "") wr.Write(To); wr.Write(Message); Send(wr.ToArray()); } public void SendEmoteMsg(ChatMsg Type, Languages Language, string Message, string To) { WoWWriter wr = new WoWWriter(OpCode.CMSG_TEXT_EMOTE); wr.Write((UInt32)Type); wr.Write((UInt32)Language); wr.Write(Message); Send(wr.ToArray()); } public void JoinChannel(string channel, string password) { WoWWriter wr = new WoWWriter(OpCode.CMSG_JOIN_CHANNEL); wr.Write(channel); wr.Write((byte)0); Send(wr.ToArray()); ChannelList.Add(channel); Event e = new Event(EventType.EVENT_CHANNEL_JOINED, Time.GetTime(), channel); BoogieCore.Event(e); } public void PartChannel(string channel) { WoWWriter wr = new WoWWriter(OpCode.CMSG_LEAVE_CHANNEL); wr.Write(channel); Send(wr.ToArray()); ChannelList.Remove(channel); Event e = new Event(EventType.EVENT_CHANNEL_LEFT, Time.GetTime(), channel); BoogieCore.Event(e); } } }