diff --git a/src/main/java/tech/nevets/vplus/init/ZoomInit.java b/src/main/java/tech/nevets/vplus/init/ZoomInit.java index f6d0c0f..c8c6cf9 100644 --- a/src/main/java/tech/nevets/vplus/init/ZoomInit.java +++ b/src/main/java/tech/nevets/vplus/init/ZoomInit.java @@ -1,2 +1,58 @@ -package tech.nevets.vplus.init;public class ZoomInit { -} +package tech.nevets.vplus.init; + +import static tech.nevets.vplus.misc.VPZoom.*; + +public class ZoomInit { + public static Boolean isZooming() { + return keyBinding.isPressed(); + } + + public static void manageSmoothCamera() { + if (zoomStarting()) { + zoomStarted(); + enableSmoothCamera(); + } + + if (zoomStopping()) { + zoomStopped(); + resetSmoothCamera(); + } + } + + private static Boolean isSmoothCamera() { + return mc.options.smoothCameraEnabled; + } + + private static void enableSmoothCamera() { + mc.options.smoothCameraEnabled = true; + } + + private static void disableSmoothCamera() { + mc.options.smoothCameraEnabled = false; + } + + private static boolean zoomStarting() { + return isZooming() && !currentlyZoomed; + } + + private static boolean zoomStopping() { + return !isZooming() && currentlyZoomed; + } + + private static void zoomStarted() { + originalSmoothCameraEnabled = isSmoothCamera(); + currentlyZoomed = true; + } + + private static void zoomStopped() { + currentlyZoomed = false; + } + + private static void resetSmoothCamera() { + if (originalSmoothCameraEnabled) { + enableSmoothCamera(); + } else { + disableSmoothCamera(); + } + } +} \ No newline at end of file diff --git a/src/main/java/tech/nevets/vplus/misc/VPZoom.java b/src/main/java/tech/nevets/vplus/misc/VPZoom.java index f12cf63..f436da4 100644 --- a/src/main/java/tech/nevets/vplus/misc/VPZoom.java +++ b/src/main/java/tech/nevets/vplus/misc/VPZoom.java @@ -1,7 +1,5 @@ package tech.nevets.vplus.misc; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.KeyBinding; @@ -14,8 +12,8 @@ public class VPZoom { public static KeyBinding keyBinding; public static Boolean originalSmoothCameraEnabled; public static final MinecraftClient mc = MinecraftClient.getInstance(); + public static final double zoomLevel = 19.0; - @Environment(EnvType.CLIENT) public static void vpZoom() { keyBinding = new KeyBinding("key.vplus.zoom", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_C, "category.vplus.zoom"); currentlyZoomed = false; diff --git a/src/main/java/tech/nevets/vplus/mixin/ZoomMixin.java b/src/main/java/tech/nevets/vplus/mixin/ZoomMixin.java index e6f5357..d4c6678 100644 --- a/src/main/java/tech/nevets/vplus/mixin/ZoomMixin.java +++ b/src/main/java/tech/nevets/vplus/mixin/ZoomMixin.java @@ -1,2 +1,23 @@ -package tech.nevets.vplus.mixin;public class ZoomMixin { +package tech.nevets.vplus.mixin; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.render.GameRenderer; +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.CallbackInfoReturnable; +import tech.nevets.vplus.init.ZoomInit; +import tech.nevets.vplus.misc.VPZoom; + +@Environment(EnvType.CLIENT) +@Mixin(GameRenderer.class) +public class ZoomMixin { + @Inject(method = "getFov(Lnet/minecraft/client/render/Camera;FZ)D", at = @At("HEAD"), cancellable = true) + public void getZoomLevel(CallbackInfoReturnable callbackInfo) { + if(ZoomInit.isZooming()) { + callbackInfo.setReturnValue(VPZoom.zoomLevel); + } + ZoomInit.manageSmoothCamera(); + } } diff --git a/src/main/resources/vplus.mixins.json b/src/main/resources/vplus.mixins.json index 787a8af..b0f66ae 100644 --- a/src/main/resources/vplus.mixins.json +++ b/src/main/resources/vplus.mixins.json @@ -4,6 +4,7 @@ "package": "tech.nevets.vplus.mixin", "compatibilityLevel": "JAVA_16", "mixins": [ + "ZoomMixin" ], "client": [ ],