From 96ffc5c1a5268d62215e86a9cb794edaf8290891 Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Sun, 16 Jan 2022 15:55:44 +0100 Subject: [PATCH] Fixed multiplayer: cache in Mode/ModifierSettingsManager does not work on server, so it's removed. Also changed some packets to use separate classes for clientside handling, as recommended by the Forge Community Wiki. --- build.gradle | 2 +- .../buildmode/ModeSettingsManager.java | 13 +----- .../ModifierSettingsManager.java | 13 ++---- .../network/AddUndoMessage.java | 42 ++++++++++++------- .../network/BlockPlacedMessage.java | 14 ++++++- .../network/ClearUndoMessage.java | 19 +++++++-- .../network/PacketHandler.java | 2 +- .../network/RequestLookAtMessage.java | 31 +++++++++----- .../network/TranslatedLogMessage.java | 3 ++ 9 files changed, 84 insertions(+), 55 deletions(-) diff --git a/build.gradle b/build.gradle index 308556d..8939965 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.18.1-2.30' +version = '1.18.1-2.31' group = 'nl.requios.effortlessbuilding' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'effortlessbuilding' diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeSettingsManager.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeSettingsManager.java index f27356e..264939c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeSettingsManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeSettingsManager.java @@ -16,33 +16,24 @@ import javax.annotation.Nonnull; @Mod.EventBusSubscriber public class ModeSettingsManager { - private static ModeSettings cache = null; - //Retrieves the buildsettings of a player through the modeCapability capability //Never returns null @Nonnull public static ModeSettings getModeSettings(Player player) { - if (cache != null) return cache; - LazyOptional modeCapability = player.getCapability(ModeCapabilityManager.MODE_CAPABILITY, null); if (modeCapability.isPresent()) { ModeCapabilityManager.IModeCapability capability = modeCapability.orElse(null); - cache = capability.getModeData(); - if (cache == null) { - cache = new ModeSettings(); - capability.setModeData(cache); + if (capability.getModeData() == null){ + capability.setModeData(new ModeSettings()); } - //Add invalidation listener, to invalidate cache - modeCapability.addListener(self -> cache = null); return capability.getModeData(); } EffortlessBuilding.logger.warn("Player does not have modeCapability: " + player); //Return dummy settings return new ModeSettings(); -// throw new IllegalArgumentException("Player does not have modeCapability capability"); } public static void setModeSettings(Player player, ModeSettings modeSettings) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/ModifierSettingsManager.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/ModifierSettingsManager.java index 4a91649..7583398 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/ModifierSettingsManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/ModifierSettingsManager.java @@ -17,27 +17,20 @@ import javax.annotation.Nonnull; @Mod.EventBusSubscriber public class ModifierSettingsManager { - private static ModifierSettings cache = null; - //Retrieves the buildsettings of a player through the modifierCapability capability //Never returns null @Nonnull public static ModifierSettings getModifierSettings(Player player) { - if (cache != null) return cache; LazyOptional modifierCapability = player.getCapability(ModifierCapabilityManager.MODIFIER_CAPABILITY, null); if (modifierCapability.isPresent()) { ModifierCapabilityManager.IModifierCapability capability = modifierCapability.orElse(null); - cache = capability.getModifierData(); - if (cache == null) { - cache = new ModifierSettings(); - capability.setModifierData(cache); + if (capability.getModifierData() == null){ + capability.setModifierData(new ModifierSettings()); } - //Add invalidation listener, to invalidate cache - modifierCapability.addListener(self -> cache = null); - return cache; + return capability.getModifierData(); } EffortlessBuilding.logger.warn("Player does not have modifierCapability: " + player); diff --git a/src/main/java/nl/requios/effortlessbuilding/network/AddUndoMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/AddUndoMessage.java index a9fc402..4a639b2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/AddUndoMessage.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/AddUndoMessage.java @@ -6,11 +6,15 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.buildmodifier.BlockSet; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; +import nl.requios.effortlessbuilding.render.BlockPreviewRenderer; import java.util.ArrayList; import java.util.function.Supplier; @@ -67,25 +71,31 @@ public class AddUndoMessage { ctx.get().enqueueWork(() -> { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { //Received clientside - - Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); - //Add to undo stack clientside - //Only the appropriate player that needs to add this to the undo stack gets this message - UndoRedo.addUndo(player, new BlockSet( - new ArrayList() {{ - add(message.getCoordinate()); - }}, - new ArrayList() {{ - add(message.getPreviousBlockState()); - }}, - new ArrayList() {{ - add(message.getNewBlockState()); - }}, - new Vec3(0, 0, 0), - message.getCoordinate(), message.getCoordinate())); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(message, ctx)); } }); ctx.get().setPacketHandled(true); } } + + @OnlyIn(Dist.CLIENT) + public static class ClientHandler { + public static void handle(AddUndoMessage message, Supplier ctx) { + Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); + //Add to undo stack clientside + //Only the appropriate player that needs to add this to the undo stack gets this message + UndoRedo.addUndo(player, new BlockSet( + new ArrayList() {{ + add(message.getCoordinate()); + }}, + new ArrayList() {{ + add(message.getPreviousBlockState()); + }}, + new ArrayList() {{ + add(message.getNewBlockState()); + }}, + new Vec3(0, 0, 0), + message.getCoordinate(), message.getCoordinate())); + } + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/BlockPlacedMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/BlockPlacedMessage.java index ec191ab..2d68d31 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/BlockPlacedMessage.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/BlockPlacedMessage.java @@ -6,6 +6,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; import nl.requios.effortlessbuilding.buildmode.BuildModes; @@ -95,8 +98,7 @@ public class BlockPlacedMessage { ctx.get().enqueueWork(() -> { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { //Received clientside - //Nod RenderHandler to do the dissolve shader effect - BlockPreviewRenderer.onBlocksPlaced(); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(message, ctx)); } else { //Received serverside BuildModes.onBlockPlacedMessage(ctx.get().getSender(), message); @@ -105,4 +107,12 @@ public class BlockPlacedMessage { ctx.get().setPacketHandled(true); } } + + @OnlyIn(Dist.CLIENT) + public static class ClientHandler { + public static void handle(BlockPlacedMessage message, Supplier ctx) { + //Nod RenderHandler to do the dissolve shader effect + BlockPreviewRenderer.onBlocksPlaced(); + } + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/ClearUndoMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/ClearUndoMessage.java index 10d4324..0bd946c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/ClearUndoMessage.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/ClearUndoMessage.java @@ -2,10 +2,14 @@ package nl.requios.effortlessbuilding.network; import net.minecraft.world.entity.player.Player; import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; +import nl.requios.effortlessbuilding.render.BlockPreviewRenderer; import java.util.function.Supplier; @@ -30,13 +34,20 @@ public class ClearUndoMessage { ctx.get().enqueueWork(() -> { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { //Received clientside - Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); - - //Add to undo stack clientside - UndoRedo.clear(player); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(message, ctx)); } }); ctx.get().setPacketHandled(true); } } + + @OnlyIn(Dist.CLIENT) + public static class ClientHandler { + public static void handle(ClearUndoMessage message, Supplier ctx) { + Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); + + //Add to undo stack clientside + UndoRedo.clear(player); + } + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java b/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java index 3f302e8..f5c044d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java @@ -8,7 +8,7 @@ import nl.requios.effortlessbuilding.EffortlessBuilding; public class PacketHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( - new ResourceLocation(EffortlessBuilding.MODID, "main_channel"), + new ResourceLocation(EffortlessBuilding.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals diff --git a/src/main/java/nl/requios/effortlessbuilding/network/RequestLookAtMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/RequestLookAtMessage.java index ea34f33..bd534cd 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/RequestLookAtMessage.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/RequestLookAtMessage.java @@ -4,10 +4,14 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.NetworkEvent; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.proxy.ClientProxy; +import nl.requios.effortlessbuilding.render.BlockPreviewRenderer; import java.util.function.Supplier; @@ -44,19 +48,26 @@ public class RequestLookAtMessage { ctx.get().enqueueWork(() -> { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { //Received clientside - //Send back your info - Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); - - //Prevent double placing in normal mode with placeStartPos false - //Unless QuickReplace is on, then we do need to place start pos. - if (ClientProxy.previousLookAt.getType() == HitResult.Type.BLOCK) { - PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage((BlockHitResult) ClientProxy.previousLookAt, message.getPlaceStartPos())); - } else { - PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage()); - } + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(message, ctx)); } }); ctx.get().setPacketHandled(true); } } + + @OnlyIn(Dist.CLIENT) + public static class ClientHandler { + public static void handle(RequestLookAtMessage message, Supplier ctx) { + //Send back your info + Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); + + //Prevent double placing in normal mode with placeStartPos false + //Unless QuickReplace is on, then we do need to place start pos. + if (ClientProxy.previousLookAt.getType() == HitResult.Type.BLOCK) { + PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage((BlockHitResult) ClientProxy.previousLookAt, message.getPlaceStartPos())); + } else { + PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage()); + } + } + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/TranslatedLogMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/TranslatedLogMessage.java index 9e477ce..a127298 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/TranslatedLogMessage.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/TranslatedLogMessage.java @@ -8,6 +8,9 @@ import nl.requios.effortlessbuilding.EffortlessBuilding; import java.util.function.Supplier; +/** + * Send packet to client to translate and log the containing message + */ public class TranslatedLogMessage { private final String prefix; private final String translationKey;