public static void HandleCreateCharacter(ref PacketReader packet, WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); var hairStyle = packet.ReadByte(); var gender = packet.ReadByte(); var skin = packet.ReadByte(); var hairColor = packet.ReadByte(); var facialHair = packet.ReadByte(); var pClass = packet.ReadByte(); var race = packet.ReadByte(); var face = packet.ReadByte(); packet.ReadByte(); // Always 0 var HasUnknown = BitUnpack.GetBit(); var nameLength = BitUnpack.GetBits<uint>(6); 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 HandleChatMessageYell(ref PacketReader packet, ref WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); var language = packet.ReadInt32(); 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 HandleChatMessageSay(ref PacketReader packet, ref WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); var language = packet.ReadInt32(); var messageLength = packet.ReadByte(); var message = packet.ReadString(messageLength); ChatMessageValues chatMessage = new ChatMessageValues(MessageType.ChatMessageSay, message, true, true); chatMessage.Language = (byte)language; if (ChatCommandParser.CheckForCommand(message)) ChatCommandParser.ExecuteChatHandler(message, session); else SendMessage(ref session, chatMessage); }
public static void HandleDBQueryBulk(ref PacketReader packet, ref WorldClass session) { List<int> IdList = new List<int>(); BitUnpack BitUnpack = new BitUnpack(packet); var type = (DBTypes)packet.Read<uint>(); var count = BitUnpack.GetBits<uint>(21); bool[][] Mask = new bool[count][]; byte[][] Bytes = new byte[count][]; for (int i = 0; i < count; i++) { Mask[i] = new bool[8]; Bytes[i] = new byte[8]; } for (int i = 0; i < count; i++) { Mask[i][7] = BitUnpack.GetBit(); Mask[i][2] = BitUnpack.GetBit(); Mask[i][3] = BitUnpack.GetBit(); Mask[i][5] = BitUnpack.GetBit(); Mask[i][4] = BitUnpack.GetBit(); Mask[i][6] = BitUnpack.GetBit(); Mask[i][0] = BitUnpack.GetBit(); Mask[i][1] = BitUnpack.GetBit(); } for (int i = 0; i < count; i++) { if (Mask[i][5]) Bytes[i][5] = (byte)(packet.Read<byte>() ^ 1); IdList.Add(packet.Read<int>()); if (Mask[i][7]) Bytes[i][7] = (byte)(packet.ReadByte() ^ 1); if (Mask[i][3]) Bytes[i][3] = (byte)(packet.ReadByte() ^ 1); if (Mask[i][0]) Bytes[i][0] = (byte)(packet.ReadByte() ^ 1); if (Mask[i][1]) Bytes[i][1] = (byte)(packet.ReadByte() ^ 1); if (Mask[i][6]) Bytes[i][6] = (byte)(packet.ReadByte() ^ 1); if (Mask[i][2]) Bytes[i][2] = (byte)(packet.ReadByte() ^ 1); if (Mask[i][4]) Bytes[i][4] = (byte)(packet.ReadByte() ^ 1); } switch (type) { case DBTypes.BroadcastText: { foreach (var id in IdList) HandleBroadcastText(ref session, id); break; } default: break; } }
public static void HandleGenerateRandomCharacterName(ref PacketReader packet, WorldClass session) { var race = packet.ReadByte(); var gender = packet.ReadByte(); List<string> names = CliDB.NameGen.Where(n => n.Race == race && n.Gender == gender).Select(n => n.Name).ToList(); Random rand = new Random(Environment.TickCount); string NewName; SQLResult result; do { NewName = names[rand.Next(names.Count)]; result = DB.Characters.Select("SELECT * FROM characters WHERE name = ?", NewName); } while (result.Count != 0); PacketWriter generateRandomCharacterNameResult = new PacketWriter(ServerMessage.GenerateRandomCharacterNameResult); BitPack BitPack = new BitPack(generateRandomCharacterNameResult); BitPack.Write(1); BitPack.Write(NewName.Length, 6); BitPack.Flush(); generateRandomCharacterNameResult.WriteString(NewName); session.Send(ref generateRandomCharacterNameResult); }
public static void HandleSetActionButton(ref PacketReader packet, ref WorldClass session) { var pChar = session.Character; byte[] actionMask = { 5, 2, 6, 7, 1, 4, 0, 3 }; byte[] actionBytes = { 4, 3, 2, 0, 5, 7, 6, 1 }; var slotId = packet.ReadByte(); BitUnpack actionUnpacker = new BitUnpack(packet); var actionId = actionUnpacker.GetPackedValue(actionMask, actionBytes); if (actionId == 0) { var action = pChar.ActionButtons.Where(button => button.SlotId == slotId && button.SpecGroup == pChar.ActiveSpecGroup).Select(button => button).First(); ActionMgr.RemoveActionButton(pChar, action, true); Log.Message(LogType.DEBUG, "Character (Guid: {0}) removed action button {1} from slot {2}.", pChar.Guid, actionId, slotId); return; } var newAction = new ActionButton { Action = actionId, SlotId = slotId, SpecGroup = pChar.ActiveSpecGroup }; ActionMgr.AddActionButton(pChar, newAction, true); Log.Message(LogType.DEBUG, "Character (Guid: {0}) added action button {1} to slot {2}.", pChar.Guid, actionId, slotId); }
public static void HandleResponseCharacterCreate(ref PacketReader packet, ref WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); byte pClass = packet.ReadByte(); byte hairStyle = packet.ReadByte(); byte facialHair = packet.ReadByte(); byte race = packet.ReadByte(); byte face = packet.ReadByte(); byte skin = packet.ReadByte(); byte gender = packet.ReadByte(); byte hairColor = packet.ReadByte(); packet.ReadByte(); // Always 0 uint nameLength = BitUnpack.GetNameLength<uint>(7); string name = packet.ReadString(nameLength); SQLResult result = DB.Characters.Select("SELECT * from characters WHERE name = '{0}'", name); PacketWriter writer = new PacketWriter(LegacyMessage.ResponseCharacterCreate); if (result.Count != 0) { // Name already in use writer.WriteUInt8(0x32); session.Send(writer); return; } result = DB.Characters.Select("SELECT map, zone, posX, posY, posZ, posO FROM character_creation_data WHERE race = {0} AND class = {1}", race, pClass); if (result.Count == 0) { writer.WriteUInt8(0x31); session.Send(writer); return; } uint map = result.Read<uint>(0, "map"); uint zone = result.Read<uint>(0, "zone"); float posX = result.Read<float>(0, "posX"); float posY = result.Read<float>(0, "posY"); float posZ = result.Read<float>(0, "posZ"); float posO = result.Read<float>(0, "posO"); DB.Characters.Execute("INSERT INTO characters (name, accountid, race, class, gender, skin, zone, map, x, y, z, o, face, hairstyle, haircolor, facialhair) VALUES (" + "'{0}', {1}, {2}, {3}, {4}, {5}, {6}, {7}, '{8}', '{9}', '{10}', '{11}', {12}, {13}, {14}, {15})", name, session.Account.Id, race, pClass, gender, skin, zone, map, posX, posY, posZ, posO, face, hairStyle, hairColor, facialHair); // Success writer.WriteUInt8(0x2F); session.Send(writer); }
public static void HandleGenerateRandomCharacterNameResult(ref PacketReader packet, ref WorldClass session) { byte gender = packet.ReadByte(); byte race = packet.ReadByte(); List<string> names = DBCStorage.NameGenStorage.Where(n => n.Value.Race == race && n.Value.Gender == gender).Select(n => n.Value.Name).ToList(); Random rand = new Random(Environment.TickCount); string NewName; SQLResult result; do { NewName = names[rand.Next(names.Count)]; result = DB.Characters.Select("SELECT * FROM characters WHERE name = '{0}'", NewName); } while (result.Count != 0); PacketWriter writer = new PacketWriter(JAMCMessage.GenerateRandomCharacterNameResult); BitPack BitPack = new BitPack(writer); BitPack.Write<int>(NewName.Length, 15); BitPack.Write(true); BitPack.Flush(); writer.WriteString(NewName); session.Send(writer); }
public static void HandleResponseCharacterCreate(ref PacketReader packet, ref WorldClass session) { BitUnpack BitUnpack = new BitUnpack(packet); byte pClass = packet.ReadByte(); byte hairStyle = packet.ReadByte(); byte facialHair = packet.ReadByte(); byte race = packet.ReadByte(); byte face = packet.ReadByte(); byte skin = packet.ReadByte(); byte gender = packet.ReadByte(); byte hairColor = packet.ReadByte(); packet.ReadByte(); // Always 0 uint nameLength = BitUnpack.GetNameLength<uint>(7); string name = Character.NormalizeName(packet.ReadString(nameLength)); SQLResult result = DB.Characters.Select("SELECT * from characters WHERE name = ?", name); PacketWriter writer = new PacketWriter(LegacyMessage.ResponseCharacterCreate); if (result.Count != 0) { // Name already in use writer.WriteUInt8(0x32); session.Send(ref writer); 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) { writer.WriteUInt8(0x31); session.Send(ref writer); return; } uint map = result.Read<uint>(0, "map"); uint zone = result.Read<uint>(0, "zone"); float posX = result.Read<float>(0, "posX"); float posY = result.Read<float>(0, "posY"); float posZ = result.Read<float>(0, "posZ"); float posO = result.Read<float>(0, "posO"); // Allow declined names for now var characterFlags = CharacterFlag.Decline; DB.Characters.Execute("INSERT INTO characters (name, accountid, race, class, gender, skin, zone, map, x, y, z, o, face, hairstyle, haircolor, facialhair, characterFlags) VALUES (" + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", name, session.Account.Id, race, pClass, gender, skin, zone, map, posX, posY, posZ, posO, face, hairStyle, hairColor, facialHair, characterFlags); // Success writer.WriteUInt8(0x2F); session.Send(ref writer); }