Added crafting workshop requirements

This commit is contained in:
kuroppoi 2022-07-28 23:15:48 +02:00
parent 9e907ce56d
commit 03d43ef97e
3 changed files with 44 additions and 12 deletions

View file

@ -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]);
}

View file

@ -119,7 +119,10 @@ public class Item {
private Pair<DamageType, Float> damageInfo;
@JsonProperty("ingredients")
private List<CraftingIngredient> ingredients = new ArrayList<>();
private List<CraftingRequirement> craftingIngredients = new ArrayList<>();
@JsonProperty("crafting_helpers")
private List<CraftingRequirement> craftingHelpers = new ArrayList<>();
@JsonProperty("use")
private Map<ItemUseType, Object> useConfigs = new HashMap<>();
@ -305,11 +308,19 @@ public class Item {
}
public boolean isCraftable() {
return !ingredients.isEmpty();
return !craftingIngredients.isEmpty();
}
public List<CraftingIngredient> getIngredients() {
return ingredients;
public List<CraftingRequirement> getCraftingIngredients() {
return craftingIngredients;
}
public boolean requiresWorkshop() {
return !craftingHelpers.isEmpty();
}
public List<CraftingRequirement> getCraftingHelpers() {
return craftingHelpers;
}
public boolean hasUse(ItemUseType... types) {

View file

@ -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<CraftingIngredient> ingredients = item.getIngredients();
// Check if player has necessary ingredients
List<CraftingRequirement> 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<MetaBlock> 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);
}