public static void HandleCliSetSpecialization(ref PacketReader packet, ref WorldClass session) { var pChar = session.Character; uint specGroupId = packet.Read<uint>(); uint specId = SpecializationMgr.GetSpecIdByGroup(pChar, (byte)specGroupId); // check if new spec is primary or secondary if (pChar.SpecGroupCount == 1 && pChar.PrimarySpec == 0) { pChar.ActiveSpecGroup = 0; pChar.PrimarySpec = (ushort)specId; } else { pChar.ActiveSpecGroup = 1; pChar.SecondarySpec = (ushort)specId; pChar.SpecGroupCount = (byte)(pChar.SpecGroupCount + 1); } SpecializationMgr.SaveSpecInfo(pChar); SendSpecializationSpells(ref session); HandleUpdateTalentData(ref session); pChar.SetUpdateField<Int32>((int)PlayerFields.CurrentSpecID, (int)pChar.GetActiveSpecId()); ObjectHandler.HandleUpdateObjectValues(ref session); Log.Message(LogType.Debug, "Character (Guid: {0}) choosed specialization {1} for spec group {2}.", pChar.Guid, pChar.GetActiveSpecId(), pChar.ActiveSpecGroup); }
public void HandleAuthLogonChallenge(RealmClass session, PacketReader data) { Log.Message(LogType.NORMAL, "AuthLogonChallenge"); data.Skip(10); ushort ClientBuild = data.ReadUInt16(); data.Skip(8); account.Language = data.ReadStringFromBytes(4); data.Skip(4); account.IP = data.ReadIPAddress(); account.Name = data.ReadAccountName(); SQLResult result = DB.Realms.Select("SELECT id, name, password, expansion, gmlevel, securityFlags FROM accounts WHERE name = '{0}'", account.Name); var res = result.Read("id", "name", "password", "expansion", "securityFlags"); PacketWriter logonChallenge = new PacketWriter(); logonChallenge.WriteUInt8((byte)ClientLink.CMD_AUTH_LOGON_CHALLENGE); logonChallenge.WriteUInt8(0); if (result.Count != 0) { account.Id = result.Read<Int32>("id"); account.Expansion = result.Read<Byte>("expansion"); account.SecurityFlags = result.Read<Byte>("securityFlags"); DB.Realms.Execute("UPDATE accounts SET ip = '{0}', language = '{1}' WHERE id = {2}", account.IP, account.Language, account.Id); byte[] username = Encoding.UTF8.GetBytes(result.Read<String>("name").ToUpper()); byte[] password = Encoding.UTF8.GetBytes(result.Read<String>("password").ToUpper()); // WoW 5.1.0.16309 (5.1.0) if (ClientBuild == 16309) { session.SecureRemotePassword.CalculateX(username, password); byte[] buf = new byte[0x10]; SRP6.RAND_bytes(buf, 0x10); logonChallenge.WriteUInt8((byte)AuthResults.WOW_SUCCESS); logonChallenge.WriteBytes(session.SecureRemotePassword.B); logonChallenge.WriteUInt8(1); logonChallenge.WriteUInt8(session.SecureRemotePassword.g[0]); logonChallenge.WriteUInt8(0x20); logonChallenge.WriteBytes(session.SecureRemotePassword.N); logonChallenge.WriteBytes(session.SecureRemotePassword.salt); logonChallenge.WriteBytes(buf); // Security flags logonChallenge.WriteUInt8(account.SecurityFlags); // Enable authenticator if ((account.SecurityFlags & 4) != 0) logonChallenge.WriteUInt8(1); } } else logonChallenge.WriteUInt8((byte)AuthResults.WOW_FAIL_UNKNOWN_ACCOUNT); session.Send(logonChallenge); }
void HandleRealmData(byte[] data) { using (var reader = new PacketReader(data, false)) { ClientLink cmd = (ClientLink)reader.ReadUInt8(); switch (cmd) { case ClientLink.CMD_AUTH_LOGON_CHALLENGE: case ClientLink.CMD_AUTH_RECONNECT_CHALLENGE: HandleAuthLogonChallenge(reader); break; case ClientLink.CMD_AUTH_LOGON_PROOF: case ClientLink.CMD_AUTH_RECONNECT_PROOF: HandleAuthLogonProof(reader); break; case ClientLink.CMD_REALM_LIST: HandleRealmList(reader); break; default: Log.Message(LogType.NORMAL, "Received unknown ClientLink: {0}", cmd); break; } } }
public static void HandleLearnTalents(ref PacketReader packet, ref WorldClass session) { var pChar = session.Character; var talentSpells = new List<uint>(); BitUnpack BitUnpack = new BitUnpack(packet); uint talentCount = BitUnpack.GetBits<uint>(23); for (int i = 0; i < talentCount; i++) { var talentId = packet.Read<ushort>(); SpecializationMgr.AddTalent(pChar, pChar.ActiveSpecGroup, talentId, true); talentSpells.Add(CliDB.Talent.Single(talent => talent.Id == talentId).SpellId); } HandleUpdateTalentData(ref session); pChar.SetUpdateField<Int32>((int)PlayerFields.SpellCritPercentage + 0, SpecializationMgr.GetUnspentTalentRowCount(pChar), 0); ObjectHandler.HandleUpdateObjectValues(ref session); foreach (var talentSpell in talentSpells) SpellHandler.HandleLearnedSpells(ref session, new List<uint>(1) { talentSpell }); Log.Message(LogType.Debug, "Character (Guid: {0}) learned {1} talents.", pChar.Guid, talentCount); }
public static void HandleLogoutComplete(ref PacketReader packet, ref WorldClass session) { WorldMgr.DeleteSession(session.Character.Guid); PacketWriter logoutComplete = new PacketWriter(LegacyMessage.LogoutComplete); session.Send(logoutComplete); }
public static void HandleRequestUITime(ref PacketReader packet, ref WorldClass session) { PacketWriter uiTime = new PacketWriter(LegacyMessage.UITime); uiTime.WriteUnixTime(); session.Send(uiTime); }
//[Opcode(ClientMessage.LearnTalents, "16357")] public static void HandleLearnTalents(ref PacketReader packet, ref WorldClass session) { var pChar = session.Character; var talentSpells = new List<uint>(); BitUnpack BitUnpack = new BitUnpack(packet); uint talentCount = BitUnpack.GetBits<uint>(25); for (int i = 0; i < talentCount; i++) { var talentId = packet.ReadUInt16(); SpecializationMgr.AddTalent(pChar, pChar.ActiveSpecGroup, talentId, true); talentSpells.Add(DBCStorage.TalentStorage.LookupByKey(talentId).SpellId); } HandleTalentUpdate(ref session); pChar.SetUpdateField<Int32>((int)PlayerFields.SpellCritPercentage + 0, SpecializationMgr.GetUnspentTalentRowCount(pChar), 0); ObjectHandler.HandleUpdateObjectValues(ref session); // we need to send a single packet for every talent spell - stupid blizz foreach (var talentSpell in talentSpells) SpellHandler.HandleLearnedSpells(ref session, new List<uint>(1) { talentSpell }); Log.Message(LogType.DEBUG, "Character (Guid: {0}) learned {1} talents.", pChar.Guid, talentCount); }
public static void HandleCreateCharacter(ref PacketReader packet, WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); packet.Skip(1); var facialHair = packet.ReadByte(); var skin = packet.ReadByte(); var race = packet.ReadByte(); var hairStyle = packet.ReadByte(); var pClass = packet.ReadByte(); var face = packet.ReadByte(); var gender = packet.ReadByte(); var hairColor = packet.ReadByte(); var nameLength = BitUnpack.GetBits<uint>(6); var hasUnknown = BitUnpack.GetBit(); var name = Character.NormalizeName(packet.ReadString(nameLength)); if (hasUnknown) packet.ReadUInt32(); var result = DB.Characters.Select("SELECT * from characters WHERE name = ?", name); var createChar = new PacketWriter(ServerMessage.CreateChar); if (result.Count != 0) { // Name already in use createChar.WriteUInt8(0x32); session.Send(ref createChar); return; } result = DB.Characters.Select("SELECT map, zone, posX, posY, posZ, posO FROM character_creation_data WHERE race = ? AND class = ?", race, pClass); if (result.Count == 0) { createChar.WriteUInt8(0x31); session.Send(ref createChar); return; } var map = result.Read<uint>(0, "map"); var zone = result.Read<uint>(0, "zone"); var posX = result.Read<float>(0, "posX"); var posY = result.Read<float>(0, "posY"); var posZ = result.Read<float>(0, "posZ"); var posO = result.Read<float>(0, "posO"); // Allow declined names for now var characterFlags = CharacterFlag.Decline; DB.Characters.Execute("INSERT INTO characters (name, accountid, realmId, race, class, gender, skin, zone, map, x, y, z, o, face, hairstyle, haircolor, facialhair, characterFlags) VALUES (" + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", name, session.Account.Id, WorldConfig.RealmId, race, pClass, gender, skin, zone, map, posX, posY, posZ, posO, face, hairStyle, hairColor, facialHair, characterFlags); // Success createChar.WriteUInt8(0x2F); session.Send(ref createChar); }
public static void HandleUITimeRequest(ref PacketReader packet, WorldClass session) { PacketWriter uiTime = new PacketWriter(ServerMessage.UITime); uiTime.WriteUnixTime(); session.Send(ref uiTime); }
public static void HandleChatMessageYell(ref PacketReader packet, ref WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); int language = packet.ReadInt32(); uint messageLength = BitUnpack.GetBits<uint>(9); string chatMessage = packet.ReadString(messageLength); SendMessageByType(ref session, MessageType.ChatMessageYell, language, chatMessage); }
public static void HandleLoadingScreenNotify(ref PacketReader packet, WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); uint mapId = packet.Read<uint>(); bool loadingScreenState = BitUnpack.GetBit(); Log.Message(LogType.Debug, "Loading screen for map '{0}' is {1}.", mapId, loadingScreenState ? "enabled" : "disabled"); }
public static void HandleAreatrigger(ref PacketReader packet, ref WorldClass session) { var pChar = session.Character; uint triggerId = packet.ReadUInt32(); AreaTrigger areaTrigger = DBCStorage.AreaTriggerStorage[triggerId]; Log.Message(LogType.DEBUG, "Character (Guid: {0}) reached Areatrigger Id: {1}.", pChar.Guid, areaTrigger.Id); }
public static void HandlePong(ref PacketReader packet, ref WorldClass session) { uint sequence = packet.ReadUInt32(); uint latency = packet.ReadUInt32(); PacketWriter pong = new PacketWriter(JAMCCMessage.Pong); pong.WriteUInt32(sequence); session.Send(ref pong); }
public static bool InvokeHandler(ref PacketReader reader, WorldClass session, ClientMessage opcode) { if (OpcodeHandlers.ContainsKey(opcode)) { OpcodeHandlers[opcode].Invoke(ref reader, ref session); return true; } else return false; }
public static void HandleLogoutComplete(ref PacketReader packet, ref WorldClass session) { var pChar = session.Character; ObjectMgr.SavePositionToDB(pChar); WorldMgr.DeleteSession(pChar.Guid); PacketWriter logoutComplete = new PacketWriter(LegacyMessage.LogoutComplete); session.Send(logoutComplete); }
public static void HandleObjectUpdateFailed(ref PacketReader packet, WorldClass session) { byte[] guidMask = { 7, 0, 2, 3, 1, 4, 6, 5 }; byte[] guidBytes = { 1, 2, 5, 0, 3, 4, 6, 7 }; BitUnpack GuidUnpacker = new BitUnpack(packet); ulong guid = GuidUnpacker.GetPackedValue(guidMask, guidBytes); Log.Message(LogType.Debug, "ObjectUpdate failed for object with Guid {0}", guid); }
public static void HandleObjectUpdateFailed(ref PacketReader packet, ref WorldClass session) { byte[] guidMask = { 6, 1, 7, 5, 0, 4, 2, 3 }; byte[] guidBytes = { 2, 3, 7, 4, 5, 1, 0, 6 }; BitUnpack GuidUnpacker = new BitUnpack(packet); ulong guid = GuidUnpacker.GetGuid(guidMask, guidBytes); Log.Message(LogType.DEBUG, "ObjectUpdate failed for object with Guid {0}", guid); }
public static void HandleItemItemNameQuery(ref PacketReader packet, ref WorldClass session) { uint itemID = packet.ReadUInt32();//this from old structure Item pItem = Globals.ItemMgr.FindData(itemID); if (pItem != null) { SendItemNameQueryResponse(session,pItem); } }
public static void HandleTalkToGossip(ref PacketReader packet, ref WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); byte[] guidMask = { 3, 1, 7, 4, 6, 0, 2, 5 }; byte[] guidBytes = { 0, 1, 7, 6, 5, 2, 4, 3 }; var guid = BitUnpack.GetPackedValue(guidMask, guidBytes); var gossipData = GossipMgr.GetGossip<Creature>(SmartGuid.GetGuid(guid)); if (gossipData != null) { PacketWriter gossipMessage = new PacketWriter(ServerMessage.GossipMessage); BitPack BitPack = new BitPack(gossipMessage, guid); BitPack.WriteGuidMask(0, 1); BitPack.Write(0, 19); // gossipData.QuestsCount BitPack.WriteGuidMask(2); BitPack.Write(0, 20); // gossipData.OptionsCount // QuestsCount not supported. // for (int i = 0; i < gossipData.QuestsCount; i++) BitPack.WriteGuidMask(3); // OptionsCount not supported. // for (int i = 0; i < gossipData.OptionsCount; i++) BitPack.WriteGuidMask(5, 4, 6, 7); BitPack.Flush(); BitPack.WriteGuidBytes(6); // OptionsCount not supported. // for (int i = 0; i < gossipData.OptionsCount; i++) BitPack.WriteGuidBytes(0); // QuestsCount not supported. // for (int i = 0; i < gossipData.QuestsCount; i++) gossipMessage.WriteInt32(gossipData.Id); BitPack.WriteGuidBytes(4, 3); gossipMessage.WriteInt32(gossipData.FriendshipFactionID); gossipMessage.WriteInt32(gossipData.TextID); BitPack.WriteGuidBytes(7, 1, 5, 1); session.Send(ref gossipMessage); } }
public static void HandleLogoutCancel(ref PacketReader packet, WorldClass session) { cts.Cancel(); MoveHandler.HandleMoveUnroot(session); PacketWriter LogoutCancelAck = new PacketWriter(ServerMessage.LogoutCancelAck); session.Send(ref LogoutCancelAck); session.Character.setStandState(0); }
public static void HandleDisconnectReason(ref PacketReader packet, WorldClass session) { var pChar = session.Character; uint disconnectReason = packet.Read<uint>(); if (pChar != null) WorldMgr.DeleteSession(pChar.Guid); DB.Realms.Execute("UPDATE accounts SET online = 0 WHERE id = ?", session.Account.Id); Log.Message(LogType.Debug, "Account with Id {0} disconnected. Reason: {1}", session.Account.Id, disconnectReason); }
public static void HandleRealmSplitStateResponse(ref PacketReader packet, ref WorldClass session) { uint realmSplitState = 0; PacketWriter realmSplitStateResp = new PacketWriter(LegacyMessage.RealmSplitStateResponse); realmSplitStateResp.WriteUInt32(packet.ReadUInt32()); realmSplitStateResp.WriteUInt32(realmSplitState); realmSplitStateResp.WriteCString("01/01/01"); session.Send(ref realmSplitStateResp); }
public static void HandleAuthChallenge(ref PacketReader packet, ref WorldClass session) { PacketWriter authChallenge = new PacketWriter(ServerMessage.AuthChallenge, true); for (int i = 0; i < 8; i++) authChallenge.WriteUInt32(0); authChallenge.WriteUInt32((uint)new Random(DateTime.Now.Second).Next(1, 0xFFFFFFF)); authChallenge.WriteUInt8(1); session.Send(ref authChallenge); }
public static void HandleLogoutRequest(ref PacketReader packet, ref WorldClass session) { var pChar = session.Character; ObjectMgr.SavePositionToDB(pChar); PacketWriter logoutComplete = new PacketWriter(ServerMessage.LogoutComplete); session.Send(ref logoutComplete); // Destroy object after logout WorldMgr.SendToInRangeCharacter(pChar, ObjectHandler.HandleDestroyObject(ref session, pChar.Guid)); WorldMgr.DeleteSession(pChar.Guid); }
public static void HandleChatMessageSay(ref PacketReader packet, ref WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); int language = packet.ReadInt32(); uint messageLength = BitUnpack.GetBits<uint>(9); string chatMessage = packet.ReadString(messageLength); if (ChatCommandParser.CheckForCommand(chatMessage)) ChatCommandParser.ExecuteChatHandler(chatMessage, ref session); else SendMessageByType(ref session, MessageType.ChatMessageSay, language, chatMessage); }
public static void HandleCreatureStats(ref PacketReader packet, ref WorldClass session) { int id = packet.ReadInt32(); ulong guid = packet.ReadUInt64(); Creature creature = DataMgr.FindCreature(id); if (creature != null) { CreatureStats stats = creature.Stats; PacketWriter creatureStats = new PacketWriter(LegacyMessage.CreatureStats); creatureStats.WriteInt32(stats.Id); creatureStats.WriteCString(stats.Name); for (int i = 0; i < 7; i++) creatureStats.WriteCString(""); creatureStats.WriteCString(stats.SubName); creatureStats.WriteCString(""); creatureStats.WriteCString(stats.IconName); foreach (var v in stats.Flag) creatureStats.WriteInt32(v); creatureStats.WriteInt32(stats.Type); creatureStats.WriteInt32(stats.Family); creatureStats.WriteInt32(stats.Rank); foreach (var v in stats.QuestKillNpcId) creatureStats.WriteInt32(v); foreach (var v in stats.DisplayInfoId) creatureStats.WriteInt32(v); creatureStats.WriteFloat(stats.HealthModifier); creatureStats.WriteFloat(stats.PowerModifier); creatureStats.WriteUInt8(stats.RacialLeader); foreach (var v in stats.QuestItemId) creatureStats.WriteInt32(v); creatureStats.WriteInt32(stats.MovementInfoId); creatureStats.WriteInt32(stats.ExpansionRequired); session.Send(ref creatureStats); } else Log.Message(LogType.DEBUG, "Creature (Id: {0}) not found.", id); }
public static void HandleChatMessageYell(ref PacketReader packet, WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); var language = packet.Read<int>(); var messageLength = packet.ReadByte(); var message = packet.ReadString(messageLength); ChatMessageValues chatMessage = new ChatMessageValues(MessageType.ChatMessageYell, message, true, true); chatMessage.Language = (byte)language; SendMessage(ref session, chatMessage); }
public static void HandleAreatrigger(ref PacketReader packet, ref WorldClass session) { var pChar = session.Character; uint triggerId = packet.ReadUInt32(); AreaTrigger areaTrigger = DBCStorage.AreaTriggerStorage[triggerId]; Areatrigger_Teleport tele = Globals.DataMgr.FindAreatrigger_Tele((int)triggerId); if (tele != null) { //todo check level and more session.Character.session.Character.TeleportTo(tele.Target_Pos, tele.TargetMap); } Log.Message(LogType.DEBUG, "Character (Guid: {0}) reached Areatrigger Id: {1}.", pChar.Guid, areaTrigger.Id); }
public static void InvokeHandler(ref PacketReader reader, WorldClass session) { if (session.Character != null) { ulong charGuid = session.Character.Guid; if (WorldMgr.Sessions.ContainsKey(charGuid)) WorldMgr.Sessions[charGuid] = session; } if (OpcodeHandlers.ContainsKey(reader.Opcode)) OpcodeHandlers[reader.Opcode].Invoke(ref reader, session); else Log.Message(LogType.Dump, "Unknown Opcode: {0} (0x{1:X}), Length: {2}", reader.Opcode, reader.Opcode, reader.Size); }
public static void ReadAddonData(byte[] buffer, int size, WorldClass session) { // Clean possible addon data session.Addons.Clear(); string addonName; byte addonEnabled; uint addonCRC, UrlStringCRC; // Decompress received Addon Data PacketReader addonData = new PacketReader(ZLib.ZLibDecompress(buffer, true, size), false); // Get Addon number int ctr, numAddons = addonData.Read<int>(); // For each addon, read data from decoded packet and store into session for later use if needed for (ctr = 0; ctr < numAddons; ctr++) { addonName = addonData.ReadCString(); addonEnabled = addonData.Read<byte>(); addonCRC = addonData.Read<uint>(); UrlStringCRC = addonData.Read<uint>(); // Get the addon with same properties var Addon = AddonMgr.GetAddon(addonName, addonEnabled, addonCRC, UrlStringCRC); // Add if found, add default one if not. if (Addon != null) session.Addons.Add(Addon); else // Note: This can be skipped for those with no addon data. // TODO: Test that! session.Addons.Add(new Framework.ObjectDefines.Addon() { AuthType = 2, Enabled = addonEnabled, CRC = addonCRC, HasPUBData = 0, PUBData = null, Version = 1, // Fixed value HasUrlString = 0, UrlString = addonName, UrlStringCRC = UrlStringCRC }); } int addonEnd = addonData.Read<int>(); // Unknown }