Exemple #1
0
        /// <summary>
        /// buy packet
        /// </summary>
        /// <param name="buyPacket"></param>
        public void BuyShop(BuyPacket buyPacket)
        {
            if (Session.Character.InExchangeOrTrade)
            {
                return;
            }

            byte amount = buyPacket.Amount;

            switch (buyPacket.Type)
            {
            case BuyShopType.CharacterShop:
            {
                // User shop
                if (!Session.HasCurrentMapInstance)
                {
                    return;
                }
                KeyValuePair <long, MapShop> shop = Session.CurrentMapInstance.UserShops.FirstOrDefault(mapshop => mapshop.Value.OwnerId.Equals(buyPacket.OwnerId));
                PersonalShopItem             item = shop.Value?.Items.FirstOrDefault(i => i.ShopSlot.Equals(buyPacket.Slot));
                if (item == null || amount <= 0 || amount > 99)
                {
                    return;
                }
                if (amount > item.SellAmount)
                {
                    amount = item.SellAmount;
                }
                if (item.Price * amount + ServerManager.Instance.GetProperty <long>(shop.Value.OwnerId, nameof(Character.Gold)) > ServerManager.Instance.MaxGold)
                {
                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateShopMemo(3, Language.Instance.GetMessageFromKey("MAX_GOLD")));
                    return;
                }

                if (item.Price * amount >= Session.Character.Gold)
                {
                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateShopMemo(3, Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY")));
                    return;
                }

                // check if the item has been removed successfully from previous owner and
                // remove it
                if (BuyValidate(Session, shop, buyPacket.Slot, amount))
                {
                    Session.Character.Gold -= item.Price * amount;
                    Session.SendPacket(Session.Character.GenerateGold());

                    KeyValuePair <long, MapShop> shop2 = Session.CurrentMapInstance.UserShops.FirstOrDefault(s => s.Value.OwnerId.Equals(buyPacket.OwnerId));
                    LoadShopItem(buyPacket.OwnerId, shop2);
                }
                else
                {
                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0));
                }

                break;
            }

            case BuyShopType.ItemShop:
            {
                // load shop
                if (!Session.HasCurrentMapInstance)
                {
                    return;
                }
                MapNpc npc = Session.CurrentMapInstance.Npcs.FirstOrDefault(n => n.MapNpcId.Equals((short)buyPacket.OwnerId));
                if (npc != null)
                {
                    int dist = Map.GetDistance(Session.Character.GetPos(), npc.GetPos());
                    if (npc.Shop == null || dist > 5)
                    {
                        return;
                    }
                    if (npc.Shop.ShopSkills.Any())
                    {
                        if (!npc.Shop.ShopSkills.Exists(s => s.SkillVNum == buyPacket.Slot))
                        {
                            return;
                        }

                        // skill shop
                        if (Session.Character.UseSp)
                        {
                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("REMOVE_SP"), 0));
                            return;
                        }

                        if (Session.Character.Skills.Any(s => s.Value.LastUse.AddMilliseconds(s.Value.Skill.Cooldown * 100) > DateTime.Now))
                        {
                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SKILL_NEED_COOLDOWN"), 0));
                            return;
                        }

                        Skill skillinfo = ServerManager.Instance.GetSkill(buyPacket.Slot);
                        if (Session.Character.Skills.Any(s => s.Value.SkillVNum == buyPacket.Slot) || skillinfo == null)
                        {
                            return;
                        }

                        if (Session.Character.Gold < skillinfo.Price)
                        {
                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 0));
                        }
                        else if (Session.Character.GetCp() < skillinfo.CPCost)
                        {
                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_CP"), 0));
                        }
                        else
                        {
                            if (skillinfo.SkillVNum < 200)
                            {
                                int SkillMiniumLevel = 0;
                                if (skillinfo.MinimumSwordmanLevel == 0 && skillinfo.MinimumArcherLevel == 0 && skillinfo.MinimumMagicianLevel == 0)
                                {
                                    SkillMiniumLevel = skillinfo.MinimumAdventurerLevel;
                                }
                                else
                                {
                                    switch (Session.Character.Class)
                                    {
                                    case ClassType.Adventurer:
                                        SkillMiniumLevel = skillinfo.MinimumAdventurerLevel;
                                        break;

                                    case ClassType.Swordman:
                                        SkillMiniumLevel = skillinfo.MinimumSwordmanLevel;
                                        break;

                                    case ClassType.Archer:
                                        SkillMiniumLevel = skillinfo.MinimumArcherLevel;
                                        break;

                                    case ClassType.Magician:
                                        SkillMiniumLevel = skillinfo.MinimumMagicianLevel;
                                        break;
                                    }
                                }
                                if (SkillMiniumLevel == 0)
                                {
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SKILL_CANT_LEARN"), 0));
                                    return;
                                }
                                if (Session.Character.Level < SkillMiniumLevel)
                                {
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("TOO_LOW_LVL"), 0));
                                    return;
                                }
                                foreach (CharacterSkill skill in Session.Character.Skills.Select(s => s.Value))
                                {
                                    if (skillinfo.CastId == skill.Skill.CastId && skill.Skill.SkillVNum < 200)
                                    {
                                        Session.Character.Skills.TryRemove(skill.SkillVNum, out CharacterSkill value);
                                    }
                                }
                            }
                            else
                            {
                                if ((byte)Session.Character.Class != skillinfo.Class)
                                {
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SKILL_CANT_LEARN"), 0));
                                    return;
                                }
                                if (Session.Character.JobLevel < skillinfo.LevelMinimum)
                                {
                                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_JOB_LVL"), 0));
                                    return;
                                }
                                if (skillinfo.UpgradeSkill != 0)
                                {
                                    CharacterSkill oldupgrade = Session.Character.Skills.FirstOrDefault(s => s.Value.Skill.UpgradeSkill == skillinfo.UpgradeSkill && s.Value.Skill.UpgradeType == skillinfo.UpgradeType && s.Value.Skill.UpgradeSkill != 0).Value;
                                    if (oldupgrade != null)
                                    {
                                        Session.Character.Skills.TryRemove(oldupgrade.SkillVNum, out CharacterSkill value);
                                    }
                                }
                            }

                            Session.Character.Skills[buyPacket.Slot] = new CharacterSkill {
                                SkillVNum = buyPacket.Slot, CharacterId = Session.Character.CharacterId
                            };

                            Session.Character.Gold -= skillinfo.Price;
                            Session.SendPacket(Session.Character.GenerateGold());
                            Session.SendPacket(Session.Character.GenerateSki());
                            Session.SendPackets(Session.Character.GenerateQuicklist());
                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SKILL_LEARNED"), 0));
                            Session.SendPacket(Session.Character.GenerateLev());
                        }
                    }
                    else if (npc.Shop.ShopItems.Any())
                    {
                        // npc shop
                        ShopItemDTO item = npc.Shop.ShopItems.FirstOrDefault(it => it.Slot == buyPacket.Slot);
                        if (item == null || amount <= 0 || amount > 99)
                        {
                            return;
                        }
                        Item   iteminfo   = ServerManager.Instance.GetItem(item.ItemVNum);
                        long   price      = iteminfo.Price * amount;
                        long   Reputprice = iteminfo.ReputPrice * amount;
                        double percent;
                        switch (Session.Character.GetDignityIco())
                        {
                        case 3:
                            percent = 1.10;
                            break;

                        case 4:
                            percent = 1.20;
                            break;

                        case 5:
                        case 6:
                            percent = 1.5;
                            break;

                        default:
                            percent = 1;
                            break;
                        }
                        sbyte rare = item.Rare;
                        if (iteminfo.Type == 0)
                        {
                            amount = 1;
                        }
                        if (iteminfo.ReputPrice == 0)
                        {
                            if (price < 0 || price * percent > Session.Character.Gold)
                            {
                                Session.SendPacket(UserInterfaceHelper.Instance.GenerateShopMemo(3, Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY")));
                                return;
                            }
                        }
                        else
                        {
                            if (Reputprice <= 0 || Reputprice > Session.Character.Reput)
                            {
                                Session.SendPacket(UserInterfaceHelper.Instance.GenerateShopMemo(3, Language.Instance.GetMessageFromKey("NOT_ENOUGH_REPUT")));
                                return;
                            }
                            byte ra = (byte)ServerManager.Instance.RandomNumber();

                            int[] rareprob = { 100, 100, 70, 50, 30, 15, 5, 1 };
                            if (iteminfo.ReputPrice != 0)
                            {
                                for (int i = 0; i < rareprob.Length; i++)
                                {
                                    if (ra <= rareprob[i])
                                    {
                                        rare = (sbyte)i;
                                    }
                                }
                            }
                        }

                        List <ItemInstance> newItem = Session.Character.Inventory.AddNewToInventory(item.ItemVNum, amount, rare: rare, upgrade: item.Upgrade, design: item.Color);
                        if (!newItem.Any())
                        {
                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateShopMemo(3, Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE")));
                            return;
                        }

                        if (newItem.Any())
                        {
                            if (iteminfo.ReputPrice == 0)
                            {
                                Session.SendPacket(UserInterfaceHelper.Instance.GenerateShopMemo(1, string.Format(Language.Instance.GetMessageFromKey("BUY_ITEM_VALID"), iteminfo.Name, amount)));
                                Session.Character.Gold -= (long)(price * percent);
                                Session.SendPacket(Session.Character.GenerateGold());
                            }
                            else
                            {
                                Session.SendPacket(UserInterfaceHelper.Instance.GenerateShopMemo(1, string.Format(Language.Instance.GetMessageFromKey("BUY_ITEM_VALID"), iteminfo.Name, amount)));
                                Session.Character.Reput -= Reputprice;
                                Session.SendPacket(Session.Character.GenerateFd());
                                Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("REPUT_DECREASED"), 11));
                            }
                        }
                        else
                        {
                            Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ENOUGH_PLACE"), 0));
                        }
                    }
                }
                break;
            }
            }
        }
Exemple #2
0
        /// <summary>
        /// pdtse packet
        /// </summary>
        /// <param name="pdtsePacket"></param>
        public void Pdtse(PdtsePacket pdtsePacket)
        {
            if (!Session.HasCurrentMapInstance)
            {
                return;
            }
            short vNum = pdtsePacket.VNum;

            if (pdtsePacket.Type == 1)
            {
                Recipe rec;
                if (Session.Character.LastUsedItem == 0)
                {
                    MapNpc npc =
                        Session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == Session.Character.LastNRunId);
                    if (npc == null)
                    {
                        return;
                    }
                    int distance = Map.GetDistance(Session.Character.GetPos(), npc.GetPos());
                    if (npc.MapInstance != Session.CurrentMapInstance || distance > 5)
                    {
                        return;
                    }

                    rec = npc.Recipes.FirstOrDefault(s => s.ItemVNum == vNum);
                }
                else
                {
                    if (!ServerManager.Instance.ItemHasRecipe(vNum))
                    {
                        // NO RECIPE WITH THIS VNUM
                        return;
                    }
                    if (Session.Character.Inventory.CountItem(Session.Character.LastUsedItem) <= 0)
                    {
                        // NO SCROLL, PACKET HACKING
                        return;
                    }

                    rec = ServerManager.Instance.GetRecipeByItemVNum(vNum);
                }
                if (rec == null || rec.Amount <= 0)
                {
                    return;
                }
                string rece = $"m_list 3 {rec.Amount}";
                rece  = rec.Items.Where(ite => ite.Amount > 0).Aggregate(rece, (current, ite) => current + $" {ite.ItemVNum} {ite.Amount}");
                rece += " -1";
                Session.SendPacket(rece);
            }
            else
            {
                Recipe rec;
                if (Session.Character.LastUsedItem == 0)
                {
                    MapNpc npc =
                        Session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == Session.Character.LastNRunId);
                    if (npc == null)
                    {
                        return;
                    }
                    int distance = Map.GetDistance(Session.Character.GetPos(), npc.GetPos());
                    if (npc.MapInstance != Session.CurrentMapInstance || distance > 5)
                    {
                        return;
                    }
                    rec = npc.Recipes.FirstOrDefault(s => s.ItemVNum == vNum);
                }
                else
                {
                    if (!ServerManager.Instance.ItemHasRecipe(vNum))
                    {
                        // NO RECIPE WITH THIS VNUM
                        return;
                    }
                    if (Session.Character.Inventory.CountItem(Session.Character.LastUsedItem) <= 0)
                    {
                        // NO SCROLL, PACKET HACKING
                        return;
                    }

                    rec = ServerManager.Instance.GetRecipeByItemVNum(vNum);
                }
                if (rec == null)
                {
                    return;
                }
                if (rec.Amount <= 0)
                {
                    return;
                }
                if (rec.Items.Any(ite => Session.Character.Inventory.CountItem(ite.ItemVNum) < ite.Amount))
                {
                    return;
                }

                ItemInstance inv = Session.Character.Inventory.AddNewToInventory(rec.ItemVNum, rec.Amount).FirstOrDefault();
                if (inv == null)
                {
                    return;
                }
                if (inv.GetType() == typeof(WearableInstance))
                {
                    if (inv is WearableInstance item && (item.Item.EquipmentSlot == EquipmentType.Armor || item.Item.EquipmentSlot == EquipmentType.MainWeapon ||
                                                         item.Item.EquipmentSlot == EquipmentType.SecondaryWeapon))
                    {
                        item.SetRarityPoint();
                    }
                }
                foreach (RecipeItemDTO ite in rec.Items)
                {
                    Session.Character.Inventory.RemoveItemAmount(ite.ItemVNum, ite.Amount);
                }
                Session.Character.LastUsedItem = 0;
                Session.SendPacket($"pdti 11 {inv.ItemVNum} {rec.Amount} 29 {inv.Upgrade} 0");
                Session.SendPacket(UserInterfaceHelper.Instance.GenerateGuri(19, 1, Session.Character.CharacterId, 1324));
                Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("CRAFTED_OBJECT"), inv.Item.Name, rec.Amount), 0));
                Session.Character.IncrementQuests(QuestType.Product, inv.ItemVNum, rec.Amount);
            }
        }