mirror of
https://github.com/GTNewHorizons/StorageDrawers.git
synced 2026-11-13 00:47:31 +00:00
Recipe and ingredient handler API; handle AE2 recipes for quartz lookups.
This commit is contained in:
1 parent
983f20944e
commit
a9e52d88b2
10 files changed
+340
-54
No files matched your search
@@ -3,6 +3,7 @@ package com.jaquadro.minecraft.storagedrawers;
|
||||
import com.jaquadro.minecraft.storagedrawers.config.CompTierRegistry;
|
||||
import com.jaquadro.minecraft.storagedrawers.config.ConfigManager;
|
||||
import com.jaquadro.minecraft.storagedrawers.config.OreDictRegistry;
|
||||
import com.jaquadro.minecraft.storagedrawers.config.RecipeHandlerRegistry;
|
||||
import com.jaquadro.minecraft.storagedrawers.core.*;
|
||||
import com.jaquadro.minecraft.storagedrawers.integration.IntegrationRegistry;
|
||||
import com.jaquadro.minecraft.storagedrawers.network.BlockClickMessage;
|
||||
@@ -38,6 +39,7 @@ public class StorageDrawers
|
||||
public static ConfigManager config;
|
||||
public static CompTierRegistry compRegistry;
|
||||
public static OreDictRegistry oreDictRegistry;
|
||||
public static RecipeHandlerRegistry recipeHandlerRegistry;
|
||||
|
||||
@Mod.Instance(MOD_ID)
|
||||
public static StorageDrawers instance;
|
||||
@@ -57,6 +59,7 @@ public class StorageDrawers
|
||||
|
||||
compRegistry = new CompTierRegistry();
|
||||
oreDictRegistry = new OreDictRegistry();
|
||||
recipeHandlerRegistry = new RecipeHandlerRegistry();
|
||||
|
||||
blocks.init();
|
||||
items.init();
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.api.registry;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public interface IIngredientHandler
|
||||
{
|
||||
ItemStack getItemStack (Object object);
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.api.registry;
|
||||
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface IRecipeHandler
|
||||
{
|
||||
Object[] getInputAsArray (IRecipe recipe);
|
||||
|
||||
List getInputAsList (IRecipe recipe);
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.api.registry;
|
||||
|
||||
public interface IRecipeHandlerRegistry
|
||||
{
|
||||
void registerRecipeHandler (Class clazz, IRecipeHandler handler);
|
||||
|
||||
void registerIngredientHandler (Class clazz, IIngredientHandler handler);
|
||||
|
||||
IRecipeHandler getRecipeHandler (Class clazz);
|
||||
|
||||
IIngredientHandler getIngredientHandler (Class clazz);
|
||||
}
|
||||
@@ -1,25 +1,20 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.block.tile;
|
||||
|
||||
import com.jaquadro.minecraft.storagedrawers.StorageDrawers;
|
||||
import com.jaquadro.minecraft.storagedrawers.api.registry.IIngredientHandler;
|
||||
import com.jaquadro.minecraft.storagedrawers.api.registry.IRecipeHandler;
|
||||
import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer;
|
||||
import com.jaquadro.minecraft.storagedrawers.config.CompTierRegistry;
|
||||
import com.jaquadro.minecraft.storagedrawers.config.ConfigManager;
|
||||
import com.jaquadro.minecraft.storagedrawers.network.CountUpdateMessage;
|
||||
import com.jaquadro.minecraft.storagedrawers.storage.*;
|
||||
import com.jaquadro.minecraft.storagedrawers.storage.IStorageProvider;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.common.network.NetworkRegistry;
|
||||
import cpw.mods.fml.common.network.simpleimpl.IMessage;
|
||||
import net.minecraft.inventory.InventoryCrafting;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.CraftingManager;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.item.crafting.ShapedRecipes;
|
||||
import net.minecraft.item.crafting.ShapelessRecipes;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraftforge.oredict.ShapedOreRecipe;
|
||||
import net.minecraftforge.oredict.ShapelessOreRecipe;
|
||||
import org.apache.logging.log4j.Level;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -236,14 +231,22 @@ public class TileEntityDrawersComp extends TileEntityDrawers
|
||||
if (!DrawerData.areItemsEqual(stack, output))
|
||||
continue;
|
||||
|
||||
if (recipe instanceof ShapelessOreRecipe)
|
||||
match = tryMatch(stack, ((ShapelessOreRecipe) recipe).getInput());
|
||||
else if (recipe instanceof ShapelessRecipes)
|
||||
match = tryMatch(stack, ((ShapelessRecipes) recipe).recipeItems);
|
||||
else if (recipe instanceof ShapedOreRecipe)
|
||||
match = tryMatch(stack, ((ShapedOreRecipe) recipe).getInput());
|
||||
else if (recipe instanceof ShapedRecipes)
|
||||
match = tryMatch(stack, ((ShapedRecipes) recipe).recipeItems);
|
||||
IRecipeHandler handler = StorageDrawers.recipeHandlerRegistry.getRecipeHandler(recipe.getClass());
|
||||
while (handler != null) {
|
||||
Object[] itemArr = handler.getInputAsArray(recipe);
|
||||
if (itemArr != null) {
|
||||
match = tryMatch(stack, itemArr);
|
||||
break;
|
||||
}
|
||||
|
||||
List itemList = handler.getInputAsList(recipe);
|
||||
if (itemList != null) {
|
||||
match = tryMatch(stack, itemList);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (match != null) {
|
||||
setupLookup(lookup1, stack);
|
||||
@@ -296,6 +299,9 @@ public class TileEntityDrawersComp extends TileEntityDrawers
|
||||
return null;
|
||||
|
||||
Object item = list[0];
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
if (item instanceof ItemStack) {
|
||||
ItemStack item1 = (ItemStack)item;
|
||||
for (int i = 1, n = list.length; i < n; i++) {
|
||||
@@ -320,6 +326,29 @@ public class TileEntityDrawersComp extends TileEntityDrawers
|
||||
return (ItemStack)item1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
IIngredientHandler handler = StorageDrawers.recipeHandlerRegistry.getIngredientHandler(item.getClass());
|
||||
if (handler == null)
|
||||
return null;
|
||||
|
||||
ItemStack item1 = handler.getItemStack(item);
|
||||
if (item1 == null)
|
||||
return null;
|
||||
|
||||
for (int i = 1, n = list.length; i < n; i++) {
|
||||
Object item2 = list[i];
|
||||
if (item2 == null || item.getClass() != item2.getClass())
|
||||
return null;
|
||||
|
||||
item2 = handler.getItemStack(item2);
|
||||
if (item2 == null || item2.getClass() != ItemStack.class)
|
||||
return null;
|
||||
if (!item1.isItemEqual((ItemStack)item2))
|
||||
return null;
|
||||
}
|
||||
|
||||
return item1;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -465,43 +494,6 @@ public class TileEntityDrawersComp extends TileEntityDrawers
|
||||
}
|
||||
}
|
||||
|
||||
/*private class CompStorageProvider extends DefaultStorageProvider
|
||||
{
|
||||
public CompStorageProvider () {
|
||||
super(TileEntityDrawersComp.this, TileEntityDrawersComp.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCentrallyManaged () {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSlotStackCapacity (int slot) {
|
||||
if (convRate == null || convRate[slot] == 0)
|
||||
return 0;
|
||||
|
||||
int stackLimit = convRate[0] * TileEntityDrawersComp.this.getDrawerCapacity();
|
||||
return stackLimit / convRate[slot];
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSlotCount (int slot) {
|
||||
if (convRate == null || convRate[slot] == 0)
|
||||
return 0;
|
||||
|
||||
return pooledCount / convRate[slot];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSlotCount (int slot, int amount) {
|
||||
if (convRate == null || convRate[slot] == 0)
|
||||
return;
|
||||
|
||||
pooledCount = (pooledCount % convRate[slot]) + convRate[slot] * amount;
|
||||
}
|
||||
}*/
|
||||
|
||||
private static class InventoryLookup extends InventoryCrafting
|
||||
{
|
||||
private ItemStack[] stackList;
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.config;
|
||||
|
||||
import com.jaquadro.minecraft.storagedrawers.api.registry.IIngredientHandler;
|
||||
import com.jaquadro.minecraft.storagedrawers.api.registry.IRecipeHandler;
|
||||
import com.jaquadro.minecraft.storagedrawers.api.registry.IRecipeHandlerRegistry;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.item.crafting.ShapedRecipes;
|
||||
import net.minecraft.item.crafting.ShapelessRecipes;
|
||||
import net.minecraftforge.oredict.ShapedOreRecipe;
|
||||
import net.minecraftforge.oredict.ShapelessOreRecipe;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class RecipeHandlerRegistry implements IRecipeHandlerRegistry
|
||||
{
|
||||
private Map<Class, IRecipeHandler> recipeRegistry = new HashMap<Class, IRecipeHandler>();
|
||||
private Map<Class, IIngredientHandler> ingredientRegistry = new HashMap<Class, IIngredientHandler>();
|
||||
|
||||
public RecipeHandlerRegistry () {
|
||||
registerRecipeHandler(ShapedOreRecipe.class, new ShapedOreRecipeHandler());
|
||||
registerRecipeHandler(ShapedRecipes.class, new ShapedRecipeHandler());
|
||||
registerRecipeHandler(ShapelessOreRecipe.class, new ShapelessOreRecipeHandler());
|
||||
registerRecipeHandler(ShapelessRecipes.class, new ShapelessRecipeHandler());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerRecipeHandler (Class clazz, IRecipeHandler handler) {
|
||||
if (!recipeRegistry.containsKey(clazz))
|
||||
recipeRegistry.put(clazz, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerIngredientHandler (Class clazz, IIngredientHandler handler) {
|
||||
if (!ingredientRegistry.containsKey(clazz))
|
||||
ingredientRegistry.put(clazz, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IRecipeHandler getRecipeHandler (Class clazz) {
|
||||
while (clazz != null) {
|
||||
if (recipeRegistry.containsKey(clazz))
|
||||
return recipeRegistry.get(clazz);
|
||||
|
||||
clazz = clazz.getSuperclass();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IIngredientHandler getIngredientHandler (Class clazz) {
|
||||
while (clazz != null) {
|
||||
if (ingredientRegistry.containsKey(clazz))
|
||||
return ingredientRegistry.get(clazz);
|
||||
|
||||
for (Class inter : clazz.getInterfaces()) {
|
||||
if (ingredientRegistry.containsKey(inter))
|
||||
return ingredientRegistry.get(inter);
|
||||
}
|
||||
|
||||
clazz = clazz.getSuperclass();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static class ShapedOreRecipeHandler implements IRecipeHandler
|
||||
{
|
||||
@Override
|
||||
public Object[] getInputAsArray (IRecipe recipe) {
|
||||
return ((ShapedOreRecipe) recipe).getInput();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getInputAsList (IRecipe recipe) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static class ShapedRecipeHandler implements IRecipeHandler
|
||||
{
|
||||
@Override
|
||||
public Object[] getInputAsArray (IRecipe recipe) {
|
||||
return ((ShapedRecipes) recipe).recipeItems;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getInputAsList (IRecipe recipe) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static class ShapelessOreRecipeHandler implements IRecipeHandler
|
||||
{
|
||||
@Override
|
||||
public Object[] getInputAsArray (IRecipe recipe) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getInputAsList (IRecipe recipe) {
|
||||
return ((ShapelessOreRecipe) recipe).getInput();
|
||||
}
|
||||
}
|
||||
|
||||
private static class ShapelessRecipeHandler implements IRecipeHandler
|
||||
{
|
||||
@Override
|
||||
public Object[] getInputAsArray (IRecipe recipe) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getInputAsList (IRecipe recipe) {
|
||||
return ((ShapelessRecipes) recipe).recipeItems;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,11 +2,12 @@ package com.jaquadro.minecraft.storagedrawers.integration;
|
||||
|
||||
import appeng.api.AEApi;
|
||||
import appeng.api.networking.security.BaseActionSource;
|
||||
import appeng.api.recipes.IIngredient;
|
||||
import appeng.api.storage.IMEInventory;
|
||||
import appeng.api.storage.IMEMonitor;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import com.jaquadro.minecraft.storagedrawers.integration.ae2.DrawerExternalStorageHandler;
|
||||
import com.jaquadro.minecraft.storagedrawers.integration.ae2.IStorageBusMonitorFactory;
|
||||
import com.jaquadro.minecraft.storagedrawers.StorageDrawers;
|
||||
import com.jaquadro.minecraft.storagedrawers.integration.ae2.*;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
|
||||
@@ -68,6 +69,16 @@ public class AppliedEnergistics extends IntegrationModule
|
||||
|
||||
@Override
|
||||
public void init () throws Throwable {
|
||||
ShapedRecipeHandler shapedHandler = new ShapedRecipeHandler();
|
||||
if (shapedHandler.isValid())
|
||||
StorageDrawers.recipeHandlerRegistry.registerRecipeHandler(shapedHandler.getRecipeClass(), shapedHandler);
|
||||
|
||||
ShapelessRecipeHandler shapelessHandler = new ShapelessRecipeHandler();
|
||||
if (shapelessHandler.isValid())
|
||||
StorageDrawers.recipeHandlerRegistry.registerRecipeHandler(shapelessHandler.getRecipeClass(), shapelessHandler);
|
||||
|
||||
StorageDrawers.recipeHandlerRegistry.registerIngredientHandler(IIngredient.class, new IngredientHandler());
|
||||
|
||||
ReflectionFactory rfactory = new ReflectionFactory();
|
||||
if (!rfactory.init())
|
||||
throw new Exception("No valid Storage Bus Monitor factory");
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.integration.ae2;
|
||||
|
||||
import appeng.api.recipes.IIngredient;
|
||||
import com.jaquadro.minecraft.storagedrawers.api.registry.IIngredientHandler;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class IngredientHandler implements IIngredientHandler
|
||||
{
|
||||
@Override
|
||||
public ItemStack getItemStack (Object object) {
|
||||
if (!(object instanceof IIngredient))
|
||||
return null;
|
||||
|
||||
try {
|
||||
IIngredient ingredient = (IIngredient) object;
|
||||
ItemStack[] set = ingredient.getItemStackSet();
|
||||
if (set == null || set.length == 0)
|
||||
return null;
|
||||
|
||||
return set[0];
|
||||
}
|
||||
catch (Throwable t) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.integration.ae2;
|
||||
|
||||
import com.jaquadro.minecraft.storagedrawers.api.registry.IRecipeHandler;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
|
||||
public class ShapedRecipeHandler implements IRecipeHandler
|
||||
{
|
||||
private Class classShapedRecipe;
|
||||
private Method methodGetInput;
|
||||
|
||||
private boolean valid = true;
|
||||
|
||||
public ShapedRecipeHandler () {
|
||||
try {
|
||||
classShapedRecipe = Class.forName("appeng.recipes.game.ShapedRecipe");
|
||||
methodGetInput = classShapedRecipe.getMethod("getInput");
|
||||
|
||||
if (!methodGetInput.getReturnType().isArray())
|
||||
valid = false;
|
||||
}
|
||||
catch (Throwable t) {
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
public Class getRecipeClass () {
|
||||
return classShapedRecipe;
|
||||
}
|
||||
|
||||
public boolean isValid () {
|
||||
return valid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getInputAsArray (IRecipe recipe) {
|
||||
try {
|
||||
return (Object[]) methodGetInput.invoke(recipe);
|
||||
}
|
||||
catch (Throwable t) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getInputAsList (IRecipe recipe) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.integration.ae2;
|
||||
|
||||
import com.jaquadro.minecraft.storagedrawers.api.registry.IRecipeHandler;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
|
||||
public class ShapelessRecipeHandler implements IRecipeHandler
|
||||
{
|
||||
private Class classShapelessRecipe;
|
||||
private Method methodGetInput;
|
||||
|
||||
private boolean valid = true;
|
||||
|
||||
public ShapelessRecipeHandler () {
|
||||
try {
|
||||
classShapelessRecipe = Class.forName("appeng.recipes.game.ShapelessRecipe");
|
||||
methodGetInput = classShapelessRecipe.getMethod("getInput");
|
||||
|
||||
if (!List.class.isAssignableFrom(methodGetInput.getReturnType()))
|
||||
valid = false;
|
||||
}
|
||||
catch (Throwable t) {
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
public Class getRecipeClass () {
|
||||
return classShapelessRecipe;
|
||||
}
|
||||
|
||||
public boolean isValid () {
|
||||
return valid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getInputAsArray (IRecipe recipe) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List getInputAsList (IRecipe recipe) {
|
||||
try {
|
||||
return (List) methodGetInput.invoke(recipe);
|
||||
}
|
||||
catch (Throwable t) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user