aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io')
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java4
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java212
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java2
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java138
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java2
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java257
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/overlays/CraftingOverlay.java44
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.java141
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/recipes/ForgeRecipe.java220
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/recipes/Ingredient.java88
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java39
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java180
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeSlot.java28
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/Debouncer.java34
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/HotmInformation.java179
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.java36
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java38
17 files changed, 1261 insertions, 381 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java
index 5c26e3d6..e78c117b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java
@@ -152,7 +152,7 @@ public class ItemPriceInformation {
}
break;
case 4:
- if (craftCost.fromRecipe) {
+ if (craftCost != null && craftCost.fromRecipe) {
if ((int) craftCost.craftCost == 0) {
continue;
}
@@ -224,7 +224,7 @@ public class ItemPriceInformation {
}
break;
case 3:
- if (craftCost.fromRecipe) {
+ if (craftCost != null && craftCost.fromRecipe) {
if ((int) craftCost.craftCost == 0) {
continue;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
index 0f4e58bf..064b1fa7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
@@ -1,14 +1,13 @@
package io.github.moulberry.notenoughupdates;
-import com.google.common.collect.Lists;
import com.google.gson.*;
import io.github.moulberry.notenoughupdates.auction.APIManager;
import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe;
import io.github.moulberry.notenoughupdates.overlays.CraftingOverlay;
-import io.github.moulberry.notenoughupdates.util.Constants;
-import io.github.moulberry.notenoughupdates.util.HypixelApi;
-import io.github.moulberry.notenoughupdates.util.SBInfo;
-import io.github.moulberry.notenoughupdates.util.Utils;
+import io.github.moulberry.notenoughupdates.recipes.CraftingRecipe;
+import io.github.moulberry.notenoughupdates.recipes.Ingredient;
+import io.github.moulberry.notenoughupdates.recipes.NeuRecipe;
+import io.github.moulberry.notenoughupdates.util.*;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.init.Blocks;
@@ -17,8 +16,8 @@ import net.minecraft.inventory.ContainerChest;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.*;
-import net.minecraft.network.play.client.C0DPacketCloseWindow;
import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.common.ProgressManager;
import org.apache.commons.io.FileUtils;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
@@ -68,18 +67,26 @@ public class NEUManager {
private static String GIT_COMMITS_URL;
- private final HashMap<String, Set<String>> usagesMap = new HashMap<>();
+ // TODO: private final Map<String, NeuItem>
+
+ private final Set<NeuRecipe> recipes = new HashSet<>();
+ private final HashMap<String, Set<NeuRecipe>> recipesMap = new HashMap<>();
+ private final HashMap<String, Set<NeuRecipe>> usagesMap = new HashMap<>();
public String latestRepoCommit = null;
public File configLocation;
public File repoLocation;
public File configFile;
+ public HotmInformation hotm;
public NEUManager(NotEnoughUpdates neu, File configLocation) {
this.neu = neu;
this.configLocation = configLocation;
this.auctionManager = new APIManager(this);
+ this.hotm = new HotmInformation(neu);
+
+
GIT_COMMITS_URL = neu.config.hidden.repoCommitsURL;
gson = new GsonBuilder().setPrettyPrinting().create();
@@ -261,14 +268,17 @@ public class NEUManager {
if (items.exists()) {
File[] itemFiles = new File(repoLocation, "items").listFiles();
if (itemFiles != null) {
+ ProgressManager.ProgressBar bar = ProgressManager.push("Loading recipes", itemFiles.length);
for (File f : itemFiles) {
String internalname = f.getName().substring(0, f.getName().length() - 5);
+ bar.step(internalname);
synchronized (itemMap) {
if (!itemMap.containsKey(internalname)) {
loadItem(internalname);
}
}
}
+ ProgressManager.pop(bar);
}
}
@@ -283,14 +293,17 @@ public class NEUManager {
if (items.exists()) {
File[] itemFiles = new File(repoLocation, "items").listFiles();
if (itemFiles != null) {
+ ProgressManager.ProgressBar bar = ProgressManager.push("Loading items", itemFiles.length);
for (File f : itemFiles) {
String internalname = f.getName().substring(0, f.getName().length() - 5);
+ bar.step(internalname);
synchronized (itemMap) {
if (!itemMap.containsKey(internalname)) {
loadItem(internalname);
}
}
}
+ ProgressManager.pop(bar);
}
}
@@ -325,23 +338,17 @@ public class NEUManager {
itemMap.put(internalName, json);
if (json.has("recipe")) {
- synchronized (usagesMap) {
- JsonObject recipe = json.get("recipe").getAsJsonObject();
-
- String[] x = {"1", "2", "3"};
- String[] y = {"A", "B", "C"};
- for (int i = 0; i < 9; i++) {
- String name = y[i / 3] + x[i % 3];
- String itemS = recipe.get(name).getAsString();
- if (itemS != null && itemS.split(":").length == 2) {
- itemS = itemS.split(":")[0];
- }
-
- if (!usagesMap.containsKey(itemS)) {
- usagesMap.put(itemS, new HashSet<>());
- }
- usagesMap.get(itemS).add(internalName);
- }
+ JsonObject recipe = json.getAsJsonObject("recipe");
+ NeuRecipe neuRecipe = NeuRecipe.parseRecipe(this, recipe, json);
+ if (neuRecipe != null)
+ registerNeuRecipe(neuRecipe);
+ }
+ if (json.has("recipes")) {
+ for (JsonElement element : json.getAsJsonArray("recipes")) {
+ JsonObject recipe = element.getAsJsonObject();
+ NeuRecipe neuRecipe = NeuRecipe.parseRecipe(this, recipe, json);
+ if (neuRecipe != null)
+ registerNeuRecipe(neuRecipe);
}
}
@@ -392,6 +399,24 @@ public class NEUManager {
}
}
+ public void registerNeuRecipe(NeuRecipe recipe) {
+ recipes.add(recipe);
+ for (Ingredient output : recipe.getOutputs()) {
+ recipesMap.computeIfAbsent(output.getInternalItemId(), ignored -> new HashSet<>()).add(recipe);
+ }
+ for (Ingredient input : recipe.getIngredients()) {
+ usagesMap.computeIfAbsent(input.getInternalItemId(), ignored -> new HashSet<>()).add(recipe);
+ }
+ }
+
+ public Set<NeuRecipe> getRecipesFor(String internalName) {
+ return recipesMap.getOrDefault(internalName, Collections.emptySet());
+ }
+
+ public Set<NeuRecipe> getUsagesFor(String internalName) {
+ return usagesMap.getOrDefault(internalName, Collections.emptySet());
+ }
+
/**
* Searches a string for a query. This method is used to mimic the behaviour of the
* more complex map-based search function. This method is used for the chest-item-search feature.
@@ -820,27 +845,25 @@ public class NEUManager {
ContainerChest container = null;
if (Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest)
container = (ContainerChest) Minecraft.getMinecraft().thePlayer.openContainer;
- if (item.has("recipe") && container != null && container.getLowerChestInventory().getDisplayName().getUnformattedText().equals("Craft Item")) {
- CraftingOverlay.updateItem(item);
- } else if (item.has("useneucraft") && item.get("useneucraft").getAsBoolean()) {
- displayGuiItemRecipe(item.get("internalname").getAsString(), "");
- } else if (item.has("clickcommand")) {
- String clickcommand = item.get("clickcommand").getAsString();
-
- if (clickcommand.equals("viewrecipe")) {
- neu.sendChatMessage(
- "/" + clickcommand + " " +
- item.get("internalname").getAsString().split(";")[0]);
- viewItemAttemptID = item.get("internalname").getAsString();
- viewItemAttemptTime = System.currentTimeMillis();
- } else if (clickcommand.equals("viewpotion")) {
- neu.sendChatMessage(
- "/" + clickcommand + " " +
- item.get("internalname").getAsString().split(";")[0].toLowerCase());
- viewItemAttemptID = item.get("internalname").getAsString();
- viewItemAttemptTime = System.currentTimeMillis();
+ String internalName = item.get("internalname").getAsString();
+ Set<NeuRecipe> recipesFor = getRecipesFor(internalName);
+ if (container != null && container.getLowerChestInventory().getDisplayName().getUnformattedText().equals("Craft Item")) {
+ Optional<NeuRecipe> recipe = recipesFor.stream().filter(it -> it instanceof CraftingRecipe).findAny();
+ if (recipe.isPresent()) {
+ CraftingOverlay.updateItem((CraftingRecipe) recipe.get());
+ return;
}
}
+ if (!item.has("clickcommand")) return;
+ String clickcommand = item.get("clickcommand").getAsString();
+ switch (clickcommand.intern()) {
+ case "viewrecipe":
+ displayGuiItemRecipe(internalName, null);
+ break;
+ case "viewoption":
+ neu.sendChatMessage("/viewpotion " + internalName.split(";")[0].toLowerCase(Locale.ROOT));
+ }
+ displayGuiItemRecipe(internalName, "");
}
/**
@@ -920,90 +943,24 @@ public class NEUManager {
loadItem(internalname);
}
- /**
- * Constructs a GuiItemUsages from the recipe usage data (see #usagesMap) of a given item
- */
public boolean displayGuiItemUsages(String internalName) {
- List<ItemStack[]> craftMatrices = new ArrayList<>();
- List<JsonObject> results = new ArrayList<>();
-
- if (!usagesMap.containsKey(internalName)) {
- return false;
- }
-
- for (String internalNameResult : usagesMap.get(internalName)) {
- JsonObject item = getItemInformation().get(internalNameResult);
- results.add(item);
-
- if (item != null && item.has("recipe")) {
- JsonObject recipe = item.get("recipe").getAsJsonObject();
-
- ItemStack[] craftMatrix = new ItemStack[9];
-
- String[] x = {"1", "2", "3"};
- String[] y = {"A", "B", "C"};
- for (int i = 0; i < 9; i++) {
- String name = y[i / 3] + x[i % 3];
- String itemS = recipe.get(name).getAsString();
- int count = 1;
- if (itemS != null && itemS.split(":").length == 2) {
- count = Integer.parseInt(itemS.split(":")[1]);
- itemS = itemS.split(":")[0];
- }
- JsonObject craft = getItemInformation().get(itemS);
- if (craft != null) {
- ItemStack stack = jsonToStack(craft);
- stack.stackSize = count;
- craftMatrix[i] = stack;
- }
- }
-
- craftMatrices.add(craftMatrix);
- }
- }
-
- if (craftMatrices.size() > 0) {
- Minecraft.getMinecraft().displayGuiScreen(new GuiItemRecipe("Item Usages", craftMatrices, results, this));
- return true;
- }
- return false;
+ if (!usagesMap.containsKey(internalName)) return false;
+ Set<NeuRecipe> usages = usagesMap.get(internalName);
+ if (usages.isEmpty()) return false;
+ Utils.sendCloseScreenPacket();
+ Minecraft.getMinecraft().displayGuiScreen(
+ new GuiItemRecipe("Item Usages", new ArrayList<>(usages), this));
+ return true;
}
- /**
- * Constructs a GuiItemRecipeOld from the recipe data of a given item.
- */
public boolean displayGuiItemRecipe(String internalName, String text) {
- JsonObject item = getItemInformation().get(internalName);
- if (item != null && item.has("recipe")) {
- JsonObject recipe = item.get("recipe").getAsJsonObject();
-
- ItemStack[] craftMatrix = new ItemStack[9];
-
- String[] x = {"1", "2", "3"};
- String[] y = {"A", "B", "C"};
- for (int i = 0; i < 9; i++) {
- String name = y[i / 3] + x[i % 3];
- String itemS = recipe.get(name).getAsString();
- int count = 1;
- if (itemS != null && itemS.split(":").length == 2) {
- count = Integer.parseInt(itemS.split(":")[1]);
- itemS = itemS.split(":")[0];
- }
- JsonObject craft = getItemInformation().get(itemS);
- if (craft != null) {
- ItemStack stack = jsonToStack(craft);
- stack.stackSize = count;
- craftMatrix[i] = stack;
- }
- }
-
- Minecraft.getMinecraft().thePlayer.sendQueue.addToSendQueue(new C0DPacketCloseWindow(
- Minecraft.getMinecraft().thePlayer.openContainer.windowId));
- Minecraft.getMinecraft().displayGuiScreen(new GuiItemRecipe(text != null ? text : "Item Recipe",
- Lists.<ItemStack[]>newArrayList(craftMatrix), Lists.newArrayList(item), this));
- return true;
- }
- return false;
+ if (!recipesMap.containsKey(internalName)) return false;
+ Set<NeuRecipe> recipes = recipesMap.get(internalName);
+ if (recipes.isEmpty()) return false;
+ Utils.sendCloseScreenPacket();
+ Minecraft.getMinecraft().displayGuiScreen(
+ new GuiItemRecipe(text != null ? text : "Item Recipe", new ArrayList<>(recipes), this));
+ return true;
}
/**
@@ -1207,6 +1164,15 @@ public class NEUManager {
writeJson(json, file);
}
+ public JsonObject readJsonDefaultDir(String filename) throws IOException {
+ File f = new File(new File(repoLocation, "items"), filename);
+ if (f.exists() && f.isFile() && f.canRead())
+ try (Reader reader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8)) {
+ return gson.fromJson(reader, JsonObject.class);
+ } // rethrow io exceptions
+ return null;
+ }
+
public TreeMap<String, JsonObject> getItemInformation() {
return itemMap;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
index 23b89b44..3a6afef8 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
@@ -15,6 +15,7 @@ import io.github.moulberry.notenoughupdates.options.NEUConfig;
import io.github.moulberry.notenoughupdates.overlays.FuelBar;
import io.github.moulberry.notenoughupdates.overlays.OverlayManager;
import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer;
+import io.github.moulberry.notenoughupdates.recipes.RecipeGenerator;
import io.github.moulberry.notenoughupdates.util.SBInfo;
import io.github.moulberry.notenoughupdates.util.Utils;
import io.github.moulberry.notenoughupdates.util.XPInformation;
@@ -131,6 +132,7 @@ public class NotEnoughUpdates {
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new NEUEventListener(this));
+ MinecraftForge.EVENT_BUS.register(new RecipeGenerator(this));
MinecraftForge.EVENT_BUS.register(CapeManager.getInstance());
//MinecraftForge.EVENT_BUS.register(new SBGamemodes());
MinecraftForge.EVENT_BUS.register(new EnchantingSolvers());
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java b/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java
index 254ab5cf..d0b4a7f5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java
@@ -7,6 +7,8 @@ import io.github.moulberry.notenoughupdates.ItemPriceInformation;
import io.github.moulberry.notenoughupdates.NEUManager;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.miscgui.GuiPriceGraph;
+import io.github.moulberry.notenoughupdates.recipes.Ingredient;
+import io.github.moulberry.notenoughupdates.recipes.NeuRecipe;
import io.github.moulberry.notenoughupdates.util.Constants;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
@@ -760,87 +762,77 @@ public class APIManager {
}
public CraftInfo getCraftCost(String internalname) {
- return getCraftCost(internalname, 0);
+ return getCraftCost(internalname, new HashSet<>());
}
/**
* Recursively calculates the cost of crafting an item from raw materials.
*/
- public CraftInfo getCraftCost(String internalname, int depth) {
- if (craftCost.containsKey(internalname)) {
- return craftCost.get(internalname);
- } else {
- CraftInfo ci = new CraftInfo();
-
- ci.vanillaItem = isVanillaItem(internalname);
-
- JsonObject auctionInfo = getItemAuctionInfo(internalname);
- float lowestBin = getLowestBin(internalname);
- JsonObject bazaarInfo = getBazaarInfo(internalname);
-
- if (bazaarInfo != null && bazaarInfo.get("curr_buy") != null) {
- float bazaarInstantBuyPrice = bazaarInfo.get("curr_buy").getAsFloat();
- ci.craftCost = bazaarInstantBuyPrice;
- }
- //Don't use auction prices for vanilla items cuz people like to transfer money, messing up the cost of vanilla items.
- if (lowestBin > 0 && !ci.vanillaItem) {
- if (ci.craftCost < 0 || lowestBin < ci.craftCost) {
- ci.craftCost = lowestBin;
- }
- } else if (auctionInfo != null && !ci.vanillaItem) {
- float auctionPrice = auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat();
- if (ci.craftCost < 0 || auctionPrice < ci.craftCost) {
- ci.craftCost = auctionPrice;
- }
- }
-
- if (depth > 16) {
- craftCost.put(internalname, ci);
- return ci;
- }
-
- JsonObject item = manager.getItemInformation().get(internalname);
- if (item != null && item.has("recipe")) {
- float craftPrice = 0;
- JsonObject recipe = item.get("recipe").getAsJsonObject();
-
- String[] x = {"1", "2", "3"};
- String[] y = {"A", "B", "C"};
- for (int i = 0; i < 9; i++) {
- String name = y[i / 3] + x[i % 3];
- String itemS = recipe.get(name).getAsString();
- if (itemS == null || itemS.length() == 0) continue;
-
- int count = 1;
- if (itemS.split(":").length == 2) {
- count = Integer.parseInt(itemS.split(":")[1]);
- itemS = itemS.split(":")[0];
- }
- if (itemS.equals(internalname)) { //if item is used a crafting component in its own recipe, return
- craftCost.put(internalname, ci);
- return ci;
- }
-
- float compCost = getCraftCost(itemS, depth + 1).craftCost * count;
- if (compCost < 0) {
- //If it's a custom item without a cost, return
- if (!getCraftCost(itemS).vanillaItem) {
- craftCost.put(internalname, ci);
- return ci;
+ private CraftInfo getCraftCost(String internalname, Set<String> visited) {
+ if (craftCost.containsKey(internalname)) return craftCost.get(internalname);
+ if (visited.contains(internalname)) return null;
+ visited.add(internalname);
+
+
+ boolean vanillaItem = isVanillaItem(internalname);
+ float craftCost = Float.POSITIVE_INFINITY;
+
+ JsonObject auctionInfo = getItemAuctionInfo(internalname);
+ float lowestBin = getLowestBin(internalname);
+ JsonObject bazaarInfo = getBazaarInfo(internalname);
+
+ if (bazaarInfo != null && bazaarInfo.get("curr_buy") != null) {
+ craftCost = bazaarInfo.get("curr_buy").getAsFloat();
+ }
+ //Don't use auction prices for vanilla items cuz people like to transfer money, messing up the cost of vanilla items.
+ if (!vanillaItem) {
+ if (lowestBin > 0) {
+ craftCost = Math.min(lowestBin, craftCost);
+ } else if (auctionInfo != null) {
+ float auctionPrice = auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsInt();
+ craftCost = Math.min(auctionPrice, craftCost);
+ }
+ }
+
+ Set<NeuRecipe> recipes = manager.getRecipesFor(internalname);
+ boolean fromRecipe = false;
+ if (recipes != null)
+ RECIPE_ITER:
+ for (NeuRecipe recipe : recipes) {
+ float craftPrice = 0;
+ for (Ingredient i : recipe.getIngredients()) {
+ if (i.isCoins()) {
+ craftPrice += i.getCount();
+ continue;
+ }
+ CraftInfo ingredientCraftCost = getCraftCost(i.getInternalItemId(), visited);
+ if (ingredientCraftCost == null)
+ continue RECIPE_ITER; // Skip recipes with items further up the chain
+ craftPrice += ingredientCraftCost.craftCost * i.getCount();
+ }
+ int resultCount = 0;
+ for (Ingredient item : recipe.getOutputs())
+ if (item.getInternalItemId().equals(internalname))
+ resultCount += item.getCount();
+
+ if (resultCount == 0)
+ continue;
+ float craftPricePer = craftPrice / resultCount;
+ if (craftPricePer < craftCost) {
+ fromRecipe = true;
+ craftCost = craftPricePer;
}
- } else {
- craftPrice += compCost;
}
- }
-
- if (ci.craftCost < 0 || craftPrice < ci.craftCost) {
- ci.craftCost = craftPrice;
- ci.fromRecipe = true;
- }
- }
- craftCost.put(internalname, ci);
- return ci;
+ visited.remove(internalname);
+ if (Float.isInfinite(craftCost)) {
+ return null;
}
+ CraftInfo craftInfo = new CraftInfo();
+ craftInfo.vanillaItem = vanillaItem;
+ craftInfo.craftCost = craftCost;
+ craftInfo.fromRecipe = fromRecipe;
+ this.craftCost.put(internalname, craftInfo);
+ return craftInfo;
}
/**
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java
index 910870d5..0e58a6bc 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java
@@ -715,7 +715,7 @@ public class Commands {
"Ok, this is actually the last message, use the command again and you'll crash I promise"};
private int devFailIndex = 0;
- private static final List<String> devTestUsers = new ArrayList<>(Arrays.asList("moulberry", "lucycoconut", "ironm00n", "ariyio", "throwpo", "dediamondpro"));
+ private static final List<String> devTestUsers = new ArrayList<>(Arrays.asList("moulberry", "lucycoconut", "ironm00n", "ariyio", "throwpo", "lrg89", "dediamondpro"));
SimpleCommand devTestCommand = new SimpleCommand("neudevtest", new SimpleCommand.ProcessCommandRunnable() {
@Override
public void processCommand(ICommandSender sender, String[] args) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
index 210e1da7..e820378b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
@@ -1,33 +1,51 @@
package io.github.moulberry.notenoughupdates.miscgui;
-import com.google.gson.JsonObject;
+import com.google.common.collect.ImmutableList;
import io.github.moulberry.notenoughupdates.NEUManager;
+import io.github.moulberry.notenoughupdates.recipes.NeuRecipe;
+import io.github.moulberry.notenoughupdates.recipes.RecipeSlot;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
+import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
-import org.lwjgl.util.vector.Vector2f;
import java.awt.*;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
public class GuiItemRecipe extends GuiScreen {
- private static final ResourceLocation resourcePacksTexture = new ResourceLocation("textures/gui/resource_packs.png");
- private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation("textures/gui/container/crafting_table.png");
+ public static final ResourceLocation resourcePacksTexture = new ResourceLocation("textures/gui/resource_packs.png");
+
+ public static final int SLOT_SIZE = 16;
+ public static final int SLOT_SPACING = SLOT_SIZE + 2;
+ public static final int BUTTON_WIDTH = 7;
+ public static final int BUTTON_HEIGHT = 11;
+ public static final int BUTTON_POSITION_Y = 63;
+ public static final int BUTTON_POSITION_LEFT_X = 110;
+ public static final int BUTTON_POSITION_RIGHT_X = 147;
+ public static final int PAGE_STRING_X = 132;
+ public static final int PAGE_STRING_Y = 69;
+ public static final int TITLE_X = 28;
+ public static final int TITLE_Y = 6;
+ public static final int HOTBAR_SLOT_X = 8;
+ public static final int HOTBAR_SLOT_Y = 142;
+ public static final int PLAYER_INVENTORY_X = 8;
+ public static final int PLAYER_INVENTORY_Y = 84;
- private final List<ItemStack[]> craftMatrices;
- private final List<JsonObject> results;
private int currentIndex = 0;
private final String title;
+ private final List<NeuRecipe> craftingRecipes;
private final NEUManager manager;
public int guiLeft = 0;
@@ -35,159 +53,122 @@ public class GuiItemRecipe extends GuiScreen {
public int xSize = 176;
public int ySize = 166;
- public GuiItemRecipe(String title, List<ItemStack[]> craftMatrices, List<JsonObject> results, NEUManager manager) {
- this.craftMatrices = craftMatrices;
- this.results = results;
+ public GuiItemRecipe(String title, List<NeuRecipe> craftingRecipes, NEUManager manager) {
+ this.craftingRecipes = craftingRecipes;
this.manager = manager;
this.title = title;
}
- private String getCraftText() {
- if(results.get(currentIndex).has("crafttext")) {
- return results.get(currentIndex).get("crafttext").getAsString();
- } else {
- return "";
- }
+ public NeuRecipe getCurrentRecipe() {
+ currentIndex = MathHelper.clamp_int(currentIndex, 0, craftingRecipes.size());
+ return craftingRecipes.get(currentIndex);
+ }
+
+ public boolean isWithinRect(int x, int y, int topLeftX, int topLeftY, int width, int height) {
+ return topLeftX <= x && x <= topLeftX + width
+ && topLeftY <= y && y <= topLeftY + height;
+ }
+
+ private ImmutableList<RecipeSlot> getAllRenderedSlots() {
+ return ImmutableList.<RecipeSlot>builder()
+ .addAll(getPlayerInventory())
+ .addAll(getCurrentRecipe().getSlots()).build();
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
drawDefaultBackground();
-
- if(currentIndex < 0) {
- currentIndex = 0;
- } else if(currentIndex >= craftMatrices.size()) {
- currentIndex = craftMatrices.size()-1;
- }
-
FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRendererObj;
<