diff --git a/src/client/java/wtf/hak/survivalfabric/mixin/client/EntityMixin.java b/src/client/java/wtf/hak/survivalfabric/mixin/client/EntityMixin.java new file mode 100644 index 0000000..db3b7cd --- /dev/null +++ b/src/client/java/wtf/hak/survivalfabric/mixin/client/EntityMixin.java @@ -0,0 +1,31 @@ +package wtf.hak.survivalfabric.mixin.client; + +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import wtf.hak.survivalfabric.teleportation.AngleViewHandler; + +@Mixin(Entity.class) +public abstract class EntityMixin { + + @Inject(method = "setYaw", at = @At("HEAD"), cancellable = true) + private void preventYawChange(float yaw, CallbackInfo ci) { + if((Object) this instanceof ClientPlayerEntity player) { + if(player.isMainPlayer() && AngleViewHandler.PREVENT_HEAD_MOVEMENT) { + ci.cancel(); + } + } + } + + @Inject(method = "setPitch", at = @At("HEAD"), cancellable = true) + private void preventPitchChange(float pitch, CallbackInfo ci) { + if((Object) this instanceof ClientPlayerEntity player) { + if(player.isMainPlayer() && AngleViewHandler.PREVENT_HEAD_MOVEMENT) { + ci.cancel(); + } + } + } +} diff --git a/src/client/java/wtf/hak/survivalfabric/teleportation/AngleViewHandler.java b/src/client/java/wtf/hak/survivalfabric/teleportation/AngleViewHandler.java index 74dd60e..5a5c0dd 100644 --- a/src/client/java/wtf/hak/survivalfabric/teleportation/AngleViewHandler.java +++ b/src/client/java/wtf/hak/survivalfabric/teleportation/AngleViewHandler.java @@ -14,6 +14,7 @@ import java.util.concurrent.TimeUnit; public class AngleViewHandler { private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + public static boolean PREVENT_HEAD_MOVEMENT = false; public static void registerKeybindings() { for(Angle angle : Angle.values()) { @@ -31,9 +32,14 @@ public class AngleViewHandler { player.setYaw(angle.yaw); player.setPitch(angle.pitch); + PREVENT_HEAD_MOVEMENT = true; + scheduler.schedule(() -> { if(player == null) return; + PREVENT_HEAD_MOVEMENT = false; player.setPitch(-90); + PREVENT_HEAD_MOVEMENT = true; + scheduler.schedule(() -> PREVENT_HEAD_MOVEMENT = false, 1500, TimeUnit.MILLISECONDS); }, 1500, TimeUnit.MILLISECONDS); } }); diff --git a/src/client/resources/survivalfabric.client.mixins.json b/src/client/resources/survivalfabric.client.mixins.json index c15ff45..9ed4600 100644 --- a/src/client/resources/survivalfabric.client.mixins.json +++ b/src/client/resources/survivalfabric.client.mixins.json @@ -3,6 +3,7 @@ "package": "wtf.hak.survivalfabric.mixin.client", "compatibilityLevel": "JAVA_21", "client": [ + "EntityMixin" ], "injectors": { "defaultRequire": 1