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 HandleSendNewTimeSpeed(ref WorldClass session) { PacketWriter newTimeSpeed = new PacketWriter(LegacyMessage.SendNewTimeSpeed); newTimeSpeed.WritePackedTime(); newTimeSpeed.WritePackedTime(); newTimeSpeed.WriteFloat(0.01666667f); newTimeSpeed.WriteInt32(0); newTimeSpeed.WriteInt32(0); session.Send(ref newTimeSpeed); }
public static void HandleLoginSetTimeSpeed(ref WorldClass session) { PacketWriter loginSetTimeSpeed = new PacketWriter(ServerMessage.LoginSetTimeSpeed); loginSetTimeSpeed.WriteInt32(1); loginSetTimeSpeed.WriteInt32(1); loginSetTimeSpeed.WriteFloat(0.01666667f); loginSetTimeSpeed.WritePackedTime(); loginSetTimeSpeed.WritePackedTime(); session.Send(ref loginSetTimeSpeed); }
public static void HandleMoveSetRunSpeed(ref WorldClass session, float speed = 7f) { PacketWriter setRunSpeed = new PacketWriter(JAMCMessage.MoveSetRunSpeed); BitPack BitPack = new BitPack(setRunSpeed, session.Character.Guid); BitPack.WriteGuidMask(0, 4, 1, 6, 3, 5, 7, 2); BitPack.Flush(); setRunSpeed.WriteFloat(speed); BitPack.WriteGuidBytes(7); setRunSpeed.WriteUInt32(0); BitPack.WriteGuidBytes(3, 6, 0, 4, 1, 5, 2); session.Send(setRunSpeed); }
public static void HandleMoveSetFlightSpeed(ref WorldClass session, float speed = 7f) { PacketWriter setFlightSpeed = new PacketWriter(ServerMessage.MoveSetFlightSpeed); BitPack BitPack = new BitPack(setFlightSpeed, session.Character.Guid); BitPack.WriteGuidMask(5, 4, 2, 1, 7, 6, 3, 0); BitPack.Flush(); setFlightSpeed.WriteUInt32(0); BitPack.WriteGuidBytes(5, 7); setFlightSpeed.WriteFloat(speed); BitPack.WriteGuidBytes(1, 2, 3, 6, 0, 4); session.Send(ref setFlightSpeed); }
public static void HandleMoveSetRunSpeed(ref WorldClass session, float speed = 7f) { PacketWriter setRunSpeed = new PacketWriter(ServerMessage.MoveSetRunSpeed); BitPack BitPack = new BitPack(setRunSpeed, session.Character.Guid); BitPack.WriteGuidMask(6, 1, 2, 5, 0, 3, 7, 4); BitPack.Flush(); BitPack.WriteGuidBytes(3, 0, 1, 5); setRunSpeed.WriteFloat(speed); BitPack.WriteGuidBytes(7, 4, 2); setRunSpeed.WriteUInt32(0); BitPack.WriteGuidBytes(6); session.Send(ref setRunSpeed); }
public static void HandleEnumCharactersResult(ref PacketReader packet, WorldClass session) { // Set existing character from last world session to null session.Character = null; DB.Realms.Execute("UPDATE accounts SET online = 1 WHERE id = ?", session.Account.Id); SQLResult result = DB.Characters.Select("SELECT * FROM characters WHERE accountid = ?", session.Account.Id); PacketWriter enumCharacters = new PacketWriter(ServerMessage.EnumCharactersResult); BitPack BitPack = new BitPack(enumCharacters); BitPack.Write(0, 21); BitPack.Write(result.Count, 16); for (int c = 0; c < result.Count; c++) { var name = result.Read<string>(c, "Name"); var loginCinematic = result.Read<bool>(c, "LoginCinematic"); BitPack.Guid = result.Read<ulong>(c, "Guid"); BitPack.GuildGuid = result.Read<ulong>(c, "GuildGuid"); BitPack.WriteGuidMask(0); BitPack.WriteGuildGuidMask(4); BitPack.WriteGuidMask(7); BitPack.WriteGuildGuidMask(3, 7); BitPack.WriteGuidMask(5, 4, 6); BitPack.WriteGuildGuidMask(1); BitPack.WriteGuidMask(3, 2); BitPack.WriteGuildGuidMask(0, 2); BitPack.WriteGuidMask(1); BitPack.WriteGuildGuidMask(5); BitPack.Write(loginCinematic); BitPack.WriteGuildGuidMask(6); BitPack.Write((uint)UTF8Encoding.UTF8.GetBytes(name).Length, 6); } BitPack.Write(1); BitPack.Flush(); for (int c = 0; c < result.Count; c++) { string name = result.Read<string>(c, "Name"); BitPack.Guid = result.Read<ulong>(c, "Guid"); BitPack.GuildGuid = result.Read<ulong>(c, "GuildGuid"); enumCharacters.WriteUInt32(result.Read<uint>(c, "PetLevel")); enumCharacters.WriteUInt8(result.Read<byte>(c, "Level")); BitPack.WriteGuildGuidBytes(2, 3); //TODO: implement items for (int j = 0; j < 23; j++) { enumCharacters.WriteUInt32(0); enumCharacters.WriteUInt32(0); enumCharacters.WriteUInt8(0); } BitPack.WriteGuildGuidBytes(6); enumCharacters.WriteUInt8(0); enumCharacters.WriteUInt8(result.Read<byte>(c, "HairStyle")); enumCharacters.WriteUInt32(result.Read<uint>(c, "CustomizeFlags")); enumCharacters.WriteUInt8(result.Read<byte>(c, "Class")); BitPack.WriteGuildGuidBytes(7); BitPack.WriteGuidBytes(0); enumCharacters.WriteUInt32(result.Read<uint>(c, "PetFamily")); BitPack.WriteGuildGuidBytes(1); BitPack.WriteGuidBytes(3, 7, 2); BitPack.WriteGuildGuidBytes(5); enumCharacters.WriteUInt8(result.Read<byte>(c, "Gender")); enumCharacters.WriteUInt32(result.Read<uint>(c, "PetDisplayId")); enumCharacters.WriteUInt32(result.Read<uint>(c, "Zone")); BitPack.WriteGuidBytes(6); enumCharacters.WriteUInt8(result.Read<byte>(c, "HairColor")); enumCharacters.WriteUInt8(result.Read<byte>(c, "FacialHair")); enumCharacters.WriteString(name); enumCharacters.WriteUInt8(result.Read<byte>(c, "Race")); BitPack.WriteGuildGuidBytes(4); enumCharacters.WriteUInt8(result.Read<byte>(c, "Skin")); enumCharacters.WriteUInt32(result.Read<uint>(c, "Map")); enumCharacters.WriteUInt32(result.Read<uint>(c, "CharacterFlags")); enumCharacters.WriteFloat(result.Read<float>(c, "Y")); BitPack.WriteGuildGuidBytes(0); BitPack.WriteGuidBytes(4, 1); enumCharacters.WriteFloat(result.Read<float>(c, "Z")); BitPack.WriteGuidBytes(5); enumCharacters.WriteUInt8(result.Read<byte>(c, "Face")); enumCharacters.WriteFloat(result.Read<float>(c, "X")); } session.Send(ref enumCharacters); }
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 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 static void HandleMoveSetFlightSpeed(ref WorldClass session, float speed = 7f) { PacketWriter setFlightSpeed = new PacketWriter(JAMCMessage.MoveSetFlightSpeed); BitPack BitPack = new BitPack(setFlightSpeed, session.Character.Guid); BitPack.WriteGuidMask(6, 1, 7, 4, 5, 3, 0, 2); BitPack.Flush(); BitPack.WriteGuidBytes(0, 4, 6); setFlightSpeed.WriteFloat(speed); BitPack.WriteGuidBytes(7, 2); setFlightSpeed.WriteUInt32(0); BitPack.WriteGuidBytes(5, 1, 3); session.Send(ref setFlightSpeed); }
public static void HandleMoveUpdate(ulong guid, ObjectMovementValues movementValues, Vector4 vector) { PacketWriter moveUpdate = new PacketWriter(JAMCMessage.MoveUpdate); BitPack BitPack = new BitPack(moveUpdate, guid); BitPack.WriteGuidMask(0); BitPack.Write(!movementValues.HasMovementFlags); BitPack.Write(!movementValues.HasRotation); BitPack.WriteGuidMask(2, 6); BitPack.Write(!movementValues.HasMovementFlags2); BitPack.WriteGuidMask(7); BitPack.Write<uint>(0, 24); BitPack.WriteGuidMask(1); if (movementValues.HasMovementFlags) BitPack.Write((uint)movementValues.MovementFlags, 30); BitPack.WriteGuidMask(4); BitPack.Write(!movementValues.IsAlive); BitPack.Write(0); if (movementValues.HasMovementFlags2) BitPack.Write((uint)movementValues.MovementFlags2, 13); BitPack.Write(0); BitPack.WriteGuidMask(5); BitPack.Write(true); BitPack.Write(0); BitPack.Write(movementValues.IsInterpolated); BitPack.Write(0); BitPack.Write(true); BitPack.WriteGuidMask(3); BitPack.Write(true); if (movementValues.IsInterpolated) BitPack.Write(movementValues.IsInterpolated2); BitPack.Flush(); if (movementValues.IsInterpolated) { moveUpdate.WriteUInt32(0); if (movementValues.IsInterpolated2) { moveUpdate.WriteFloat(0); moveUpdate.WriteFloat(0); moveUpdate.WriteFloat(0); } moveUpdate.WriteFloat(0); } if (movementValues.IsAlive) moveUpdate.WriteUInt32(movementValues.Time); BitPack.WriteGuidBytes(5, 7); moveUpdate.WriteFloat(vector.Z); BitPack.WriteGuidBytes(4, 3, 2, 6, 0); moveUpdate.WriteFloat(vector.X); if (movementValues.HasRotation) moveUpdate.WriteFloat(vector.W); moveUpdate.WriteFloat(vector.Y); Character pChar = WorldMgr.GetSession(guid).Character; ObjectMgr.SetPosition(ref pChar, vector, false); WorldMgr.SendToAllInZone(guid, moveUpdate); }
public static void HandleNewWorld(ref WorldClass session, Vector4 vector, uint mapId) { PacketWriter newWorld = new PacketWriter(ServerMessage.NewWorld); newWorld.WriteFloat(vector.Z); newWorld.WriteFloat(vector.X); newWorld.WriteUInt32(mapId); newWorld.WriteFloat(vector.Y); newWorld.WriteFloat(vector.O); session.Send(ref newWorld); }
public static void HandleQueryGameObject(ref PacketReader packet, ref WorldClass session) { byte[] guidMask = { 4, 6, 7, 5, 3, 2, 1, 0 }; byte[] guidBytes = { 0, 2, 3, 5, 6, 1, 4, 7 }; BitUnpack BitUnpack = new BitUnpack(packet); var hasData = false; var id = packet.Read<int>(); var guid = BitUnpack.GetPackedValue(guidMask, guidBytes); PacketWriter queryGameObjectResponse = new PacketWriter(ServerMessage.QueryGameObjectResponse); BitPack BitPack = new BitPack(queryGameObjectResponse); GameObject gObject = DataMgr.FindGameObject(id); if (hasData = (gObject != null)) { GameObjectStats stats = gObject.Stats; BitPack.Write(hasData); BitPack.Flush(); queryGameObjectResponse.WriteInt32(stats.Id); queryGameObjectResponse.WriteInt32(0); queryGameObjectResponse.WriteInt32(stats.Type); queryGameObjectResponse.WriteInt32(stats.DisplayInfoId); queryGameObjectResponse.WriteCString(stats.Name); for (int i = 0; i < 3; i++) queryGameObjectResponse.WriteCString(""); queryGameObjectResponse.WriteCString(stats.IconName); queryGameObjectResponse.WriteCString(stats.CastBarCaption); queryGameObjectResponse.WriteCString(""); foreach (var v in stats.Data) queryGameObjectResponse.WriteInt32(v); queryGameObjectResponse.WriteFloat(stats.Size); queryGameObjectResponse.WriteUInt8((byte)stats.QuestItemId.Count); foreach (var v in stats.QuestItemId) queryGameObjectResponse.WriteInt32(v); queryGameObjectResponse.WriteInt32(stats.ExpansionRequired); var size = (uint)queryGameObjectResponse.BaseStream.Length - 13; queryGameObjectResponse.WriteUInt32Pos(size, 9); session.Send(ref queryGameObjectResponse); } else { BitPack.Write(hasData); Log.Message(LogType.DEBUG, "Gameobject (Id: {0}) not found.", id); } }
public static void HandleMoveSetSwimSpeed(ref WorldClass session, float speed = 4.72222f) { PacketWriter setSwimSpeed = new PacketWriter(ServerMessage.MoveSetSwimSpeed); BitPack BitPack = new BitPack(setSwimSpeed, session.Character.Guid); BitPack.WriteGuidMask(6, 3, 1, 2, 0, 4, 7, 5); BitPack.Flush(); BitPack.WriteGuidBytes(2); setSwimSpeed.WriteFloat(speed); BitPack.WriteGuidBytes(1, 6); setSwimSpeed.WriteUInt32(0); BitPack.WriteGuidBytes(3, 4, 0, 7, 5); session.Send(ref setSwimSpeed); }
public static void HandleMoveTeleport(ref WorldClass session, Vector4 vector) { bool IsTransport = false; bool Unknown = false; PacketWriter moveTeleport = new PacketWriter(ServerMessage.MoveTeleport); BitPack BitPack = new BitPack(moveTeleport, session.Character.Guid); BitPack.WriteGuidMask(7); BitPack.Write(Unknown); BitPack.WriteGuidMask(2, 0); if (Unknown) { BitPack.Write(0); BitPack.Write(0); } BitPack.Write(IsTransport); if (IsTransport) BitPack.WriteTransportGuidMask(4, 3, 5, 7, 0, 2, 6, 1); BitPack.WriteGuidMask(5, 1, 3, 6, 4); BitPack.Flush(); BitPack.WriteGuidBytes(0); if (IsTransport) BitPack.WriteTransportGuidBytes(7, 6, 0, 2, 3, 1, 5, 4); BitPack.WriteGuidBytes(6, 1); moveTeleport.WriteUInt32(0); BitPack.WriteGuidBytes(7, 5); moveTeleport.WriteFloat(vector.X); BitPack.WriteGuidBytes(4, 3, 2); moveTeleport.WriteFloat(vector.Y); moveTeleport.WriteFloat(vector.O); moveTeleport.WriteFloat(vector.Z); if (Unknown) moveTeleport.WriteUInt8(0); session.Send(ref moveTeleport); }
public static void HandleMoveUpdate(ulong guid, ObjectMovementValues movementValues, Vector4 vector) { PacketWriter moveUpdate = new PacketWriter(ServerMessage.MoveUpdate); BitPack BitPack = new BitPack(moveUpdate, guid); BitPack.WriteGuidMask(2); BitPack.Write(0); BitPack.WriteGuidMask(1); BitPack.Write(!movementValues.HasMovementFlags2); BitPack.Write(true); BitPack.Write(true); BitPack.Write<uint>(0, 22); BitPack.WriteGuidMask(3); BitPack.Write(!movementValues.IsAlive); BitPack.Write(!movementValues.HasMovementFlags); BitPack.WriteGuidMask(6); if (movementValues.HasMovementFlags2) BitPack.Write((uint)movementValues.MovementFlags2, 13); BitPack.WriteGuidMask(4, 7); BitPack.Write(movementValues.IsInterpolated); BitPack.Write(0); if (movementValues.HasMovementFlags) BitPack.Write((uint)movementValues.MovementFlags, 30); BitPack.Write(!movementValues.HasRotation); BitPack.Write(movementValues.IsTransport); BitPack.WriteGuidMask(5); if (movementValues.IsInterpolated) BitPack.Write(movementValues.IsInterpolated2); BitPack.Write(true); BitPack.Write(0); BitPack.WriteGuidMask(0); BitPack.Flush(); moveUpdate.WriteFloat(vector.Z); BitPack.WriteGuidBytes(3); moveUpdate.WriteFloat(vector.X); BitPack.WriteGuidBytes(0, 7); moveUpdate.WriteFloat(vector.Y); BitPack.WriteGuidBytes(5); if (movementValues.IsInterpolated) { moveUpdate.WriteFloat(0); if (movementValues.IsInterpolated2) { moveUpdate.WriteFloat(0); moveUpdate.WriteFloat(0); moveUpdate.WriteFloat(0); } moveUpdate.WriteUInt32(0); } BitPack.WriteGuidBytes(6, 2); if (movementValues.IsAlive) moveUpdate.WriteUInt32(movementValues.Time); BitPack.WriteGuidBytes(1, 4); if (movementValues.HasRotation) moveUpdate.WriteFloat(vector.O); var session = WorldMgr.GetSession(guid); if (session != null) { Character pChar = session.Character; ObjectMgr.SetPosition(ref pChar, vector, false); WorldMgr.SendToInRangeCharacter(pChar, moveUpdate); } }
public static void HandleEnumCharactersResult(ref PacketReader packet, ref WorldClass session) { SQLResult result = DB.Characters.Select("SELECT guid, name, race, class, gender, skin, face, hairstyle, " + "haircolor, facialhair, level, zone, map, x, y, z, guildguid, petdisplayid, " + "petlevel, petfamily, characterflags, customizeflags, loginCinematic FROM characters WHERE accountid = {0}", session.Account.Id); PacketWriter enumCharacters = new PacketWriter(JAMCMessage.EnumCharactersResult); BitPack BitPack = new BitPack(enumCharacters); BitPack.Write(0, 23); BitPack.Write(result.Count, 17); if (result.Count != 0) { for (int c = 0; c < result.Count; c++) { string name = result.Read<String>(c, "Name"); bool loginCinematic = result.Read<Boolean>(c, "LoginCinematic"); BitPack.Guid = result.Read<UInt64>(c, "Guid"); BitPack.GuildGuid = result.Read<UInt64>(c, "GuildGuid"); BitPack.WriteGuidMask(7, 0, 4); BitPack.WriteGuildGuidMask(2); BitPack.WriteGuidMask(5, 3); BitPack.Write((uint)Encoding.ASCII.GetBytes(name).Length, 7); BitPack.WriteGuildGuidMask(0, 5, 3); BitPack.Write(loginCinematic); BitPack.WriteGuildGuidMask(6, 7); BitPack.WriteGuidMask(1); BitPack.WriteGuildGuidMask(4, 1); BitPack.WriteGuidMask(2, 6); } BitPack.Write(1); BitPack.Flush(); for (int c = 0; c < result.Count; c++) { string name = result.Read<String>(c, "Name"); BitPack.Guid = result.Read<UInt64>(c, "Guid"); BitPack.GuildGuid = result.Read<UInt64>(c, "GuildGuid"); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "CharacterFlags")); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "PetFamily")); enumCharacters.WriteFloat(result.Read<Single>(c, "Z")); BitPack.WriteGuidBytes(7); BitPack.WriteGuildGuidBytes(6); // Not implanted for (int j = 0; j < 23; j++) { enumCharacters.WriteUInt32(0); enumCharacters.WriteUInt8(0); enumCharacters.WriteUInt32(0); } enumCharacters.WriteFloat(result.Read<Single>(c, "X")); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Class")); BitPack.WriteGuidBytes(5); enumCharacters.WriteFloat(result.Read<Single>(c, "Y")); BitPack.WriteGuildGuidBytes(3); BitPack.WriteGuidBytes(6); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "PetLevel")); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "PetDisplayId")); BitPack.WriteGuidBytes(2); BitPack.WriteGuidBytes(1); enumCharacters.WriteUInt8(result.Read<Byte>(c, "HairColor")); enumCharacters.WriteUInt8(result.Read<Byte>(c, "FacialHair")); BitPack.WriteGuildGuidBytes(2); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "Zone")); enumCharacters.WriteUInt8(0); BitPack.WriteGuidBytes(0); BitPack.WriteGuildGuidBytes(1); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Skin")); BitPack.WriteGuidBytes(4); BitPack.WriteGuildGuidBytes(5); enumCharacters.WriteString(name); BitPack.WriteGuildGuidBytes(0); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Level")); BitPack.WriteGuidBytes(3); BitPack.WriteGuildGuidBytes(7); enumCharacters.WriteUInt8(result.Read<Byte>(c, "HairStyle")); BitPack.WriteGuildGuidBytes(4); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Gender")); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "Map")); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "CustomizeFlags")); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Race")); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Face")); } } else { BitPack.Write(1); BitPack.Flush(); }; session.Send(enumCharacters); }
public static void HandleMoveTeleport(ref WorldClass session, Vector4 vector) { bool isTransport = false; bool unknown = false; PacketWriter moveTeleport = new PacketWriter(ServerMessage.MoveTeleport); BitPack BitPack = new BitPack(moveTeleport, session.Character.Guid); moveTeleport.WriteFloat(vector.Y); moveTeleport.WriteFloat(vector.O); moveTeleport.WriteFloat(vector.Z); moveTeleport.WriteUInt32(0); moveTeleport.WriteFloat(vector.X); BitPack.WriteGuidMask(5, 4, 6, 7, 3, 0); BitPack.Write(isTransport); if (isTransport) BitPack.WriteTransportGuidMask(6, 4, 2, 5, 3, 0, 7, 1); BitPack.Write(unknown); BitPack.WriteGuidMask(1); if (unknown) { BitPack.Write(0); BitPack.Write(0); } BitPack.WriteGuidMask(2); BitPack.Flush(); BitPack.WriteGuidBytes(2, 5); if (isTransport) BitPack.WriteTransportGuidBytes(2, 1, 4, 0, 6, 5, 7, 3); BitPack.WriteGuidBytes(0, 4); if (unknown) moveTeleport.WriteUInt8(0); BitPack.WriteGuidBytes(3, 6, 1, 7); session.Send(ref moveTeleport); }
public static void HandleEnumCharactersResult(ref PacketReader packet, ref WorldClass session) { // Set existing character from last world session to null session.Character = null; DB.Realms.Execute("UPDATE accounts SET online = 1 WHERE id = ?", session.Account.Id); SQLResult result = DB.Characters.Select("SELECT * FROM characters WHERE accountid = ?", session.Account.Id); PacketWriter enumCharacters = new PacketWriter(JAMCMessage.EnumCharactersResult); BitPack BitPack = new BitPack(enumCharacters); BitPack.Write(0, 23); BitPack.Write(result.Count, 17); if (result.Count != 0) { for (int c = 0; c < result.Count; c++) { string name = result.Read<String>(c, "Name"); bool loginCinematic = result.Read<Boolean>(c, "LoginCinematic"); BitPack.Guid = result.Read<UInt64>(c, "Guid"); BitPack.GuildGuid = result.Read<UInt64>(c, "GuildGuid"); BitPack.WriteGuidMask(7, 0, 4); BitPack.WriteGuildGuidMask(2); BitPack.WriteGuidMask(5, 3); BitPack.Write((uint)Encoding.ASCII.GetBytes(name).Length, 7); BitPack.WriteGuildGuidMask(0, 5, 3); BitPack.Write(loginCinematic); BitPack.WriteGuildGuidMask(6, 7); BitPack.WriteGuidMask(1); BitPack.WriteGuildGuidMask(4, 1); BitPack.WriteGuidMask(2, 6); } BitPack.Write(1); BitPack.Flush(); for (int c = 0; c < result.Count; c++) { string name = result.Read<String>(c, "Name"); BitPack.Guid = result.Read<UInt64>(c, "Guid"); BitPack.GuildGuid = result.Read<UInt64>(c, "GuildGuid"); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "CharacterFlags")); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "PetFamily")); enumCharacters.WriteFloat(result.Read<Single>(c, "Z")); BitPack.WriteGuidBytes(7); BitPack.WriteGuildGuidBytes(6); // Not implanted for (int j = 0; j < 23; j++) { enumCharacters.WriteUInt32(0); enumCharacters.WriteUInt8(0); enumCharacters.WriteUInt32(0); } enumCharacters.WriteFloat(result.Read<Single>(c, "X")); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Class")); BitPack.WriteGuidBytes(5); enumCharacters.WriteFloat(result.Read<Single>(c, "Y")); BitPack.WriteGuildGuidBytes(3); BitPack.WriteGuidBytes(6); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "PetLevel")); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "PetDisplayId")); BitPack.WriteGuidBytes(2); BitPack.WriteGuidBytes(1); enumCharacters.WriteUInt8(result.Read<Byte>(c, "HairColor")); enumCharacters.WriteUInt8(result.Read<Byte>(c, "FacialHair")); BitPack.WriteGuildGuidBytes(2); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "Zone")); enumCharacters.WriteUInt8(0); BitPack.WriteGuidBytes(0); BitPack.WriteGuildGuidBytes(1); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Skin")); BitPack.WriteGuidBytes(4); BitPack.WriteGuildGuidBytes(5); enumCharacters.WriteString(name); BitPack.WriteGuildGuidBytes(0); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Level")); BitPack.WriteGuidBytes(3); BitPack.WriteGuildGuidBytes(7); enumCharacters.WriteUInt8(result.Read<Byte>(c, "HairStyle")); BitPack.WriteGuildGuidBytes(4); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Gender")); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "Map")); enumCharacters.WriteUInt32(result.Read<UInt32>(c, "CustomizeFlags")); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Race")); enumCharacters.WriteUInt8(result.Read<Byte>(c, "Face")); } } else { BitPack.Write(1); BitPack.Flush(); }; session.Send(ref enumCharacters); }
public static void HandleGameObjectStats(ref PacketReader packet, ref WorldClass session) { int id = packet.ReadInt32(); ulong guid = packet.ReadUInt64(); GameObject gObject = DataMgr.FindGameObject(id); if (gObject != null) { GameObjectStats stats = gObject.Stats; PacketWriter gameObjectStats = new PacketWriter(LegacyMessage.GameObjectStats); gameObjectStats.WriteInt32(stats.Id); gameObjectStats.WriteInt32(stats.Type); gameObjectStats.WriteInt32(stats.DisplayInfoId); gameObjectStats.WriteCString(stats.Name); for (int i = 0; i < 3; i++) gameObjectStats.WriteCString(""); gameObjectStats.WriteCString(stats.IconName); gameObjectStats.WriteCString(stats.CastBarCaption); gameObjectStats.WriteCString(""); foreach (var v in stats.Data) gameObjectStats.WriteInt32(v); gameObjectStats.WriteFloat(stats.Size); foreach (var v in stats.QuestItemId) gameObjectStats.WriteInt32(v); gameObjectStats.WriteInt32(stats.ExpansionRequired); session.Send(ref gameObjectStats); } else Log.Message(LogType.DEBUG, "Gameobject (Id: {0}) not found.", id); }
public static void HandleMoveSetWalkSpeed(ref WorldClass session, float speed = 2.5f) { PacketWriter setWalkSpeed = new PacketWriter(ServerMessage.MoveSetWalkSpeed); BitPack BitPack = new BitPack(setWalkSpeed, session.Character.Guid); setWalkSpeed.WriteFloat(speed); setWalkSpeed.WriteUInt32(0); BitPack.WriteGuidMask(5, 4, 3, 1, 0, 7, 2, 6); BitPack.Flush(); BitPack.WriteGuidBytes(7, 5, 3, 2, 4, 1, 6, 0); session.Send(ref setWalkSpeed); }
public static void HandleMoveSetSwimSpeed(ref WorldClass session, float speed = 4.72222f) { PacketWriter setSwimSpeed = new PacketWriter(JAMCMessage.MoveSetSwimSpeed); BitPack BitPack = new BitPack(setSwimSpeed, session.Character.Guid); BitPack.WriteGuidMask(4, 0, 7, 5, 6, 1, 2, 3); BitPack.Flush(); setSwimSpeed.WriteUInt32(0); BitPack.WriteGuidBytes(3, 7, 0, 1, 4, 5, 2); setSwimSpeed.WriteFloat(speed); BitPack.WriteGuidBytes(6); session.Send(setSwimSpeed); }
public static void HandleMoveUpdate(ulong guid, ObjectMovementValues movementValues, Vector4 vector) { PacketWriter moveUpdate = new PacketWriter(ServerMessage.MoveUpdate); BitPack BitPack = new BitPack(moveUpdate, guid); moveUpdate.WriteFloat(vector.Y); moveUpdate.WriteFloat(vector.Z); moveUpdate.WriteFloat(vector.X); BitPack.WriteGuidMask(5); BitPack.Write(0); BitPack.WriteGuidMask(3); BitPack.Write(0); BitPack.Write(1); BitPack.Write(!movementValues.HasMovementFlags2); BitPack.WriteGuidMask(0); BitPack.Write(1); BitPack.Write(!movementValues.HasRotation); BitPack.WriteGuidMask(7); BitPack.Write(movementValues.IsTransport); BitPack.Write(0); BitPack.Write(movementValues.Time == 0); BitPack.Write(!movementValues.HasMovementFlags); BitPack.WriteGuidMask(2); BitPack.Write(1); BitPack.Write(movementValues.IsFallingOrJumping); BitPack.WriteGuidMask(1, 6); BitPack.Write<uint>(0, 22); BitPack.WriteGuidMask(4); if (movementValues.IsFallingOrJumping) BitPack.Write(movementValues.HasJumpData); if (movementValues.HasMovementFlags) BitPack.Write((uint)movementValues.MovementFlags, 30); if (movementValues.HasMovementFlags2) BitPack.Write((uint)movementValues.MovementFlags2, 13); BitPack.Flush(); if (movementValues.IsFallingOrJumping) { if (movementValues.HasJumpData) { moveUpdate.WriteFloat(movementValues.CurrentSpeed); moveUpdate.WriteFloat(movementValues.Sin); moveUpdate.WriteFloat(movementValues.Cos); } moveUpdate.WriteFloat(movementValues.JumpVelocity); moveUpdate.WriteUInt32(movementValues.FallTime); } BitPack.WriteGuidBytes(1, 0, 4, 5, 7, 2); if (movementValues.Time != 0) moveUpdate.WriteUInt32(movementValues.Time); if (movementValues.HasRotation) moveUpdate.WriteFloat(vector.O); BitPack.WriteGuidBytes(6, 3); var session = WorldMgr.GetSession(guid); if (session != null) { Character pChar = session.Character; ObjectMgr.SetPosition(ref pChar, vector, false); WorldMgr.SendToInRangeCharacter(pChar, moveUpdate); } }
public static void HandleMoveSetWalkSpeed(ref WorldClass session, float speed = 2.5f) { PacketWriter setWalkSpeed = new PacketWriter(JAMCMessage.MoveSetWalkSpeed); BitPack BitPack = new BitPack(setWalkSpeed, session.Character.Guid); setWalkSpeed.WriteUInt32(0); setWalkSpeed.WriteFloat(speed); BitPack.WriteGuidMask(6, 2, 1, 4, 5, 3, 7, 0); BitPack.Flush(); BitPack.WriteGuidBytes(1, 6, 3, 0, 7, 4, 2, 5); session.Send(setWalkSpeed); }
public static void HandleQueryCreature(ref PacketReader packet, ref WorldClass session) { var hasData = false; var id = packet.Read<int>(); PacketWriter queryCreatureResponse = new PacketWriter(ServerMessage.QueryCreatureResponse); BitPack BitPack = new BitPack(queryCreatureResponse); queryCreatureResponse.WriteInt32(id); Creature creature = DataMgr.FindCreature(id); if (hasData = (creature != null)) { CreatureStats stats = creature.Stats; BitPack.Write(hasData); BitPack.Write(stats.QuestItemId.Count, 22); BitPack.Write(0, 11); BitPack.Write(stats.RacialLeader); BitPack.Write(stats.IconName.Length + 1, 6); for (int i = 0; i < 8; i++) { if (i == 1) BitPack.Write(stats.Name.Length + 1, 11); else BitPack.Write(0, 11); } BitPack.Write(stats.SubName.Length != 0 ? stats.SubName.Length + 1 : 0, 11); BitPack.Flush(); queryCreatureResponse.WriteInt32(stats.Rank); queryCreatureResponse.WriteInt32(stats.DisplayInfoId[2]); queryCreatureResponse.WriteInt32(stats.Type); foreach (var v in stats.Flag) queryCreatureResponse.WriteInt32(v); queryCreatureResponse.WriteFloat(stats.PowerModifier); queryCreatureResponse.WriteInt32(stats.DisplayInfoId[0]); queryCreatureResponse.WriteFloat(1); queryCreatureResponse.WriteCString(stats.Name); if (stats.IconName != "") queryCreatureResponse.WriteCString(stats.IconName); queryCreatureResponse.WriteInt32(stats.Family); queryCreatureResponse.WriteInt32(stats.QuestKillNpcId[0]); if (stats.SubName != "") queryCreatureResponse.WriteCString(stats.SubName); queryCreatureResponse.WriteInt32(stats.MovementInfoId); queryCreatureResponse.WriteInt32(stats.DisplayInfoId[1]); queryCreatureResponse.WriteFloat(1); queryCreatureResponse.WriteFloat(stats.HealthModifier); queryCreatureResponse.WriteInt32(0); foreach (var v in stats.QuestItemId) queryCreatureResponse.WriteInt32(v); queryCreatureResponse.WriteInt32(stats.DisplayInfoId[3]); queryCreatureResponse.WriteInt32(stats.QuestKillNpcId[1]); queryCreatureResponse.WriteInt32(stats.ExpansionRequired); session.Send(ref queryCreatureResponse); } else { BitPack.Write(hasData); Log.Message(LogType.DEBUG, "Creature (Id: {0}) not found.", id); } }
public static void HandleMoveTeleport(ref WorldClass session, Vector4 vector) { bool IsTransport = false; bool Unknown = false; PacketWriter moveTeleport = new PacketWriter(JAMCMessage.MoveTeleport); BitPack BitPack = new BitPack(moveTeleport, session.Character.Guid); moveTeleport.WriteUInt32(0); moveTeleport.WriteFloat(vector.X); moveTeleport.WriteFloat(vector.Y); moveTeleport.WriteFloat(vector.Z); moveTeleport.WriteFloat(vector.W); BitPack.WriteGuidMask(3, 1, 7); BitPack.Write(Unknown); BitPack.WriteGuidMask(6); // Unknown bits if (Unknown) { BitPack.Write(false); BitPack.Write(false); } BitPack.WriteGuidMask(0, 4); BitPack.Write(IsTransport); BitPack.WriteGuidMask(2); // Transport guid if (IsTransport) BitPack.WriteTransportGuidMask(7, 5, 2, 1, 0, 4, 3, 6); BitPack.WriteGuidMask(5); BitPack.Flush(); if (IsTransport) BitPack.WriteTransportGuidBytes(1, 5, 7, 0, 3, 4, 6, 2); BitPack.WriteGuidBytes(3); if (Unknown) moveTeleport.WriteUInt8(0); BitPack.WriteGuidBytes(2, 1, 7, 5, 6, 4, 0); session.Send(moveTeleport); }
public static void HandleCliQueryNPCText(ref PacketReader packet, ref WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); byte[] guidMask = { 4, 7, 3, 6, 0, 1, 5, 2 }; byte[] guidBytes = { 5, 6, 7, 1, 2, 3, 0, 4 }; var gossipTextId = packet.Read<int>(); var guid = BitUnpack.GetPackedValue(guidMask, guidBytes); var gossipData = GossipMgr.GetGossip<Creature>(SmartGuid.GetGuid(guid)); if (gossipData != null) { PacketWriter queryNPCTextResponse = new PacketWriter(ServerMessage.QueryNPCTextResponse); BitPack BitPack = new BitPack(queryNPCTextResponse); queryNPCTextResponse.WriteInt32(gossipTextId); queryNPCTextResponse.WriteInt32(0); queryNPCTextResponse.WriteFloat(1); for (int i = 0; i < 7; i++) queryNPCTextResponse.WriteUInt32(0); queryNPCTextResponse.WriteInt32(gossipData.BroadCastText.Id); for (int i = 0; i < 7; i++) queryNPCTextResponse.WriteUInt32(0); BitPack.Write(1); BitPack.Flush(); var size = (uint)queryNPCTextResponse.BaseStream.Length - 13; queryNPCTextResponse.WriteUInt32Pos(size, 8); session.Send(ref queryNPCTextResponse); } }
public static void HandleNPCText(ref PacketReader packet, ref WorldClass session) { var gossipTextId = packet.ReadInt32(); var guid = packet.ReadUInt64(); var gossipData = GossipMgr.GetGossip<Creature>(ObjectGuid.GetGuid(guid)); if (gossipData != null) { PacketWriter npcText = new PacketWriter(LegacyMessage.NPCText); npcText.WriteInt32(gossipTextId); npcText.WriteFloat(1); for (int i = 0; i < 7; i++) npcText.WriteUInt32(0); npcText.WriteInt32(gossipData.BroadCastText.Id); for (int i = 0; i < 7; i++) npcText.WriteUInt32(0); session.Send(ref npcText); } }