From e95bd1d651b7448b0d6c480fbfc75c713f12f6a1 Mon Sep 17 00:00:00 2001 From: Integer Limit <103940576+IntegerLimit@users.noreply.github.com> Date: Sat, 28 Dec 2024 17:37:50 +1100 Subject: [PATCH] Fix Change Type, Fix Edge Case CME CME fix adapted from https://github.com/AE2-UEL/BetterP2P/pull/4 --- .../mixin/betterp2p/GridServerCacheMixin.java | 24 ++++++----- .../betterp2p/ServerLinkP2PHandlerMixin.java | 42 ++++++++++++++++++ .../ServerTypeChangeHandlerMixin.java | 43 +++++++++++++++++++ .../ServerUnlinkP2PHandlerMixin.java | 38 ++++++++++++++++ .../network/LabsP2PAddAsInputMessage.java | 14 +++--- .../network/LabsP2PAddAsOutputMessage.java | 14 +++--- .../network/LabsP2PChangeTypeMessage.java | 13 +++--- .../resources/mixins.nomilabs.betterp2p.json | 5 ++- 8 files changed, 164 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerLinkP2PHandlerMixin.java create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerTypeChangeHandlerMixin.java create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerUnlinkP2PHandlerMixin.java diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/GridServerCacheMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/GridServerCacheMixin.java index f9d4aabc..88f6a15e 100644 --- a/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/GridServerCacheMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/GridServerCacheMixin.java @@ -80,12 +80,11 @@ private void properlyChangeAllP2PTypes(P2PLocation p2p, TunnelInfo newType, Call return; } - changeP2PType(tunnel, newType); - - if (tunnel.getFrequency() == 0 || !tunnel.isActive()) { + if (tunnel.getFrequency() == 0) { // Unbound or Inactive // Can't rebind same frequency if inactive, as not registered in ae2 handling - cir.setReturnValue(true); + var result = changeP2PType(tunnel, newType); + cir.setReturnValue(result != null); return; } @@ -94,12 +93,17 @@ private void properlyChangeAllP2PTypes(P2PLocation p2p, TunnelInfo newType, Call TunnelCollection outputs = tunnel.getProxy().getP2P().getOutputs(tunnel.getFrequency(), tunnel.getClass()); - for (var input : inputs) { - changeP2PType(input, newType); - } - - for (var output : outputs) { - changeP2PType(output, newType); + // Add all parts to a new list, so we don't CME + List> toModify = new ArrayList<>(); + inputs.forEach(toModify::add); + outputs.forEach(toModify::add); + + for (var modify : toModify) { + var result = changeP2PType(modify, newType); + if (result == null) { + cir.setReturnValue(false); + return; + } } } catch (GridAccessException ignored) {} cir.setReturnValue(true); diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerLinkP2PHandlerMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerLinkP2PHandlerMixin.java new file mode 100644 index 00000000..717dd9a6 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerLinkP2PHandlerMixin.java @@ -0,0 +1,42 @@ +package com.nomiceu.nomilabs.mixin.betterp2p; + +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.projecturanus.betterp2p.network.ModNetwork; +import com.projecturanus.betterp2p.network.PlayerRequest; +import com.projecturanus.betterp2p.network.packet.C2SLinkP2P; +import com.projecturanus.betterp2p.network.packet.ServerLinkP2PHandler; + +/** + * Fixes an edge case CME. + */ +@Mixin(value = ServerLinkP2PHandler.class, remap = false) +public class ServerLinkP2PHandlerMixin { + + @Inject(method = "onMessage(Lcom/projecturanus/betterp2p/network/packet/C2SLinkP2P;Lnet/minecraftforge/fml/common/network/simpleimpl/MessageContext;)Lnet/minecraftforge/fml/common/network/simpleimpl/IMessage;", + at = @At("HEAD"), + cancellable = true) + private void newMsgHandling(C2SLinkP2P message, MessageContext ctx, CallbackInfoReturnable cir) { + cir.setReturnValue(null); + + if (!ctx.side.isServer()) return; + if (message.getInput() == null || message.getOutput() == null) return; + + PlayerRequest state = ModNetwork.INSTANCE.getPlayerState().get(ctx.getServerHandler().player.getUniqueID()); + if (state == null) return; + + ctx.getServerHandler().server.addScheduledTask(() -> { + var result = state.getGridCache().linkP2P(message.getInput(), message.getOutput()); + + if (result != null) { + ModNetwork.INSTANCE.requestP2PUpdate(ctx.getServerHandler().player); + } + }); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerTypeChangeHandlerMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerTypeChangeHandlerMixin.java new file mode 100644 index 00000000..01bc17fa --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerTypeChangeHandlerMixin.java @@ -0,0 +1,43 @@ +package com.nomiceu.nomilabs.mixin.betterp2p; + +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.projecturanus.betterp2p.BetterP2P; +import com.projecturanus.betterp2p.network.ModNetwork; +import com.projecturanus.betterp2p.network.PlayerRequest; +import com.projecturanus.betterp2p.network.packet.*; +import com.projecturanus.betterp2p.util.p2p.TunnelInfo; + +/** + * Fixes an edge case CME. + */ +@Mixin(value = ServerTypeChangeHandler.class, remap = false) +public class ServerTypeChangeHandlerMixin { + + @Inject(method = "onMessage(Lcom/projecturanus/betterp2p/network/packet/C2STypeChange;Lnet/minecraftforge/fml/common/network/simpleimpl/MessageContext;)Lcom/projecturanus/betterp2p/network/packet/S2COpenGui;", + at = @At("HEAD"), + cancellable = true) + private void newMsgHandling(C2STypeChange message, MessageContext ctx, CallbackInfoReturnable cir) { + cir.setReturnValue(null); + + if (!ctx.side.isServer()) return; + if (message.getP2p() == null) return; + + PlayerRequest state = ModNetwork.INSTANCE.getPlayerState().get(ctx.getServerHandler().player.getUniqueID()); + TunnelInfo type = BetterP2P.proxy.getP2PFromIndex(message.getNewType()); + if (state == null || type == null) return; + + ctx.getServerHandler().server.addScheduledTask(() -> { + var result = state.getGridCache().changeAllP2Ps(message.getP2p(), type); + + if (result) { + ModNetwork.INSTANCE.requestP2PList(ctx.getServerHandler().player, type.getIndex()); + } + }); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerUnlinkP2PHandlerMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerUnlinkP2PHandlerMixin.java new file mode 100644 index 00000000..822020ee --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/betterp2p/ServerUnlinkP2PHandlerMixin.java @@ -0,0 +1,38 @@ +package com.nomiceu.nomilabs.mixin.betterp2p; + +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.projecturanus.betterp2p.network.ModNetwork; +import com.projecturanus.betterp2p.network.PlayerRequest; +import com.projecturanus.betterp2p.network.packet.*; + +/** + * Fixes an edge case CME. + */ +@Mixin(value = ServerUnlinkP2PHandler.class, remap = false) +public class ServerUnlinkP2PHandlerMixin { + + @Inject(method = "onMessage(Lcom/projecturanus/betterp2p/network/packet/C2SUnlinkP2P;Lnet/minecraftforge/fml/common/network/simpleimpl/MessageContext;)Lcom/projecturanus/betterp2p/network/packet/S2COpenGui;", + at = @At("HEAD"), + cancellable = true) + private void newMsgHandling(C2SUnlinkP2P message, MessageContext ctx, CallbackInfoReturnable cir) { + cir.setReturnValue(null); + + if (!ctx.side.isServer()) return; + if (message.getP2p() == null) return; + + PlayerRequest state = ModNetwork.INSTANCE.getPlayerState().get(ctx.getServerHandler().player.getUniqueID()); + if (state == null) return; + + ctx.getServerHandler().server.addScheduledTask(() -> { + state.getGridCache().unlinkP2P(message.getP2p()); + + ModNetwork.INSTANCE.requestP2PUpdate(ctx.getServerHandler().player); + }); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsP2PAddAsInputMessage.java b/src/main/java/com/nomiceu/nomilabs/network/LabsP2PAddAsInputMessage.java index e4b1543a..e7254f95 100644 --- a/src/main/java/com/nomiceu/nomilabs/network/LabsP2PAddAsInputMessage.java +++ b/src/main/java/com/nomiceu/nomilabs/network/LabsP2PAddAsInputMessage.java @@ -48,12 +48,14 @@ public IMessage onMessage(LabsP2PAddAsInputMessage message, MessageContext ctx) PlayerRequest state = ModNetwork.INSTANCE.getPlayerState().get(ctx.getServerHandler().player.getUniqueID()); if (state == null) return null; - boolean result = ((AccessibleGridServerCache) (Object) state.getGridCache()) - .labs$addInput(message.location, message.sourceFrequency); - - if (result) { - ModNetwork.INSTANCE.requestP2PUpdate(ctx.getServerHandler().player); - } + ctx.getServerHandler().server.addScheduledTask(() -> { + boolean result = ((AccessibleGridServerCache) (Object) state.getGridCache()) + .labs$addInput(message.location, message.sourceFrequency); + + if (result) { + ModNetwork.INSTANCE.requestP2PUpdate(ctx.getServerHandler().player); + } + }); return null; } } diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsP2PAddAsOutputMessage.java b/src/main/java/com/nomiceu/nomilabs/network/LabsP2PAddAsOutputMessage.java index d10fd74e..100f5e92 100644 --- a/src/main/java/com/nomiceu/nomilabs/network/LabsP2PAddAsOutputMessage.java +++ b/src/main/java/com/nomiceu/nomilabs/network/LabsP2PAddAsOutputMessage.java @@ -48,12 +48,14 @@ public IMessage onMessage(LabsP2PAddAsOutputMessage message, MessageContext ctx) PlayerRequest state = ModNetwork.INSTANCE.getPlayerState().get(ctx.getServerHandler().player.getUniqueID()); if (state == null) return null; - boolean result = ((AccessibleGridServerCache) (Object) state.getGridCache()) - .labs$addOutput(message.location, message.sourceFrequency); - - if (result) { - ModNetwork.INSTANCE.requestP2PUpdate(ctx.getServerHandler().player); - } + ctx.getServerHandler().server.addScheduledTask(() -> { + boolean result = ((AccessibleGridServerCache) (Object) state.getGridCache()) + .labs$addOutput(message.location, message.sourceFrequency); + + if (result) { + ModNetwork.INSTANCE.requestP2PUpdate(ctx.getServerHandler().player); + } + }); return null; } } diff --git a/src/main/java/com/nomiceu/nomilabs/network/LabsP2PChangeTypeMessage.java b/src/main/java/com/nomiceu/nomilabs/network/LabsP2PChangeTypeMessage.java index 48fc9349..a5cf6f74 100644 --- a/src/main/java/com/nomiceu/nomilabs/network/LabsP2PChangeTypeMessage.java +++ b/src/main/java/com/nomiceu/nomilabs/network/LabsP2PChangeTypeMessage.java @@ -49,12 +49,13 @@ public IMessage onMessage(LabsP2PChangeTypeMessage message, MessageContext ctx) PlayerRequest state = ModNetwork.INSTANCE.getPlayerState().get(ctx.getServerHandler().player.getUniqueID()); if (state == null) return null; - PartP2PTunnel result = ((AccessibleGridServerCache) (Object) state.getGridCache()) - .labs$changeIsInput(message.location, message.isInput); - - if (result != null) { - ModNetwork.INSTANCE.requestP2PUpdate(ctx.getServerHandler().player); - } + ctx.getServerHandler().server.addScheduledTask(() -> { + PartP2PTunnel result = ((AccessibleGridServerCache) (Object) state.getGridCache()) + .labs$changeIsInput(message.location, message.isInput); + if (result != null) { + ModNetwork.INSTANCE.requestP2PUpdate(ctx.getServerHandler().player); + } + }); return null; } } diff --git a/src/main/resources/mixins.nomilabs.betterp2p.json b/src/main/resources/mixins.nomilabs.betterp2p.json index 82de40eb..c74a5efa 100644 --- a/src/main/resources/mixins.nomilabs.betterp2p.json +++ b/src/main/resources/mixins.nomilabs.betterp2p.json @@ -8,7 +8,10 @@ "BetterMemoryCardModesMixin", "CommonProxyMixin", "GridServerCacheMixin", - "ServerRenameP2PTunnelMixin" + "ServerLinkP2PHandlerMixin", + "ServerRenameP2PTunnelMixin", + "ServerTypeChangeHandlerMixin", + "ServerUnlinkP2PHandlerMixin" ], "client": [ "ClientProxyMixin",