Skip to content

Commit 871c733

Browse files
committed
make pattern terminal tend to use existed item in pattern
1 parent fd36497 commit 871c733

19 files changed

+416
-260
lines changed

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@
99
import appeng.container.slot.SlotFakeCraftingMatrix;
1010
import appeng.container.slot.SlotPatternOutputs;
1111
import appeng.helpers.InventoryAction;
12-
import appeng.items.misc.ItemEncodedPattern;
1312
import appeng.util.Platform;
1413
import appeng.util.item.AEItemStack;
1514
import com.glodblock.github.common.item.ItemFluidDrop;
1615
import com.glodblock.github.common.item.ItemFluidEncodedPattern;
1716
import com.glodblock.github.common.item.ItemFluidPacket;
1817
import com.glodblock.github.common.part.PartExtendedFluidPatternTerminal;
19-
import com.glodblock.github.common.part.PartFluidPatternTerminal;
2018
import com.glodblock.github.interfaces.PatternConsumer;
2119
import com.glodblock.github.loader.FCItems;
2220
import com.glodblock.github.util.Ae2Reflect;
@@ -31,9 +29,9 @@
3129
import net.minecraftforge.items.ItemHandlerHelper;
3230

3331
import java.util.ArrayList;
32+
import java.util.HashMap;
3433
import java.util.List;
3534
import java.util.Objects;
36-
import java.util.Optional;
3735

3836
public class ContainerExtendedFluidPatternTerminal extends ContainerExpandedProcessingPatternTerm implements PatternConsumer {
3937
public final ITerminalHost part;
@@ -429,9 +427,9 @@ else if (!slot.getStack().isEmpty()) {
429427
}
430428

431429
@Override
432-
public void acceptPattern(IAEItemStack[] inputs, IAEItemStack[] outputs) {
430+
public void acceptPattern(HashMap<Integer, ItemStack[]> inputs, ItemStack[] outputs, boolean combine) {
433431
if (part instanceof PartExtendedFluidPatternTerminal) {
434-
((PartExtendedFluidPatternTerminal) part).onChangeCrafting(inputs, outputs);
432+
((PartExtendedFluidPatternTerminal) part).onChangeCrafting(inputs, outputs, combine);
435433
}
436434
}
437435

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import javax.annotation.Nullable;
2929
import java.util.ArrayList;
30+
import java.util.HashMap;
3031
import java.util.List;
3132
import java.util.Objects;
3233

@@ -155,15 +156,18 @@ public void doAction(EntityPlayerMP player, InventoryAction action, int slotId,
155156
}
156157

157158
@Override
158-
public void acceptPattern(IAEItemStack[] inputs, IAEItemStack[] outputs) {
159-
copyStacks(inputs, tile.getCraftingSlots());
160-
copyStacks(outputs, tile.getOutputSlots());
161-
}
162-
163-
private static void copyStacks(IAEItemStack[] src, AeStackInventory<IAEItemStack> dest) {
164-
int bound = Math.min(src.length, dest.getSlotCount());
165-
for (int i = 0; i < bound; i++) {
166-
dest.setStack(i, src[i]);
159+
public void acceptPattern(HashMap<Integer, ItemStack[]> inputs, ItemStack[] outputs, boolean combine) {
160+
AeStackInventory<IAEItemStack> craftingSlot = tile.getCraftingSlots();
161+
AeStackInventory<IAEItemStack> outputSlot = tile.getOutputSlots();
162+
for (int index : inputs.keySet()) {
163+
ItemStack[] items = inputs.get(index);
164+
if (index < craftingSlot.getSlotCount() && items.length > 0) {
165+
craftingSlot.setStack(index, AEItemStack.fromItemStack(items[0]));
166+
}
167+
}
168+
int bound = Math.min(outputSlot.getSlotCount(), outputs.length);
169+
for (int index = 0; index < bound; index ++) {
170+
outputSlot.setStack(index, AEItemStack.fromItemStack(outputs[index]));
167171
}
168172
}
169173

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@
3333
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
3434
import net.minecraftforge.items.ItemHandlerHelper;
3535

36-
import java.util.ArrayList;
37-
import java.util.List;
38-
import java.util.Objects;
39-
import java.util.Optional;
36+
import java.util.*;
4037

4138
public class ContainerFluidPatternTerminal extends ContainerPatternTerm implements PatternConsumer {
4239
@GuiSync(105)
@@ -205,9 +202,9 @@ private static IAEItemStack[] collectInventory(Slot[] slots) {
205202
}
206203

207204
@Override
208-
public void acceptPattern(IAEItemStack[] inputs, IAEItemStack[] outputs) {
205+
public void acceptPattern(HashMap<Integer, ItemStack[]> inputs, ItemStack[] outputs, boolean combine) {
209206
if (Ae2Reflect.getPart(this) instanceof PartFluidPatternTerminal) {
210-
((PartFluidPatternTerminal) Ae2Reflect.getPart(this)).onChangeCrafting(inputs, outputs);
207+
((PartFluidPatternTerminal) Ae2Reflect.getPart(this)).onChangeCrafting(inputs, outputs, combine);
211208
}
212209
}
213210

src/main/java/com/glodblock/github/common/part/PartExtendedFluidPatternTerminal.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import appeng.api.networking.crafting.ICraftingPatternDetails;
44
import appeng.api.parts.IPartModel;
55
import appeng.api.storage.data.IAEItemStack;
6+
import appeng.api.storage.data.IItemList;
67
import appeng.core.sync.GuiBridge;
78
import appeng.items.parts.PartModels;
89
import appeng.parts.PartModel;
@@ -17,7 +18,7 @@
1718
import com.glodblock.github.inventory.ExAppEngInternalInventory;
1819
import com.glodblock.github.inventory.GuiType;
1920
import com.glodblock.github.inventory.InventoryHandler;
20-
import com.glodblock.github.util.Ae2Reflect;
21+
import com.glodblock.github.util.Util;
2122
import net.minecraft.entity.player.EntityPlayer;
2223
import net.minecraft.item.ItemStack;
2324
import net.minecraft.nbt.NBTTagCompound;
@@ -27,8 +28,10 @@
2728
import net.minecraft.util.math.BlockPos;
2829
import net.minecraft.util.math.Vec3d;
2930
import net.minecraftforge.items.IItemHandler;
31+
import net.minecraftforge.items.IItemHandlerModifiable;
3032

3133
import javax.annotation.Nonnull;
34+
import java.util.HashMap;
3235

3336
public class PartExtendedFluidPatternTerminal extends PartExpandedProcessingPatternTerminal {
3437

@@ -122,20 +125,30 @@ public void onChangeInventory(IItemHandler inv, int slot, InvOperation mc, ItemS
122125
super.onChangeInventory(inv, slot, mc, removedStack, newStack);
123126
}
124127

125-
public void onChangeCrafting(IAEItemStack[] newCrafting, IAEItemStack[] newOutput) {
128+
public void onChangeCrafting(HashMap<Integer, ItemStack[]> inputs, ItemStack[] outputs, boolean combine) {
126129
IItemHandler crafting = this.getInventoryByName("crafting");
127130
IItemHandler output = this.getInventoryByName("output");
131+
IItemList<IAEItemStack> storageList = this.getInventory(Util.ITEM) == null ?
132+
null : this.getInventory(Util.ITEM).getStorageList();
128133
if (crafting instanceof AppEngInternalInventory && output instanceof AppEngInternalInventory) {
129-
for (int x = 0; x < crafting.getSlots() && x < newCrafting.length; x++) {
130-
final IAEItemStack item = newCrafting[x];
131-
((AppEngInternalInventory)crafting)
132-
.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack());
134+
Util.clearItemInventory((IItemHandlerModifiable) crafting);
135+
Util.clearItemInventory((IItemHandlerModifiable) output);
136+
ItemStack[] fuzzyFind = new ItemStack[Util.findMax(inputs.keySet()) + 1];
137+
for (int index : inputs.keySet()) {
138+
Util.fuzzyTransferItems(index, inputs.get(index), fuzzyFind, storageList);
133139
}
134-
135-
for (int x = 0; x < output.getSlots() && x < newOutput.length; x++) {
136-
final IAEItemStack item = newOutput[x];
137-
((AppEngInternalInventory)output)
138-
.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack());
140+
if (combine) {
141+
fuzzyFind = Util.compress(fuzzyFind);
142+
}
143+
int bound = Math.min(crafting.getSlots(), fuzzyFind.length);
144+
for (int x = 0; x < bound; x++) {
145+
final ItemStack item = fuzzyFind[x];
146+
((AppEngInternalInventory) crafting).setStackInSlot(x, item == null ? ItemStack.EMPTY : item);
147+
}
148+
bound = Math.min(output.getSlots(), outputs.length);
149+
for (int x = 0; x < bound; x++) {
150+
final ItemStack item = outputs[x];
151+
((AppEngInternalInventory) output).setStackInSlot(x, item == null ? ItemStack.EMPTY : item);
139152
}
140153
}
141154
}

src/main/java/com/glodblock/github/common/part/PartFluidPatternTerminal.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import appeng.api.networking.crafting.ICraftingPatternDetails;
44
import appeng.api.parts.IPartModel;
55
import appeng.api.storage.data.IAEItemStack;
6+
import appeng.api.storage.data.IItemList;
67
import appeng.core.sync.GuiBridge;
78
import appeng.items.misc.ItemEncodedPattern;
89
import appeng.items.parts.PartModels;
@@ -19,8 +20,8 @@
1920
import com.glodblock.github.inventory.ExAppEngInternalInventory;
2021
import com.glodblock.github.inventory.GuiType;
2122
import com.glodblock.github.inventory.InventoryHandler;
22-
import com.glodblock.github.util.Ae2Reflect;
2323
import com.glodblock.github.util.FluidCraftingPatternDetails;
24+
import com.glodblock.github.util.Util;
2425
import net.minecraft.entity.player.EntityPlayer;
2526
import net.minecraft.item.ItemStack;
2627
import net.minecraft.nbt.NBTTagCompound;
@@ -30,8 +31,10 @@
3031
import net.minecraft.util.math.BlockPos;
3132
import net.minecraft.util.math.Vec3d;
3233
import net.minecraftforge.items.IItemHandler;
34+
import net.minecraftforge.items.IItemHandlerModifiable;
3335

3436
import javax.annotation.Nonnull;
37+
import java.util.HashMap;
3538

3639
public class PartFluidPatternTerminal extends PartPatternTerminal {
3740

@@ -165,20 +168,30 @@ public void putPattern(IAEItemStack[] inputs, IAEItemStack[] outputs) {
165168
}
166169
}
167170

168-
public void onChangeCrafting(IAEItemStack[] newCrafting, IAEItemStack[] newOutput) {
171+
public void onChangeCrafting(HashMap<Integer, ItemStack[]> inputs, ItemStack[] outputs, boolean combine) {
169172
IItemHandler crafting = this.getInventoryByName("crafting");
170173
IItemHandler output = this.getInventoryByName("output");
174+
IItemList<IAEItemStack> storageList = this.getInventory(Util.ITEM) == null ?
175+
null : this.getInventory(Util.ITEM).getStorageList();
171176
if (crafting instanceof AppEngInternalInventory && output instanceof AppEngInternalInventory) {
172-
for (int x = 0; x < crafting.getSlots() && x < newCrafting.length; x++) {
173-
final IAEItemStack item = newCrafting[x];
174-
((AppEngInternalInventory)crafting)
175-
.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack());
177+
Util.clearItemInventory((IItemHandlerModifiable) crafting);
178+
Util.clearItemInventory((IItemHandlerModifiable) output);
179+
ItemStack[] fuzzyFind = new ItemStack[Util.findMax(inputs.keySet()) + 1];
180+
for (int index : inputs.keySet()) {
181+
Util.fuzzyTransferItems(index, inputs.get(index), fuzzyFind, storageList);
176182
}
177-
178-
for (int x = 0; x < output.getSlots() && x < newOutput.length; x++) {
179-
final IAEItemStack item = newOutput[x];
180-
((AppEngInternalInventory)output)
181-
.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack());
183+
if (combine && !this.craftingMode) {
184+
fuzzyFind = Util.compress(fuzzyFind);
185+
}
186+
int bound = Math.min(crafting.getSlots(), fuzzyFind.length);
187+
for (int x = 0; x < bound; x++) {
188+
final ItemStack item = fuzzyFind[x];
189+
((AppEngInternalInventory) crafting).setStackInSlot(x, item == null ? ItemStack.EMPTY : item);
190+
}
191+
bound = Math.min(output.getSlots(), outputs.length);
192+
for (int x = 0; x < bound; x++) {
193+
final ItemStack item = outputs[x];
194+
((AppEngInternalInventory) output).setStackInSlot(x, item == null ? ItemStack.EMPTY : item);
182195
}
183196
}
184197
}

src/main/java/com/glodblock/github/common/tile/TileFluidAssembler.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.glodblock.github.common.tile;
22

3-
import appeng.api.AEApi;
43
import appeng.api.config.Actionable;
54
import appeng.api.config.PowerMultiplier;
65
import appeng.api.config.Upgrades;
7-
import appeng.api.implementations.ICraftingPatternItem;
86
import appeng.api.implementations.items.IUpgradeModule;
97
import appeng.api.networking.IGrid;
108
import appeng.api.networking.crafting.ICraftingPatternDetails;
@@ -18,7 +16,6 @@
1816
import appeng.api.networking.events.MENetworkPowerStatusChange;
1917
import appeng.api.networking.security.IActionSource;
2018
import appeng.api.storage.IMEInventory;
21-
import appeng.api.storage.channels.IItemStorageChannel;
2219
import appeng.api.storage.data.IAEItemStack;
2320
import appeng.api.util.AECableType;
2421
import appeng.api.util.AEPartLocation;
@@ -33,6 +30,7 @@
3330
import appeng.util.item.AEItemStack;
3431
import com.glodblock.github.common.item.ItemFluidCraftEncodedPattern;
3532
import com.glodblock.github.util.FluidCraftingPatternDetails;
33+
import com.glodblock.github.util.Util;
3634
import io.netty.buffer.ByteBuf;
3735
import net.minecraft.inventory.InventoryCrafting;
3836
import net.minecraft.item.ItemStack;
@@ -317,7 +315,7 @@ public void update() {
317315
if (!this.waitingToSend.isEmpty() && this.getProxy().isActive()) {
318316
List<ItemStack> rst = new ArrayList<>();
319317
try {
320-
IMEInventory<IAEItemStack> des = this.getProxy().getStorage().getInventory(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class));
318+
IMEInventory<IAEItemStack> des = this.getProxy().getStorage().getInventory(Util.ITEM);
321319
final IEnergySource src = this.getProxy().getEnergy();
322320
for (ItemStack item : this.waitingToSend) {
323321
if (item != null && !item.isEmpty()) {

src/main/java/com/glodblock/github/common/tile/TileFluidDiscretizer.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.glodblock.github.common.tile;
22

3-
import appeng.api.AEApi;
43
import appeng.api.config.Actionable;
54
import appeng.api.networking.GridFlags;
65
import appeng.api.networking.crafting.ICraftingGrid;
@@ -10,8 +9,6 @@
109
import appeng.api.networking.storage.IBaseMonitor;
1110
import appeng.api.networking.storage.IStorageGrid;
1211
import appeng.api.storage.*;
13-
import appeng.api.storage.channels.IFluidStorageChannel;
14-
import appeng.api.storage.channels.IItemStorageChannel;
1512
import appeng.api.storage.data.IAEFluidStack;
1613
import appeng.api.storage.data.IAEItemStack;
1714
import appeng.api.storage.data.IItemList;
@@ -21,8 +18,8 @@
2118
import appeng.me.helpers.MachineSource;
2219
import appeng.me.storage.MEInventoryHandler;
2320
import appeng.tile.grid.AENetworkTile;
24-
import appeng.util.Platform;
2521
import com.glodblock.github.common.item.ItemFluidDrop;
22+
import com.glodblock.github.util.Util;
2623

2724
import javax.annotation.Nullable;
2825
import java.util.ArrayList;
@@ -56,9 +53,9 @@ public int getPriority() {
5653
@Override
5754
public List<IMEInventoryHandler> getCellArray(IStorageChannel<?> channel) {
5855
if (getProxy().isActive()) {
59-
if (channel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) {
56+
if (channel == Util.ITEM) {
6057
return Collections.singletonList(fluidDropInv.invHandler);
61-
} else if (channel == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)) {
58+
} else if (channel == Util.FLUID) {
6259
return Collections.singletonList(fluidCraftInv.invHandler);
6360
}
6461
}
@@ -123,7 +120,7 @@ private IEnergyGrid getEnergyGrid() {
123120
private IMEMonitor<IAEFluidStack> getFluidGrid() {
124121
try {
125122
return getProxy().getGrid().<IStorageGrid>getCache(IStorageGrid.class)
126-
.getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class));
123+
.getInventory(Util.FLUID);
127124
} catch (GridAccessException e) {
128125
return null;
129126
}
@@ -234,7 +231,7 @@ public void onListUpdate() {
234231

235232
@Override
236233
public IStorageChannel<IAEItemStack> getChannel() {
237-
return AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class);
234+
return Util.ITEM;
238235
}
239236

240237
}
@@ -279,7 +276,7 @@ public IItemList<IAEFluidStack> getAvailableItems(IItemList<IAEFluidStack> out)
279276

280277
@Override
281278
public IStorageChannel<IAEFluidStack> getChannel() {
282-
return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class);
279+
return Util.FLUID;
283280
}
284281

285282
}

src/main/java/com/glodblock/github/common/tile/TileFluidLevelMaintainer.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.glodblock.github.common.tile;
22

3-
import appeng.api.AEApi;
43
import appeng.api.config.Actionable;
54
import appeng.api.config.PowerMultiplier;
65
import appeng.api.networking.GridFlags;
@@ -14,7 +13,6 @@
1413
import appeng.api.networking.security.IActionSource;
1514
import appeng.api.networking.storage.IStorageGrid;
1615
import appeng.api.storage.IMEMonitor;
17-
import appeng.api.storage.channels.IFluidStorageChannel;
1816
import appeng.api.storage.data.IAEFluidStack;
1917
import appeng.api.storage.data.IAEItemStack;
2018
import appeng.core.AELog;
@@ -30,6 +28,7 @@
3028
import com.glodblock.github.common.item.ItemFluidPacket;
3129
import com.glodblock.github.util.DummyInvAdaptor;
3230
import com.glodblock.github.util.MultiCraftingTracker;
31+
import com.glodblock.github.util.Util;
3332
import com.google.common.collect.ImmutableSet;
3433
import io.netty.buffer.ByteBuf;
3534
import net.minecraft.item.ItemStack;
@@ -100,7 +99,7 @@ public long[] getRequest() {
10099

101100
@MENetworkEventSubscribe
102101
public void onStorageUpdate(MENetworkStorageEvent event) {
103-
if (event.channel.equals(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class))) {
102+
if (event.channel.equals(Util.FLUID)) {
104103
doWork();
105104
}
106105
}
@@ -188,7 +187,7 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) {
188187

189188
private IMEMonitor<IAEFluidStack> getFluidMonitor() {
190189
return getProxy().getNode().getGrid().<IStorageGrid>getCache(IStorageGrid.class)
191-
.getInventory(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class));
190+
.getInventory(Util.FLUID);
192191
}
193192

194193
@Override

0 commit comments

Comments
 (0)