Exemplo n.º 1
0
        public async Task <SaltyCommandResult> SetGoldAsync(
            [Description("Desired amount to set.")]
            long count,
            [Description("Player you want to set gold.")]
            IPlayerEntity player = null)
        {
            if (player == null)
            {
                player = Context.Player;
            }

            player.Character.Gold = count;
            await player.ActualizeUiGold();

            return(new SaltyCommandResult(true, $"{player.Character.Name}'s gold has been set to {count}"));
        }
Exemplo n.º 2
0
 public static Task GoldUp(this IPlayerEntity player, long amount)
 {
     player.Character.Gold += amount;
     return(player.ActualizeUiGold());
 }
Exemplo n.º 3
0
        private static async Task HandleNpcSkillBuyRequest(IPlayerEntity player, ShopBuyEvent shopBuy, Shop shop)
        {
            ShopSkillDto skillShop = shop.Skills.FirstOrDefault(s => s.SkillId == shopBuy.Slot);

            if (skillShop == null)
            {
                return;
            }

            // check use sp
            if (player.HasSpWeared)
            {
                return;
            }

            // check skill cooldown
            if (player.SkillComponent.CooldownsBySkillId.Any(s => s.Item2 == shopBuy.Slot))
            {
                return;
            }

            // check skill already exists in player skills
            if (player.SkillComponent.Skills.ContainsKey(shopBuy.Slot))
            {
                return;
            }

            // check skill class
            if ((byte)player.Character.Class != skillShop.Skill.Class)
            {
                return;
            }

            // check skill price
            if (player.Character.Gold < skillShop.Skill.Price)
            {
                return;
            }

            // check skill cp
            if (player.GetCp() < skillShop.Skill.CpCost)
            {
                return;
            }

            // check skill minimum level
            byte minimumLevel = 1;

            switch (player.Character.Class)
            {
            case CharacterClassType.Adventurer:
                minimumLevel = skillShop.Skill.MinimumAdventurerLevel;
                break;

            case CharacterClassType.Swordman:
                minimumLevel = skillShop.Skill.MinimumSwordmanLevel;
                break;

            case CharacterClassType.Archer:
                minimumLevel = skillShop.Skill.MinimumArcherLevel;
                break;

            case CharacterClassType.Magician:
                minimumLevel = skillShop.Skill.MinimumMagicianLevel;
                break;

            case CharacterClassType.Wrestler:
                minimumLevel = skillShop.Skill.MinimumWrestlerLevel;
                break;

            case CharacterClassType.Unknown:
                break;
            }

            if (skillShop.Skill.MinimumSwordmanLevel == 0 && skillShop.Skill.MinimumArcherLevel == 0 && skillShop.Skill.MinimumMagicianLevel == 0)
            {
                minimumLevel = skillShop.Skill.MinimumAdventurerLevel;
            }

            if (minimumLevel == 0)
            {
                // can't learn the skill
                return;
            }

            // level is required for passive skills
            if (player.Character.Level < minimumLevel && skillShop.Skill.Id <= 200)
            {
                return;
            }

            // job level requirement
            if (player.Character.JobLevel < minimumLevel && skillShop.SkillId >= 200)
            {
                return;
            }

            if (skillShop.SkillId < 200)
            {
                foreach (CharacterSkillDto skill in player.SkillComponent.CharacterSkills.Select(s => s.Value))
                {
                    if (skillShop.Skill.CastId == skill.Skill.CastId && skill.Skill.Id < 200)
                    {
                        player.SkillComponent.CharacterSkills.Remove(skill.Id);
                    }
                }
            }

            // check skill upgrades
            // remove old upgrade
            if (skillShop.SkillId >= 200 && skillShop.Skill.UpgradeSkill != 0)
            {
                CharacterSkillDto oldupgrade = player.SkillComponent.CharacterSkills.FirstOrDefault(s =>
                                                                                                    s.Value.Skill.UpgradeSkill == skillShop.Skill.UpgradeSkill && s.Value.Skill.UpgradeType == skillShop.Skill.UpgradeType && s.Value.Skill.UpgradeSkill != 0).Value;
                if (oldupgrade != null)
                {
                    player.SkillComponent.CharacterSkills.Remove(oldupgrade.Id);
                }
            }

            await player.AddCharacterSkillAsync(new CharacterSkillDto
            {
                Id          = Guid.NewGuid(),
                SkillId     = skillShop.SkillId,
                Skill       = skillShop.Skill,
                CharacterId = player.Id
            });

            player.Character.Gold -= skillShop.Skill.Price;
            await player.ActualizeUiGold();

            await player.ActualizeUiSkillList();

            await player.ActualizeUiQuicklist();

            await player.SendChatMessageAsync(PlayerMessages.SKILL_YOU_LEARNED_SKILL_X, SayColorType.LightGreen);

            await player.ActualizeUiExpBar();
        }
Exemplo n.º 4
0
        private async Task HandleNpcItemBuyRequest(IPlayerEntity player, ShopBuyEvent shopBuy, Shop shop)
        {
            ShopItemDto item   = shop.Items.FirstOrDefault(s => s.Slot == shopBuy.Slot);
            short       amount = shopBuy.Amount;

            if (item == null || amount <= 0)
            {
                return;
            }

            // check diginity
            double percent = 1.0;

            switch (player.GetDignityIcon())
            {
            case CharacterDignity.BluffedNameOnly:
                percent = 1.10;
                break;

            case CharacterDignity.NotQualifiedFor:
                percent = 1.20;
                break;

            case CharacterDignity.Useless:
            case CharacterDignity.StupidMinded:
                percent = 1.5;
                break;
            }

            bool isReputBuy = item.Item.ReputPrice > 0;
            long price      = isReputBuy ? item.Item.ReputPrice : item.Item.Price;

            price *= amount;
            sbyte rare = item.Rare;

            if (item.Item.Type == 0)
            {
                amount = 1;
            }

            if (!isReputBuy && price < 0 && price * percent > player.Character.Gold)
            {
                await player.SendPacketAsync(player.GenerateShopMemoPacket(SMemoPacketType.FailNpc, player.GetLanguage(PlayerMessages.YOU_DONT_HAVE_ENOUGH_GOLD)));

                return;
            }

            if (isReputBuy)
            {
                if (price > player.Character.Reput)
                {
                    await player.SendPacketAsync(player.GenerateShopMemoPacket(SMemoPacketType.FailNpc, player.GetLanguage(PlayerMessages.YOU_DONT_HAVE_ENOUGH_REPUTATION)));

                    return;
                }

                // generate a random rarity
                byte ra = (byte)_randomGenerator.Next(100);

                int[] rareprob = { 100, 100, 70, 50, 30, 15, 5, 1 };
                if (item.Item.ReputPrice == 0)
                {
                    return;
                }

                for (int i = 0; i < rareprob.Length; i++)
                {
                    if (ra <= rareprob[i])
                    {
                        rare = (sbyte)i;
                    }
                }
            }

            bool canAddItem = player.Inventory.CanAddItem(item.Item, amount);

            if (!canAddItem)
            {
                await player.SendPacketAsync(player.GenerateShopMemoPacket(SMemoPacketType.FailNpc, player.GetLanguage(PlayerMessages.YOU_DONT_HAVE_ENOUGH_SPACE_IN_INVENTORY)));

                return;
            }

            // add item to inventory
            var             itemFactory = ChickenContainer.Instance.Resolve <IItemInstanceDtoFactory>();
            ItemInstanceDto newitem     = itemFactory.CreateItem(item.ItemId, amount, (sbyte)rare);

            if (isReputBuy)
            {
                player.Character.Reput -= price;
                await player.ActualizeUiReputation();

                // player.SendPacket "reput decreased"
            }
            else
            {
                player.Character.Gold -= (long)(price * percent);
                await player.ActualizeUiGold();
            }

            await player.EmitEventAsync(new InventoryAddItemEvent
            {
                ItemInstance = newitem
            });
        }