Skip to content

Commit 1253a90

Browse files
committed
fix block mode crash
1 parent e7c1e55 commit 1253a90

File tree

5 files changed

+130
-14
lines changed

5 files changed

+130
-14
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ This is a rework and ported version of [ae2-fluid-crafting](https://github.com/p
2525
- [1.12.2] Fix the fluid amount display error when removing fluid.
2626
- [1.12.2] Upgrade cards can be inserted in Dual Interface.
2727
- [1.12.2] Fluid pattern is searchable in interface terminal.
28+
- [1.12.2] Fix crash when using block mode, fluid will also be considered as blockable.
2829

2930
## Installation
3031

@@ -36,6 +37,8 @@ Any version of AE2(Both Official AE2 and GTNH edition AE2 works).
3637
### 1.12.2
3738
Unofficial AE2([PAE2](https://www.curseforge.com/minecraft/mc-mods/ae2-extended-life)).
3839

40+
You can directly upgrade origin AE2FC2 in your old save.
41+
3942
Official AE2 isn't supported, you can use origin [AE2FC](https://github.com/phantamanta44/ae2-fluid-crafting) if you are playing with Official AE2.
4043

4144
## Basic Devices

src/main/java/com/glodblock/github/client/container/ContainerFluidPatternTerminal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ else if (!slot.getStack().isEmpty()) {
315315
}
316316
else if (!slot.getStack().isEmpty()) {
317317
ItemStack stack = slot.getStack();
318-
stack.setCount(stack.getCount() * divide);
318+
stack.setCount(stack.getCount() / divide);
319319
}
320320
}
321321
}

src/main/java/com/glodblock/github/coremod/CoreModHooks.java

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
import appeng.parts.misc.PartInterface;
1111
import appeng.tile.misc.TileInterface;
1212
import appeng.util.InventoryAdaptor;
13+
import appeng.util.inv.BlockingInventoryAdaptor;
1314
import appeng.util.inv.filter.IAEItemFilter;
1415
import com.glodblock.github.common.item.ItemFluidDrop;
1516
import com.glodblock.github.common.item.ItemFluidEncodedPattern;
1617
import com.glodblock.github.common.item.ItemFluidPacket;
1718
import com.glodblock.github.common.part.PartDualInterface;
1819
import com.glodblock.github.common.tile.TileDualInterface;
1920
import com.glodblock.github.handler.FluidConvertingItemHandler;
21+
import com.glodblock.github.inventory.BlockingFluidInventoryAdaptor;
2022
import com.glodblock.github.inventory.FluidConvertingInventoryAdaptor;
2123
import com.glodblock.github.inventory.FluidConvertingInventoryCrafting;
2224
import com.glodblock.github.loader.FCItems;
@@ -58,6 +60,11 @@ public static InventoryAdaptor wrapInventory(@Nullable TileEntity tile, EnumFaci
5860
return tile != null ? FluidConvertingInventoryAdaptor.wrap(tile, face) : null;
5961
}
6062

63+
@Nullable
64+
public static BlockingInventoryAdaptor wrapBlockInventory(@Nullable TileEntity tile, EnumFacing face) {
65+
return tile != null ? BlockingFluidInventoryAdaptor.getAdaptor(tile, face) : null;
66+
}
67+
6168
public static long getCraftingByteCost(IAEItemStack stack) {
6269
return stack.getItem() instanceof ItemFluidDrop
6370
? (long)Math.ceil(stack.getStackSize() / 1000D) : stack.getStackSize();
@@ -106,17 +113,4 @@ private static IMachineSet unionMachineSets(IMachineSet a, IMachineSet b) {
106113
}
107114
}
108115

109-
public static class FluidPatternSlotFilter implements IAEItemFilter {
110-
public FluidPatternSlotFilter() {
111-
}
112-
113-
public boolean allowExtract(IItemHandler inv, int slot, int amount) {
114-
return true;
115-
}
116-
117-
public boolean allowInsert(IItemHandler inv, int slot, ItemStack stack) {
118-
return !stack.isEmpty() && (stack.getItem() instanceof ItemEncodedPattern || stack.getItem() instanceof ItemFluidEncodedPattern);
119-
}
120-
}
121-
122116
}

src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public MethodVisitor visitMethod(int access, String name, String desc, String si
3131
case "pushPattern":
3232
case "isBusy":
3333
return new TransformInvAdaptorCalls(api, super.visitMethod(access, name, desc, signature, exceptions));
34+
case "isCustomInvBlocking":
35+
return new TransformBlockAdaptorCalls(api, super.visitMethod(access, name, desc, signature, exceptions));
3436
default:
3537
return super.visitMethod(access, name, desc, signature, exceptions);
3638
}
@@ -59,4 +61,25 @@ public void visitMethodInsn(int opcode, String owner, String name, String desc,
5961

6062
}
6163

64+
private static class TransformBlockAdaptorCalls extends MethodVisitor {
65+
66+
TransformBlockAdaptorCalls(int api, MethodVisitor mv) {
67+
super(api, mv);
68+
}
69+
70+
@Override
71+
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
72+
if (opcode == Opcodes.INVOKESTATIC && owner.equals("appeng/util/inv/BlockingInventoryAdaptor") && name.equals("getAdaptor")) {
73+
super.visitMethodInsn(Opcodes.INVOKESTATIC,
74+
"com/glodblock/github/coremod/CoreModHooks",
75+
"wrapBlockInventory",
76+
"(Lnet/minecraft/tileentity/TileEntity;Lnet/minecraft/util/EnumFacing;)Lappeng/util/inv/BlockingInventoryAdaptor;",
77+
false);
78+
} else {
79+
super.visitMethodInsn(opcode, owner, name, desc, itf);
80+
}
81+
}
82+
83+
}
84+
6285
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.glodblock.github.inventory;
2+
3+
import appeng.helpers.NonBlockingItems;
4+
import appeng.util.inv.BlockingInventoryAdaptor;
5+
import appeng.util.inv.ItemHandlerIterator;
6+
import appeng.util.inv.ItemSlot;
7+
import it.unimi.dsi.fastutil.ints.IntSet;
8+
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
9+
import net.minecraft.item.ItemStack;
10+
import net.minecraft.tileentity.TileEntity;
11+
import net.minecraft.util.EnumFacing;
12+
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
13+
import net.minecraftforge.fluids.capability.IFluidHandler;
14+
import net.minecraftforge.fluids.capability.IFluidTankProperties;
15+
import net.minecraftforge.items.CapabilityItemHandler;
16+
import net.minecraftforge.items.IItemHandler;
17+
18+
import javax.annotation.Nullable;
19+
import java.util.Iterator;
20+
import java.util.Objects;
21+
22+
public class BlockingFluidInventoryAdaptor extends BlockingInventoryAdaptor {
23+
24+
@Nullable
25+
private final IItemHandler invItems;
26+
@Nullable
27+
private final IFluidHandler invFluids;
28+
@Nullable
29+
private final String domain;
30+
31+
public BlockingFluidInventoryAdaptor(@Nullable IItemHandler invItems, @Nullable IFluidHandler invFluids, @Nullable String domain) {
32+
this.invItems = invItems;
33+
this.invFluids = invFluids;
34+
this.domain = domain;
35+
}
36+
37+
public static BlockingInventoryAdaptor getAdaptor(TileEntity te, EnumFacing d) {
38+
IItemHandler itemHandler = null;
39+
IFluidHandler fluidHandler = null;
40+
String domain = null;
41+
if (te != null && te.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d)) {
42+
itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d);
43+
if (itemHandler != null) {
44+
domain = Objects.requireNonNull(te.getBlockType().getRegistryName()).getNamespace();
45+
}
46+
}
47+
if (te != null && te.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, d)) {
48+
fluidHandler = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, d);
49+
if (fluidHandler != null) {
50+
domain = Objects.requireNonNull(te.getBlockType().getRegistryName()).getNamespace();
51+
}
52+
}
53+
return new BlockingFluidInventoryAdaptor(itemHandler, fluidHandler, domain);
54+
}
55+
56+
@Override
57+
public boolean containsBlockingItems() {
58+
59+
boolean itemPass = true;
60+
boolean fluidPass = true;
61+
62+
if (invItems != null) {
63+
int slots = this.invItems.getSlots();
64+
for(int slot = 0; slot < slots; ++slot) {
65+
ItemStack is = this.invItems.getStackInSlot(slot);
66+
if (!is.isEmpty() && this.isBlockableItem(is)) {
67+
itemPass = false;
68+
}
69+
}
70+
}
71+
72+
if (invFluids != null) {
73+
for (IFluidTankProperties tank : invFluids.getTankProperties()) {
74+
if (tank != null && tank.getContents() != null && (tank.canFill() || tank.canDrain())) {
75+
fluidPass = false;
76+
}
77+
}
78+
}
79+
80+
return !(fluidPass && itemPass);
81+
}
82+
83+
@Override
84+
public Iterator<ItemSlot> iterator() {
85+
return new ItemHandlerIterator(this.invItems);
86+
}
87+
88+
boolean isBlockableItem(ItemStack stack) {
89+
Object2ObjectOpenHashMap map = NonBlockingItems.INSTANCE.getMap().get(this.domain);
90+
if (map.get(stack.getItem()) != null) {
91+
return !((IntSet)map.get(stack.getItem())).contains(stack.getItemDamage());
92+
} else {
93+
return true;
94+
}
95+
}
96+
}

0 commit comments

Comments
 (0)