/// <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; } } }
/// <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); } }