public void Buy(PlayerObject player, ulong index, ushort count)
{
UserItem goods = null;
for (int i = 0; i < Goods.Count; i++)
{
if (Goods[i].UniqueID != index) continue;
goods = Goods[i];
break;
}
bool isUsed = false;
bool isBuyBack = false;
var callingNPC = NPCObject.Get(player.NPCObjectID);
if (callingNPC != null)
{
if (goods == null)
{
for (int i = 0; i < callingNPC.UsedGoods.Count; i++)
{
if (callingNPC.UsedGoods[i].UniqueID != index) continue;
goods = callingNPC.UsedGoods[i];
isUsed = true;
break;
}
}
if (goods == null)
{
if (!callingNPC.BuyBack.ContainsKey(player.Name)) callingNPC.BuyBack[player.Name] = new List<UserItem>();
for (int i = 0; i < callingNPC.BuyBack[player.Name].Count; i++)
{
if (callingNPC.BuyBack[player.Name][i].UniqueID != index) continue;
goods = callingNPC.BuyBack[player.Name][i];
isBuyBack = true;
break;
}
}
}
if (goods == null || count == 0 || count > goods.Info.StackSize) return;
if ((isBuyBack || isUsed) && count > goods.Count)
count = goods.Count;
else
goods.Count = count;
uint cost = goods.Price();
cost = (uint)(cost * PriceRate(player));
uint baseCost = (uint)(goods.Price() * PriceRate(player, true));
if (player.NPCPage.Key.ToUpper() == PearlBuyKey)//pearl currency
{
if (cost > player.Info.PearlCount) return;
}
else if (cost > player.Account.Gold) return;
UserItem item = (isBuyBack || isUsed) ? goods : Envir.CreateFreshItem(goods.Info);
item.Count = goods.Count;
if (!player.CanGainItem(item)) return;
if (player.NPCPage.Key.ToUpper() == PearlBuyKey)
{
player.IntelligentCreatureLosePearls((int)cost);
}
else
{
player.Account.Gold -= cost;
player.Enqueue(new S.LoseGold { Gold = cost });
if (callingNPC != null && callingNPC.Conq != null)
{
callingNPC.Conq.GoldStorage += (cost - baseCost);
}
}
player.GainItem(item);
if (isUsed)
{
callingNPC.UsedGoods.Remove(goods); //If used or buyback will destroy whole stack instead of reducing to remaining quantity
List<UserItem> newGoodsList = new List<UserItem>();
newGoodsList.AddRange(Goods);
newGoodsList.AddRange(callingNPC.UsedGoods);
callingNPC.NeedSave = true;
player.Enqueue(new S.NPCGoods
{
List = newGoodsList,
Rate = PriceRate(player),
HideAddedStats = Settings.GoodsHideAddedStats,
Type = player.NPCPage.Key.ToUpper() == BuyUsedKey ? PanelType.BuySub : PanelType.Buy
});
}
if (isBuyBack)
{
callingNPC.BuyBack[player.Name].Remove(goods); //If used or buyback will destroy whole stack instead of reducing to remaining quantity
player.Enqueue(new S.NPCGoods { List = callingNPC.BuyBack[player.Name], Rate = PriceRate(player), HideAddedStats = false });
}
}
public void Sell(PlayerObject player, UserItem item)