diff --git a/common/src/main/java/com/seibel/distanthorizons/common/AbstractPluginPacketSender.java b/common/src/main/java/com/seibel/distanthorizons/common/AbstractPluginPacketSender.java index 959e05588..cb6550394 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/AbstractPluginPacketSender.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/AbstractPluginPacketSender.java @@ -1,6 +1,7 @@ package com.seibel.distanthorizons.common; import com.seibel.distanthorizons.core.config.Config; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.ConfigBasedLogger; import com.seibel.distanthorizons.core.network.event.internal.IncompatibleMessageInternalEvent; import com.seibel.distanthorizons.core.network.event.internal.ProtocolErrorInternalEvent; @@ -30,6 +31,16 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender public static final ResourceLocation WRAPPER_PACKET_RESOURCE = new ResourceLocation(ModInfo.RESOURCE_NAMESPACE, ModInfo.WRAPPER_PACKET_PATH); #endif + // "Forge byte" is an unused packet ID. We have our own system which works with all mod loaders, + // so we're just accounting for it by reading the protocol version as a byte instead of a short in Forge, to keep cross-loader compatibility + private final boolean forgeByteInProtocolVersion; + + + public AbstractPluginPacketSender() { this(false); } + public AbstractPluginPacketSender(boolean forgeByteInProtocolVersion) + { + this.forgeByteInProtocolVersion = forgeByteInProtocolVersion; + } @Override public final void sendToClient(IServerPlayerWrapper serverPlayer, AbstractNetworkMessage message) @@ -41,7 +52,7 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender @Override public abstract void sendToServer(AbstractNetworkMessage message); - public static AbstractNetworkMessage decodeMessage(FriendlyByteBuf in) + public AbstractNetworkMessage decodeMessage(FriendlyByteBuf in) { AbstractNetworkMessage message = null; @@ -49,7 +60,7 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender { in.markReaderIndex(); - int protocolVersion = in.readShort(); + int protocolVersion = this.forgeByteInProtocolVersion ? in.readByte() : in.readShort(); if (protocolVersion != ModInfo.PROTOCOL_VERSION) { return new IncompatibleMessageInternalEvent(protocolVersion); @@ -82,11 +93,19 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender } } - public static void encodeMessage(FriendlyByteBuf out, AbstractNetworkMessage message) + public void encodeMessage(FriendlyByteBuf out, AbstractNetworkMessage message) { // This is intentionally unhandled, because errors related to this are unlikely to appear in wild Objects.requireNonNull(message); - out.writeShort(ModInfo.PROTOCOL_VERSION); + + if (this.forgeByteInProtocolVersion) + { + out.writeByte(ModInfo.PROTOCOL_VERSION); + } + else + { + out.writeShort(ModInfo.PROTOCOL_VERSION); + } try { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/CommonPacketPayload.java b/common/src/main/java/com/seibel/distanthorizons/common/CommonPacketPayload.java index 07fa39e61..ae092f1ce 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/CommonPacketPayload.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/CommonPacketPayload.java @@ -2,7 +2,9 @@ package com.seibel.distanthorizons.common; #if MC_VER >= MC_1_20_6 +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -12,6 +14,7 @@ import org.jetbrains.annotations.Nullable; public record CommonPacketPayload(@Nullable AbstractNetworkMessage message) implements CustomPacketPayload { public static final Type TYPE = new Type<>(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE); + private static final AbstractPluginPacketSender PACKET_SENDER = (AbstractPluginPacketSender) SingletonInjector.INSTANCE.get(IPluginPacketSender.class); @NotNull @Override @@ -23,11 +26,11 @@ public record CommonPacketPayload(@Nullable AbstractNetworkMessage message) impl @NotNull @Override public CommonPacketPayload decode(@NotNull FriendlyByteBuf in) - { return new CommonPacketPayload(AbstractPluginPacketSender.decodeMessage(in)); } + { return new CommonPacketPayload(PACKET_SENDER.decodeMessage(in)); } @Override public void encode(@NotNull FriendlyByteBuf out, CommonPacketPayload payload) - { AbstractPluginPacketSender.encodeMessage(out, payload.message()); } + { PACKET_SENDER.encodeMessage(out, payload.message()); } } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java index fabc83d20..441c1b737 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -33,6 +33,7 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.util.math.Mat4f; @@ -82,6 +83,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy { private final ClientApi clientApi = ClientApi.INSTANCE; private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); + private static final AbstractPluginPacketSender PACKET_SENDER = (AbstractPluginPacketSender) SingletonInjector.INSTANCE.get(IPluginPacketSender.class); private static final Logger LOGGER = DhLoggerBuilder.getLogger(); // TODO we shouldn't be filtering keys on the Forge/Fabric side, only in ClientApi @@ -316,9 +318,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy #else ClientPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE, (client, handler, buffer, packetSender) -> { - // Forge packet ID - buffer.readByte(); - AbstractNetworkMessage message = AbstractPluginPacketSender.decodeMessage(buffer); + AbstractNetworkMessage message = PACKET_SENDER.decodeMessage(buffer); if (message != null) { ClientApi.INSTANCE.pluginMessageReceived(message); diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricPluginPacketSender.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricPluginPacketSender.java index 5a2970d71..3786d5de6 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricPluginPacketSender.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricPluginPacketSender.java @@ -22,9 +22,7 @@ public class FabricPluginPacketSender extends AbstractPluginPacketSender ClientPlayNetworking.send(new CommonPacketPayload(message)); #else // < 1.20.6 FriendlyByteBuf buffer = PacketByteBufs.create(); - // Forge packet ID - buffer.writeByte(0); - AbstractPluginPacketSender.encodeMessage(buffer, message); + this.encodeMessage(buffer, message); ClientPlayNetworking.send(WRAPPER_PACKET_RESOURCE, buffer); #endif } @@ -36,9 +34,7 @@ public class FabricPluginPacketSender extends AbstractPluginPacketSender ServerPlayNetworking.send(serverPlayer, new CommonPacketPayload(message)); #else // < 1.20.6 FriendlyByteBuf buffer = PacketByteBufs.create(); - // Forge packet ID - buffer.writeByte(0); - AbstractPluginPacketSender.encodeMessage(buffer, message); + this.encodeMessage(buffer, message); ServerPlayNetworking.send(serverPlayer, WRAPPER_PACKET_RESOURCE, buffer); #endif } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java index ee0cfb6b1..f932e51ff 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java @@ -9,7 +9,10 @@ import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.distanthorizons.core.api.internal.ServerApi; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.common.AbstractPluginPacketSender; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.fabric.testing.TestWorldGenBindingEvent; @@ -32,7 +35,6 @@ import com.seibel.distanthorizons.common.CommonPacketPayload; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; #else import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage; -import com.seibel.distanthorizons.common.AbstractPluginPacketSender; #endif import java.util.function.Supplier; @@ -48,6 +50,8 @@ import java.util.function.Supplier; public class FabricServerProxy implements AbstractModInitializer.IEventProxy { private static final ServerApi SERVER_API = ServerApi.INSTANCE; + @SuppressWarnings("unused") + private static final AbstractPluginPacketSender PACKET_SENDER = (AbstractPluginPacketSender) SingletonInjector.INSTANCE.get(IPluginPacketSender.class); private static final Logger LOGGER = DhLoggerBuilder.getLogger(); private final boolean isDedicatedServer; @@ -192,9 +196,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy #else ServerPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE, (server, serverPlayer, handler, buffer, packetSender) -> { - // Forge packet ID - buffer.readByte(); - AbstractNetworkMessage message = AbstractPluginPacketSender.decodeMessage(buffer); + AbstractNetworkMessage message = PACKET_SENDER.decodeMessage(buffer); if (message != null) { ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(serverPlayer), message); diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java index 38a93cb1f..8e9629edb 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java @@ -33,6 +33,7 @@ import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -79,6 +80,7 @@ import java.util.concurrent.ThreadPoolExecutor; public class ForgeClientProxy implements AbstractModInitializer.IEventProxy { private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); + private static final ForgePluginPacketSender PACKET_SENDER = (ForgePluginPacketSender) SingletonInjector.INSTANCE.get(IPluginPacketSender.class); private static final Logger LOGGER = DhLoggerBuilder.getLogger(); @@ -96,7 +98,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy MinecraftForge.EVENT_BUS.register(this); // handles singleplayer, LAN, and connecting to a server - ForgePluginPacketSender.setPacketHandler((IServerPlayerWrapper player, @NotNull AbstractNetworkMessage message) -> + PACKET_SENDER.setPacketHandler((IServerPlayerWrapper player, @NotNull AbstractNetworkMessage message) -> { ClientApi.INSTANCE.pluginMessageReceived(message); ServerApi.INSTANCE.pluginMessageReceived(player, message); diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgePluginPacketSender.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgePluginPacketSender.java index 6a26d48a5..c0bda6840 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgePluginPacketSender.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgePluginPacketSender.java @@ -45,16 +45,18 @@ public class ForgePluginPacketSender extends AbstractPluginPacketSender ); #endif - public static void setPacketHandler(Consumer consumer) + public ForgePluginPacketSender() { super(true); } + + public void setPacketHandler(Consumer consumer) { - setPacketHandler((player, message) -> consumer.accept(message)); + this.setPacketHandler((player, message) -> consumer.accept(message)); } - public static void setPacketHandler(BiConsumer consumer) + public void setPacketHandler(BiConsumer consumer) { #if MC_VER >= MC_1_20_2 PLUGIN_CHANNEL.messageBuilder(MessageWrapper.class, 0) - .encoder((wrapper, out) -> AbstractPluginPacketSender.encodeMessage(out, wrapper.message)) - .decoder(in -> new MessageWrapper(AbstractPluginPacketSender.decodeMessage(in))) + .encoder((wrapper, out) -> this.encodeMessage(out, wrapper.message)) + .decoder(in -> new MessageWrapper(this.decodeMessage(in))) .consumerNetworkThread((wrapper, context) -> { if (wrapper.message != null) @@ -73,8 +75,8 @@ public class ForgePluginPacketSender extends AbstractPluginPacketSender .add(); #else // < 1.20.2 PLUGIN_CHANNEL.registerMessage(0, MessageWrapper.class, - (wrapper, out) -> AbstractPluginPacketSender.encodeMessage(out, wrapper.message), - in -> new MessageWrapper(AbstractPluginPacketSender.decodeMessage(in)), + (wrapper, out) -> this.encodeMessage(out, wrapper.message), + in -> new MessageWrapper(this.decodeMessage(in)), (wrapper, context) -> { if (wrapper.message != null) diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java index dd1f0f144..286820f84 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java @@ -7,7 +7,9 @@ import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.distanthorizons.core.api.internal.ServerApi; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; @@ -51,6 +53,8 @@ import java.util.function.Supplier; public class ForgeServerProxy implements AbstractModInitializer.IEventProxy { + private static final ForgePluginPacketSender PACKET_SENDER = (ForgePluginPacketSender) SingletonInjector.INSTANCE.get(IPluginPacketSender.class); + #if MC_VER < MC_1_19_2 private static LevelAccessor GetEventLevel(WorldEvent e) { return e.getWorld(); } #else @@ -68,7 +72,7 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy MinecraftForge.EVENT_BUS.register(this); if (this.isDedicated) { - ForgePluginPacketSender.setPacketHandler(ServerApi.INSTANCE::pluginMessageReceived); + PACKET_SENDER.setPacketHandler(ServerApi.INSTANCE::pluginMessageReceived); } }