From 510bd94c5c30d4ffd71bab7384a03593ec587622 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Fri, 29 Jul 2022 22:07:05 +0800 Subject: [PATCH 1/3] add ic2 nei support --- dependencies.gradle | 1 + .../nei/recipes/DefaultExtractorLoader.java | 13 ++ .../IndustrialCraftRecipeExtractor.java | 114 ++++++++++++++++++ .../github/util/ModAndClassUtil.java | 3 + 4 files changed, 131 insertions(+) create mode 100644 src/main/java/com/glodblock/github/nei/recipes/extractor/IndustrialCraftRecipeExtractor.java diff --git a/dependencies.gradle b/dependencies.gradle index 344f1b3a..8dc68525 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -21,5 +21,6 @@ dependencies { compileOnly('com.github.GTNewHorizons:ThaumicEnergistics:1.3.19-GTNH:dev') {transitive = false} compileOnly("com.github.GTNewHorizons:EnderIO:2.3.1.29:dev") {transitive = false} + runtime("com.github.GTNewHorizons:Baubles:1.0.1.14:dev") } diff --git a/src/main/java/com/glodblock/github/nei/recipes/DefaultExtractorLoader.java b/src/main/java/com/glodblock/github/nei/recipes/DefaultExtractorLoader.java index 9b0a1540..858b0349 100644 --- a/src/main/java/com/glodblock/github/nei/recipes/DefaultExtractorLoader.java +++ b/src/main/java/com/glodblock/github/nei/recipes/DefaultExtractorLoader.java @@ -47,6 +47,19 @@ public class DefaultExtractorLoader implements Runnable { FluidRecipe.addRecipeMap(null, new ForestryRecipeExtractor(new NEIHandlerStill())); } + if (ModAndClassUtil.IC2) { + FluidRecipe.addRecipeMap("blastfurnace", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("BlockCutter", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("centrifuge", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("compressor", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("extractor", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("fluidcanner", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("macerator", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("metalformer", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("oreWashing", new IndustrialCraftRecipeExtractor()); + FluidRecipe.addRecipeMap("solidcanner", new IndustrialCraftRecipeExtractor()); + } + } } diff --git a/src/main/java/com/glodblock/github/nei/recipes/extractor/IndustrialCraftRecipeExtractor.java b/src/main/java/com/glodblock/github/nei/recipes/extractor/IndustrialCraftRecipeExtractor.java new file mode 100644 index 00000000..88343e44 --- /dev/null +++ b/src/main/java/com/glodblock/github/nei/recipes/extractor/IndustrialCraftRecipeExtractor.java @@ -0,0 +1,114 @@ +package com.glodblock.github.nei.recipes.extractor; + +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.IRecipeHandler; +import com.glodblock.github.nei.object.IRecipeExtractor; +import com.glodblock.github.nei.object.OrderStack; +import com.glodblock.github.util.Ae2Reflect; +import ic2.neiIntegration.core.recipehandler.FluidCannerRecipeHandler; +import ic2.neiIntegration.core.recipehandler.OreWashingRecipeHandler; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class IndustrialCraftRecipeExtractor implements IRecipeExtractor { + + @Override + public List> getInputIngredients(List rawInputs) { + List> tmp = new LinkedList<>(); + for (int i = 0; i < rawInputs.size(); i ++) { + if (rawInputs.get(i) == null) continue; + tmp.add(OrderStack.pack(rawInputs.get(i), i)); + } + return tmp; + } + + @Override + public List> getOutputIngredients(List rawOutputs) { + List> tmp = new LinkedList<>(); + for (int i = 0; i < rawOutputs.size(); i ++) { + if (rawOutputs.get(i) == null) continue; + tmp.add(OrderStack.pack(rawOutputs.get(i), i)); + } + return tmp; + } + + @Override + public List> getInputIngredients(List rawInputs, IRecipeHandler recipe, int index) { + List> stacks = new LinkedList<>(); + + if (recipe instanceof FluidCannerRecipeHandler) { + FluidCannerRecipeHandler.CachedFluidCannerRecipe cachedRecipe = (FluidCannerRecipeHandler.CachedFluidCannerRecipe) ((FluidCannerRecipeHandler) recipe).arecipes.get(index); + FluidStack input = ReflectIC2.getInputFluid(cachedRecipe); + PositionedStack add = rawInputs.size() > 1 ? rawInputs.get(1) : null; + stacks.add(OrderStack.pack(add, 0)); + stacks.add(new OrderStack<>(input, 1)); + } + else if (recipe instanceof OreWashingRecipeHandler) { + stacks = getInputIngredients(rawInputs); + int water = ReflectIC2.getOreWasherWater((OreWashingRecipeHandler) recipe, index); + stacks.add(new OrderStack<>(new FluidStack(FluidRegistry.WATER, water), stacks.size())); + } else { + stacks = getInputIngredients(rawInputs); + } + + return stacks.stream().filter(Objects::nonNull).collect(Collectors.toList()); + } + + @Override + public List> getOutputIngredients(List rawOutputs, IRecipeHandler recipe, int index) { + List> stacks = new LinkedList<>(); + + if (recipe instanceof FluidCannerRecipeHandler) { + FluidCannerRecipeHandler.CachedFluidCannerRecipe cachedRecipe = (FluidCannerRecipeHandler.CachedFluidCannerRecipe) ((FluidCannerRecipeHandler) recipe).arecipes.get(index); + FluidStack output = ReflectIC2.getOutputFluid(cachedRecipe); + stacks.add(new OrderStack<>(output, 0)); + } else { + stacks = getOutputIngredients(rawOutputs); + } + + return stacks.stream().filter(Objects::nonNull).collect(Collectors.toList()); + } + + private static class ReflectIC2 { + + private final static Field inputsF; + private final static Field resultF; + + private final static Method oreWasherWater; + + static { + try { + inputsF = Ae2Reflect.reflectField(FluidCannerRecipeHandler.CachedFluidCannerRecipe.class, "fluidInput"); + resultF = Ae2Reflect.reflectField(FluidCannerRecipeHandler.CachedFluidCannerRecipe.class, "fluidOutput"); + oreWasherWater = Ae2Reflect.reflectMethod(OreWashingRecipeHandler.class, "getreqWater", int.class); + } catch (NoSuchFieldException | NoSuchMethodException e) { + throw new IllegalStateException("Failed to initialize IC2 reflection hacks!", e); + } + } + + private static FluidStack getInputFluid(FluidCannerRecipeHandler.CachedFluidCannerRecipe recipe) { + return Ae2Reflect.readField(recipe, inputsF); + } + + private static FluidStack getOutputFluid(FluidCannerRecipeHandler.CachedFluidCannerRecipe recipe) { + return Ae2Reflect.readField(recipe, resultF); + } + + private static int getOreWasherWater(OreWashingRecipeHandler recipeHandler, int index) { + try { + return (int) oreWasherWater.invoke(recipeHandler, index); + } catch (Exception e) { + throw new IllegalStateException("Failed to invoke method: " + oreWasherWater, e); + } + } + + } + +} diff --git a/src/main/java/com/glodblock/github/util/ModAndClassUtil.java b/src/main/java/com/glodblock/github/util/ModAndClassUtil.java index abb57118..ef52c355 100644 --- a/src/main/java/com/glodblock/github/util/ModAndClassUtil.java +++ b/src/main/java/com/glodblock/github/util/ModAndClassUtil.java @@ -20,6 +20,7 @@ public final class ModAndClassUtil { public static boolean OC = false; public static boolean ThE = false; public static boolean WCT = false; + public static boolean IC2 = false; public static boolean isDoubleButton; public static boolean isSaveText; @@ -112,6 +113,8 @@ public final class ModAndClassUtil { ThE = true; if (Loader.isModLoaded("ae2wct")) WCT = true; + if (Loader.isModLoaded("IC2")) + IC2 = true; } } From dc6445bb6ef733f8e0ba31c1d2812e44a78e90ef Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Fri, 29 Jul 2022 22:10:58 +0800 Subject: [PATCH 2/3] check nei --- src/main/java/com/glodblock/github/proxy/ClientProxy.java | 5 ++++- src/main/java/com/glodblock/github/util/ModAndClassUtil.java | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/glodblock/github/proxy/ClientProxy.java b/src/main/java/com/glodblock/github/proxy/ClientProxy.java index fed7cd0e..e8e3e427 100644 --- a/src/main/java/com/glodblock/github/proxy/ClientProxy.java +++ b/src/main/java/com/glodblock/github/proxy/ClientProxy.java @@ -3,6 +3,7 @@ package com.glodblock.github.proxy; import com.glodblock.github.loader.ListenerLoader; import com.glodblock.github.loader.RenderLoader; import com.glodblock.github.nei.recipes.DefaultExtractorLoader; +import com.glodblock.github.util.ModAndClassUtil; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; @@ -24,6 +25,8 @@ public class ClientProxy extends CommonProxy { @Override public void postInit(FMLPostInitializationEvent event){ super.postInit(event); - (new DefaultExtractorLoader()).run(); + if (ModAndClassUtil.NEI) { + (new DefaultExtractorLoader()).run(); + } } } diff --git a/src/main/java/com/glodblock/github/util/ModAndClassUtil.java b/src/main/java/com/glodblock/github/util/ModAndClassUtil.java index ef52c355..38c6de8f 100644 --- a/src/main/java/com/glodblock/github/util/ModAndClassUtil.java +++ b/src/main/java/com/glodblock/github/util/ModAndClassUtil.java @@ -21,6 +21,7 @@ public final class ModAndClassUtil { public static boolean ThE = false; public static boolean WCT = false; public static boolean IC2 = false; + public static boolean NEI = false; public static boolean isDoubleButton; public static boolean isSaveText; @@ -115,6 +116,8 @@ public final class ModAndClassUtil { WCT = true; if (Loader.isModLoaded("IC2")) IC2 = true; + if (Loader.isModLoaded("NotEnoughItems")) + NEI = true; } } From ec9f55d17ac4c1e9e58ccc60b9d53f2d86fb3e16 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Sat, 30 Jul 2022 22:32:42 +0800 Subject: [PATCH 3/3] fix 4096k int overflow and drops --- .../common/storage/FluidCellInventory.java | 6 ++--- .../common/tile/TileFluidDiscretizer.java | 27 ++++++++++++++----- .../common/tile/TileFluidInterface.java | 6 ----- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/glodblock/github/common/storage/FluidCellInventory.java b/src/main/java/com/glodblock/github/common/storage/FluidCellInventory.java index bbf3918e..33208e59 100644 --- a/src/main/java/com/glodblock/github/common/storage/FluidCellInventory.java +++ b/src/main/java/com/glodblock/github/common/storage/FluidCellInventory.java @@ -389,19 +389,19 @@ public class FluidCellInventory implements IFluidCellInventory { if( this.canHoldNewFluid() ) // room for new type, and for at least one item! { - final int remainingItemCount = (int) this.getRemainingFluidCount() - this.getBytesPerType() * 8; + final long remainingItemCount = this.getRemainingFluidCount() - this.getBytesPerType() * 8; if( remainingItemCount > 0 ) { if( input.getStackSize() > remainingItemCount ) { final FluidStack toReturn = Util.cloneFluidStack(sharedFluidStack); - toReturn.amount = sharedFluidStack.amount - remainingItemCount; + toReturn.amount = (int) (sharedFluidStack.amount - remainingItemCount); if( mode == Actionable.MODULATE ) { final FluidStack toWrite = Util.cloneFluidStack( sharedFluidStack ); - toWrite.amount = remainingItemCount; + toWrite.amount = (int) remainingItemCount; this.cellItems.add( AEFluidStack.create( toWrite ) ); this.updateFluidCount( toWrite.amount ); diff --git a/src/main/java/com/glodblock/github/common/tile/TileFluidDiscretizer.java b/src/main/java/com/glodblock/github/common/tile/TileFluidDiscretizer.java index 20b40225..813ff32e 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileFluidDiscretizer.java +++ b/src/main/java/com/glodblock/github/common/tile/TileFluidDiscretizer.java @@ -1,5 +1,6 @@ package com.glodblock.github.common.tile; +import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.networking.GridFlags; import appeng.api.networking.crafting.ICraftingGrid; @@ -19,7 +20,6 @@ import appeng.me.GridAccessException; import appeng.me.cache.CraftingGridCache; import appeng.me.storage.MEInventoryHandler; import appeng.tile.grid.AENetworkTile; -import appeng.util.Platform; import com.glodblock.github.common.item.ItemFluidDrop; import java.util.ArrayList; @@ -48,8 +48,6 @@ public class TileFluidDiscretizer extends AENetworkTile implements IPriorityHost @Override @SuppressWarnings("rawtypes") public List getCellArray(StorageChannel channel) { - /*conflict = !checkDiscreatizer(); - if (conflict) return Collections.emptyList();*/ if (getProxy().isActive()) { if (channel == StorageChannel.ITEMS) { return Collections.singletonList(fluidDropInv.invHandler); @@ -131,6 +129,25 @@ public class TileFluidDiscretizer extends AENetworkTile implements IPriorityHost updateState(); } + @MENetworkEventSubscribe + public void onBootUp(MENetworkBootingStatusChange event) { + try { + IMEInventory inventory = this.getProxy().getStorage().getItemInventory(); + IItemList items = inventory.getAvailableItems(AEApi.instance().storage().createItemList()); + IItemList drops = AEApi.instance().storage().createItemList(); + for (IAEItemStack item : items) { + if (item != null && item.getItem() instanceof ItemFluidDrop) { + drops.add(item); + } + } + for (IAEItemStack drop : drops) { + inventory.extractItems(drop, Actionable.MODULATE, ownActionSource); + inventory.injectItems(drop, Actionable.MODULATE, ownActionSource); + } + } catch (GridAccessException ignored) { + } + } + private class FluidDiscretizingInventory implements IMEInventory, IMEMonitorHandlerReceiver { private final MEInventoryHandler invHandler = new MEInventoryHandler<>(this, getChannel()); @@ -142,7 +159,6 @@ public class TileFluidDiscretizer extends AENetworkTile implements IPriorityHost @Override public IAEItemStack injectItems(IAEItemStack request, Actionable type, BaseActionSource src) { - /*if (conflict) return request;*/ IAEFluidStack fluidStack = ItemFluidDrop.getAeFluidStack(request); if (fluidStack == null) { return request; @@ -165,7 +181,6 @@ public class TileFluidDiscretizer extends AENetworkTile implements IPriorityHost @Override public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { - /*if (conflict) return null;*/ IAEFluidStack fluidStack = ItemFluidDrop.getAeFluidStack(request); if (fluidStack == null) { return null; @@ -188,7 +203,6 @@ public class TileFluidDiscretizer extends AENetworkTile implements IPriorityHost @Override public IItemList getAvailableItems(IItemList out) { - /*if (conflict) return out;*/ if (itemCache == null) { itemCache = new ArrayList<>(); IMEMonitor fluidGrid = getFluidGrid(); @@ -253,7 +267,6 @@ public class TileFluidDiscretizer extends AENetworkTile implements IPriorityHost @Override @SuppressWarnings("rawtypes") public IAEFluidStack injectItems(IAEFluidStack input, Actionable type, BaseActionSource src) { - /*if (conflict) return null;*/ ICraftingGrid craftingGrid; try { craftingGrid = getProxy().getGrid().getCache(ICraftingGrid.class); diff --git a/src/main/java/com/glodblock/github/common/tile/TileFluidInterface.java b/src/main/java/com/glodblock/github/common/tile/TileFluidInterface.java index ad0a3bb1..143ce769 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileFluidInterface.java +++ b/src/main/java/com/glodblock/github/common/tile/TileFluidInterface.java @@ -2,18 +2,12 @@ package com.glodblock.github.common.tile; import appeng.api.config.Upgrades; import appeng.api.networking.IGridNode; -import appeng.api.networking.energy.IEnergyGrid; import appeng.api.networking.events.MENetworkChannelsChanged; import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkPowerStatusChange; -import appeng.api.networking.security.BaseActionSource; -import appeng.api.networking.security.MachineSource; -import appeng.api.networking.storage.IStorageGrid; import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickingRequest; -import appeng.api.storage.IMEMonitor; import appeng.api.storage.data.IAEFluidStack; -import appeng.me.GridAccessException; import appeng.tile.TileEvent; import appeng.tile.events.TileEventType; import appeng.tile.inventory.AppEngInternalAEInventory;