Skip to content

Commit

Permalink
drops leak when discretizer go offline
Browse files Browse the repository at this point in the history
  • Loading branch information
GlodBlock committed Aug 1, 2022
1 parent b40669f commit 93b5513
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 0 deletions.
56 changes: 56 additions & 0 deletions src/main/java/com/glodblock/github/coremod/CoreModHooks.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
package com.glodblock.github.coremod;

import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.networking.IMachineSet;
import appeng.api.networking.storage.IStorageGrid;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.channels.IFluidStorageChannel;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEFluidStack;
import appeng.api.storage.data.IAEItemStack;
import appeng.crafting.MECraftingInventory;
import appeng.items.misc.ItemEncodedPattern;
import appeng.me.MachineSet;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import appeng.parts.misc.PartInterface;
import appeng.tile.misc.TileInterface;
import appeng.util.InventoryAdaptor;
Expand Down Expand Up @@ -131,4 +140,51 @@ public static IAEItemStack displayAEFluid(IAEItemStack drop) {
else return drop;
}

public static void storeFluidItem(CraftingCPUCluster instance) {
final IGrid g = Ae2Reflect.getGrid(instance);

if( g == null )
{
return;
}

final IStorageGrid sg = g.getCache( IStorageGrid.class );
final IMEInventory<IAEItemStack> ii = sg.getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class));
final IMEInventory<IAEFluidStack> jj = sg.getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class));
final MECraftingInventory inventory = Ae2Reflect.getCPUInventory(instance);

for( IAEItemStack is : inventory.getItemList() )
{
is = inventory.extractItems( is.copy(), Actionable.MODULATE, Ae2Reflect.getCPUSource(instance) );

if( is != null )
{
Ae2Reflect.postCPUChange(instance, is, Ae2Reflect.getCPUSource(instance));
if (is.getItem() instanceof ItemFluidDrop) {
IAEFluidStack fluidDrop = ItemFluidDrop.getAeFluidStack(is);
fluidDrop = jj.injectItems(fluidDrop, Actionable.MODULATE, Ae2Reflect.getCPUSource(instance));
if (fluidDrop == null) {
is = null;
} else {
is.setStackSize(fluidDrop.getStackSize());
}
} else {
is = ii.injectItems(is, Actionable.MODULATE, Ae2Reflect.getCPUSource(instance));
}
}

if( is != null )
{
inventory.injectItems( is, Actionable.MODULATE, Ae2Reflect.getCPUSource(instance) );
}
}

if( inventory.getItemList().isEmpty() )
{
Ae2Reflect.setCPUInventory(instance, new MECraftingInventory());
}

Ae2Reflect.markCPUDirty(instance);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ private static class TransformCraftingCPUCluster extends ClassVisitor {
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (name.equals("executeCrafting")) {
return new TransformExecuteCrafting(api, super.visitMethod(access, name, desc, signature, exceptions));
} else if (name.equals("cancel")) {
return new TransformStoreItems(api, super.visitMethod(access, name, desc, signature, exceptions));
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
Expand Down Expand Up @@ -83,4 +85,27 @@ public void visitMethodInsn(int opcode, String owner, String name, String desc,

}

private static class TransformStoreItems extends MethodVisitor {

TransformStoreItems(int api, MethodVisitor mv) {
super(api, mv);
}

@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
if (opcode == Opcodes.INVOKESPECIAL
&& owner.equals("appeng/me/cluster/implementations/CraftingCPUCluster") && name.equals("storeItems")) {
super.visitMethodInsn(Opcodes.INVOKESTATIC,
"com/glodblock/github/coremod/CoreModHooks",
"storeFluidItem",
"(Lappeng/me/cluster/implementations/CraftingCPUCluster;)V",
false
);
} else {
super.visitMethodInsn(opcode, owner, name, desc, itf);
}
}

}

}
51 changes: 51 additions & 0 deletions src/main/java/com/glodblock/github/util/Ae2Reflect.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package com.glodblock.github.util;

import appeng.api.definitions.IItemDefinition;
import appeng.api.networking.IGrid;
import appeng.api.networking.security.IActionSource;
import appeng.api.storage.data.IAEItemStack;
import appeng.container.implementations.ContainerExpandedProcessingPatternTerm;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.container.slot.OptionalSlotFake;
import appeng.container.slot.SlotFakeCraftingMatrix;
import appeng.container.slot.SlotRestrictedInput;
import appeng.crafting.MECraftingInventory;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import appeng.recipes.game.DisassembleRecipe;
import appeng.util.inv.ItemSlot;
import net.minecraft.inventory.Container;
Expand All @@ -19,6 +24,9 @@
public class Ae2Reflect {

private static final Method mItemSlot_setExtractable;
private static final Method mCPU_getGrid;
private static final Method mCPU_postChange;
private static final Method mCPU_markDirty;
private static final Field fDisassembleRecipe_nonCellMappings;
private static final Field fContainerPatternTerm_craftingSlots;
private static final Field fContainerPatternTerm_outputSlots;
Expand All @@ -29,10 +37,15 @@ public class Ae2Reflect {
private static final Field fContainerExPatternTerm_patternSlotIN;
private static final Field fContainerExPatternTerm_patternSlotOUT;
private static final Field fInventory_container;
private static final Field fCPU_inventory;
private static final Field fCPU_machineSrc;

static {
try {
mItemSlot_setExtractable = reflectMethod(ItemSlot.class, "setExtractable", boolean.class);
mCPU_getGrid = reflectMethod(CraftingCPUCluster.class, "getGrid");
mCPU_postChange = reflectMethod(CraftingCPUCluster.class, "postChange", IAEItemStack.class, IActionSource.class);
mCPU_markDirty = reflectMethod(CraftingCPUCluster.class, "markDirty");
fInventory_container = reflectField(InventoryCrafting.class, "eventHandler", "field_70465_c", "c");
fDisassembleRecipe_nonCellMappings = reflectField(DisassembleRecipe.class, "nonCellMappings");
fContainerPatternTerm_craftingSlots = reflectField(ContainerPatternTerm.class, "craftingSlots");
Expand All @@ -43,6 +56,8 @@ public class Ae2Reflect {
fContainerExPatternTerm_outputSlots = reflectField(ContainerExpandedProcessingPatternTerm.class, "outputSlots");
fContainerExPatternTerm_patternSlotIN = reflectField(ContainerExpandedProcessingPatternTerm.class, "patternSlotIN");
fContainerExPatternTerm_patternSlotOUT = reflectField(ContainerExpandedProcessingPatternTerm.class, "patternSlotOUT");
fCPU_inventory = Ae2Reflect.reflectField(CraftingCPUCluster.class, "inventory");
fCPU_machineSrc = Ae2Reflect.reflectField(CraftingCPUCluster.class, "machineSrc");
} catch (Exception e) {
throw new IllegalStateException("Failed to initialize AE2 reflection hacks!", e);
}
Expand Down Expand Up @@ -134,4 +149,40 @@ public static SlotRestrictedInput getExPatternSlotOut(ContainerExpandedProcessin
return readField(cont, fContainerExPatternTerm_patternSlotOUT);
}

public static IGrid getGrid(CraftingCPUCluster cpu) {
try {
return (IGrid) mCPU_getGrid.invoke(cpu);
} catch (Exception e) {
throw new IllegalStateException("Failed to invoke method: " + mCPU_getGrid, e);
}
}

public static MECraftingInventory getCPUInventory(CraftingCPUCluster cpu) {
return Ae2Reflect.readField(cpu, fCPU_inventory);
}

public static void setCPUInventory(CraftingCPUCluster cpu, MECraftingInventory value) {
Ae2Reflect.writeField(cpu, fCPU_inventory, value);
}

public static IActionSource getCPUSource(CraftingCPUCluster cpu) {
return Ae2Reflect.readField(cpu, fCPU_machineSrc);
}

public static void postCPUChange(CraftingCPUCluster cpu, IAEItemStack stack, IActionSource src) {
try {
mCPU_postChange.invoke(cpu, stack, src);
} catch (Exception e) {
throw new IllegalStateException("Failed to invoke method: " + mCPU_postChange, e);
}
}

public static void markCPUDirty(CraftingCPUCluster cpu) {
try {
mCPU_markDirty.invoke(cpu);
} catch (Exception e) {
throw new IllegalStateException("Failed to invoke method: " + mCPU_markDirty, e);
}
}

}

0 comments on commit 93b5513

Please sign in to comment.