Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        /// <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);
        }