internal Character(ILogger <Character> logger, CharacterManager characterManager, PlayerCharacterEntity entity, GameDataService gameDataService) { SetExistsState(true); CharacterManager = characterManager; Weapons = new CharacterInventory(this, 3, ItemCategory.Weapon); Skills = new CharacterInventory(this, 1, ItemCategory.Skill); Costumes = new CharacterInventory(this, 7, ItemCategory.Costume); Id = entity.Id; Slot = entity.Slot; Gender = (CharacterGender)entity.Gender; Hair = gameDataService.GetDefaultItem(Gender, CostumeSlot.Hair, entity.BasicHair); Face = gameDataService.GetDefaultItem(Gender, CostumeSlot.Face, entity.BasicFace); Shirt = gameDataService.GetDefaultItem(Gender, CostumeSlot.Shirt, entity.BasicShirt); Pants = gameDataService.GetDefaultItem(Gender, CostumeSlot.Pants, entity.BasicPants); Gloves = gameDataService.GetDefaultItem(Gender, CostumeSlot.Gloves, 0); Shoes = gameDataService.GetDefaultItem(Gender, CostumeSlot.Shoes, 0); var plr = characterManager.Player; var inventory = CharacterManager.Player.Inventory; plr.AddContextToLogger(logger); SetInventoryIfNeeded(entity.Weapon1Id, (byte)WeaponSlot.Weapon1, Weapons); SetInventoryIfNeeded(entity.Weapon2Id, (byte)WeaponSlot.Weapon2, Weapons); SetInventoryIfNeeded(entity.Weapon3Id, (byte)WeaponSlot.Weapon3, Weapons); SetInventoryIfNeeded(entity.HairId, (byte)CostumeSlot.Hair, Costumes); SetInventoryIfNeeded(entity.FaceId, (byte)CostumeSlot.Face, Costumes); SetInventoryIfNeeded(entity.ShirtId, (byte)CostumeSlot.Shirt, Costumes); SetInventoryIfNeeded(entity.PantsId, (byte)CostumeSlot.Pants, Costumes); SetInventoryIfNeeded(entity.GlovesId, (byte)CostumeSlot.Gloves, Costumes); SetInventoryIfNeeded(entity.ShoesId, (byte)CostumeSlot.Shoes, Costumes); SetInventoryIfNeeded(entity.AccessoryId, (byte)CostumeSlot.Accessory, Costumes); SetInventoryIfNeeded(entity.SkillId, (byte)SkillSlot.Skill, Skills); Weapons.ItemAdded += SendEquip; Weapons.ItemRemoved += SendUnEquip; Costumes.ItemAdded += SendEquip; Costumes.ItemRemoved += SendUnEquip; Skills.ItemAdded += SendEquip; Skills.ItemRemoved += SendUnEquip; void SendEquip(object _, CharacterInventoryEventArgs e) { plr.Session.Send(new SUseItemAckMessage(Slot, e.Slot, e.Item.Id, UseItemAction.Equip)); } void SendUnEquip(object _, CharacterInventoryEventArgs e) { plr.Session.Send(new SUseItemAckMessage(Slot, e.Slot, e.Item.Id, UseItemAction.UnEquip)); } void SetInventoryIfNeeded(long?id, byte itemSlot, CharacterInventory characterInventory) { var log = logger.ForContext( ("CharacterSlot", Slot), ("ItemSlot", itemSlot), ("ItemId", id)); if (id == null) { return; } var item = inventory[(ulong)id]; if (item == null) { log.Warning("Character has non-existant item"); return; } var error = characterInventory.Add(itemSlot, item); if (error != CharacterInventoryError.OK) { log.Warning("Unable to equip item Error={Error}", error); } } }
/// <summary> /// Creates a new character /// </summary> public (Character character, CharacterCreateResult result) Create(byte slot, CharacterGender gender, byte hair, byte face, byte shirt, byte pants, byte gloves, byte shoes) { var logger = _logger.ForContext( ("Method", "Create"), ("Slot", slot), ("Gender", gender), ("Hair", hair), ("Face", face), ("Shirt", shirt), ("Pants", pants), ("Gloves", gloves), ("Shoes", shoes)); if (Count >= 3) { return(null, CharacterCreateResult.LimitReached); } if (_characters.ContainsKey(slot)) { return(null, CharacterCreateResult.SlotInUse); } var defaultHair = _gameDataService.GetDefaultItem(gender, CostumeSlot.Hair, hair); if (defaultHair == null) { logger.Warning("Invalid hair"); return(null, CharacterCreateResult.InvalidDefaultItem); } var defaultFace = _gameDataService.GetDefaultItem(gender, CostumeSlot.Face, face); if (defaultFace == null) { logger.Warning("Invalid face"); return(null, CharacterCreateResult.InvalidDefaultItem); } var defaultShirt = _gameDataService.GetDefaultItem(gender, CostumeSlot.Shirt, shirt); if (defaultShirt == null) { logger.Warning("Invalid shirt"); return(null, CharacterCreateResult.InvalidDefaultItem); } var defaultPants = _gameDataService.GetDefaultItem(gender, CostumeSlot.Pants, pants); if (defaultPants == null) { logger.Warning("Invalid pants"); return(null, CharacterCreateResult.InvalidDefaultItem); } var defaultGloves = _gameDataService.GetDefaultItem(gender, CostumeSlot.Gloves, gloves); if (defaultGloves == null) { logger.Warning("Invalid gloves"); return(null, CharacterCreateResult.InvalidDefaultItem); } var defaultShoes = _gameDataService.GetDefaultItem(gender, CostumeSlot.Shoes, shoes); if (defaultShoes == null) { logger.Warning("Invalid shoes"); return(null, CharacterCreateResult.InvalidDefaultItem); } var character = new Character(this, _idGeneratorService.GetNextId(IdKind.Character), slot, gender, defaultHair, defaultFace, defaultShirt, defaultPants, defaultGloves, defaultShoes); _characters.Add(slot, character); var charStyle = new CharacterStyle(character.Gender, character.Slot, character.Hair.Variation, character.Face.Variation, character.Shirt.Variation, character.Pants.Variation); Player.Session.Send(new SSuccessCreateCharacterAckMessage(character.Slot, charStyle)); return(character, CharacterCreateResult.Success); }