package codechicken.nei.recipe; import codechicken.nei.OffsetPositioner; import codechicken.nei.api.API; import codechicken.nei.api.IOverlayHandler; import codechicken.nei.api.IStackPositioner; import com.google.common.base.Objects; import net.minecraft.client.gui.inventory.*; import java.util.HashMap; public class RecipeInfo { private static class OverlayKey { String ident; Class<? extends GuiContainer> guiClass; public OverlayKey(Class<? extends GuiContainer> classz, String ident) { this.guiClass = classz; this.ident = ident; } @Override public boolean equals(Object obj) { if (!(obj instanceof OverlayKey)) { return false; } OverlayKey key = (OverlayKey) obj; return Objects.equal(ident, key.ident) && guiClass == key.guiClass; } @Override public int hashCode() { return Objects.hashCode(ident, guiClass); } } static HashMap<OverlayKey, IOverlayHandler> overlayMap = new HashMap<OverlayKey, IOverlayHandler>(); static HashMap<OverlayKey, IStackPositioner> positionerMap = new HashMap<OverlayKey, IStackPositioner>(); static HashMap<Class<? extends GuiContainer>, int[]> offsets = new HashMap<Class<? extends GuiContainer>, int[]>(); public static void registerOverlayHandler(Class<? extends GuiContainer> classz, IOverlayHandler handler, String ident) { overlayMap.put(new OverlayKey(classz, ident), handler); } public static void registerGuiOverlay(Class<? extends GuiContainer> classz, String ident, IStackPositioner positioner) { positionerMap.put(new OverlayKey(classz, ident), positioner); if (positioner instanceof OffsetPositioner && !offsets.containsKey(classz)) { OffsetPositioner p = (OffsetPositioner) positioner; setGuiOffset(classz, p.offsetx, p.offsety); } } public static void setGuiOffset(Class<? extends GuiContainer> classz, int x, int y) { offsets.put(classz, new int[] { x, y }); } public static boolean hasDefaultOverlay(GuiContainer gui, String ident) { return positionerMap.containsKey(new OverlayKey(gui.getClass(), ident)); } public static boolean hasOverlayHandler(GuiContainer gui, String ident) { return overlayMap.containsKey(new OverlayKey(gui.getClass(), ident)); } public static IOverlayHandler getOverlayHandler(GuiContainer gui, String ident) { return overlayMap.get(new OverlayKey(gui.getClass(), ident)); } public static IStackPositioner getStackPositioner(GuiContainer gui, String ident) { return positionerMap.get(new OverlayKey(gui.getClass(), ident)); } public static int[] getGuiOffset(GuiContainer gui) { int[] offset = offsets.get(gui.getClass()); return offset == null ? new int[] { 5, 11 } : offset; } public static void load() { API.registerRecipeHandler(new ShapedRecipeHandler()); API.registerUsageHandler(new ShapedRecipeHandler()); API.registerRecipeHandler(new ShapelessRecipeHandler()); API.registerUsageHandler(new ShapelessRecipeHandler()); API.registerRecipeHandler(new FireworkRecipeHandler()); API.registerUsageHandler(new FireworkRecipeHandler()); API.registerRecipeHandler(new FurnaceRecipeHandler()); API.registerUsageHandler(new FurnaceRecipeHandler()); API.registerRecipeHandler(new BrewingRecipeHandler()); API.registerUsageHandler(new BrewingRecipeHandler()); API.registerRecipeHandler(new FuelRecipeHandler()); API.registerUsageHandler(new FuelRecipeHandler()); API.registerGuiOverlay(GuiCrafting.class, "crafting"); API.registerGuiOverlay(GuiInventory.class, "crafting2x2", 63, 20); API.registerGuiOverlay(GuiFurnace.class, "smelting"); API.registerGuiOverlay(GuiFurnace.class, "fuel"); API.registerGuiOverlay(GuiBrewingStand.class, "brewing"); API.registerGuiOverlayHandler(GuiCrafting.class, new DefaultOverlayHandler(), "crafting"); API.registerGuiOverlayHandler(GuiInventory.class, new DefaultOverlayHandler(63, 20), "crafting2x2"); API.registerGuiOverlayHandler(GuiBrewingStand.class, new BrewingOverlayHandler(), "brewing"); API.registerRecipeHandler(new ProfilerRecipeHandler(true)); API.registerUsageHandler(new ProfilerRecipeHandler(false)); } }