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",