From 88ca223bbc9543f12cf30df07c5a2a972ba606f9 Mon Sep 17 00:00:00 2001
From: s809 <11816467-s809@users.noreply.gitlab.com>
Date: Sat, 3 Aug 2024 15:43:19 +0500
Subject: [PATCH] Fix dimension switching (untested)
---
.../wrappers/misc/IMixinServerPlayer.java | 11 +++
.../wrappers/misc/ServerPlayerWrapper.java | 17 ++--
.../wrappers/world/ClientLevelWrapper.java | 4 +-
coreSubProjects | 2 +-
.../fabric/mixins/client/MixinMinecraft.java | 2 +-
.../mixins/server/MixinServerPlayer.java | 77 +++++++++++++++++++
.../DistantHorizons.fabric.mixins.json | 3 +-
forge/build.gradle | 1 +
.../forge/ForgeClientProxy.java | 6 +-
.../forge/mixins/client/MixinMinecraft.java | 4 +
.../mixins/server/MixinServerPlayer.java | 67 ++++++++++++++++
.../DistantHorizons.forge.mixins.json | 3 +-
.../neoforge/NeoforgeClientProxy.java | 2 +-
.../client/MixinClientPacketListener.java | 2 +-
.../mixins/server/MixinServerPlayer.java | 77 +++++++++++++++++++
.../DistantHorizons.neoforge.mixins.json | 3 +-
16 files changed, 264 insertions(+), 17 deletions(-)
create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/IMixinServerPlayer.java
create mode 100644 fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinServerPlayer.java
create mode 100644 forge/src/main/java/com/seibel/distanthorizons/forge/mixins/server/MixinServerPlayer.java
create mode 100644 neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinServerPlayer.java
diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/IMixinServerPlayer.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/IMixinServerPlayer.java
new file mode 100644
index 000000000..54e5a4dac
--- /dev/null
+++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/IMixinServerPlayer.java
@@ -0,0 +1,11 @@
+package com.seibel.distanthorizons.common.wrappers.misc;
+
+import net.minecraft.server.level.ServerLevel;
+import org.jetbrains.annotations.Nullable;
+
+public interface IMixinServerPlayer
+{
+ @Nullable
+ ServerLevel distantHorizons$getDimensionChangeDestination();
+
+}
diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java
index be725eed5..cfb709e19 100644
--- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java
+++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java
@@ -6,6 +6,7 @@ import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
import com.seibel.distanthorizons.core.util.math.Vec3d;
+import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import net.minecraft.world.phys.Vec3;
@@ -47,11 +48,17 @@ public class ServerPlayerWrapper implements IServerPlayerWrapper
@Override
public IServerLevelWrapper getLevel()
{
- #if MC_VER < MC_1_20_1
- return ServerLevelWrapper.getWrapper(this.serverPlayer().getLevel());
- #else
- return ServerLevelWrapper.getWrapper(this.serverPlayer().serverLevel());
- #endif
+ ServerLevel level = ((IMixinServerPlayer) this.serverPlayer()).distantHorizons$getDimensionChangeDestination();
+ if (level == null)
+ {
+ #if MC_VER < MC_1_20_1
+ level = this.serverPlayer().getLevel();
+ #else
+ level = this.serverPlayer().serverLevel();
+ #endif
+ }
+
+ return ServerLevelWrapper.getWrapper(level);
}
@Override
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 a6d2801b7..a82a29444 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
@@ -76,9 +76,9 @@ public class ClientLevelWrapper implements IClientLevelWrapper
}
@Nullable
- public static IClientLevelWrapper getWrapper(@Nullable ClientLevel level, boolean bypassMultiverse)
+ public static IClientLevelWrapper getWrapper(@Nullable ClientLevel level, boolean bypassLevelKeyManager)
{
- if (!bypassMultiverse)
+ if (!bypassLevelKeyManager)
{
if (level == null)
{
diff --git a/coreSubProjects b/coreSubProjects
index 93b57ae2e..9d1173344 160000
--- a/coreSubProjects
+++ b/coreSubProjects
@@ -1 +1 @@
-Subproject commit 93b57ae2e1d768bea880df0e2c1e6b149cc900ff
+Subproject commit 9d1173344422717af1525894c2e59dc3598da05c
diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java
index 14d991433..aeda80514 100644
--- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java
+++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java
@@ -132,7 +132,7 @@ public abstract class MixinMinecraft
}
if (level != null)
{
- ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(level));
+ ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(level, true));
}
this.lastLevel = level;
}
diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinServerPlayer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinServerPlayer.java
new file mode 100644
index 000000000..0b7abb744
--- /dev/null
+++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinServerPlayer.java
@@ -0,0 +1,77 @@
+/*
+ * This file is part of the Distant Horizons mod
+ * licensed under the GNU LGPL v3 License.
+ *
+ * Copyright (C) 2020-2023 James Seibel
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.seibel.distanthorizons.fabric.mixins.server;
+
+import com.seibel.distanthorizons.common.wrappers.misc.IMixinServerPlayer;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.entity.Entity;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+#if MC_VER >= MC_1_21
+import net.minecraft.world.level.portal.DimensionTransition;
+#endif
+
+
+@Mixin(ServerPlayer.class)
+public class MixinServerPlayer implements IMixinServerPlayer
+{
+ @Unique
+ @Nullable
+ private ServerLevel dimensionChangeDestination;
+
+ @Override
+ @Nullable
+ public ServerLevel distantHorizons$getDimensionChangeDestination()
+ {
+ return this.dimensionChangeDestination;
+ }
+
+ @Inject(at = @At("HEAD"), method = "changeDimension")
+ #if MC_VER >= MC_1_21
+ public void changeDimension(DimensionTransition dimensionTransition, CallbackInfoReturnable cir)
+ {
+ this.dimensionChangeDestination = dimensionTransition.newLevel();
+ }
+ #else
+ public void changeDimension(ServerLevel destination, CallbackInfoReturnable cir)
+ {
+ this.dimensionChangeDestination = destination;
+ }
+ #endif
+
+ #if MC_VER >= MC_1_20_1
+ @Inject(at = @At("RETURN"), method = "setServerLevel")
+ public void setServerLevel(ServerLevel level, CallbackInfo ci)
+ #else
+ @Inject(at = @At("RETURN"), method = "setLevel")
+ public void setLevel(ServerLevel level, CallbackInfo ci)
+ #endif
+ {
+ this.dimensionChangeDestination = null;
+ }
+
+}
\ No newline at end of file
diff --git a/fabric/src/main/resources/DistantHorizons.fabric.mixins.json b/fabric/src/main/resources/DistantHorizons.fabric.mixins.json
index 5d1ce2c2c..32d875c96 100644
--- a/fabric/src/main/resources/DistantHorizons.fabric.mixins.json
+++ b/fabric/src/main/resources/DistantHorizons.fabric.mixins.json
@@ -5,7 +5,8 @@
"mixins": [
"server.MixinChunkGenerator",
"server.MixinChunkMap",
- "server.MixinUtilBackgroundThread"
+ "server.MixinUtilBackgroundThread",
+ "server.MixinServerPlayer"
],
"client": [
"client.MixinClientLevel",
diff --git a/forge/build.gradle b/forge/build.gradle
index 6b952a1b0..f00f9feeb 100644
--- a/forge/build.gradle
+++ b/forge/build.gradle
@@ -40,6 +40,7 @@ loom {
ideConfigGenerated(false)
runDir("../run/client")
// vmArgs("-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg)
+ programArgs("--username", "NoNick")
}
server {
server()
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 9906f8f05..e1332bec0 100644
--- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java
+++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java
@@ -121,7 +121,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
#endif
{
LOGGER.info("level load");
-
+
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
@@ -133,7 +133,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
}
ClientLevel clientLevel = (ClientLevel) level;
- IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel);
+ IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel, true);
// TODO this causes a crash due to level being set to null somewhere
ClientApi.INSTANCE.clientLevelLoadEvent(clientLevelWrapper);
}
@@ -145,7 +145,7 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
#endif
{
LOGGER.info("level unload");
-
+
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java
index 4bcedc1ad..cdee88a8f 100644
--- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java
+++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java
@@ -2,6 +2,8 @@ package com.seibel.distanthorizons.forge.mixins.client;
import com.seibel.distanthorizons.api.enums.config.EDhApiUpdateBranch;
import com.seibel.distanthorizons.common.wrappers.gui.updater.UpdateModScreen;
+import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
+import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.jar.installer.GitlabGetter;
@@ -11,7 +13,9 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.IVersionConstants;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.TitleScreen;
+import net.minecraft.client.multiplayer.ClientLevel;
import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/server/MixinServerPlayer.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/server/MixinServerPlayer.java
new file mode 100644
index 000000000..984b88731
--- /dev/null
+++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/server/MixinServerPlayer.java
@@ -0,0 +1,67 @@
+/*
+ * This file is part of the Distant Horizons mod
+ * licensed under the GNU LGPL v3 License.
+ *
+ * Copyright (C) 2020-2023 James Seibel
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.seibel.distanthorizons.forge.mixins.server;
+
+import com.seibel.distanthorizons.common.wrappers.misc.IMixinServerPlayer;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.entity.Entity;
+import net.minecraftforge.common.util.ITeleporter;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+
+@Mixin(ServerPlayer.class)
+public class MixinServerPlayer implements IMixinServerPlayer
+{
+ @Unique
+ @Nullable
+ private volatile ServerLevel distantHorizons$dimensionChangeDestination;
+
+ @Override
+ @Nullable
+ public ServerLevel distantHorizons$getDimensionChangeDestination()
+ {
+ return this.distantHorizons$dimensionChangeDestination;
+ }
+
+ @Inject(at = @At("HEAD"), method = "changeDimension", remap = false)
+ public void changeDimension(ServerLevel destination, ITeleporter teleporter, CallbackInfoReturnable cir)
+ {
+ this.distantHorizons$dimensionChangeDestination = destination;
+ }
+
+ #if MC_VER >= MC_1_20_1
+ @Inject(at = @At("RETURN"), method = "setServerLevel")
+ public void setServerLevel(ServerLevel level, CallbackInfo ci)
+ #else
+ @Inject(at = @At("RETURN"), method = "setLevel")
+ public void setLevel(ServerLevel level, CallbackInfo ci)
+ #endif
+ {
+ this.distantHorizons$dimensionChangeDestination = null;
+ }
+
+}
\ No newline at end of file
diff --git a/forge/src/main/resources/DistantHorizons.forge.mixins.json b/forge/src/main/resources/DistantHorizons.forge.mixins.json
index d6c1ff160..1a2e25e85 100644
--- a/forge/src/main/resources/DistantHorizons.forge.mixins.json
+++ b/forge/src/main/resources/DistantHorizons.forge.mixins.json
@@ -5,7 +5,8 @@
"mixins": [
"server.MixinUtilBackgroundThread",
"server.MixinChunkGenerator",
- "server.MixinTFChunkGenerator"
+ "server.MixinTFChunkGenerator",
+ "server.MixinServerPlayer"
],
"client": [
"client.MixinClientPacketListener",
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 f1712d7fb..1e62d541f 100644
--- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java
+++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java
@@ -131,7 +131,7 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
}
ClientLevel clientLevel = (ClientLevel) level;
- IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel);
+ IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel, true);
// TODO this causes a crash due to level being set to null somewhere
ClientApi.INSTANCE.clientLevelLoadEvent(clientLevelWrapper);
}
diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinClientPacketListener.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinClientPacketListener.java
index e3467d476..808a8ed15 100644
--- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinClientPacketListener.java
+++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinClientPacketListener.java
@@ -21,7 +21,7 @@ public class MixinClientPacketListener
void onHandleLoginEnd(CallbackInfo ci)
{
ClientApi.INSTANCE.onClientOnlyConnected();
- ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level));
+ ClientApi.INSTANCE.clientLevelLoadEvent(ClientLevelWrapper.getWrapper(this.level, true));
}
#if MC_VER < MC_1_19_4
diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinServerPlayer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinServerPlayer.java
new file mode 100644
index 000000000..6f337c550
--- /dev/null
+++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinServerPlayer.java
@@ -0,0 +1,77 @@
+/*
+ * This file is part of the Distant Horizons mod
+ * licensed under the GNU LGPL v3 License.
+ *
+ * Copyright (C) 2020-2023 James Seibel
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.seibel.distanthorizons.neoforge.mixins.server;
+
+import com.seibel.distanthorizons.common.wrappers.misc.IMixinServerPlayer;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.entity.Entity;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+#if MC_VER >= MC_1_21
+import net.minecraft.world.level.portal.DimensionTransition;
+#endif
+
+
+@Mixin(ServerPlayer.class)
+public class MixinServerPlayer implements IMixinServerPlayer
+{
+ @Unique
+ @Nullable
+ private ServerLevel distantHorizons$dimensionChangeDestination;
+
+ @Override
+ @Nullable
+ public ServerLevel distantHorizons$getDimensionChangeDestination()
+ {
+ return this.distantHorizons$dimensionChangeDestination;
+ }
+
+ @Inject(at = @At("HEAD"), method = "changeDimension")
+ #if MC_VER >= MC_1_21
+ public void changeDimension(DimensionTransition dimensionTransition, CallbackInfoReturnable cir)
+ {
+ this.distantHorizons$dimensionChangeDestination = dimensionTransition.newLevel();
+ }
+ #else
+ public void changeDimension(ServerLevel destination, CallbackInfoReturnable cir)
+ {
+ this.distantHorizons$dimensionChangeDestination = destination;
+ }
+ #endif
+
+ #if MC_VER >= MC_1_20_1
+ @Inject(at = @At("RETURN"), method = "setServerLevel")
+ public void setServerLevel(ServerLevel level, CallbackInfo ci)
+ #else
+ @Inject(at = @At("RETURN"), method = "setLevel")
+ public void setLevel(ServerLevel level, CallbackInfo ci)
+ #endif
+ {
+ this.distantHorizons$dimensionChangeDestination = null;
+ }
+
+}
\ No newline at end of file
diff --git a/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json b/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json
index 5efe0dba6..a2eabcdaa 100644
--- a/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json
+++ b/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json
@@ -5,7 +5,8 @@
"mixins": [
"server.MixinUtilBackgroundThread",
"server.MixinChunkGenerator",
- "server.MixinTFChunkGenerator"
+ "server.MixinTFChunkGenerator",
+ "server.MixinServerPlayer"
],
"client": [
"client.MixinClientPacketListener",