using FiestaBot.Configuration; using FiestaBot.Enums; using FiestaBot.Instances.Networking; using FiestaBot.Manager.ClientPacket; using FiestaBot.Manager.Game; using FiestaBot.Manager.Networking; using FiestaBot.Utilities; using FiestaBot.Zone.Game; namespace FiestaBot.Manager.Handlers { internal class Manager03Handler { [ManagerPacketHandler(3, 20)] public static void CharacterList(ManagerClient socket, Packet packet) { socket.InCharSelect = true; packet.ReadUShort(out var sessionId); socket.ZoneKey = sessionId; packet.ReadByte(out var totalCharacters); if (totalCharacters > 0) { Logger.Log(LogType.Character, "You have {0} characters available:", totalCharacters); for (var i = 0; i < totalCharacters; i++) { //basic info packet.ReadInt(out var charId); packet.ReadString(out var charName, 20); packet.ReadUShort(out var charLevel); packet.ReadByte(out var charSlot); socket.InUseCharSlots.Add(charSlot); packet.ReadString(out var charMapIndex, 12); packet.ReadByte(out var deleteYear); packet.ReadByte(out var deleteMonth); packet.ReadByte(out var deleteDay); packet.ReadByte(out var deleteHour); packet.ReadByte(out var deleteMin); //character looks packet.ReadByte(out var charLookJobGender); packet.ReadByte(out var charLookHair); packet.ReadByte(out var charLookHairColor); packet.ReadByte(out var charLookFace); //character equipment packet.ReadUShort(out var charEqHat); packet.ReadUShort(out var charEqMouth); packet.ReadUShort(out var charEqRightHand); packet.ReadUShort(out var charEqBody); packet.ReadUShort(out var charEqLeftHand); packet.ReadUShort(out var charEqPant); packet.ReadUShort(out var charEqBoot); packet.ReadUShort(out var charEqAccBoot); packet.ReadUShort(out var charEqAccPant); packet.ReadUShort(out var charEqAccBody); packet.ReadUShort(out var charEqAccHeadA); packet.ReadUShort(out var charEqMiniMonR); packet.ReadUShort(out var charEqEye); packet.ReadUShort(out var charEqAccLeftHand); packet.ReadUShort(out var charEqAccRightHand); packet.ReadUShort(out var charEqAccBack); packet.ReadUShort(out var charEqCosEff); packet.ReadUShort(out var charEqAccHip); packet.ReadUShort(out var charEqMiniMon); packet.ReadUShort(out var charEqAccShield); packet.ReadByte(out var ref1); packet.ReadByte(out var ref2); packet.ReadByte(out var ref3); packet.ReadUInt(out var nKqHandle); packet.ReadString(out var charMapName, 12); packet.ReadInt(out var charPosX); packet.ReadInt(out var charPosY); packet.ReadInt(out var kqDate); packet.ReadByte(out var bNeedChangeId); packet.ReadInt(out var init); packet.ReadByte(out var rowNo); packet.ReadByte(out var tutorialState); packet.ReadByte(out var tutorialStep); packet.ReadString(out var unk00, 3); var genderId = (byte)((charLookJobGender >> 7) & 0x01); var classId = (byte)((charLookJobGender >> 2) & 0x1F); var position = new Position { MapInx = charMapIndex, X = charPosX, Y = charPosY, Z = 90 }; var style = new Style { Gender = (Gender)genderId, HairID = charLookHair, HairColorID = charLookHairColor, FaceID = charLookFace }; var equipment = new Equipment { // todo }; var character = new Character { Slot = charSlot, ID = charId, Name = charName, Class = (Class)classId, Level = charLevel, AdminLevel = 0, Style = style, Position = position, Equipment = equipment }; socket.AllCharacters.Add(character); Logger.Log(LogType.Character, "ID: {0} | Name: {1} | Level: {2} | Slot: {3} | Map: {4} | Gender: {5} | Class: {6} | Hair: {7} | Color: {8} | Face: {9} | PosX: {10} | PosY: {11}", charId, charName, charLevel, charSlot, SHNSearch.FindNameByInx(FindType.MapInfo, charMapIndex), (Gender)genderId, (Class)classId, SHNSearch.FindNameByID(FindType.HairInfo, charLookHair), SHNSearch.FindNameByID(FindType.HairColorInfo, charLookHairColor), SHNSearch.FindNameByID(FindType.FaceInfo, charLookFace), charPosX, charPosY); } if (Program.Config.AutoSelectCharacter) { ManagerPacket.SendCharacterSelect(socket, Program.Config.AutoSelectCharacterSlot); } else { Logger.Log(LogType.Character, "> Pick a character with selectchar [ID] OR type createchar to start the creation of a new character"); } } else { Logger.Log(LogType.Character, "> You currently have no characters available, type createchar to start the creation of a charater"); } packet.Dispose(); if(Program.Config.AutoSelectCharacter) { ManagerPacket.SendCharacterSelect(socket, Program.Config.AutoSelectCharacterSlot); } else { socket.InCharSelect = true; } } [ManagerPacketHandler(3, 21)] public static void InvalidworldTransfer(ManagerClient socket, Packet packet) { Logger.Log(LogType.World, "World transfer failed: invalid transferkey specified"); packet.Dispose(); socket.Disconnect(); } } }