public static void HandleDBQueryBulk(ref PacketReader packet, ref WorldClass session) { var type = (DBTypes)packet.ReadUInt32(); var unknown = packet.ReadInt32(); var id = packet.ReadInt32(); switch (type) { case DBTypes.BroadcastText: { var broadCastText = GossipMgr.GetBroadCastText<Creature>(id); PacketWriter dbReply = new PacketWriter(JAMCMessage.DBReply); BitPack BitPack = new BitPack(dbReply); var textLength = broadCastText.Text.Length; var alternativeTextLength = broadCastText.AlternativeText.Length; var size = 48; if (textLength == 0 || alternativeTextLength == 0) size += 1; size += textLength + alternativeTextLength; dbReply.WriteUInt32((uint)size); dbReply.WriteInt32(broadCastText.Id); dbReply.WriteInt32(broadCastText.Language); dbReply.WriteUInt16((ushort)broadCastText.Text.Length); dbReply.WriteString(broadCastText.Text); dbReply.WriteUInt16((ushort)broadCastText.AlternativeText.Length); dbReply.WriteString(broadCastText.AlternativeText); broadCastText.Emotes.ForEach(emote => dbReply.WriteInt32(emote)); dbReply.WriteUInt32(1); dbReply.WriteUInt32(0); // UnixTime, last change server side dbReply.WriteUInt32((uint)DBTypes.BroadcastText); dbReply.WriteInt32(broadCastText.Id); session.Send(ref dbReply); break; } } }
public static void HandleBroadcastText(ref WorldClass session, int id) { var broadCastText = GossipMgr.GetBroadCastText<Creature>(id); PacketWriter dbReply = new PacketWriter(ServerMessage.DBReply); BitPack BitPack = new BitPack(dbReply); var textLength = broadCastText.Text.Length; var alternativeTextLength = broadCastText.AlternativeText.Length; var size = 48; if (textLength == 0 || alternativeTextLength == 0) size += 1; size += textLength + alternativeTextLength; dbReply.WriteUInt32(0); // UnixTime, last change server side dbReply.WriteUInt32((uint)DBTypes.BroadcastText); dbReply.WriteUInt32((uint)size); dbReply.WriteInt32(broadCastText.Id); dbReply.WriteInt32(broadCastText.Language); dbReply.WriteUInt16((ushort)broadCastText.Text.Length); dbReply.WriteString(broadCastText.Text); dbReply.WriteUInt16((ushort)broadCastText.AlternativeText.Length); dbReply.WriteString(broadCastText.AlternativeText); broadCastText.Emotes.ForEach(emote => dbReply.WriteInt32(emote)); dbReply.WriteUInt32(1); dbReply.WriteInt32(broadCastText.Id); session.Send(ref dbReply); }
public static void HandleUpdateObjectValues(ref WorldClass session) { WorldObject character = session.Character; PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8((byte)UpdateType.Values); updateObject.WriteGuid(character.Guid); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); session.Send(ref updateObject); }
public static void SendMessageByType(ref WorldClass session, MessageType type, int language, string chatMessage) { PacketWriter messageChat = new PacketWriter(LegacyMessage.MessageChat); ulong guid = session.Character.Guid; messageChat.WriteUInt8((byte)type); messageChat.WriteInt32(language); messageChat.WriteUInt64(guid); messageChat.WriteUInt32(0); messageChat.WriteUInt64(guid); messageChat.WriteUInt32((uint)chatMessage.Length + 1); messageChat.WriteCString(chatMessage); messageChat.WriteUInt16(0); session.Send(ref messageChat); }
public static void HandleUpdateObject(ref PacketReader packet, ref WorldClass session) { Character character = session.Character; PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); // Grml sandbox style... updateObject.WriteUInt8(1); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8(4); UpdateFlag updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation | UpdateFlag.Self | UpdateFlag.Unknown4; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); session.Send(updateObject); }
public static void HandleUpdateObjectCreate(ref WorldClass session) { WorldObject character = session.Character; PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8((byte)UpdateType.CreateObject); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8((byte)ObjectType.Player); UpdateFlag updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation | UpdateFlag.Self; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); session.Send(ref updateObject); }
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); PacketWriter messageChat = new PacketWriter(LegacyMessage.MessageChat); ulong guid = WorldMgr.Session.Character.Guid; messageChat.WriteUInt8(1); messageChat.WriteInt32(language); messageChat.WriteUInt64(guid); messageChat.WriteUInt32(0); messageChat.WriteUInt64(guid); messageChat.WriteUInt32(messageLength + 1); messageChat.WriteCString(chatMessage); messageChat.WriteUInt16(0); session.Send(messageChat); }
public void HandleAuthLogonProof(PacketReader data) { Log.Message(LogType.NORMAL, "AuthLogonProof"); using (var logonProof = new PacketWriter()) { var a = data.ReadBytes(32); var m1 = data.ReadBytes(20); SecureRemotePassword.CalculateU(a); SecureRemotePassword.CalculateM2(m1); SecureRemotePassword.CalculateK(); foreach (var b in SecureRemotePassword.K) if (b < 0x10) account.SessionKey += "0" + String.Format(CultureInfo.InvariantCulture, "{0:X}", b); else account.SessionKey += String.Format(CultureInfo.InvariantCulture, "{0:X}", b); logonProof.WriteUInt8((byte)ClientLink.CMD_AUTH_LOGON_PROOF); logonProof.WriteUInt8(0); logonProof.WriteBytes(SecureRemotePassword.M2); logonProof.WriteUInt32(0x800000); logonProof.WriteUInt32(0); logonProof.WriteUInt16(0); SecureRemotePassword.Dispose(); DB.Realms.Execute("UPDATE accounts SET sessionkey = ? WHERE id = ?", account.SessionKey, account.Id); Send(logonProof); } }
public void HandleRealmList(RealmClass session, PacketReader data) { Log.Message(LogType.NORMAL, "RealmList"); PacketWriter realmData = new PacketWriter(); foreach (var r in Realms) { realmData.WriteUInt8(1); realmData.WriteUInt8(0); realmData.WriteUInt8(0); realmData.WriteCString(r.Name); realmData.WriteCString(r.IP + ":" + r.Port); realmData.WriteFloat(0); realmData.WriteUInt8(0); // CharCount realmData.WriteUInt8(1); realmData.WriteUInt8(0x2C); } PacketWriter realmList = new PacketWriter(); realmList.WriteUInt8((byte)ClientLink.CMD_REALM_LIST); realmList.WriteUInt16((ushort)(realmData.BaseStream.Length + 8)); realmList.WriteUInt32(0); realmList.WriteUInt16((ushort)Realms.Count); realmList.WriteBytes(realmData.ReadDataToSend()); realmList.WriteUInt8(0); realmList.WriteUInt8(0x10); session.Send(realmList); }
public void HandleAuthLogonProof(RealmClass session, PacketReader data) { Log.Message(LogType.NORMAL, "AuthLogonProof"); PacketWriter logonProof = new PacketWriter(); byte[] a = new byte[32]; byte[] m1 = new byte[20]; Array.Copy(DataBuffer, 1, a, 0, 32); Array.Copy(DataBuffer, 33, m1, 0, 20); session.SecureRemotePassword.CalculateU(a); session.SecureRemotePassword.CalculateM2(m1); session.SecureRemotePassword.CalculateK(); foreach (var b in session.SecureRemotePassword.K) if (b < 0x10) account.SessionKey += "0" + String.Format("{0:X}", b); else account.SessionKey += String.Format("{0:X}", b); logonProof.WriteUInt8((byte)ClientLink.CMD_AUTH_LOGON_PROOF); logonProof.WriteUInt8(0); logonProof.WriteBytes(session.SecureRemotePassword.M2); logonProof.WriteUInt32(0x800000); logonProof.WriteUInt32(0); logonProof.WriteUInt16(0); DB.Realms.Execute("UPDATE accounts SET sessionkey = '{0}' WHERE id = {1}", account.SessionKey, account.Id); session.Send(logonProof); }
public static void HandleUpdateObject(ref WorldClass session) { WorldObject character = session.Character; PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8(1); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8(4); UpdateFlag updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation | UpdateFlag.Self; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); session.Send(ref updateObject); var tempSessions = new Dictionary<ulong, WorldClass>(WorldMgr.Sessions); tempSessions.Remove(character.Guid); if (tempSessions != null) { foreach (var s in tempSessions) { if (character.Map != s.Value.Character.Map) continue; updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8(1); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8(4); updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); s.Value.Send(ref updateObject); } foreach (var s in tempSessions) { WorldObject pChar = s.Value.Character; if (pChar.Map != character.Map) continue; updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)pChar.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8(1); updateObject.WriteGuid(pChar.Guid); updateObject.WriteUInt8(4); updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref pChar, updateFlags); pChar.WriteUpdateFields(ref updateObject); pChar.WriteDynamicUpdateFields(ref updateObject); session.Send(ref updateObject); } } character.AddCreatureSpawnsToWorld(ref session); character.AddGameObjectSpawnsToWorld(ref session); }
public static void HandleUpdateObjectValues(ref WorldClass session, bool broadcast = false, bool toself = true) { WorldObject character = session.Character; PacketWriter updateObject = new PacketWriter(ServerMessage.ObjectUpdate); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8((byte)UpdateType.Values); updateObject.WriteGuid(character.Guid); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); if (toself) session.Send(ref updateObject); if (broadcast) WorldMgr.SendToInRangeCharacter(character as Character, updateObject); }
public static void HandleUpdateObjectCreate(ref WorldClass session) { WorldObject character = session.Character; PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8((byte)UpdateType.CreateObject); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8((byte)ObjectType.Player); UpdateFlag updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation | UpdateFlag.Self; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); session.Send(ref updateObject); var tempSessions = new Dictionary<ulong, WorldClass>(WorldMgr.Sessions); tempSessions.Remove(character.Guid); if (tempSessions != null) { foreach (var s in tempSessions) { if (s.Value.Character.CheckUpdateDistance(character)) { updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8((byte)UpdateType.CreateObject); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8((byte)ObjectType.Player); updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); s.Value.Send(ref updateObject); } } foreach (var s in tempSessions) { WorldObject pChar = s.Value.Character; if (character.CheckUpdateDistance(pChar)) { character.ToCharacter().InRangeObjects.Add(pChar.Guid, pChar); updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)pChar.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8((byte)UpdateType.CreateObject); updateObject.WriteGuid(pChar.Guid); updateObject.WriteUInt8((byte)ObjectType.Player); updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref pChar, updateFlags); pChar.WriteUpdateFields(ref updateObject); pChar.WriteDynamicUpdateFields(ref updateObject); session.Send(ref updateObject); } } } }
public void HandleRealmList(PacketReader data) { Log.Message(LogType.NORMAL, "RealmList"); using (var realmData = new PacketWriter()) { Realms.ToList().ForEach(r => { using (var result = DB.Characters.Select("SELECT COUNT(*) as Count FROM characters WHERE AccountId = ? AND RealmId = ?", account.Id, r.Value.Id)) { var charCount = result.Read<byte>(0, "Count"); realmData.WriteUInt8(1); realmData.WriteUInt8(0); realmData.WriteUInt8(0); realmData.WriteCString(r.Key); realmData.WriteCString(r.Value.IP + ":" + r.Value.Port); realmData.WriteFloat(0); realmData.WriteUInt8(charCount); realmData.WriteUInt8(1); realmData.WriteUInt8(0x2C); } }); using (var realmList = new PacketWriter()) { realmList.WriteUInt8((byte)ClientLink.CMD_REALM_LIST); realmList.WriteUInt16((ushort)(realmData.BaseStream.Length + 8)); realmList.WriteUInt32(0); realmList.WriteUInt16((ushort)Realms.Count); realmList.WriteBytes(realmData.ReadDataToSend()); realmList.WriteUInt8(0); realmList.WriteUInt8(0x10); Send(realmList); } } }
public void AddToWorld() { CreateFullGuid(); CreateData(GameObject); Globals.SpawnMgr.AddSpawn(this, ref GameObject); SetGameObjectFields(); WorldObject obj = this; UpdateFlag updateFlags = UpdateFlag.Rotation | UpdateFlag.StationaryPosition; foreach (var v in Globals.WorldMgr.Sessions) { Character pChar = v.Value.Character; if (pChar.Map != Map) continue; PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8(1); updateObject.WriteGuid(Guid); updateObject.WriteUInt8(5); Globals.WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref obj, updateFlags); WriteUpdateFields(ref updateObject); WriteDynamicUpdateFields(ref updateObject); v.Value.Send(ref updateObject); } }
public static void SendMessageByType(ref WorldClass session, MessageType type, int language, string chatMessage, bool Broadcast = false) { PacketWriter messageChat = new PacketWriter(LegacyMessage.MessageChat); ulong guid = session.Character.Guid; messageChat.WriteUInt8((byte)type); messageChat.WriteInt32(language); messageChat.WriteUInt64(guid); messageChat.WriteUInt32(0); messageChat.WriteUInt64(guid); messageChat.WriteUInt32((uint)chatMessage.Length + 1); messageChat.WriteCString(chatMessage); messageChat.WriteUInt16(0); if (Broadcast) { Globals.WorldMgr.SendToInRangeCharacter(session.Character, messageChat); session.Send(ref messageChat); } else session.Send(ref messageChat); }
public void AddToWorld() { CreateFullGuid(); CreateData(Creature); if (this.BaseStats == null)//when stats not foz return; Globals.SpawnMgr.AddSpawn(this); WorldObject obj = this; UpdateFlag updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation; foreach (var v in Globals.WorldMgr.Sessions) { Character pChar = v.Value.Character; if (pChar.CheckUpdateDistance(this)) { PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)Map); updateObject.WriteUInt32(1); WorldMgr.WriteCreateObject(ref updateObject, obj, updateFlags, ObjectType.Unit); v.Value.Send(ref updateObject); } } }
public void AddToWorld() { CreateFullGuid(); CreateData(Creature); Globals.SpawnMgr.AddSpawn(this, ref Creature); SetCreatureFields(); WorldObject obj = this; UpdateFlag updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation; foreach (var v in Globals.WorldMgr.Sessions) { Character pChar = v.Value.Character; if (pChar.CheckUpdateDistance(this)) { PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8(1); updateObject.WriteGuid(Guid); updateObject.WriteUInt8(3); Globals.WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref obj, updateFlags); WriteUpdateFields(ref updateObject); WriteDynamicUpdateFields(ref updateObject); v.Value.Send(ref updateObject); } } }
public static void HandleUpdateTalentData(ref WorldClass session) { var pChar = session.Character; const byte glyphCount = 6; PacketWriter updateTalentData = new PacketWriter(ServerMessage.UpdateTalentData); BitPack BitPack = new BitPack(updateTalentData); BitPack.Write(pChar.SpecGroupCount, 19); for (int i = 0; i < pChar.SpecGroupCount; i++) { var talents = SpecializationMgr.GetTalentsBySpecGroup(pChar, (byte)i); BitPack.Write(talents.Count, 23); } BitPack.Flush(); for (int i = 0; i < pChar.SpecGroupCount; i++) { var talents = SpecializationMgr.GetTalentsBySpecGroup(pChar, (byte)i); var specId = (i == 0) ? pChar.PrimarySpec : pChar.SecondarySpec; for (int j = 0; j < glyphCount; j++) updateTalentData.WriteInt16(0); // Glyph Id for (int j = 0; j < talents.Count; j++) updateTalentData.WriteUInt16(talents[j].Id); // Talent Id updateTalentData.WriteUInt32(specId); // Spec Id } updateTalentData.WriteUInt8(pChar.ActiveSpecGroup); // Active Spec (0 or 1) session.Send(ref updateTalentData); }
public static void HandleTalentUpdate(ref WorldClass session) { var pChar = session.Character; const byte glyphCount = 6; PacketWriter writer = new PacketWriter(); writer.WriteUInt8((byte)pChar.SpecGroupCount); // Spec Count (Default 1) writer.WriteUInt8((byte)pChar.ActiveSpecGroup); // Active Spec (0 or 1) for (int i = 0; i < pChar.SpecGroupCount; i++) { var specId = (i == 0) ? pChar.PrimarySpec : pChar.SecondarySpec; writer.WriteUInt32(specId); // Spec Id var talents = SpecializationMgr.GetTalentsBySpecGroup(pChar, (byte)i); writer.WriteUInt8((byte)talents.Count); // Spent Talent Row Count for (int j = 0; j < talents.Count; j++) writer.WriteUInt16(talents[j].Id); // Talent Id writer.WriteUInt8(glyphCount); // Glyph Count - NYI for (int j = 0; j < glyphCount; j++) writer.WriteInt16(0); // Glyph Id - NYI } session.Send(ref writer); }
public void AddToWorld() { CreateFullGuid(); CreateData(GameObject); SetUpdateFields(); Globals.SpawnMgr.AddSpawn(this, ref GameObject); WorldObject obj = this; UpdateFlag updateFlags = UpdateFlag.Rotation | UpdateFlag.StationaryPosition; foreach (var v in Globals.WorldMgr.Sessions) { Character pChar = v.Value.Character; if (pChar.CheckUpdateDistance(this)) { PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)Map); updateObject.WriteUInt32(1); WorldMgr.WriteCreateObject(ref updateObject, obj, updateFlags, ObjectType.GameObject); v.Value.Send(ref updateObject); } } }
public static void HandleUpdateObject(ref WorldClass session) { Character character = session.Character; PacketWriter updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8(1); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8(4); UpdateFlag updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation | UpdateFlag.Self; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); session.Send(updateObject); var tempSession = WorldMgr.Sessions; tempSession.Remove(character.Guid); foreach (var s in tempSession) { if (character.Zone != s.Value.Character.Zone) continue; updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8(1); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8(4); updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); s.Value.Send(updateObject); } foreach (var s in tempSession) { character = s.Value.Character; if (character.Zone != session.Character.Zone) continue; updateObject = new PacketWriter(LegacyMessage.UpdateObject); updateObject.WriteUInt16((ushort)character.Map); updateObject.WriteUInt32(1); updateObject.WriteUInt8(1); updateObject.WriteGuid(character.Guid); updateObject.WriteUInt8(4); updateFlags = UpdateFlag.Alive | UpdateFlag.Rotation; WorldMgr.WriteUpdateObjectMovement(ref updateObject, ref character, updateFlags); character.WriteUpdateFields(ref updateObject); character.WriteDynamicUpdateFields(ref updateObject); session.Send(updateObject); } }