diff --git a/gameserver/src/main/java/brainwine/gameserver/item/CraftingIngredient.java b/gameserver/src/main/java/brainwine/gameserver/item/CraftingRequirement.java similarity index 72% rename from gameserver/src/main/java/brainwine/gameserver/item/CraftingIngredient.java rename to gameserver/src/main/java/brainwine/gameserver/item/CraftingRequirement.java index 58b32b4..47d8214 100644 --- a/gameserver/src/main/java/brainwine/gameserver/item/CraftingIngredient.java +++ b/gameserver/src/main/java/brainwine/gameserver/item/CraftingRequirement.java @@ -2,23 +2,23 @@ package brainwine.gameserver.item; import com.fasterxml.jackson.annotation.JsonCreator; -public class CraftingIngredient { +public class CraftingRequirement { private final LazyItemGetter item; private final int quantity; - private CraftingIngredient(LazyItemGetter item, int quantity) { + private CraftingRequirement(LazyItemGetter item, int quantity) { this.item = item; this.quantity = quantity; } @JsonCreator - private CraftingIngredient(String item) { + private CraftingRequirement(String item) { this(new LazyItemGetter(item), 1); } @JsonCreator - private CraftingIngredient(Object[] data) { + private CraftingRequirement(Object[] data) { this(new LazyItemGetter((String)data[0]), (int)data[1]); } diff --git a/gameserver/src/main/java/brainwine/gameserver/item/Item.java b/gameserver/src/main/java/brainwine/gameserver/item/Item.java index 39170ea..a782dd2 100644 --- a/gameserver/src/main/java/brainwine/gameserver/item/Item.java +++ b/gameserver/src/main/java/brainwine/gameserver/item/Item.java @@ -119,7 +119,10 @@ public class Item { private Pair damageInfo; @JsonProperty("ingredients") - private List ingredients = new ArrayList<>(); + private List craftingIngredients = new ArrayList<>(); + + @JsonProperty("crafting_helpers") + private List craftingHelpers = new ArrayList<>(); @JsonProperty("use") private Map useConfigs = new HashMap<>(); @@ -305,11 +308,19 @@ public class Item { } public boolean isCraftable() { - return !ingredients.isEmpty(); + return !craftingIngredients.isEmpty(); } - public List getIngredients() { - return ingredients; + public List getCraftingIngredients() { + return craftingIngredients; + } + + public boolean requiresWorkshop() { + return !craftingHelpers.isEmpty(); + } + + public List getCraftingHelpers() { + return craftingHelpers; } public boolean hasUse(ItemUseType... types) { diff --git a/gameserver/src/main/java/brainwine/gameserver/server/requests/CraftRequest.java b/gameserver/src/main/java/brainwine/gameserver/server/requests/CraftRequest.java index d75c72a..f0fb48c 100644 --- a/gameserver/src/main/java/brainwine/gameserver/server/requests/CraftRequest.java +++ b/gameserver/src/main/java/brainwine/gameserver/server/requests/CraftRequest.java @@ -6,9 +6,12 @@ import brainwine.gameserver.annotations.OptionalField; import brainwine.gameserver.annotations.RequestInfo; import brainwine.gameserver.entity.player.Inventory; import brainwine.gameserver.entity.player.Player; -import brainwine.gameserver.item.CraftingIngredient; +import brainwine.gameserver.item.CraftingRequirement; import brainwine.gameserver.item.Item; import brainwine.gameserver.server.PlayerRequest; +import brainwine.gameserver.util.MathUtils; +import brainwine.gameserver.util.Pair; +import brainwine.gameserver.zone.MetaBlock; /** * TODO Account for skills, bonuses etc.. @@ -28,10 +31,11 @@ public class CraftRequest extends PlayerRequest { return; } - List ingredients = item.getIngredients(); + // Check if player has necessary ingredients + List ingredients = item.getCraftingIngredients(); Inventory inventory = player.getInventory(); - for(CraftingIngredient ingredient : ingredients) { + for(CraftingRequirement ingredient : ingredients) { Item item = ingredient.getItem(); if(!inventory.hasItem(item, ingredient.getQuantity() * quantity)) { @@ -40,7 +44,24 @@ public class CraftRequest extends PlayerRequest { } } - for(CraftingIngredient ingredient : ingredients) { + // Check if required crafting helpers are nearby + if(item.requiresWorkshop()) { + List workshop = player.getZone().getMetaBlocksWhere(metaBlock + -> MathUtils.inRange(player.getX(), player.getY(), metaBlock.getX(), metaBlock.getY(), 10)); + + for(CraftingRequirement craftingHelper : item.getCraftingHelpers()) { + int quantityMissing = craftingHelper.getQuantity() - (int)workshop.stream().filter(metaBlock + -> metaBlock.getItem() == craftingHelper.getItem()).count(); + + if(quantityMissing > 0) { + player.alert(String.format("You can't craft this item because your workshop is lacking %sx %s.", + quantityMissing, craftingHelper.getItem().getTitle())); + return; + } + } + } + + for(CraftingRequirement ingredient : ingredients) { inventory.removeItem(ingredient.getItem(), ingredient.getQuantity() * quantity); }