// MALE ITEMS public static Item HairMale() { return(new Item(10200003) { Uid = 2867972925711604442, CreationTime = 1565575851, Color = EquipColor.Custom( Maple2Storage.Types.Color.Argb(0xFF, 0x4C, 0x69, 0xB5), Maple2Storage.Types.Color.Argb(0xFF, 0x4C, 0x85, 0xDB), Maple2Storage.Types.Color.Argb(0xFF, 0x48, 0x5E, 0xA8), 4 ), HairD = HairData.hairData(0.3f, 0.3f, new byte[24], new byte[24]), AppearanceFlag = 2, Stats = new ItemStats(), }); }
public void HandleCreate(LoginSession session, PacketReader packet) { byte gender = packet.ReadByte(); //packet.ReadShort(); // const? // var jobCode = (Job)packet.ReadShort(); int jobCode = packet.ReadShort(); string name = packet.ReadUnicodeString(); var skinColor = packet.Read <SkinColor>(); //packet.ReadShort(); // const? packet.Skip(2); var Equips = new Dictionary <ItemSlot, Item>(); logger.Info($"Creating character: {name}, gender: {gender}, skinColor: {skinColor}, job: {jobCode}"); int equipCount = packet.ReadByte(); for (int i = 0; i < equipCount; i++) { uint id = packet.ReadUInt(); string typeStr = packet.ReadUnicodeString(); if (!Enum.TryParse(typeStr, out ItemSlot type)) { throw new ArgumentException($"Unknown equip type: {typeStr}"); } var equipColor = packet.Read <EquipColor>(); int colorIndex = packet.ReadInt(); switch (type) { case ItemSlot.HR: // Hair // Hair Length/Position float backLength = BitConverter.ToSingle(packet.Read(4), 0); byte[] backPositionArray = packet.Read(24); float frontLength = BitConverter.ToSingle(packet.Read(4), 0); byte[] frontPositionArray = packet.Read(24); Equips.Add(ItemSlot.HR, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, HairD = HairData.hairData(backLength, frontLength, backPositionArray, frontPositionArray), Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.FA: // Face Equips.Add(ItemSlot.FA, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.FD: // Face Decoration byte[] faceDecoration = packet.Read(16); // Face decoration position Equips.Add(ItemSlot.FD, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, FaceDecorationD = faceDecoration, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.CL: // Clothes Equips.Add(ItemSlot.CL, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.PA: // Pants Equips.Add(ItemSlot.PA, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.SH: // Shoes Equips.Add(ItemSlot.SH, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; case ItemSlot.ER: // Ear // Assign ER Equips.Add(ItemSlot.ER, new Item(Convert.ToInt32(id)) { CreationTime = 1565575851, Color = equipColor, Stats = new ItemStats(), IsTemplate = false, }); break; } logger.Info($" > {type} - id: {id}, color: {equipColor}, colorIndex: {colorIndex}"); } packet.ReadInt(); // const? (4) // Check if name is in use (currently just on local account) bool taken = false; foreach (var character in AccountStorage.Characters.Values) { if (character.Name.ToLower().Equals(name.ToLower())) { taken = true; } } if (taken) { session.Send(ResponseCharCreatePacket.NameTaken()); return; } // Create new player object Player newCharacter = Player.NewCharacter(gender, jobCode, name, skinColor, Equips); // Add player object to account storage AccountStorage.AddCharacter(newCharacter); // Send updated CHAR_MAX_COUNT session.Send(CharacterListPacket.SetMax(4, 6)); // Send CHARACTER_LIST for new character only (append) session.Send(CharacterListPacket.AppendEntry(newCharacter)); }