Merge branch 'feature/plugin-channel'

This commit is contained in:
s809
2024-04-02 22:35:28 +05:00
20 changed files with 470 additions and 233 deletions
@@ -2,10 +2,7 @@ package com.seibel.distanthorizons.common;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.arguments.BoolArgumentType;
import com.mojang.brigadier.arguments.DoubleArgumentType;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.arguments.*;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent;
@@ -263,6 +260,7 @@ public abstract class AbstractModInitializer
this.put(Integer.class, new Pair<>(() -> integer((int) configEntry.getMin(), (int) configEntry.getMax()), IntegerArgumentType::getInteger));
this.put(Double.class, new Pair<>(() -> doubleArg((double) configEntry.getMin(), (double) configEntry.getMax()), DoubleArgumentType::getDouble));
this.put(Boolean.class, new Pair<>(BoolArgumentType::bool, BoolArgumentType::getBool));
this.put(String.class, new Pair<>(StringArgumentType::string, StringArgumentType::getString));
}}.entrySet())
{
if (!pair.getKey().isAssignableFrom(configEntry.getType()))
@@ -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 enabled = 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.enabled = 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.enabled;
}
@Override
public void disable()
{
this.clearServerKeyedLevel();
this.enabled = false;
}
}
@@ -22,6 +22,7 @@ package com.seibel.distanthorizons.common.wrappers.minecraft;
import java.io.File;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import com.mojang.blaze3d.platform.NativeImage;
@@ -31,6 +32,7 @@ import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.enums.EDhDirection;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
@@ -43,6 +45,7 @@ import com.seibel.distanthorizons.core.pos.DhChunkPos;
import net.minecraft.CrashReport;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.core.BlockPos;
@@ -101,7 +104,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public void clearFrameObjectCache()
{
lightMap = null;
this.lightMap = null;
}
@@ -150,20 +153,20 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
}
@Override
public boolean hasSinglePlayerServer() { return mc.hasSingleplayerServer(); }
public boolean hasSinglePlayerServer() { return this.mc.hasSingleplayerServer(); }
@Override
public boolean clientConnectedToDedicatedServer() { return mc.getCurrentServer() != null && !this.hasSinglePlayerServer(); }
public boolean clientConnectedToDedicatedServer() { return this.mc.getCurrentServer() != null && !this.hasSinglePlayerServer(); }
@Override
public String getCurrentServerName() { return mc.getCurrentServer().name; }
public String getCurrentServerName() { return this.mc.getCurrentServer().name; }
@Override
public String getCurrentServerIp() { return mc.getCurrentServer().ip; }
public String getCurrentServerIp() { return this.mc.getCurrentServer().ip; }
@Override
public String getCurrentServerVersion()
{
return mc.getCurrentServer().version.getString();
return this.mc.getCurrentServer().version.getString();
}
//=============//
@@ -172,25 +175,25 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
public LocalPlayer getPlayer()
{
return mc.player;
return this.mc.player;
}
@Override
public boolean playerExists()
{
return mc.player != null;
return this.mc.player != null;
}
@Override
public UUID getPlayerUUID()
{
return getPlayer().getUUID();
return this.getPlayer().getUUID();
}
@Override
public DhBlockPos getPlayerBlockPos()
{
BlockPos playerPos = getPlayer().blockPosition();
BlockPos playerPos = this.getPlayer().blockPosition();
return new DhBlockPos(playerPos.getX(), playerPos.getY(), playerPos.getZ());
}
@@ -200,26 +203,34 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
#if MC_VER < MC_1_17_1
ChunkPos playerPos = new ChunkPos(getPlayer().blockPosition());
#else
ChunkPos playerPos = getPlayer().chunkPosition();
ChunkPos playerPos = this.getPlayer().chunkPosition();
#endif
return new DhChunkPos(playerPos.x, playerPos.z);
}
public ModelManager getModelManager()
{
return mc.getModelManager();
return this.mc.getModelManager();
}
@Nullable
@Override
public IClientLevelWrapper getWrappedClientLevel()
{
if (this.mc.level == null)
return this.getWrappedClientLevel(false);
}
@Override
@Nullable
public IClientLevelWrapper getWrappedClientLevel(boolean bypassMultiverse)
{
ClientLevel level = this.mc.level;
if (level == null)
{
return null;
}
return ClientLevelWrapper.getWrapperIgnoringOverride(this.mc.level);
return ClientLevelWrapper.getWrapper(level, bypassMultiverse);
}
/** Please move over to getInstallationDirectory() */
@@ -227,17 +238,21 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public File getGameDirectory()
{
return getInstallationDirectory();
return this.getInstallationDirectory();
}
@Override
public IProfilerWrapper getProfiler()
{
if (profilerWrapper == null)
profilerWrapper = new ProfilerWrapper(mc.getProfiler());
else if (mc.getProfiler() != profilerWrapper.profiler)
profilerWrapper.profiler = mc.getProfiler();
return profilerWrapper;
if (this.profilerWrapper == null)
{
this.profilerWrapper = new ProfilerWrapper(this.mc.getProfiler());
}
else if (this.mc.getProfiler() != this.profilerWrapper.profiler)
{
this.profilerWrapper.profiler = this.mc.getProfiler();
}
return this.profilerWrapper;
}
/** Returns all worlds available to the server */
@@ -246,7 +261,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
{
ArrayList<ILevelWrapper> worlds = new ArrayList<ILevelWrapper>();
Iterable<ServerLevel> serverWorlds = mc.getSingleplayerServer().getAllLevels();
Iterable<ServerLevel> serverWorlds = this.mc.getSingleplayerServer().getAllLevels();
for (ServerLevel world : serverWorlds)
{
worlds.add(ServerLevelWrapper.getWrapper(world));
@@ -260,8 +275,11 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public void sendChatMessage(String string)
{
LocalPlayer p = getPlayer();
if (p == null) return;
LocalPlayer p = this.getPlayer();
if (p == null)
{
return;
}
#if MC_VER < MC_1_19_2
p.sendMessage(new TextComponent(string), getPlayer().getUUID());
#else
@@ -292,7 +310,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public Object getOptionsObject()
{
return mc.options;
return this.mc.options;
}
@Override
@@ -304,7 +322,13 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public File getInstallationDirectory()
{
return mc.gameDirectory;
return this.mc.gameDirectory;
}
@Override
public List<IServerPlayerWrapper> getPlayerList()
{
return null;
}
@Override
@@ -1,9 +1,13 @@
package com.seibel.distanthorizons.common.wrappers.minecraft;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import net.minecraft.server.dedicated.DedicatedServer;
import java.io.File;
import java.util.List;
import java.util.stream.Collectors;
//@Environment(EnvType.SERVER)
public class MinecraftDedicatedServerWrapper implements IMinecraftSharedWrapper
@@ -19,9 +23,19 @@ public class MinecraftDedicatedServerWrapper implements IMinecraftSharedWrapper
@Override
public File getInstallationDirectory()
{
if (dedicatedServer == null)
if (this.dedicatedServer == null)
{
throw new IllegalStateException("Trying to get Installation Direction before Dedicated server complete initialization!");
return dedicatedServer.getServerDirectory();
}
return this.dedicatedServer.getServerDirectory();
}
@Override
public List<IServerPlayerWrapper> getPlayerList()
{
return this.dedicatedServer.getPlayerList().getPlayers().stream()
.map(serverPlayer -> (IServerPlayerWrapper) ServerPlayerWrapper.getWrapper(serverPlayer))
.collect(Collectors.toList());
}
}
@@ -8,6 +8,7 @@ import com.seibel.distanthorizons.coreapi.util.math.Vec3d;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.phys.Vec3;
import java.net.SocketAddress;
import java.util.UUID;
import java.util.concurrent.ConcurrentMap;
@@ -27,12 +28,14 @@ public class ServerPlayerWrapper implements IServerPlayerWrapper
{
this.serverPlayer = serverPlayer;
}
@Override
public UUID getUUID()
{
return serverPlayer.getUUID();
return this.serverPlayer.getUUID();
}
@Override
public IServerLevelWrapper getLevel()
{
#if MC_VER < MC_1_20_1
@@ -41,22 +44,38 @@ public class ServerPlayerWrapper implements IServerPlayerWrapper
return ServerLevelWrapper.getWrapper(this.serverPlayer.serverLevel());
#endif
}
public Vec3d getPosition() {
Vec3 position = serverPlayer.position();
@Override
public Vec3d getPosition()
{
Vec3 position = this.serverPlayer.position();
return new Vec3d(position.x, position.y, position.z);
}
public int getViewDistance() {
return serverPlayer.server.getPlayerList().getViewDistance();
@Override
public int getViewDistance()
{
return this.serverPlayer.server.getPlayerList().getViewDistance();
}
public Object getWrappedMcObject() {
return serverPlayer;
@Override
public SocketAddress getRemoteAddress()
{
#if MC_VER >= MC_1_19_4
return this.serverPlayer.connection.getRemoteAddress();
#else // < 1.19.4
return this.serverPlayer.connection.connection.getRemoteAddress();
#endif
}
@Override
public Object getWrappedMcObject()
{
return this.serverPlayer;
}
@Override
public String toString() {
return "Wrapped{" + serverPlayer.toString() + "}";
return "Wrapped{" + this.serverPlayer.toString() + "}";
}
}
@@ -0,0 +1,54 @@
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 io.netty.buffer.ByteBufAllocator;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import java.util.function.Consumer;
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 sendPluginPacketClient(Consumer<ByteBuf> encoder)
{
FriendlyByteBuf buffer = this.createBuffer(encoder);
this.sendPluginPacketClient(buffer);
}
@Override
public final void sendPluginPacketServer(IServerPlayerWrapper serverPlayer, Consumer<ByteBuf> encoder)
{
FriendlyByteBuf buffer = this.createBuffer(encoder);
this.sendPluginPacketServer((ServerPlayer) serverPlayer.getWrappedMcObject(), buffer);
}
private FriendlyByteBuf createBuffer(Consumer<ByteBuf> encoder)
{
FriendlyByteBuf buffer = new FriendlyByteBuf(ByteBufAllocator.DEFAULT.buffer());
if (this.shouldAddForgePacketId())
{
buffer.writeByte(0);
}
encoder.accept(buffer);
return buffer;
}
protected boolean shouldAddForgePacketId()
{
return false;
}
protected abstract void sendPluginPacketClient(FriendlyByteBuf buffer);
protected abstract void sendPluginPacketServer(ServerPlayer serverPlayer, FriendlyByteBuf buffer);
}
@@ -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;
@@ -55,23 +53,31 @@ public class ClientLevelWrapper implements IClientLevelWrapper
// wrapper logic //
//===============//
@Nullable
public static IClientLevelWrapper getWrapper(@Nullable ClientLevel level)
public static IClientLevelWrapper getWrapper(@NotNull ClientLevel level)
{
if (level == null)
{
return null;
}
// used if the client is connected to a server that defines the currently loaded level
if (KEYED_CLIENT_LEVEL_MANAGER.getUseOverrideWrapper())
{
return KEYED_CLIENT_LEVEL_MANAGER.getOverrideWrapper();
}
return getWrapperIgnoringOverride(level);
return getWrapper(level, false);
}
@Nullable
public static IClientLevelWrapper getWrapper(@Nullable ClientLevel level, boolean bypassMultiverse)
{
if (!bypassMultiverse)
{
if (level == null)
{
return null;
}
// used if the client is connected to a server that defines the currently loaded level
IServerKeyedClientLevel overrideLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel();
if (overrideLevel != null)
{
return overrideLevel;
}
}
return LEVEL_WRAPPER_BY_CLIENT_LEVEL.computeIfAbsent(level, ClientLevelWrapper::new);
}
public static IClientLevelWrapper getWrapperIgnoringOverride(@NotNull ClientLevel level) { return LEVEL_WRAPPER_BY_CLIENT_LEVEL.computeIfAbsent(level, ClientLevelWrapper::new); }
@Nullable
@Override
@@ -99,13 +105,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 //
//====================//
@@ -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() + "}";
}
}
@@ -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,12 +33,9 @@ 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;
@@ -56,11 +54,13 @@ import net.minecraft.client.gui.screens.TitleScreen;
import java.nio.FloatBuffer;
#endif
import java.util.HashSet;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import net.minecraft.client.multiplayer.ClientHandshakePacketListenerImpl;
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 +93,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
* Registers Fabric Events
* @author Ran
*/
@Override
public void registerEvents()
{
LOGGER.info("Registering Fabric Client Events");
@@ -236,16 +237,15 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
// networking event //
//==================//
ClientPlayNetworking.registerGlobalReceiver(new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE),
(Minecraft client, ClientPacketListener handler, FriendlyByteBuf friendlyByteBuf, PacketSender responseSender) ->
ClientPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.PLUGIN_CHANNEL_RESOURCE,
(Minecraft client, ClientPacketListener handler, FriendlyByteBuf mcBuffer, PacketSender responseSender) ->
{
// converting to a ByteBuf is necessary otherwise Fabric will complain when the game boots
ByteBuf nettyByteBuf = friendlyByteBuf.asReadOnly();
ByteBuf buffer = mcBuffer.asReadOnly();
// remove the Bukkit/Forge packet ID byte
nettyByteBuf.readByte();
// (Neo)Forge packet ID (Unused, always expected to be 0)
buffer.readByte();
ClientApi.INSTANCE.serverMessageReceived(nettyByteBuf);
ClientApi.INSTANCE.pluginMessageReceived(buffer);
});
}
@@ -275,14 +275,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;
}
}
@@ -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.");
}
}
}
@@ -0,0 +1,29 @@
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 boolean shouldAddForgePacketId()
{
return true;
}
@Override
protected void sendPluginPacketClient(FriendlyByteBuf buffer)
{
ClientPlayNetworking.send(PLUGIN_CHANNEL_RESOURCE, buffer);
}
@Override
protected void sendPluginPacketServer(ServerPlayer serverPlayer, FriendlyByteBuf buffer)
{
ServerPlayNetworking.send(serverPlayer, PLUGIN_CHANNEL_RESOURCE, buffer);
}
}
@@ -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,42 @@ 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) ->
{
ByteBuf nettyByteBuf = friendlyByteBuf.asReadOnly();
// (Neo)Forge packet ID (Unused, always expected to be 0)
nettyByteBuf.readByte();
ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(serverPlayer), nettyByteBuf);
});
}
}
}
@@ -24,12 +24,22 @@ public class MixinClientPacketListener
private ClientLevel level;
@Inject(method = "handleLogin", at = @At("RETURN"))
void onHandleLoginEnd(CallbackInfo ci) { ClientApi.INSTANCE.onClientOnlyConnected(); }
void onHandleLoginEnd(CallbackInfo ci)
{
ClientApi.INSTANCE.onClientOnlyConnected();
ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level));
}
@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)); }
void onHandleRespawnEnd(CallbackInfo ci)
{
ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level));
}
#if MC_VER < MC_1_19_4
@Inject(method = "cleanup", at = @At("HEAD"))
@@ -32,11 +32,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.client.multiplayer.ClientLevel;
#if MC_VER < MC_1_19_2
@@ -54,20 +50,6 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraftforge.common.MinecraftForge;
#if MC_VER >= MC_1_20_2
import net.minecraftforge.network.Channel;
import net.minecraftforge.network.ChannelBuilder;
import net.minecraftforge.network.SimpleChannel;
#elif MC_VER >= MC_1_18_2
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;
#elif MC_VER >= MC_1_17_1
import net.minecraftforge.fmllegacy.network.NetworkRegistry;
import net.minecraftforge.fmllegacy.network.simple.SimpleChannel;
#else // < 1.17.1
import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.fml.network.simple.SimpleChannel;
#endif
import org.apache.logging.log4j.Logger;
import org.lwjgl.glfw.GLFW;
@@ -79,8 +61,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.
@@ -92,8 +72,6 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
{
private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private static SimpleChannel multiversePluginChannel;
#if MC_VER < MC_1_19_2
@@ -108,7 +86,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
public void registerEvents()
{
MinecraftForge.EVENT_BUS.register(this);
this.setupNetworkingListeners();
ForgePluginPacketSender.setPacketHandler(ClientApi.INSTANCE::pluginMessageReceived);
}
@@ -268,77 +246,6 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
}
//============//
// networking //
//============//
public void setupNetworkingListeners()
{
#if MC_VER >= MC_1_20_2
Channel.VersionTest versionTest = (status, version)
-> status != Channel.VersionTest.Status.PRESENT || version == ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION;
multiversePluginChannel = ChannelBuilder.named(new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE))
.networkProtocolVersion(ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION)
.serverAcceptedVersions(versionTest)
.clientAcceptedVersions(versionTest)
.simpleChannel();
multiversePluginChannel.messageBuilder(ByteBuf.class, 0)
.decoder(FriendlyByteBuf::asReadOnly)
.consumerNetworkThread((nettyByteBuf, contextRef) ->
{
ClientApi.INSTANCE.serverMessageReceived(nettyByteBuf);
contextRef.setPacketHandled(true);
})
.add();
#else // < 1.20.2
Predicate<String> versionTest = versionString ->
{
if (versionString.equals(NetworkRegistry.ABSENT #if MC_VER >= MC_1_19_4 .version() #endif) || versionString.equals(NetworkRegistry.ACCEPTVANILLA))
{
// allow using networking on vanilla servers or if DH isn't installed on the server
return true;
}
try
{
int version = Integer.parseInt(versionString);
return ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION == version;
}
catch (NumberFormatException ignored)
{
return false;
}
};
multiversePluginChannel = NetworkRegistry.newSimpleChannel(
new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE),
// network protocol version
() -> ModInfo.MULTIVERSE_PLUGIN_PROTOCOL_VERSION +"",
// client accepted versions
versionTest,
// server accepted versions
versionTest
);
multiversePluginChannel.registerMessage(0/*should be incremented for each simple channel we listen to*/, ByteBuf.class,
// encoder
(pack, friendlyByteBuf) -> { },
// decoder
FriendlyByteBuf::asReadOnly,
// message consumer
(nettyByteBuf, contextRef) ->
{
ClientApi.INSTANCE.serverMessageReceived(nettyByteBuf);
contextRef.get().setPacketHandled(true);
}
);
#endif
}
//===========//
// rendering //
//===========//
@@ -23,6 +23,7 @@ import com.mojang.brigadier.CommandDispatcher;
import com.seibel.distanthorizons.common.AbstractModInitializer;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor;
@@ -81,7 +82,11 @@ public class ForgeMain extends AbstractModInitializer
}
@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 ForgePluginPacketSender());
}
@Override
protected IEventProxy createClientProxy() { return new ForgeClientProxy(); }
@@ -0,0 +1,112 @@
package com.seibel.distanthorizons.forge;
import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper;
import com.seibel.distanthorizons.common.wrappers.network.AbstractPluginPacketSender;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
#if MC_VER >= MC_1_20_2
import net.minecraftforge.network.PacketDistributor;
import net.minecraftforge.network.ChannelBuilder;
import net.minecraftforge.network.SimpleChannel;
#elif MC_VER >= MC_1_18_2
import net.minecraftforge.network.PacketDistributor;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;
#elif MC_VER >= MC_1_17_1
import net.minecraftforge.fmllegacy.network.NetworkRegistry;
import net.minecraftforge.fmllegacy.network.PacketDistributor;
import net.minecraftforge.fmllegacy.network.simple.SimpleChannel;
#else // < 1.17.1
import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.fml.network.simple.SimpleChannel;
import net.minecraftforge.fml.network.PacketDistributor;
#endif
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class ForgePluginPacketSender extends AbstractPluginPacketSender
{
public static final SimpleChannel PLUGIN_CHANNEL =
#if MC_VER >= MC_1_20_2
ChannelBuilder.named(AbstractPluginPacketSender.PLUGIN_CHANNEL_RESOURCE)
.networkProtocolVersion(1)
.serverAcceptedVersions((status, version) -> true)
.clientAcceptedVersions((status, version) -> true)
.simpleChannel();
#else // < 1.20.2
NetworkRegistry.newSimpleChannel(
AbstractPluginPacketSender.PLUGIN_CHANNEL_RESOURCE,
() -> "1",
ignored -> true,
ignored -> true
);
#endif
public static void setPacketHandler(Consumer<ByteBuf> consumer)
{
setPacketHandler((player, buffer) -> consumer.accept(buffer));
}
public static void setPacketHandler(BiConsumer<IServerPlayerWrapper, ByteBuf> consumer)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.messageBuilder(FriendlyByteBuf.class, 0)
.encoder((buffer, mcBuffer) -> mcBuffer.writeBytes(buffer))
.decoder(FriendlyByteBuf::new)
.consumerNetworkThread((buffer, context) ->
{
if (context.getSender() != null)
{
consumer.accept(ServerPlayerWrapper.getWrapper(context.getSender()), buffer);
}
else
{
consumer.accept(null, buffer);
}
context.setPacketHandled(true);
})
.add();
#else // < 1.20.2
PLUGIN_CHANNEL.registerMessage(0, FriendlyByteBuf.class,
(buffer, mcBuffer) -> mcBuffer.writeBytes(buffer),
FriendlyByteBuf::new,
(buffer, context) ->
{
if (context.get().getSender() != null)
{
consumer.accept(ServerPlayerWrapper.getWrapper(context.get().getSender()), buffer);
}
else
{
consumer.accept(null, buffer);
}
context.get().setPacketHandled(true);
}
);
#endif
}
@Override
protected void sendPluginPacketClient(FriendlyByteBuf buffer)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.send(buffer, PacketDistributor.SERVER.noArg());
#else // < 1.20.2
PLUGIN_CHANNEL.send(PacketDistributor.SERVER.noArg(), buffer);
#endif
}
@Override
protected void sendPluginPacketServer(ServerPlayer serverPlayer, FriendlyByteBuf buffer)
{
#if MC_VER >= MC_1_20_2
PLUGIN_CHANNEL.send(buffer, PacketDistributor.PLAYER.with(serverPlayer));
#else // < 1.20.2
PLUGIN_CHANNEL.send(PacketDistributor.PLAYER.with(() -> serverPlayer), buffer);
#endif
}
}
@@ -6,6 +6,7 @@ import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
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.ClientApi;
import com.seibel.distanthorizons.core.api.internal.ServerApi;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
@@ -59,7 +60,6 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
#endif
private final ServerApi serverApi = ServerApi.INSTANCE;
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private final boolean isDedicated;
public static Supplier<Boolean> isGenerationThreadChecker = null;
@@ -69,6 +69,10 @@ public class ForgeServerProxy implements AbstractModInitializer.IEventProxy
public void registerEvents()
{
MinecraftForge.EVENT_BUS.register(this);
if (this.isDedicated)
{
ForgePluginPacketSender.setPacketHandler(ServerApi.INSTANCE::pluginMessageReceived);
}
}
@@ -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)
{
+9 -2
View File
@@ -5,7 +5,7 @@
if [ -n "$1" ]; then
prefix="$1:"
fi
z
clear
trap "echo; exit" INT
@@ -16,12 +16,19 @@ for version in $(ls ./versionProperties/); do
result=""
if ./gradlew "$prefix"classes -PmcVer=$version; then
result+="\e[1;32m"
echo -ne "\e[1;32m"
else
result+="\e[1;31m"
echo -ne "\e[1;31m"
fi
result+=$version
result+="\e[0m"
echo "#"
echo "# $version"
echo "#"
echo -e "\e[0m"
completed_builds+=($result)
done
@@ -29,5 +36,5 @@ done
./gradlew classes
echo
echo "Build results:"
echo -e "\e[1mBuild results:\e[0m"
echo -e "${completed_builds[*]}"