Skip to content

Commit 620684f

Browse files
committed
- Provided selective slot updates for MEItemBus and MEFluidBus.
- Added partial checks to prevent certain boundary cases from causing product loss issues with recipes. - Selective redstone signaling update.
1 parent fc03f70 commit 620684f

File tree

15 files changed

+81
-20
lines changed

15 files changed

+81
-20
lines changed

src/main/java/github/kasuminova/mmce/common/integration/ModIntegrationAE2.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.minecraft.item.ItemStack;
1313

1414
public class ModIntegrationAE2 {
15+
1516
public static void registerUpgrade() {
1617
Upgrades.CAPACITY.registerItem(new ItemStack(ItemsMM.meFluidOutputBus), 5);
1718
Upgrades.CAPACITY.registerItem(new ItemStack(ItemsMM.meFluidinputBus), 5);
@@ -31,4 +32,5 @@ public static boolean securityCheck(EntityPlayer player, AENetworkProxy proxy) {
3132
}
3233
return false;
3334
}
35+
3436
}

src/main/java/github/kasuminova/mmce/common/tile/MEFluidInputBus.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
8888
IMEMonitor<IAEFluidStack> inv = proxy.getStorage().getInventory(channel);
8989
int capacity = tanks.getCapacity();
9090

91-
for (int slot = 0; slot < config.getSlots(); slot++) {
91+
for (final int slot : getNeedUpdateSlots()) {
9292
IAEFluidStack cfgStack = config.getFluidInSlot(slot);
9393
IAEFluidStack invStack = tanks.getFluidInSlot(slot);
9494

@@ -145,8 +145,10 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
145145
}
146146
}
147147

148+
changedSlots.clear();
148149
return successAtLeastOnce ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
149150
} catch (GridAccessException e) {
151+
changedSlots.clear();
150152
return TickRateModulation.IDLE;
151153
}
152154
}

src/main/java/github/kasuminova/mmce/common/tile/MEFluidOutputBus.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
5252

5353
try {
5454
IMEMonitor<IAEFluidStack> inv = proxy.getStorage().getInventory(channel);
55-
for (int i = 0; i < tanks.getSlots(); i++) {
56-
IAEFluidStack fluid = tanks.getFluidInSlot(i);
55+
for (final int slot : getNeedUpdateSlots()) {
56+
IAEFluidStack fluid = tanks.getFluidInSlot(slot);
5757

5858
if (fluid == null) {
5959
continue;
@@ -69,12 +69,14 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
6969
successAtLeastOnce = true;
7070
}
7171

72-
tanks.setFluidInSlot(i, left);
72+
tanks.setFluidInSlot(slot, left);
7373
}
7474
} catch (GridAccessException e) {
75+
changedSlots.clear();
7576
return TickRateModulation.IDLE;
7677
}
7778

79+
changedSlots.clear();
7880
return successAtLeastOnce ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
7981
}
8082

src/main/java/github/kasuminova/mmce/common/tile/MEItemInputBus.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public IOInventory buildInventory() {
3434
}
3535
IOInventory inv = new IOInventory(this, slotIDs, new int[]{});
3636
inv.setStackLimit(Integer.MAX_VALUE, slotIDs);
37+
inv.setListener(changedSlots::set);
3738
return inv;
3839
}
3940

@@ -52,6 +53,7 @@ public IOInventory buildConfigInventory() {
5253
IOInventory inv = new IOInventory(this, new int[]{}, new int[]{});
5354
inv.setStackLimit(Integer.MAX_VALUE, slotIDs);
5455
inv.setMiscSlots(slotIDs);
56+
inv.setListener(changedSlots::set);
5557
return inv;
5658
}
5759

@@ -117,7 +119,7 @@ private boolean needsUpdate() {
117119

118120
@Nonnull
119121
@Override
120-
public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final int ticksSinceLastCall) {
122+
public synchronized TickRateModulation tickingRequest(@Nonnull final IGridNode node, final int ticksSinceLastCall) {
121123
if (!proxy.isActive()) {
122124
return TickRateModulation.IDLE;
123125
}
@@ -127,7 +129,7 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
127129

128130
IMEMonitor<IAEItemStack> inv = proxy.getStorage().getInventory(channel);
129131

130-
for (int slot = 0; slot < configInventory.getSlots(); slot++) {
132+
for (final int slot : getNeedUpdateSlots()) {
131133
ItemStack cfgStack = configInventory.getStackInSlot(slot);
132134
ItemStack invStack = inventory.getStackInSlot(slot);
133135

@@ -179,8 +181,10 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
179181
}
180182
}
181183

184+
changedSlots.clear();
182185
return successAtLeastOnce ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
183186
} catch (GridAccessException e) {
187+
changedSlots.clear();
184188
return TickRateModulation.IDLE;
185189
}
186190
}
@@ -217,7 +221,7 @@ private IAEItemStack createStack(final ItemStack stack) {
217221

218222
@Override
219223
public void markNoUpdate() {
220-
if (proxy.isActive() && needsUpdate()) {
224+
if (proxy.isActive() && !changedSlots.isEmpty()) {
221225
try {
222226
proxy.getTick().alertDevice(proxy.getNode());
223227
} catch (GridAccessException e) {
@@ -240,6 +244,7 @@ public boolean configInvHasItem() {
240244

241245
public void readConfigInventoryNBT(final NBTTagCompound compound) {
242246
configInventory = IOInventory.deserialize(this, compound);
247+
configInventory.setListener(changedSlots::set);
243248

244249
int[] slotIDs = new int[configInventory.getSlots()];
245250
for (int slotID = 0; slotID < slotIDs.length; slotID++) {

src/main/java/github/kasuminova/mmce/common/tile/MEItemOutputBus.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public TickingRequest getTickingRequest(@Nonnull final IGridNode node) {
5656

5757
@Nonnull
5858
@Override
59-
public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final int ticksSinceLastCall) {
59+
public synchronized TickRateModulation tickingRequest(@Nonnull final IGridNode node, final int ticksSinceLastCall) {
6060
if (!proxy.isActive()) {
6161
return TickRateModulation.IDLE;
6262
}
@@ -65,13 +65,13 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
6565

6666
try {
6767
IMEMonitor<IAEItemStack> inv = proxy.getStorage().getInventory(channel);
68-
for (int i = 0; i < inventory.getSlots(); i++) {
69-
ItemStack stack = inventory.getStackInSlot(i);
68+
for (final int slot : getNeedUpdateSlots()) {
69+
ItemStack stack = inventory.getStackInSlot(slot);
7070
if (stack.isEmpty()) {
7171
continue;
7272
}
7373

74-
ItemStack extracted = inventory.extractItem(i, stack.getCount(), false);
74+
ItemStack extracted = inventory.extractItem(slot, stack.getCount(), false);
7575

7676
IAEItemStack aeStack = channel.createStack(extracted);
7777
if (aeStack == null) {
@@ -81,7 +81,7 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
8181
IAEItemStack left = Platform.poweredInsert(proxy.getEnergy(), inv, aeStack, source);
8282

8383
if (left != null) {
84-
inventory.setStackInSlot(i, left.createItemStack());
84+
inventory.setStackInSlot(slot, left.createItemStack());
8585

8686
if (aeStack.getStackSize() != left.getStackSize()) {
8787
successAtLeastOnce = true;
@@ -91,15 +91,17 @@ public TickRateModulation tickingRequest(@Nonnull final IGridNode node, final in
9191
}
9292
}
9393
} catch (GridAccessException e) {
94+
changedSlots.clear();
9495
return TickRateModulation.IDLE;
9596
}
9697

98+
changedSlots.clear();
9799
return successAtLeastOnce ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
98100
}
99101

100102
@Override
101103
public void markNoUpdate() {
102-
if (proxy.isActive() && hasItem()) {
104+
if (proxy.isActive() && !changedSlots.isEmpty()) {
103105
try {
104106
proxy.getTick().alertDevice(proxy.getNode());
105107
} catch (GridAccessException e) {

src/main/java/github/kasuminova/mmce/common/tile/base/MEFluidBus.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import javax.annotation.Nonnull;
2828
import javax.annotation.Nullable;
29+
import java.util.BitSet;
2930

3031
public abstract class MEFluidBus extends MEMachineComponent implements
3132
IAEFluidInventory,
@@ -38,6 +39,7 @@ public abstract class MEFluidBus extends MEMachineComponent implements
3839

3940
protected final IFluidStorageChannel channel = AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class);
4041
protected final ConfigManager cm = new ConfigManager(this);
42+
protected final BitSet changedSlots = new BitSet();
4143
protected final UpgradeInventory upgrades;
4244
protected final AEFluidInventoryUpgradeable tanks;
4345

@@ -46,6 +48,10 @@ public MEFluidBus() {
4648
this.upgrades = new StackUpgradeInventory(proxy.getMachineRepresentation(), this, 5);
4749
}
4850

51+
protected int[] getNeedUpdateSlots() {
52+
return changedSlots.stream().toArray();
53+
}
54+
4955
public IAEFluidTank getTanks() {
5056
return tanks;
5157
}
@@ -114,7 +120,7 @@ public void updateSetting(final IConfigManager manager, final Enum settingName,
114120
@Override
115121
public void onChangeInventory(final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack) {
116122
updateTankCapacity();
117-
markNoUpdateSync();
123+
markForUpdateSync();
118124
}
119125

120126
private void updateTankCapacity() {
@@ -124,6 +130,7 @@ private void updateTankCapacity() {
124130

125131
@Override
126132
public void onFluidInventoryChanged(final IAEFluidTank inv, final int slot) {
133+
changedSlots.set(slot);
127134
markNoUpdateSync();
128135
}
129136

src/main/java/github/kasuminova/mmce/common/tile/base/MEItemBus.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import appeng.api.AEApi;
44
import appeng.api.storage.channels.IItemStorageChannel;
55
import hellfirepvp.modularmachinery.common.util.IOInventory;
6+
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
7+
import it.unimi.dsi.fastutil.ints.IntSet;
68
import net.minecraft.item.ItemStack;
79
import net.minecraft.nbt.NBTTagCompound;
810
import net.minecraft.util.EnumFacing;
@@ -12,14 +14,20 @@
1214

1315
import javax.annotation.Nonnull;
1416
import javax.annotation.Nullable;
17+
import java.util.BitSet;
1518

1619
public abstract class MEItemBus extends MEMachineComponent {
1720

1821
protected final IItemStorageChannel channel = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class);
22+
protected final BitSet changedSlots = new BitSet();
1923
protected IOInventory inventory = buildInventory();
2024

2125
public abstract IOInventory buildInventory();
2226

27+
protected int[] getNeedUpdateSlots() {
28+
return changedSlots.stream().toArray();
29+
}
30+
2331
public IOInventory getInternalInventory() {
2432
return inventory;
2533
}
@@ -50,6 +58,7 @@ public void readCustomNBT(final NBTTagCompound compound) {
5058

5159
public void readInventoryNBT(final NBTTagCompound tag) {
5260
this.inventory = IOInventory.deserialize(this, tag);
61+
this.inventory.setListener(changedSlots::set);
5362

5463
int[] slotIDs = new int[inventory.getSlots()];
5564
for (int slotID = 0; slotID < slotIDs.length; slotID++) {

src/main/java/github/kasuminova/mmce/common/util/AEFluidInventoryUpgradeable.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public int getCapacity() {
3737

3838
public void setCapacity(int capacity) {
3939
this.capacity = capacity;
40+
for (int slot = 0; slot < getSlots(); slot++) {
41+
this.onContentChanged(slot);
42+
}
4043
}
4144

4245
@Override

src/main/java/github/kasuminova/mmce/common/world/MMWorldEventListener.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.minecraft.world.IWorldEventListener;
1212
import net.minecraft.world.World;
1313
import net.minecraft.world.gen.structure.StructureBoundingBox;
14+
import net.minecraftforge.event.world.ChunkEvent;
1415
import net.minecraftforge.event.world.WorldEvent;
1516
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
1617
import net.minecraftforge.fml.common.gameevent.TickEvent;
@@ -65,6 +66,22 @@ public void onServerTickStart(TickEvent.ServerTickEvent event) {
6566
worldChangedChunks.clear();
6667
}
6768

69+
@SubscribeEvent
70+
public void onChunkUnload(final ChunkEvent.Unload event) {
71+
World world = event.getWorld();
72+
if (world.isRemote) {
73+
return;
74+
}
75+
ChunkPos pos = event.getChunk().getPos();
76+
int xStart = pos.getXStart();
77+
int xEnd = pos.getXEnd();
78+
int zStart = pos.getZStart();
79+
int zEnd = pos.getZEnd();
80+
81+
StructureBoundingBox structureArea = new StructureBoundingBox(xStart, zStart, xEnd, zEnd);
82+
worldChangedChunks.get(world).put(pos, structureArea);
83+
}
84+
6885
public boolean isAreaChanged(@Nonnull final World worldIn,
6986
@Nonnull final BlockPos min,
7087
@Nonnull final BlockPos max) {

src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
package hellfirepvp.modularmachinery.common;
1010

11+
import appeng.me.helpers.IGridProxyable;
1112
import github.kasuminova.mmce.common.capability.CapabilityUpgrade;
1213
import github.kasuminova.mmce.common.concurrent.TaskExecutor;
1314
import github.kasuminova.mmce.common.container.ContainerMEFluidInputBus;
@@ -22,7 +23,6 @@
2223
import github.kasuminova.mmce.common.tile.MEFluidOutputBus;
2324
import github.kasuminova.mmce.common.tile.MEItemInputBus;
2425
import github.kasuminova.mmce.common.tile.MEItemOutputBus;
25-
import github.kasuminova.mmce.common.tile.base.MEMachineComponent;
2626
import github.kasuminova.mmce.common.util.concurrent.Action;
2727
import github.kasuminova.mmce.common.world.MMWorldEventListener;
2828
import hellfirepvp.modularmachinery.ModularMachinery;
@@ -100,11 +100,11 @@ public static void loadModData(File configDir) {
100100
}
101101

102102
private static boolean aeSecurityCheck(EntityPlayer player, TileEntity te) {
103-
if (!Mods.AE2.isPresent() || !(te instanceof MEMachineComponent)) {
103+
if (!Mods.AE2.isPresent() || !(te instanceof IGridProxyable)) {
104104
return true;
105105
}
106106

107-
return ModIntegrationAE2.securityCheck(player, ((MEMachineComponent) te).getProxy());
107+
return ModIntegrationAE2.securityCheck(player, ((IGridProxyable) te).getProxy());
108108
}
109109

110110
public void preInit() {

0 commit comments

Comments
 (0)