public void Craft(PlayerObject player, ulong index, uint 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; } bool hasItems = true; List <int> usedSlots = new List <int>(); //Check Items foreach (var ingredient in recipe.Ingredients) { uint amount = 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 (amount <= item.Count) { amount = 0; } else { hasItems = false; } break; } if (amount > 0) { hasItems = false; break; } } if (!hasItems) { player.Enqueue(p); return; } UserItem craftedItem = Envir.CreateFreshItem(goods.Info); craftedItem.Count = count; if (!player.CanGainItem(craftedItem)) { player.Enqueue(p); return; } //Take Items foreach (var ingredient in recipe.Ingredients) { uint amount = ingredient.Count * count; for (int i = 0; i < slots.Length; i++) { int slot = slots[i]; if (slot < 0) { continue; } UserItem item = player.Info.Inventory[slot]; if (item == null || item.Info != ingredient.Info) { continue; } 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; } } //Give Item player.GainItem(craftedItem); p.Success = true; player.Enqueue(p); }
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); }