public void Craft(PlayerObject player, ulong index, ushort count, int[] slots)
{
S.CraftItem p = new S.CraftItem();
RecipeInfo recipe = null;
for (int i = 0; i < CraftGoods.Count; i++)
{
if (CraftGoods[i].Item.UniqueID != index) continue;
recipe = CraftGoods[i];
break;
}
UserItem goods = recipe.Item;
if (goods == null || count == 0 || count > goods.Info.StackSize)
{
player.Enqueue(p);
return;
}
if (player.Account.Gold < recipe.Gold)
{
player.Enqueue(p);
return;
}
bool hasItems = true;
List<int> usedSlots = new List<int>();
//Check Tools
foreach (var tool in recipe.Tools)
{
for (int i = 0; i < slots.Length; i++)
{
int slot = slots[i];
if (usedSlots.Contains(slot)) continue;
if (slot < 0 || slot > player.Info.Inventory.Length) continue;
UserItem item = player.Info.Inventory[slot];
if (item == null || item.Info != tool.Info) continue;
usedSlots.Add(slot);
if ((uint)Math.Floor(item.CurrentDura / 1000M) < count)
{
hasItems = false;
break;
}
}
if (!hasItems)
{
break;
}
}
//Check Ingredients
foreach (var ingredient in recipe.Ingredients)
{
if (ingredient.Count * count > ingredient.Info.StackSize)
{
player.Enqueue(p);
return;
}
ushort amount = (ushort)(ingredient.Count * count);
for (int i = 0; i < slots.Length; i++)
{
int slot = slots[i];
if (usedSlots.Contains(slot)) continue;
if (slot < 0 || slot > player.Info.Inventory.Length) continue;
UserItem item = player.Info.Inventory[slot];
if (item == null || item.Info != ingredient.Info) continue;
usedSlots.Add(slot);
if (ingredient.CurrentDura < ingredient.MaxDura && ingredient.CurrentDura > item.CurrentDura)
{
hasItems = false;
break;
}
if (amount > item.Count)
{
hasItems = false;
break;
}
amount = 0;
break;
}
if (amount > 0)
{
hasItems = false;
break;
}
}
if (!hasItems || usedSlots.Count != (recipe.Tools.Count + recipe.Ingredients.Count))
{
player.Enqueue(p);
return;
}
if (count > (goods.Info.StackSize / goods.Count) || count < 1)
{
player.Enqueue(p);
return;
}
UserItem craftedItem = Envir.CreateFreshItem(goods.Info);
craftedItem.Count = (ushort)(goods.Count * count);
if (!player.CanGainItem(craftedItem))
{
player.Enqueue(p);
return;
}
List<int> usedSlots2 = new List<int>();
//Use Tool Durability
foreach (var tool in recipe.Tools)
{
for (int i = 0; i < slots.Length; i++)
{
int slot = slots[i];
if (usedSlots2.Contains(slot)) continue;
if (slot < 0 || slot > player.Info.Inventory.Length) continue;
UserItem item = player.Info.Inventory[slot];
if (item == null || item.Info != tool.Info) continue;
usedSlots2.Add(slot);
player.DamageItem(item, (int)(count * 1000), true);
break;
}
}
//Take Ingredients
foreach (var ingredient in recipe.Ingredients)
{
ushort amount = (ushort)(ingredient.Count * count);
for (int i = 0; i < slots.Length; i++)
{
int slot = slots[i];
if (usedSlots2.Contains(slot)) continue;
if (slot < 0 || slot > player.Info.Inventory.Length) continue;
UserItem item = player.Info.Inventory[slot];
if (item == null || item.Info != ingredient.Info) continue;
usedSlots2.Add(slot);
if (item.Count > amount)
{
player.Enqueue(new S.DeleteItem { UniqueID = item.UniqueID, Count = amount });
player.Info.Inventory[slot].Count -= amount;
break;
}
else
{
player.Enqueue(new S.DeleteItem { UniqueID = item.UniqueID, Count = item.Count });
amount -= item.Count;
player.Info.Inventory[slot] = null;
}
break;
}
}
//Take Gold
player.Account.Gold -= recipe.Gold;
player.Enqueue(new S.LoseGold { Gold = recipe.Gold });
if (Envir.Random.Next(100) >= recipe.Chance + player.Stats[Stat.CraftRatePercent])
{
player.ReceiveChat("Crafting attempt failed.", ChatType.System);
}
else
{
//Give Item
player.GainItem(craftedItem);
}
p.Success = true;
player.Enqueue(p);
}
}