From 369725941e115c2f949326ecdfcbf3458803f5ef Mon Sep 17 00:00:00 2001 From: CelDaemon Date: Thu, 30 Jan 2025 16:18:50 +0100 Subject: [PATCH] Port to 1.21.4 and fix: Facing angles of newly joined players, respawning from obstructed spawnpoints, and clean respawns --- gradle.properties | 8 ++--- .../java/com/rikaisan/RespectWorldSpawn.java | 1 + .../java/com/rikaisan/mixin/RespawnMixin.java | 29 ------------------- .../mixin/ServerPlayerEntityMixin.java | 28 ++++++++++++++++++ .../rikaisan/mixin/TeleportTargetMixin.java | 24 +++++++++++++++ src/main/resources/fabric.mod.json | 4 +-- .../resources/respectworldspawn.mixins.json | 3 +- 7 files changed, 61 insertions(+), 36 deletions(-) delete mode 100644 src/main/java/com/rikaisan/mixin/RespawnMixin.java create mode 100644 src/main/java/com/rikaisan/mixin/ServerPlayerEntityMixin.java create mode 100644 src/main/java/com/rikaisan/mixin/TeleportTargetMixin.java diff --git a/gradle.properties b/gradle.properties index 2293908..c0961a7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,9 +4,9 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.20.1 -yarn_mappings=1.20.1+build.10 -loader_version=0.16.9 +minecraft_version=1.21.4 +yarn_mappings=1.21.4+build.8 +loader_version=0.16.10 # Mod Properties mod_version=1.0.0 @@ -14,4 +14,4 @@ maven_group=com.rikaisan archives_base_name=respectworldspawn # Dependencies -fabric_version=0.92.3+1.20.1 \ No newline at end of file +fabric_version=0.115.1+1.21.4 \ No newline at end of file diff --git a/src/main/java/com/rikaisan/RespectWorldSpawn.java b/src/main/java/com/rikaisan/RespectWorldSpawn.java index a204e89..39a0fd9 100644 --- a/src/main/java/com/rikaisan/RespectWorldSpawn.java +++ b/src/main/java/com/rikaisan/RespectWorldSpawn.java @@ -18,5 +18,6 @@ public class RespectWorldSpawn implements ModInitializer { @Override public void onInitialize() { LOGGER.info("Respecting YOUR spawn logic since 2025!"); + LOGGER.info("Obligatory Meow!"); } } \ No newline at end of file diff --git a/src/main/java/com/rikaisan/mixin/RespawnMixin.java b/src/main/java/com/rikaisan/mixin/RespawnMixin.java deleted file mode 100644 index 6f8f85d..0000000 --- a/src/main/java/com/rikaisan/mixin/RespawnMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.rikaisan.mixin; - -import com.rikaisan.RespectWorldSpawn; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.world.GameMode; -import net.minecraft.world.SaveProperties; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(ServerPlayerEntity.class) -public abstract class RespawnMixin { - @Shadow public abstract ServerWorld getServerWorld(); - - // Fix spawn angle not being used - @ModifyArg(method = "moveToSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;refreshPositionAndAngles(Lnet/minecraft/util/math/BlockPos;FF)V"), index = 1) - private float useWorldSpawnAngle(float requestedYaw) { - return getServerWorld().getGameRules().getBoolean(RespectWorldSpawn.RESPECT_SPAWN_ROTATION) ? getServerWorld().getSpawnAngle() : requestedYaw; - } - - // No need to do much, Adventure mode already has this behaviour. - @Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/SaveProperties;getGameMode()Lnet/minecraft/world/GameMode;"), method = "moveToSpawn") - private GameMode getGameMode(SaveProperties instance) { - return getServerWorld().getGameRules().getBoolean(RespectWorldSpawn.RESPECT_SPAWN_HEIGHT) ? GameMode.ADVENTURE : instance.getGameMode(); - } -} \ No newline at end of file diff --git a/src/main/java/com/rikaisan/mixin/ServerPlayerEntityMixin.java b/src/main/java/com/rikaisan/mixin/ServerPlayerEntityMixin.java new file mode 100644 index 0000000..71008ab --- /dev/null +++ b/src/main/java/com/rikaisan/mixin/ServerPlayerEntityMixin.java @@ -0,0 +1,28 @@ +package com.rikaisan.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import com.rikaisan.RespectWorldSpawn; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.GameMode; +import net.minecraft.world.SaveProperties; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ServerPlayerEntity.class) +public abstract class ServerPlayerEntityMixin { + + // No need to do much, Adventure mode already has this behaviour. + @Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/SaveProperties;getGameMode()Lnet/minecraft/world/GameMode;"), method = "getWorldSpawnPos") + private GameMode getGameMode(SaveProperties instance, @Local(argsOnly = true) ServerWorld world) { + return world.getGameRules().getBoolean(RespectWorldSpawn.RESPECT_SPAWN_HEIGHT) ? GameMode.ADVENTURE : instance.getGameMode(); + } + + // Enforce the facing angle of newly joined players. + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;refreshPositionAndAngles(Lnet/minecraft/util/math/Vec3d;FF)V"), index = 1) + private float modifyAngle(float requestedYaw, @Local(argsOnly = true) ServerWorld world) { + return world.getGameRules().getBoolean(RespectWorldSpawn.RESPECT_SPAWN_ROTATION) ? world.getSpawnAngle() : requestedYaw; + } +} \ No newline at end of file diff --git a/src/main/java/com/rikaisan/mixin/TeleportTargetMixin.java b/src/main/java/com/rikaisan/mixin/TeleportTargetMixin.java new file mode 100644 index 0000000..be138a5 --- /dev/null +++ b/src/main/java/com/rikaisan/mixin/TeleportTargetMixin.java @@ -0,0 +1,24 @@ +package com.rikaisan.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import com.rikaisan.RespectWorldSpawn; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.TeleportTarget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(TeleportTarget.class) +public class TeleportTargetMixin { + // Enforce world spawn angle when respawning using world spawn. + @ModifyArg(method = "(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/entity/Entity;Lnet/minecraft/world/TeleportTarget$PostDimensionTransition;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/TeleportTarget;(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Vec3d;FFZZLjava/util/Set;Lnet/minecraft/world/TeleportTarget$PostDimensionTransition;)V"), index = 3) + private static float enforceAngle(float requestedYaw, @Local(argsOnly = true) ServerWorld world) { + return world.getGameRules().getBoolean(RespectWorldSpawn.RESPECT_SPAWN_ROTATION) ? world.getSpawnAngle() : requestedYaw; + } + + // Enforce world spawn angle when respawning from obstructed spawn. + @ModifyArg(method = "missingSpawnBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/TeleportTarget;(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Vec3d;FFZZLjava/util/Set;Lnet/minecraft/world/TeleportTarget$PostDimensionTransition;)V"), index = 3) + private static float obstructedEnforceAngle(float requestedYaw, @Local(argsOnly = true) ServerWorld world) { + return world.getGameRules().getBoolean(RespectWorldSpawn.RESPECT_SPAWN_ROTATION) ? world.getSpawnAngle() : requestedYaw; + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 2dd8e05..1cf2388 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,8 +23,8 @@ "respectworldspawn.mixins.json" ], "depends": { - "fabricloader": ">=0.16.9", - "minecraft": "~1.20.1", + "fabricloader": ">=0.16.10", + "minecraft": "~1.21.4", "java": ">=17", "fabric-api": "*" }, diff --git a/src/main/resources/respectworldspawn.mixins.json b/src/main/resources/respectworldspawn.mixins.json index 3413abd..fc51a78 100644 --- a/src/main/resources/respectworldspawn.mixins.json +++ b/src/main/resources/respectworldspawn.mixins.json @@ -3,7 +3,8 @@ "package": "com.rikaisan.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "RespawnMixin" + "ServerPlayerEntityMixin", + "TeleportTargetMixin" ], "injectors": { "defaultRequire": 1