Fix world setting

This commit is contained in:
s809
2024-03-10 21:11:04 +05:00
parent 4d573c4aea
commit 9255c22d0e
7 changed files with 87 additions and 52 deletions
@@ -13,7 +13,7 @@ public class KeyedClientLevelManager implements IKeyedClientLevelManager
/** This is set and managed by the ClientApi for servers with support for DH. */
@Nullable
private IServerKeyedClientLevel serverKeyedLevel = null;
private boolean managedByServer = false;
private boolean enabled = false;
@@ -42,7 +42,7 @@ public class KeyedClientLevelManager implements IKeyedClientLevelManager
{
IServerKeyedClientLevel keyedLevel = new ServerKeyedClientLevel((ClientLevel) clientLevel.getWrappedMcObject(), levelKey);
this.serverKeyedLevel = keyedLevel;
this.managedByServer = true;
this.enabled = true;
return keyedLevel;
}
@@ -55,14 +55,14 @@ public class KeyedClientLevelManager implements IKeyedClientLevelManager
@Override
public boolean isEnabled()
{
return this.managedByServer;
return this.enabled;
}
@Override
public void disable()
{
this.clearServerKeyedLevel();
this.managedByServer = false;
this.enabled = false;
}
}
@@ -43,6 +43,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 +102,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public void clearFrameObjectCache()
{
lightMap = null;
this.lightMap = null;
}
@@ -150,20 +151,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 +173,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 +201,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 +236,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 +259,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 +273,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 +308,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public Object getOptionsObject()
{
return mc.options;
return this.mc.options;
}
@Override
@@ -304,7 +320,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra
@Override
public File getInstallationDirectory()
{
return mc.gameDirectory;
return this.mc.gameDirectory;
}
@Override
@@ -29,8 +29,8 @@ public abstract class AbstractPluginPacketSender implements IPluginPacketSender
}
}
protected abstract void sendPluginPacketClient(FriendlyByteBuf mcBuffer);
protected abstract void sendPluginPacketServer(ServerPlayer serverPlayer, FriendlyByteBuf mcBuffer);
protected abstract void sendPluginPacketClient(FriendlyByteBuf mcBuffer);
}
@@ -53,24 +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
IServerKeyedClientLevel overrideLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel();
if (overrideLevel != null)
{
return overrideLevel;
}
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
@@ -42,7 +42,6 @@ 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;
@@ -55,7 +54,10 @@ 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;
@@ -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), true); }
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"))