From 4d573c4aeaa87f86502ca044462159946236d8cc Mon Sep 17 00:00:00 2001 From: s809 <11816467-s809@users.noreply.gitlab.com> Date: Tue, 5 Mar 2024 22:10:05 +0500 Subject: [PATCH] Initial buggy plugin channel support --- .../level/KeyedClientLevelManager.java | 48 ++++++++++------ .../network/AbstractPluginPacketSender.java | 36 ++++++++++++ .../wrappers/world/ClientLevelWrapper.java | 13 ++--- .../wrappers/world/ServerLevelWrapper.java | 39 +++++++------ coreSubProjects | 2 +- .../fabric/FabricClientProxy.java | 17 +++--- .../distanthorizons/fabric/FabricMain.java | 15 ++++- .../fabric/FabricPluginPacketSender.java | 23 ++++++++ .../fabric/FabricServerProxy.java | 55 +++++++++++++------ .../client/MixinClientPacketListener.java | 2 +- .../forge/ForgeClientProxy.java | 10 ++-- .../neoforge/NeoforgeClientProxy.java | 2 +- 12 files changed, 183 insertions(+), 79 deletions(-) create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/wrappers/network/AbstractPluginPacketSender.java create mode 100644 fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricPluginPacketSender.java diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/KeyedClientLevelManager.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/KeyedClientLevelManager.java index b0de02033..bbe90fc99 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/KeyedClientLevelManager.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/level/KeyedClientLevelManager.java @@ -1,21 +1,20 @@ package com.seibel.distanthorizons.common.wrappers.level; -import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel; import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; -import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import net.minecraft.client.multiplayer.ClientLevel; - -import java.util.Objects; +import org.jetbrains.annotations.Nullable; public class KeyedClientLevelManager implements IKeyedClientLevelManager { public static final KeyedClientLevelManager INSTANCE = new KeyedClientLevelManager(); /** This is set and managed by the ClientApi for servers with support for DH. */ - private IServerKeyedClientLevel overrideWrapper = null; - private boolean useOverrideWrapper = false; + @Nullable + private IServerKeyedClientLevel serverKeyedLevel = null; + private boolean managedByServer = false; + //=============// @@ -30,25 +29,40 @@ public class KeyedClientLevelManager implements IKeyedClientLevelManager // level override logic // //======================// - @Override - public void setServerKeyedLevel(IServerKeyedClientLevel clientLevel) { this.overrideWrapper = clientLevel; } - @Override - public IServerKeyedClientLevel getOverrideWrapper() { return this.overrideWrapper; } @Override - public IServerKeyedClientLevel getServerKeyedLevel(ILevelWrapper level, String serverLevelKey) + @Nullable + public IServerKeyedClientLevel getServerKeyedLevel() { - Objects.requireNonNull(level); - Objects.requireNonNull(serverLevelKey); - return new ServerKeyedClientLevel((ClientLevel) level.getWrappedMcObject(), serverLevelKey); + return this.serverKeyedLevel; } + @Override + public IServerKeyedClientLevel setServerKeyedLevel(IClientLevelWrapper clientLevel, String levelKey) + { + IServerKeyedClientLevel keyedLevel = new ServerKeyedClientLevel((ClientLevel) clientLevel.getWrappedMcObject(), levelKey); + this.serverKeyedLevel = keyedLevel; + this.managedByServer = true; + return keyedLevel; + } @Override - public void setUseOverrideWrapper(boolean useOverrideWrapper) { this.useOverrideWrapper = useOverrideWrapper; } + public void clearServerKeyedLevel() + { + this.serverKeyedLevel = null; + } + @Override - public boolean getUseOverrideWrapper() { return this.useOverrideWrapper; } - + public boolean isEnabled() + { + return this.managedByServer; + } + @Override + public void disable() + { + this.clearServerKeyedLevel(); + this.managedByServer = false; + } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/network/AbstractPluginPacketSender.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/network/AbstractPluginPacketSender.java new file mode 100644 index 000000000..72d199ee9 --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/network/AbstractPluginPacketSender.java @@ -0,0 +1,36 @@ +package com.seibel.distanthorizons.common.wrappers.network; + +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; +import com.seibel.distanthorizons.coreapi.ModInfo; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.Nullable; + +public abstract class AbstractPluginPacketSender implements IPluginPacketSender +{ + public static final ResourceLocation PLUGIN_CHANNEL_RESOURCE = new ResourceLocation(ModInfo.RESOURCE_NAMESPACE, ModInfo.PLUGIN_CHANNEL_PATH); + + + @Override + public final void sendPluginPacket(@Nullable IServerPlayerWrapper serverPlayer, ByteBuf buffer) + { + FriendlyByteBuf mcBuffer = new FriendlyByteBuf(buffer); + + if (serverPlayer != null) + { + this.sendPluginPacketServer((ServerPlayer) serverPlayer.getWrappedMcObject(), mcBuffer); + } + else + { + this.sendPluginPacketClient(mcBuffer); + } + } + + protected abstract void sendPluginPacketClient(FriendlyByteBuf mcBuffer); + + protected abstract void sendPluginPacketServer(ServerPlayer serverPlayer, FriendlyByteBuf mcBuffer); + +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java index 989d017bc..54d666c46 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java @@ -1,7 +1,6 @@ package com.seibel.distanthorizons.common.wrappers.world; import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiLevelType; -import com.seibel.distanthorizons.api.interfaces.world.IDhApiDimensionTypeWrapper; import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper; import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; @@ -10,6 +9,7 @@ import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager; +import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; @@ -20,9 +20,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapp import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkSource; import net.minecraft.world.level.chunk.ChunkStatus; @@ -64,9 +62,10 @@ public class ClientLevelWrapper implements IClientLevelWrapper } // used if the client is connected to a server that defines the currently loaded level - if (KEYED_CLIENT_LEVEL_MANAGER.getUseOverrideWrapper()) + IServerKeyedClientLevel overrideLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel(); + if (overrideLevel != null) { - return KEYED_CLIENT_LEVEL_MANAGER.getOverrideWrapper(); + return overrideLevel; } return getWrapperIgnoringOverride(level); @@ -99,13 +98,11 @@ public class ClientLevelWrapper implements IClientLevelWrapper } catch (Exception e) { - LOGGER.error("Failed to get server side wrapper for client level: " + level); + LOGGER.error("Failed to get server side wrapper for client level: " + this.level); return null; } } - - //====================// // base level methods // //====================// diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java index 0728a01f3..ea6c1f1d5 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java @@ -29,6 +29,7 @@ import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; import com.seibel.distanthorizons.common.wrappers.block.cache.ServerBlockDetailMap; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; +import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; @@ -92,13 +93,13 @@ public class ServerLevelWrapper implements IServerLevelWrapper @Override public File getSaveFolder() { - return level.getChunkSource().getDataStorage().dataFolder; + return this.level.getChunkSource().getDataStorage().dataFolder; } @Override public DimensionTypeWrapper getDimensionType() { - return DimensionTypeWrapper.getDimensionTypeWrapper(level.dimensionType()); + return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); } @Override @@ -106,25 +107,25 @@ public class ServerLevelWrapper implements IServerLevelWrapper public ServerLevel getLevel() { - return level; + return this.level; } @Override public boolean hasCeiling() { - return level.dimensionType().hasCeiling(); + return this.level.dimensionType().hasCeiling(); } @Override public boolean hasSkyLight() { - return level.dimensionType().hasSkyLight(); + return this.level.dimensionType().hasSkyLight(); } @Override public int getHeight() { - return level.getHeight(); + return this.level.getHeight(); } @Override @@ -133,42 +134,48 @@ public class ServerLevelWrapper implements IServerLevelWrapper #if MC_VER < MC_1_17_1 return 0; #else - return level.getMinBuildHeight(); + return this.level.getMinBuildHeight(); #endif } @Override public IChunkWrapper tryGetChunk(DhChunkPos pos) { - if (!level.hasChunk(pos.x, pos.z)) return null; - ChunkAccess chunk = level.getChunk(pos.x, pos.z, ChunkStatus.FULL, false); - if (chunk == null) return null; - return new ChunkWrapper(chunk, level, this); + if (!this.level.hasChunk(pos.x, pos.z)) + { + return null; + } + ChunkAccess chunk = this.level.getChunk(pos.x, pos.z, ChunkStatus.FULL, false); + if (chunk == null) + { + return null; + } + return new ChunkWrapper(chunk, this.level, this); } @Override public boolean hasChunkLoaded(int chunkX, int chunkZ) { // world.hasChunk(chunkX, chunkZ); THIS DOES NOT WORK FOR CLIENT LEVEL CAUSE MOJANG ALWAYS RETURN TRUE FOR THAT! - ChunkSource source = level.getChunkSource(); + ChunkSource source = this.level.getChunkSource(); return source.hasChunk(chunkX, chunkZ); } @Override public IBlockStateWrapper getBlockState(DhBlockPos pos) { - return BlockStateWrapper.fromBlockState(level.getBlockState(McObjectConverter.Convert(pos)), this); + return BlockStateWrapper.fromBlockState(this.level.getBlockState(McObjectConverter.Convert(pos)), this); } @Override public IBiomeWrapper getBiome(DhBlockPos pos) { - return BiomeWrapper.getBiomeWrapper(level.getBiome(McObjectConverter.Convert(pos)), this); + return BiomeWrapper.getBiomeWrapper(this.level.getBiome(McObjectConverter.Convert(pos)), this); } @Override public ServerLevel getWrappedMcObject() { - return level; + return this.level; } @Override @@ -177,7 +184,7 @@ public class ServerLevelWrapper implements IServerLevelWrapper @Override public String toString() { - return "Wrapped{" + level.toString() + "@" + getDimensionType().getDimensionName() + "}"; + return "Wrapped{" + this.level.toString() + "@" + this.getDimensionType().getDimensionName() + "}"; } } diff --git a/coreSubProjects b/coreSubProjects index 2d4f03389..278ae0453 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 2d4f0338917607ddc4460aa213632ed350765799 +Subproject commit 278ae04532075810e0d3076b9895d3f63976eb3e 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 1183f3d8c..980fbfa8e 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -22,6 +22,7 @@ package com.seibel.distanthorizons.fabric; import com.seibel.distanthorizons.common.AbstractModInitializer; import com.seibel.distanthorizons.common.rendering.SeamlessOverdraw; import com.seibel.distanthorizons.common.wrappers.McObjectConverter; +import com.seibel.distanthorizons.common.wrappers.network.AbstractPluginPacketSender; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.mojang.blaze3d.platform.InputConstants; @@ -32,18 +33,16 @@ import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import com.seibel.distanthorizons.core.pos.DhBlockPos; -import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; -import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.fabric.wrappers.modAccessor.SodiumAccessor; import io.netty.buffer.ByteBuf; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.fabricmc.fabric.api.event.player.AttackBlockCallback; @@ -60,7 +59,6 @@ import java.util.HashSet; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.phys.HitResult; @@ -93,6 +91,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy * Registers Fabric Events * @author Ran */ + @Override public void registerEvents() { LOGGER.info("Registering Fabric Client Events"); @@ -236,16 +235,16 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy // networking event // //==================// - ClientPlayNetworking.registerGlobalReceiver(new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE), + ClientPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.PLUGIN_CHANNEL_RESOURCE, (Minecraft client, ClientPacketListener handler, FriendlyByteBuf friendlyByteBuf, PacketSender responseSender) -> { // converting to a ByteBuf is necessary otherwise Fabric will complain when the game boots ByteBuf nettyByteBuf = friendlyByteBuf.asReadOnly(); // remove the Bukkit/Forge packet ID byte - nettyByteBuf.readByte(); + //nettyByteBuf.readByte(); - ClientApi.INSTANCE.serverMessageReceived(nettyByteBuf); + ClientApi.INSTANCE.pluginMessageReceived(nettyByteBuf); }); } @@ -275,14 +274,14 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy // Diff and trigger events for (int keyCode : currentKeyDown) { - if (!previouslyPressKeyCodes.contains(keyCode)) + if (!this.previouslyPressKeyCodes.contains(keyCode)) { ClientApi.INSTANCE.keyPressedEvent(keyCode); } } // Update the set - previouslyPressKeyCodes = currentKeyDown; + this.previouslyPressKeyCodes = currentKeyDown; } } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java index 35daa061e..6b27702a0 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java @@ -26,6 +26,7 @@ import com.seibel.distanthorizons.core.config.ConfigBase; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.*; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.fabric.wrappers.modAccessor.*; @@ -54,12 +55,16 @@ import java.util.function.Consumer; */ public class FabricMain extends AbstractModInitializer implements ClientModInitializer, DedicatedServerModInitializer { - private static final ResourceLocation INITIAL_PHASE = ResourceLocation.tryParse("distanthorizons:dedicated_server_initial"); + private static final ResourceLocation INITIAL_PHASE = new ResourceLocation(ModInfo.RESOURCE_NAMESPACE, ModInfo.DEDICATED_SERVER_INITIAL_PATH); @Override - protected void createInitialBindings() { SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE); } + protected void createInitialBindings() + { + SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE); + SingletonInjector.INSTANCE.bind(IPluginPacketSender.class, new FabricPluginPacketSender()); + } @Override protected IEventProxy createClientProxy() { return new FabricClientProxy(); } @@ -123,15 +128,21 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti SingletonInjector.INSTANCE.runDelayedSetup(); if (Config.Client.Advanced.Graphics.Fog.disableVanillaFog.get() && SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("bclib")) + { ModAccessorInjector.INSTANCE.get(IBCLibAccessor.class).setRenderCustomFog(false); // Remove BCLib's fog + } #if MC_VER >= MC_1_20_1 if (SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("sodium")) + { ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class).setFogOcclusion(false); // FIXME: This is a tmp fix for sodium 0.5.0, and 0.5.1. This is fixed in sodium 0.5.2 + } #endif if (ConfigBase.INSTANCE == null) + { throw new IllegalStateException("Config was not initialized. Make sure to call LodCommonMain.initConfig() before calling this method."); + } } } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricPluginPacketSender.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricPluginPacketSender.java new file mode 100644 index 000000000..cb979028c --- /dev/null +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricPluginPacketSender.java @@ -0,0 +1,23 @@ +package com.seibel.distanthorizons.fabric; + +import com.seibel.distanthorizons.common.wrappers.network.AbstractPluginPacketSender; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; + +public class FabricPluginPacketSender extends AbstractPluginPacketSender +{ + @Override + protected void sendPluginPacketClient(FriendlyByteBuf mcBuffer) + { + ClientPlayNetworking.send(PLUGIN_CHANNEL_RESOURCE, mcBuffer); + } + + @Override + protected void sendPluginPacketServer(ServerPlayer serverPlayer, FriendlyByteBuf mcBuffer) + { + ServerPlayNetworking.send(serverPlayer, PLUGIN_CHANNEL_RESOURCE, mcBuffer); + } + +} 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 c9e78f365..2cb2bf19a 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java @@ -3,19 +3,23 @@ package com.seibel.distanthorizons.fabric; import com.seibel.distanthorizons.common.AbstractModInitializer; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper; +import com.seibel.distanthorizons.common.wrappers.network.AbstractPluginPacketSender; 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.ClientApi; import com.seibel.distanthorizons.core.api.internal.ServerApi; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import io.netty.buffer.ByteBuf; import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.TitleScreen; import net.minecraft.client.multiplayer.ClientLevel; @@ -52,7 +56,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy private boolean isValidTime() { - if (isDedicated) + if (this.isDedicated) { return true; } @@ -66,6 +70,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy private ServerPlayerWrapper getServerPlayerWrapper(ServerPlayer player) { return ServerPlayerWrapper.getWrapper(player); } /** Registers Fabric Events */ + @Override public void registerEvents() { LOGGER.info("Registering Fabric Server Events"); @@ -80,15 +85,15 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy //TODO: Check if both of these use the correct timed events. (i.e. is it 'ed' or 'ing' one?) ServerLifecycleEvents.SERVER_STARTING.register((server) -> { - if (isValidTime()) + if (this.isValidTime()) { - ServerApi.INSTANCE.serverLoadEvent(isDedicated); + ServerApi.INSTANCE.serverLoadEvent(this.isDedicated); } }); // ServerWorldUnloadEvent ServerLifecycleEvents.SERVER_STOPPED.register((server) -> { - if (isValidTime()) + if (this.isValidTime()) { ServerApi.INSTANCE.serverUnloadEvent(); } @@ -97,25 +102,25 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy // ServerLevelLoadEvent ServerWorldEvents.LOAD.register((server, level) -> { - if (isValidTime()) + if (this.isValidTime()) { - ServerApi.INSTANCE.serverLevelLoadEvent(getServerLevelWrapper(level)); + ServerApi.INSTANCE.serverLevelLoadEvent(this.getServerLevelWrapper(level)); } }); // ServerLevelUnloadEvent ServerWorldEvents.UNLOAD.register((server, level) -> { - if (isValidTime()) + if (this.isValidTime()) { - ServerApi.INSTANCE.serverLevelUnloadEvent(getServerLevelWrapper(level)); + ServerApi.INSTANCE.serverLevelUnloadEvent(this.getServerLevelWrapper(level)); } }); // ServerChunkLoadEvent ServerChunkEvents.CHUNK_LOAD.register((server, chunk) -> { - ILevelWrapper level = getServerLevelWrapper((ServerLevel) chunk.getLevel()); - if (isValidTime()) + ILevelWrapper level = this.getServerLevelWrapper((ServerLevel) chunk.getLevel()); + if (this.isValidTime()) { ServerApi.INSTANCE.serverChunkLoadEvent( new ChunkWrapper(chunk, chunk.getLevel(), level), @@ -126,29 +131,43 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - if (isValidTime()) + if (this.isValidTime()) { - ServerApi.INSTANCE.serverPlayerJoinEvent(getServerPlayerWrapper(handler.player)); + ServerApi.INSTANCE.serverPlayerJoinEvent(this.getServerPlayerWrapper(handler.player)); } }); ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - if (isValidTime()) + if (this.isValidTime()) { - ServerApi.INSTANCE.serverPlayerDisconnectEvent(getServerPlayerWrapper(handler.player)); + ServerApi.INSTANCE.serverPlayerDisconnectEvent(this.getServerPlayerWrapper(handler.player)); } }); ServerEntityWorldChangeEvents.AFTER_PLAYER_CHANGE_WORLD.register((player, origin, dest) -> { - if (isValidTime()) + if (this.isValidTime()) { ServerApi.INSTANCE.serverPlayerLevelChangeEvent( - getServerPlayerWrapper(player), - getServerLevelWrapper(origin), - getServerLevelWrapper(dest) + this.getServerPlayerWrapper(player), + this.getServerLevelWrapper(origin), + this.getServerLevelWrapper(dest) ); } }); + + //if (this.isDedicated) + //{ + // ServerPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.PLUGIN_CHANNEL_RESOURCE, (server, serverPlayer, handler, friendlyByteBuf, responseSender) -> + // { + // // converting to a ByteBuf is necessary otherwise Fabric will complain when the game boots + // ByteBuf nettyByteBuf = friendlyByteBuf.asReadOnly(); + // + // // remove the Bukkit/Forge packet ID byte + // nettyByteBuf.readByte(); + // + // ClientApi.INSTANCE.pluginMessageReceived(nettyByteBuf); + // }); + //} } } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java index 2e7716b87..99b188663 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java @@ -27,7 +27,7 @@ public class MixinClientPacketListener void onHandleLoginEnd(CallbackInfo ci) { ClientApi.INSTANCE.onClientOnlyConnected(); } @Inject(method = "handleRespawn", at = @At("HEAD")) - void onHandleRespawnStart(CallbackInfo ci) { ClientApi.INSTANCE.clientLevelUnloadEvent(ClientLevelWrapper.getWrapper(this.level)); } + void onHandleRespawnStart(CallbackInfo ci) { ClientApi.INSTANCE.clientLevelUnloadEvent(ClientLevelWrapper.getWrapper(this.level), true); } @Inject(method = "handleRespawn", at = @At("RETURN")) void onHandleRespawnEnd(CallbackInfo ci) { ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level)); } 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 7632f04b2..d08e49416 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java @@ -79,8 +79,6 @@ import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import org.lwjgl.opengl.GL32; -import java.util.function.Predicate; - /** * This handles all events sent to the client, * and is the starting point for most of the mod. @@ -277,10 +275,10 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy { #if MC_VER >= MC_1_20_2 Channel.VersionTest versionTest = (status, version) - -> status != Channel.VersionTest.Status.PRESENT || version == ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION; + -> status != Channel.VersionTest.Status.PRESENT || version == ModInfo.PLUGIN_PROTOCOL_VERSION; - multiversePluginChannel = ChannelBuilder.named(new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE)) - .networkProtocolVersion(ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION) + multiversePluginChannel = ChannelBuilder.named(new ResourceLocation(ModInfo.RESOURCE_NAMESPACE, ModInfo.PLUGIN_CHANNEL_PATH)) + .networkProtocolVersion(ModInfo.PLUGIN_PROTOCOL_VERSION) .serverAcceptedVersions(versionTest) .clientAcceptedVersions(versionTest) .simpleChannel(); @@ -289,7 +287,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy .decoder(FriendlyByteBuf::asReadOnly) .consumerNetworkThread((nettyByteBuf, contextRef) -> { - ClientApi.INSTANCE.serverMessageReceived(nettyByteBuf); + ClientApi.INSTANCE.pluginMessageReceived(nettyByteBuf); contextRef.setPacketHandled(true); }) .add(); diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java index 69da1d5e1..52619ac83 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java @@ -266,7 +266,7 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy try { int version = Integer.parseInt(versionString); - return ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION == version; + return ModInfo.PLUGIN_PROTOCOL_VERSION == version; } catch (NumberFormatException ignored) {