mirror of
https://github.com/DieReicheErethons/Brewery.git
synced 2025-02-21 02:01:23 +01:00
Added Ingredients by Data Value
This commit is contained in:
parent
64b72e0118
commit
70177e9f9e
@ -61,7 +61,9 @@ version: '1.2'
|
||||
# -- Recipes for Potions --
|
||||
|
||||
# name: Different names for bad/normal/good (Formatting codes possible: such as &6)
|
||||
# ingredients: List of material/amount
|
||||
# ingredients: List of 'material or id,data/amount' (Item-ids instead of material are deprecated by bukkit and may not work in the future!)
|
||||
# A list of materials can be found here: http://jd.bukkit.org/beta/apidocs/org/bukkit/Material.html
|
||||
# You can specify a data value, omitting it will ignore the data value of the added ingredient
|
||||
# cookingtime: Time in real minutes ingredients have to boil
|
||||
# distillruns: How often it has to be distilled for full alcohol (0=without distilling)
|
||||
# wood: Wood of the barrel 0=any 1=Birch 2=Oak 3=Jungle 4=Spruce
|
||||
@ -183,6 +185,7 @@ recipes:
|
||||
|
||||
|
||||
# cooked: EVERY possible ingredient and the names for the originating potions after fermenting:
|
||||
# [Example] MATERIAL_or_id: Name after cooking
|
||||
|
||||
cooked:
|
||||
WHEAT: Fermented wheat
|
||||
|
@ -20,7 +20,7 @@ public class BCauldron {
|
||||
private int state = 1;
|
||||
private boolean someRemoved = false;
|
||||
|
||||
public BCauldron(Block block, Material ingredient) {
|
||||
public BCauldron(Block block, ItemStack ingredient) {
|
||||
this.block = block;
|
||||
add(ingredient);
|
||||
bcauldrons.add(this);
|
||||
@ -48,11 +48,12 @@ public class BCauldron {
|
||||
}
|
||||
|
||||
// add an ingredient to the cauldron
|
||||
public void add(Material ingredient) {
|
||||
public void add(ItemStack ingredient) {
|
||||
if (someRemoved) {
|
||||
ingredients = ingredients.clone();
|
||||
someRemoved = false;
|
||||
}
|
||||
ingredient = new ItemStack(ingredient.getType(), 1, ingredient.getDurability());
|
||||
ingredients.add(ingredient);
|
||||
block.getWorld().playEffect(block.getLocation(), Effect.EXTINGUISH, 0);
|
||||
if (state > 1) {
|
||||
@ -71,7 +72,7 @@ public class BCauldron {
|
||||
}
|
||||
|
||||
// get cauldron from block and add given ingredient
|
||||
public static boolean ingredientAdd(Block block, Material ingredient) {
|
||||
public static boolean ingredientAdd(Block block, ItemStack ingredient) {
|
||||
// if not empty
|
||||
if (getFillLevel(block) != 0) {
|
||||
BCauldron bcauldron = get(block);
|
||||
|
@ -17,7 +17,8 @@ public class BIngredients {
|
||||
private static int lastId = 0;
|
||||
|
||||
private int id;
|
||||
private Map<Material, Integer> ingredients = new HashMap<Material, Integer>();
|
||||
private ArrayList<ItemStack> ingredients = new ArrayList<ItemStack>();
|
||||
private Map<Material, Integer> materials = new HashMap<Material, Integer>(); // Merged List Of ingredients that doesnt consider Durability
|
||||
private int cookedTime;
|
||||
|
||||
// Represents ingredients in Cauldron, Brew
|
||||
@ -28,20 +29,35 @@ public class BIngredients {
|
||||
}
|
||||
|
||||
// Load from File
|
||||
public BIngredients(Map<Material, Integer> ingredients, int cookedTime) {
|
||||
public BIngredients(ArrayList<ItemStack> ingredients, int cookedTime) {
|
||||
this.ingredients = ingredients;
|
||||
this.cookedTime = cookedTime;
|
||||
this.id = lastId;
|
||||
lastId++;
|
||||
|
||||
for (ItemStack item : ingredients) {
|
||||
addMaterial(item);
|
||||
}
|
||||
}
|
||||
|
||||
// Add an ingredient to this
|
||||
public void add(Material ingredient) {
|
||||
if (ingredients.containsKey(ingredient)) {
|
||||
int newAmount = ingredients.get(ingredient) + 1;
|
||||
ingredients.put(ingredient, newAmount);
|
||||
public void add(ItemStack ingredient) {
|
||||
addMaterial(ingredient);
|
||||
for (ItemStack item : ingredients) {
|
||||
if (item.isSimilar(ingredient)) {
|
||||
item.setAmount(item.getAmount() + ingredient.getAmount());
|
||||
return;
|
||||
}
|
||||
}
|
||||
ingredients.add(ingredient);
|
||||
}
|
||||
|
||||
private void addMaterial(ItemStack ingredient) {
|
||||
if (materials.containsKey(ingredient.getType())) {
|
||||
int newAmount = materials.get(ingredient.getType()) + ingredient.getAmount();
|
||||
materials.put(ingredient.getType(), newAmount);
|
||||
} else {
|
||||
this.ingredients.put(ingredient, 1);
|
||||
materials.put(ingredient.getType(), ingredient.getAmount());
|
||||
}
|
||||
}
|
||||
|
||||
@ -76,10 +92,10 @@ public class BIngredients {
|
||||
cookedName = P.p.languageReader.get("Brew_ThickBrew");
|
||||
potion.setDurability(Brew.PotionColor.BLUE.getColorId(false));
|
||||
} else {
|
||||
for (Material ingredient : ingredients.keySet()) {
|
||||
for (Material ingredient : materials.keySet()) {
|
||||
if (cookedNames.containsKey(ingredient)) {
|
||||
// if more than half of the ingredients is of one kind
|
||||
if (ingredients.get(ingredient) > (getIngredientsCount() / 2)) {
|
||||
if (materials.get(ingredient) > (getIngredientsCount() / 2)) {
|
||||
cookedName = cookedNames.get(ingredient);
|
||||
potion.setDurability(Brew.PotionColor.CYAN.getColorId(true));
|
||||
}
|
||||
@ -104,8 +120,8 @@ public class BIngredients {
|
||||
// returns amount of ingredients
|
||||
private int getIngredientsCount() {
|
||||
int count = 0;
|
||||
for (int value : ingredients.values()) {
|
||||
count += value;
|
||||
for (ItemStack item : ingredients) {
|
||||
count += item.getAmount();
|
||||
}
|
||||
return count;
|
||||
}
|
||||
@ -211,9 +227,21 @@ public class BIngredients {
|
||||
// when ingredients are not complete
|
||||
return -1;
|
||||
}
|
||||
for (Material ingredient : ingredients.keySet()) {
|
||||
count = ingredients.get(ingredient);
|
||||
if (recipe.amountOf(ingredient) == 0) {
|
||||
ArrayList<Material> mergedChecked = new ArrayList<Material>();
|
||||
for (ItemStack ingredient : ingredients) {
|
||||
if (mergedChecked.contains(ingredient.getType())) {
|
||||
// This ingredient type was already checked as part of a merged material
|
||||
continue;
|
||||
}
|
||||
int amountInRecipe = recipe.amountOf(ingredient);
|
||||
// If we dont consider durability for this ingredient, check the merged material
|
||||
if (recipe.hasExactData(ingredient)) {
|
||||
count = ingredient.getAmount();
|
||||
} else {
|
||||
mergedChecked.add(ingredient.getType());
|
||||
count = materials.get(ingredient.getType());
|
||||
}
|
||||
if (amountInRecipe == 0) {
|
||||
// this ingredient doesnt belong into the recipe
|
||||
if (count > (getIngredientsCount() / 2)) {
|
||||
// when more than half of the ingredients dont fit into the
|
||||
@ -231,7 +259,7 @@ public class BIngredients {
|
||||
}
|
||||
}
|
||||
// calculate the quality
|
||||
quality -= ((float) Math.abs(count - recipe.amountOf(ingredient)) / recipe.allowedCountDiff(recipe.amountOf(ingredient))) * 10.0;
|
||||
quality -= ((float) Math.abs(count - amountInRecipe) / recipe.allowedCountDiff(amountInRecipe)) * 10.0;
|
||||
}
|
||||
if (quality >= 0) {
|
||||
return Math.round(quality);
|
||||
@ -290,7 +318,8 @@ public class BIngredients {
|
||||
// Creates a copy ingredients
|
||||
public BIngredients clone() {
|
||||
BIngredients copy = new BIngredients();
|
||||
copy.ingredients.putAll(ingredients);
|
||||
copy.ingredients.addAll(ingredients);
|
||||
copy.materials.putAll(materials);
|
||||
copy.cookedTime = cookedTime;
|
||||
return copy;
|
||||
}
|
||||
@ -308,8 +337,9 @@ public class BIngredients {
|
||||
//convert the ingredient Material to String
|
||||
public Map<String, Integer> serializeIngredients() {
|
||||
Map<String, Integer> mats = new HashMap<String, Integer>();
|
||||
for (Map.Entry<Material, Integer> entry : ingredients.entrySet()) {
|
||||
mats.put(entry.getKey().name(), entry.getValue());
|
||||
for (ItemStack item : ingredients) {
|
||||
String mat = item.getType().name() + "," + item.getDurability();
|
||||
mats.put(mat, item.getAmount());
|
||||
}
|
||||
return mats;
|
||||
}
|
||||
|
@ -1,16 +1,18 @@
|
||||
package com.dre.brewery;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class BRecipe {
|
||||
|
||||
private String[] name;
|
||||
private Map<Material, Integer> ingredients = new HashMap<Material, Integer>();// material and amount
|
||||
private ArrayList<ItemStack> ingredients = new ArrayList<ItemStack>();// material and amount
|
||||
private int cookingTime;// time to cook in cauldron
|
||||
private int distillruns;// runs through the brewer
|
||||
private byte wood;// type of wood the barrel has to consist of
|
||||
@ -38,9 +40,23 @@ public class BRecipe {
|
||||
for (String item : ingredientsList) {
|
||||
String[] ingredParts = item.split("/");
|
||||
if (ingredParts.length == 2) {
|
||||
Material mat = Material.matchMaterial(ingredParts[0]);
|
||||
String[] matParts;
|
||||
if (ingredParts[0].contains(",")) {
|
||||
matParts = ingredParts[0].split(",");
|
||||
} else if (ingredParts[0].contains(":")) {
|
||||
matParts = ingredParts[0].split(":");
|
||||
} else if (ingredParts[0].contains(";")) {
|
||||
matParts = ingredParts[0].split(";");
|
||||
} else {
|
||||
matParts = ingredParts[0].split("\\.");
|
||||
}
|
||||
Material mat = Material.matchMaterial(matParts[0]);
|
||||
if (mat != null) {
|
||||
this.ingredients.put(Material.matchMaterial(ingredParts[0]), P.p.parseInt(ingredParts[1]));
|
||||
ItemStack stack = new ItemStack(mat, P.p.parseInt(ingredParts[1]), (short) -1);
|
||||
if (matParts.length == 2) {
|
||||
stack.setDurability((short) P.p.parseInt(matParts[1]));
|
||||
}
|
||||
this.ingredients.add(stack);
|
||||
} else {
|
||||
P.p.errorLog("Unknown Material: " + ingredParts[0]);
|
||||
this.ingredients = null;
|
||||
@ -124,19 +140,39 @@ public class BRecipe {
|
||||
return age != 0;
|
||||
}
|
||||
|
||||
// true if given map misses an ingredient
|
||||
public boolean isMissingIngredients(Map<Material, Integer> map) {
|
||||
if (map.size() < ingredients.size()) {
|
||||
// true if given list misses an ingredient
|
||||
public boolean isMissingIngredients(List<ItemStack> list) {
|
||||
if (list.size() < ingredients.size()) {
|
||||
return true;
|
||||
}
|
||||
for (Material ingredient : ingredients.keySet()) {
|
||||
if (!map.containsKey(ingredient)) {
|
||||
return true;
|
||||
for (ItemStack ingredient : ingredients) {
|
||||
for (ItemStack used : list) {
|
||||
if (!ingredientsMatch(used, ingredient)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Returns true if this ingredient cares about durability
|
||||
public boolean hasExactData(ItemStack item) {
|
||||
for (ItemStack ingredient : ingredients) {
|
||||
if (ingredient.getType().equals(item.getType())) {
|
||||
return ingredient.getDurability() != -1;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Returns true if this item matches the item from a recipe
|
||||
public static boolean ingredientsMatch(ItemStack usedItem, ItemStack recipeItem) {
|
||||
if (!recipeItem.getType().equals(usedItem.getType())) {
|
||||
return false;
|
||||
}
|
||||
return recipeItem.getDurability() == -1 || recipeItem.getDurability() == usedItem.getDurability();
|
||||
}
|
||||
|
||||
// true if name and ingredients are correct
|
||||
public boolean isValid() {
|
||||
return (name != null && ingredients != null && !ingredients.isEmpty());
|
||||
@ -146,9 +182,11 @@ public class BRecipe {
|
||||
// Getter
|
||||
|
||||
// how many of a specific ingredient in the recipe
|
||||
public int amountOf(Material material) {
|
||||
if (ingredients.containsKey(material)) {
|
||||
return ingredients.get(material);
|
||||
public int amountOf(ItemStack item) {
|
||||
for (ItemStack ingredient : ingredients) {
|
||||
if (ingredientsMatch(item, ingredient)) {
|
||||
return ingredient.getAmount();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -375,4 +375,76 @@ public class ConfigUpdater {
|
||||
}
|
||||
}
|
||||
|
||||
// Update de from 1.2 to 1.3
|
||||
private void update12de() {
|
||||
updateVersion("1.3");
|
||||
|
||||
// Add the Example to the Cooked Section
|
||||
int index = indexOfStart("# cooked:");
|
||||
if (index != -1) {
|
||||
addLines(index, "# [Beispiel] MATERIAL_oder_id: Name nach Gähren");
|
||||
}
|
||||
|
||||
// Add new ingredients description
|
||||
String replacedLine = "# ingredients: Auflistung von 'Material oder ID,Data/Anzahl' (Item-ids anstatt Material werden von Bukkit nicht mehr unterstützt und funktionieren möglicherweise in Zukunft nicht mehr!)";
|
||||
String[] lines = new String[] {
|
||||
"# Eine Liste von allen Materialien kann hier gefunden werden: http://jd.bukkit.org/beta/apidocs/org/bukkit/Material.html",
|
||||
"# Es kann ein Data-Wert angegeben werden, weglassen ignoriert diesen beim hinzufügen einer Zutat"
|
||||
};
|
||||
index = indexOfStart("# ingredients:");
|
||||
if (index != -1) {
|
||||
setLine(index, replacedLine);
|
||||
addLines(index, lines);
|
||||
} else {
|
||||
index = indexOfStart("# name:");
|
||||
if (index != -1) {
|
||||
addLines(index, lines);
|
||||
addLines(index, replacedLine);
|
||||
} else {
|
||||
index = indexOfStart("# -- Rezepte für Getränke --");
|
||||
if (index != -1) {
|
||||
addLines(index, lines);
|
||||
addLines(index, "", replacedLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Update en from 1.2 to 1.3
|
||||
private void update12en() {
|
||||
updateVersion("1.3");
|
||||
|
||||
// Add the Example to the Cooked Section
|
||||
int index = indexOfStart("# cooked:");
|
||||
if (index != -1) {
|
||||
addLines(index, "# [Example] MATERIAL_or_id: Name after cooking");
|
||||
}
|
||||
|
||||
// Add new ingredients description
|
||||
String replacedLine = "# ingredients: List of 'material or id,data/amount' (Item-ids instead of material are deprecated by bukkit and may not work in the future!)";
|
||||
String[] lines = new String[] {
|
||||
"# A list of materials can be found here: http://jd.bukkit.org/beta/apidocs/org/bukkit/Material.html",
|
||||
"# You can specify a data value, omitting it will ignore the data value of the added ingredient"
|
||||
};
|
||||
index = indexOfStart("# ingredients:");
|
||||
if (index != -1) {
|
||||
setLine(index, replacedLine);
|
||||
addLines(index, lines);
|
||||
} else {
|
||||
index = indexOfStart("# name:");
|
||||
if (index != -1) {
|
||||
addLines(index, lines);
|
||||
addLines(index, replacedLine);
|
||||
} else {
|
||||
index = indexOfStart("# -- Recipes for Potions --");
|
||||
if (index != -1) {
|
||||
addLines(index, lines);
|
||||
addLines(index, "", replacedLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
@ -302,10 +303,7 @@ public class P extends JavaPlugin {
|
||||
ConfigurationSection matSection = section.getConfigurationSection(id + ".mats");
|
||||
if (matSection != null) {
|
||||
// matSection has all the materials + amount as Integers
|
||||
Map<Material, Integer> ingredients = new HashMap<Material, Integer>();
|
||||
for (String mat : matSection.getKeys(false)) {
|
||||
ingredients.put(Material.getMaterial(mat), matSection.getInt(mat));
|
||||
}
|
||||
ArrayList<ItemStack> ingredients = deserializeIngredients(matSection);
|
||||
ingMap.put(id, new BIngredients(ingredients, section.getInt(id + ".cookedTime", 0)));
|
||||
} else {
|
||||
errorLog("Ingredient id: '" + id + "' incomplete in data.yml");
|
||||
@ -369,6 +367,19 @@ public class P extends JavaPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<ItemStack> deserializeIngredients(ConfigurationSection matSection) {
|
||||
ArrayList<ItemStack> ingredients = new ArrayList<ItemStack>();
|
||||
for (String mat : matSection.getKeys(false)) {
|
||||
String[] matSplit = mat.split(",");
|
||||
ItemStack item = new ItemStack(Material.getMaterial(matSplit[0]), matSection.getInt(mat));
|
||||
if (matSplit.length == 2) {
|
||||
item.setDurability((short) P.p.parseInt(matSplit[1]));
|
||||
}
|
||||
ingredients.add(item);
|
||||
}
|
||||
return ingredients;
|
||||
}
|
||||
|
||||
// returns Ingredients by id from the specified ingMap
|
||||
public BIngredients getIngredients(Map<String, BIngredients> ingMap, String id) {
|
||||
if (!ingMap.isEmpty()) {
|
||||
@ -383,11 +394,7 @@ public class P extends JavaPlugin {
|
||||
// loads BIngredients from an ingredient section
|
||||
public BIngredients loadIngredients(ConfigurationSection section) {
|
||||
if (section != null) {
|
||||
Map<Material, Integer> ingredients = new HashMap<Material, Integer>();
|
||||
for (String mat : section.getKeys(false)) {
|
||||
ingredients.put(Material.getMaterial(mat), section.getInt(mat));
|
||||
}
|
||||
return new BIngredients(ingredients, 0);
|
||||
return new BIngredients(deserializeIngredients(section), 0);
|
||||
} else {
|
||||
errorLog("Cauldron is missing Ingredient Section");
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ public class PlayerListener implements Listener {
|
||||
// contitions
|
||||
} else if (BIngredients.possibleIngredients.contains(materialInHand)) {
|
||||
if (player.hasPermission("brewery.cauldron.insert")) {
|
||||
if (BCauldron.ingredientAdd(clickedBlock, materialInHand)) {
|
||||
if (BCauldron.ingredientAdd(clickedBlock, item)) {
|
||||
boolean isBucket = item.getType().equals(Material.WATER_BUCKET)
|
||||
|| item.getType().equals(Material.LAVA_BUCKET)
|
||||
|| item.getType().equals(Material.MILK_BUCKET);
|
||||
|
Loading…
Reference in New Issue
Block a user