Moved price and it's methods to Utilities

This commit is contained in:
Teriuihi 2021-09-25 03:20:25 +02:00
parent 5dd6cb44e5
commit 22e05d140f
4 changed files with 67 additions and 71 deletions

View File

@ -2,8 +2,8 @@ package com.alttd.GUI.windows;
import com.alttd.GUI.GUIMerchant;
import com.alttd.config.Config;
import com.alttd.economy.Calculation;
import com.alttd.objects.VillagerType;
import com.alttd.util.Utilities;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.Material;
@ -19,7 +19,7 @@ public class BuyGUI extends GUIMerchant {
Template.of("trader", villagerType.getDisplayName()),
Template.of("percentage", "100")), villagerType); //TODO get percentage from player somehow
for (ItemStack itemStack : villagerType.getBuying()) {
double price = Calculation.price(itemStack);
double price = Utilities.price(itemStack);
addItem(itemStack,
getPriceItem(price),
null,

View File

@ -2,8 +2,8 @@ package com.alttd.GUI.windows;
import com.alttd.GUI.GUIMerchant;
import com.alttd.config.Config;
import com.alttd.economy.Calculation;
import com.alttd.objects.VillagerType;
import com.alttd.util.Utilities;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.Material;
@ -19,7 +19,7 @@ public class SellGUI extends GUIMerchant {
Template.of("trader", villagerType.getDisplayName()),
Template.of("percentage", "100")), villagerType); //TODO get percentage from player somehow
for (ItemStack itemStack : villagerType.getSelling()) {
double price = Calculation.price(itemStack);
double price = Utilities.price(itemStack);
addItem(itemStack,
getPriceItem(price),
null,

View File

@ -1,67 +0,0 @@
package com.alttd.economy;
import com.alttd.config.WorthConfig;
import com.alttd.util.Utilities;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.*;
import java.util.Collection;
import java.util.List;
public class Calculation {
/**
* Calculate the price for an item
* @param item to calculate price for
* @return price or int < 0 for error
*/
public static double price(ItemStack item) {
if (WorthConfig.prices.containsKey(item.getType()))
return Utilities.round(WorthConfig.prices.getDouble(item.getType()) * item.getAmount(), 2);
WorthConfig.prices.put(item.getType(), Utilities.round(getPrice(item, null), 2));
return WorthConfig.prices.getDouble(item.getType()) * item.getAmount();
}
private static double getPrice(ItemStack item, Material blockedMaterial) {
if (WorthConfig.prices.containsKey(item.getType()))
return WorthConfig.prices.getDouble(item.getType());
double price = -1;
List<Recipe> recipes = Bukkit.getRecipesFor(item);
for (Recipe recipe : recipes) {
double possiblePrice;
if (recipe instanceof ShapedRecipe shapedRecipe) {
Collection<ItemStack> values = shapedRecipe.getIngredientMap().values();
if (values.stream().anyMatch(itemStack -> itemStack.getType().equals(blockedMaterial)))
continue;
possiblePrice = getPrice(values.stream().toList(), item.getType());
if (price == -1 || price > possiblePrice)
price = possiblePrice;
} else if (recipe instanceof ShapelessRecipe shapelessRecipe) {
if (shapelessRecipe.getIngredientList().stream().anyMatch(itemStack -> itemStack.getType().equals(blockedMaterial)))
continue;
possiblePrice = getPrice(shapelessRecipe.getIngredientList(), item.getType());
if (price == -1 || price > possiblePrice)
price = possiblePrice;
} else if (recipe instanceof FurnaceRecipe furnaceRecipe) {
possiblePrice = getPrice(furnaceRecipe.getInput(), item.getType());
if (price == -1 || price > possiblePrice)
price = possiblePrice;
}
}
return price;
}
private static double getPrice(List<ItemStack> items, Material blockedMaterial) {
double price = 0;
for (ItemStack item : items) {
double tmp = getPrice(item, blockedMaterial);
if (tmp == -1)
return -1;
price += tmp;
}
return price;
}
}

View File

@ -1,5 +1,13 @@
package com.alttd.util;
import com.alttd.config.WorthConfig;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.*;
import java.util.Collection;
import java.util.List;
public class Utilities {
/**
* Rounds num down to precision (rounds up if last cut off decimal is bigger than 4)
@ -22,4 +30,59 @@ public class Utilities {
return total;
}
/**
* Calculate the price for an ItemStack (this considers stack size)
*
* @param item to calculate price for
* @return price or int < 0 for error
*/
public static double price(ItemStack item) {
if (WorthConfig.prices.containsKey(item.getType()))
return Utilities.round(WorthConfig.prices.getDouble(item.getType()) * item.getAmount(), 2);
WorthConfig.prices.put(item.getType(), Utilities.round(getPrice(item, null), 2));
return WorthConfig.prices.getDouble(item.getType()) * item.getAmount();
}
private static double getPrice(ItemStack item, Material blockedMaterial) {
if (WorthConfig.prices.containsKey(item.getType()))
return WorthConfig.prices.getDouble(item.getType());
double price = -1;
List<Recipe> recipes = Bukkit.getRecipesFor(item);
for (Recipe recipe : recipes) {
double possiblePrice;
if (recipe instanceof ShapedRecipe shapedRecipe) {
Collection<ItemStack> values = shapedRecipe.getIngredientMap().values();
if (values.stream().anyMatch(itemStack -> itemStack.getType().equals(blockedMaterial)))
continue;
possiblePrice = getPrice(values.stream().toList(), item.getType());
if (price == -1 || price > possiblePrice)
price = possiblePrice;
} else if (recipe instanceof ShapelessRecipe shapelessRecipe) {
if (shapelessRecipe.getIngredientList().stream().anyMatch(itemStack -> itemStack.getType().equals(blockedMaterial)))
continue;
possiblePrice = getPrice(shapelessRecipe.getIngredientList(), item.getType());
if (price == -1 || price > possiblePrice)
price = possiblePrice;
} else if (recipe instanceof FurnaceRecipe furnaceRecipe) {
possiblePrice = getPrice(furnaceRecipe.getInput(), item.getType());
if (price == -1 || price > possiblePrice)
price = possiblePrice;
}
}
return price;
}
private static double getPrice(List<ItemStack> items, Material blockedMaterial) {
double price = 0;
for (ItemStack item : items) {
double tmp = getPrice(item, blockedMaterial);
if (tmp == -1)
return -1;
price += tmp;
}
return price;
}
}