Skip to content

Commit 8cbec7d

Browse files
committed
修复一个可能出现的崩溃
1 parent 63bb28e commit 8cbec7d

File tree

2 files changed

+83
-73
lines changed

2 files changed

+83
-73
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ show_testing_output = false
1515

1616
# Mod Information
1717
# HIGHLY RECOMMEND complying with SemVer for mod_version: https://semver.org/
18-
mod_version = 2.7.2-unofficial
18+
mod_version = 2.7.3-unofficial
1919
root_package = com.glodblock.github
2020
mod_id = ae2fc
2121
mod_name = AE2FluidCraft-Rework-Unofficial

src/main/java/com/glodblock/github/network/CpacketMEMonitorableAction.java

Lines changed: 82 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -84,91 +84,101 @@ public IMessage onMessage(final CpacketMEMonitorableAction message, final Messag
8484
source = new PlayerSource(player, cbt.getPart());
8585
} else return null;
8686

87-
boolean drain = false;
8887
final var h = player.inventory.getItemStack();
8988
if (!h.isEmpty()) {
9089
final ItemStack ch = h.copy();
9190
ch.setCount(1);
9291
if (message.type == FLUID) {
93-
final IFluidHandlerItem fh = FluidUtil.getFluidHandler(ch);
94-
if (fh == null) return null;
95-
final var allFluid = fh.drain(Integer.MAX_VALUE, false);
96-
FluidStack fluid = null;
97-
if (!message.obj.isEmpty()) {
98-
fluid = FluidStack.loadFluidStackFromNBT(message.obj);
99-
if (fluid != null) {
100-
if (allFluid != null && allFluid.amount > 0) {
101-
if (!allFluid.isFluidEqual(fluid)) drain = true;
102-
}
103-
} else drain = true;
104-
} else drain = true;
105-
final var fluidStorage = grid.getInventory(Util.getFluidChannel());
106-
final AEFluidStack allAEFluid;
107-
if (drain) {
108-
allAEFluid = AEFluidStack.fromFluidStack(allFluid);
109-
if (allAEFluid == null) return null;
110-
final var a = fluidStorage.injectItems(allAEFluid, Actionable.SIMULATE, source);
111-
final var size = allAEFluid.getStackSize() - (a == null ? 0 : a.getStackSize());
112-
fluidStorage.injectItems(allAEFluid.setStackSize(size), Actionable.MODULATE, source);
113-
fh.drain((int) size, true);
114-
} else {
115-
allAEFluid = AEFluidStack.fromFluidStack(fluid);
116-
final var a = fluidStorage.extractItems(allAEFluid, Actionable.SIMULATE, source);
117-
if (a == null) return null;
118-
final var size = fh.fill(a.getFluidStack(), false);
119-
fluidStorage.extractItems(allAEFluid.setStackSize(size), Actionable.MODULATE, source);
120-
fh.fill(a.getFluidStack(), true);
121-
}
122-
if (h.getCount() > 1) {
123-
h.shrink(1);
124-
final var cc = fh.getContainer();
125-
cc.setCount(1);
126-
player.inventory.placeItemBackInInventory(player.world, cc);
127-
} else player.inventory.setItemStack(fh.getContainer());
128-
updateHeld(player);
92+
player.server.addScheduledTask(() -> fluidWork(message, ch, grid, source, h, player));
12993
} else if (ModAndClassUtil.GAS && message.type == GAS && h.getItem() instanceof final IGasItem ig) {
130-
mek$Work(message, ig, ch, grid, source, h, player);
131-
}
132-
} else if (message.type == FLUID_OPERATE) {
133-
if (bucket == null) {
134-
bucket = AEItemStack.fromItemStack(new ItemStack(Items.BUCKET));
94+
player.server.addScheduledTask(() -> gasWork(message, ig, ch, grid, source, h, player));
13595
}
136-
final FluidStack fluid;
137-
if (!message.obj.isEmpty()) {
138-
final var i = new ItemStack(message.obj);
139-
fluid = FakeItemRegister.getStack(i);
140-
if (fluid == null) return null;
141-
fluid.amount = 1000;
142-
} else return null;
143-
final boolean shift = message.obj.getBoolean("shift");
144-
final var itemStorage = grid.getInventory(Util.getItemChannel());
145-
final var fluidStorage = grid.getInventory(Util.getFluidChannel());
146-
final var b = itemStorage.extractItems(bucket, Actionable.SIMULATE, source);
147-
if (b == null) return null;
148-
final var aeFluid = fluidStorage.extractItems(AEFluidStack.fromFluidStack(fluid), Actionable.SIMULATE, source);
149-
if (aeFluid == null || aeFluid.getStackSize() < 1000) return null;
150-
final IFluidHandlerItem fh = FluidUtil.getFluidHandler(b.createItemStack());
151-
if (fh == null) return null;
152-
final var s = fh.fill(aeFluid.getFluidStack(), true);
153-
if (s != 1000) return null;
154-
final var out = fh.getContainer();
155-
if (shift) {
156-
final var slot = player.inventory.getFirstEmptyStack();
157-
if (slot == -1) return null;
158-
player.inventory.setInventorySlotContents(slot, out);
159-
} else {
160-
player.inventory.setItemStack(out);
161-
updateHeld(player);
96+
} else {
97+
if (message.type == FLUID_OPERATE) {
98+
player.server.addScheduledTask(() -> fluidOperateWork(message, grid, source, player));
16299
}
163-
itemStorage.extractItems(bucket, Actionable.MODULATE, source);
164-
fluidStorage.extractItems(aeFluid, Actionable.MODULATE, source);
165100
}
166101
return null;
167102
}
168103

104+
private static void fluidOperateWork(final CpacketMEMonitorableAction message, final IStorageGrid grid, final IActionSource source, final EntityPlayerMP player) {
105+
if (bucket == null) {
106+
bucket = AEItemStack.fromItemStack(new ItemStack(Items.BUCKET));
107+
}
108+
final FluidStack fluid;
109+
if (!message.obj.isEmpty()) {
110+
final var i = new ItemStack(message.obj);
111+
fluid = FakeItemRegister.getStack(i);
112+
if (fluid == null) return;
113+
fluid.amount = 1000;
114+
} else return;
115+
final boolean shift = message.obj.getBoolean("shift");
116+
final var itemStorage = grid.getInventory(Util.getItemChannel());
117+
final var fluidStorage = grid.getInventory(Util.getFluidChannel());
118+
final var b = itemStorage.extractItems(bucket, Actionable.SIMULATE, source);
119+
if (b == null) return;
120+
final var aeFluid = fluidStorage.extractItems(AEFluidStack.fromFluidStack(fluid), Actionable.SIMULATE, source);
121+
if (aeFluid == null || aeFluid.getStackSize() < 1000) return;
122+
final IFluidHandlerItem fh = FluidUtil.getFluidHandler(b.createItemStack());
123+
if (fh == null) return;
124+
final var s = fh.fill(aeFluid.getFluidStack(), true);
125+
if (s != 1000) return;
126+
final var out = fh.getContainer();
127+
if (shift) {
128+
final var slot = player.inventory.getFirstEmptyStack();
129+
if (slot == -1) return;
130+
player.inventory.setInventorySlotContents(slot, out);
131+
} else {
132+
player.inventory.setItemStack(out);
133+
updateHeld(player);
134+
}
135+
itemStorage.extractItems(bucket, Actionable.MODULATE, source);
136+
fluidStorage.extractItems(aeFluid, Actionable.MODULATE, source);
137+
}
138+
139+
private static void fluidWork(final CpacketMEMonitorableAction message, final ItemStack ch, final IStorageGrid grid, final IActionSource source, final ItemStack h, final EntityPlayerMP player) {
140+
boolean drain = false;
141+
final IFluidHandlerItem fh = FluidUtil.getFluidHandler(ch);
142+
if (fh == null) return;
143+
final var allFluid = fh.drain(Integer.MAX_VALUE, false);
144+
FluidStack fluid = null;
145+
if (!message.obj.isEmpty()) {
146+
fluid = FluidStack.loadFluidStackFromNBT(message.obj);
147+
if (fluid != null) {
148+
if (allFluid != null && allFluid.amount > 0) {
149+
if (!allFluid.isFluidEqual(fluid)) drain = true;
150+
}
151+
} else drain = true;
152+
} else drain = true;
153+
final var fluidStorage = grid.getInventory(Util.getFluidChannel());
154+
final AEFluidStack allAEFluid;
155+
if (drain) {
156+
allAEFluid = AEFluidStack.fromFluidStack(allFluid);
157+
if (allAEFluid == null) return;
158+
final var a = fluidStorage.injectItems(allAEFluid, Actionable.SIMULATE, source);
159+
final var size = allAEFluid.getStackSize() - (a == null ? 0 : a.getStackSize());
160+
fluidStorage.injectItems(allAEFluid.setStackSize(size), Actionable.MODULATE, source);
161+
fh.drain((int) size, true);
162+
} else {
163+
allAEFluid = AEFluidStack.fromFluidStack(fluid);
164+
final var a = fluidStorage.extractItems(allAEFluid, Actionable.SIMULATE, source);
165+
if (a == null) return;
166+
final var size = fh.fill(a.getFluidStack(), false);
167+
fluidStorage.extractItems(allAEFluid.setStackSize(size), Actionable.MODULATE, source);
168+
fh.fill(a.getFluidStack(), true);
169+
}
170+
if (h.getCount() > 1) {
171+
h.shrink(1);
172+
final var cc = fh.getContainer();
173+
cc.setCount(1);
174+
player.inventory.placeItemBackInInventory(player.world, cc);
175+
} else player.inventory.setItemStack(fh.getContainer());
176+
updateHeld(player);
177+
}
178+
169179
@Unique
170180
@Optional.Method(modid = "mekeng")
171-
private void mek$Work(final CpacketMEMonitorableAction message, final IGasItem ig, final ItemStack ch, final IStorageGrid grid, final IActionSource source, final ItemStack h, final EntityPlayerMP player) {
181+
private static void gasWork(final CpacketMEMonitorableAction message, final IGasItem ig, final ItemStack ch, final IStorageGrid grid, final IActionSource source, final ItemStack h, final EntityPlayerMP player) {
172182
boolean drain = false;
173183
final var allGas = ig.getGas(ch);
174184
final var allAmount = allGas == null ? 0 : allGas.amount;
@@ -208,7 +218,7 @@ public IMessage onMessage(final CpacketMEMonitorableAction message, final Messag
208218
updateHeld(player);
209219
}
210220

211-
private void updateHeld(final EntityPlayerMP p) {
221+
private static void updateHeld(final EntityPlayerMP p) {
212222
if (Platform.isServer()) {
213223
try {
214224
NetworkHandler.instance().sendTo(new PacketInventoryAction(InventoryAction.UPDATE_HAND, 0, AEItemStack.fromItemStack(p.inventory.getItemStack())), p);

0 commit comments

Comments
 (0)