cn.nukkit.inventory.ShapelessRecipe Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of powernukkit Show documentation
Show all versions of powernukkit Show documentation
A Minecraft Bedrock Edition server software implementation made in Java from scratch which supports all new features.
package cn.nukkit.inventory;
import cn.nukkit.item.Item;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
/**
* @author MagicDroidX (Nukkit Project)
*/
public class ShapelessRecipe implements CraftingRecipe {
private String recipeId;
private final Item output;
private long least,most;
private final List- ingredients;
private final List
- ingredientsAggregate;
private final int priority;
public ShapelessRecipe(Item result, Collection
- ingredients) {
this(null, 10, result, ingredients);
}
public ShapelessRecipe(String recipeId, int priority, Item result, Collection
- ingredients) {
this.recipeId = recipeId;
this.priority = priority;
this.output = result.clone();
if (ingredients.size() > 9) {
throw new IllegalArgumentException("Shapeless recipes cannot have more than 9 ingredients");
}
this.ingredients = new ArrayList<>();
this.ingredientsAggregate = new ArrayList<>();
for (Item item : ingredients) {
if (item.getCount() < 1) {
throw new IllegalArgumentException("Recipe '" + recipeId + "' Ingredient amount was not 1 (value: " + item.getCount() + ")");
}
boolean found = false;
for (Item existingIngredient : this.ingredientsAggregate) {
if (existingIngredient.equals(item, item.hasMeta(), item.hasCompoundTag())) {
existingIngredient.setCount(existingIngredient.getCount() + item.getCount());
found = true;
break;
}
}
if (!found)
this.ingredientsAggregate.add(item.clone());
this.ingredients.add(item.clone());
}
this.ingredientsAggregate.sort(CraftingManager.recipeComparator);
}
@Override
public Item getResult() {
return this.output.clone();
}
@Override
public String getRecipeId() {
return this.recipeId;
}
@Override
public UUID getId() {
return new UUID(least, most);
}
@Override
public void setId(UUID uuid) {
this.least = uuid.getLeastSignificantBits();
this.most = uuid.getMostSignificantBits();
if (this.recipeId == null) {
this.recipeId = this.getId().toString();
}
}
public List
- getIngredientList() {
List
- ingredients = new ArrayList<>();
for (Item ingredient : this.ingredients) {
ingredients.add(ingredient.clone());
}
return ingredients;
}
public int getIngredientCount() {
return ingredients.size();
}
@Override
public void registerToCraftingManager(CraftingManager manager) {
manager.registerShapelessRecipe(this);
}
@Override
public RecipeType getType() {
return RecipeType.SHAPELESS;
}
@Override
public boolean requiresCraftingTable() {
return this.ingredients.size() > 4;
}
@Override
public List
- getExtraResults() {
return new ArrayList<>();
}
@Override
public List
- getAllResults() {
return null;
}
@Override
public int getPriority() {
return this.priority;
}
public boolean matchItems(List
- inputList, List
- extraOutputList, int multiplier) {
List
- haveInputs = new ArrayList<>();
for (Item item : inputList) {
if (item.isNull())
continue;
haveInputs.add(item.clone());
}
List
- needInputs = new ArrayList<>();
if(multiplier != 1){
for (Item item : ingredientsAggregate) {
if (item.isNull())
continue;
Item itemClone = item.clone();
itemClone.setCount(itemClone.getCount() * multiplier);
needInputs.add(itemClone);
}
} else {
for (Item item : ingredientsAggregate) {
if (item.isNull())
continue;
needInputs.add(item.clone());
}
}
if (!matchItemList(haveInputs, needInputs)) {
return false;
}
List
- haveOutputs = new ArrayList<>();
for (Item item : extraOutputList) {
if (item.isNull())
continue;
haveOutputs.add(item.clone());
}
haveOutputs.sort(CraftingManager.recipeComparator);
List
- needOutputs = new ArrayList<>();
if(multiplier != 1){
for (Item item : getExtraResults()) {
if (item.isNull())
continue;
Item itemClone = item.clone();
itemClone.setCount(itemClone.getCount() * multiplier);
needOutputs.add(itemClone);
}
} else {
for (Item item : getExtraResults()) {
if (item.isNull())
continue;
needOutputs.add(item.clone());
}
}
needOutputs.sort(CraftingManager.recipeComparator);
return this.matchItemList(haveOutputs, needOutputs);
}
/**
* Returns whether the specified list of crafting grid inputs and outputs matches this recipe. Outputs DO NOT
* include the primary result item.
*
* @param inputList list of items taken from the crafting grid
* @param extraOutputList list of items put back into the crafting grid (secondary results)
* @return bool
*/
@Override
public boolean matchItems(List
- inputList, List
- extraOutputList) {
return matchItems(inputList, extraOutputList, 1);
}
private boolean matchItemList(List
- haveItems, List
- needItems) {
for (Item needItem : new ArrayList<>(needItems)) {
for (Item haveItem : new ArrayList<>(haveItems)) {
if (needItem.equals(haveItem, needItem.hasMeta(), needItem.hasCompoundTag())) {
int amount = Math.min(haveItem.getCount(), needItem.getCount());
needItem.setCount(needItem.getCount() - amount);
haveItem.setCount(haveItem.getCount() - amount);
if (haveItem.getCount() == 0) {
haveItems.remove(haveItem);
}
if (needItem.getCount() == 0) {
needItems.remove(needItem);
break;
}
}
}
}
return haveItems.isEmpty() && needItems.isEmpty();
}
@Override
public List
- getIngredientsAggregate() {
return ingredientsAggregate;
}
}