diff --git a/NeoForge/build.gradle b/NeoForge/build.gradle index 4096365..c5026c3 100644 --- a/NeoForge/build.gradle +++ b/NeoForge/build.gradle @@ -34,7 +34,6 @@ dependencies { implementation fg.deobf(neoforge.caelus.get()) compileOnly fg.deobf(neoforge.cameraoverhaul.get()) - // NOT UPDATED YET! // runtimeOnly fg.deobf(neoforge.cameraoverhaul.get()) compileOnly fg.deobf(libs.figura.forge.get()) diff --git a/NeoForge/libs.versions.toml b/NeoForge/libs.versions.toml index fc5e436..e58b2ed 100644 --- a/NeoForge/libs.versions.toml +++ b/NeoForge/libs.versions.toml @@ -9,7 +9,7 @@ curios = "5.8.1+1.20.1" caelus = "3.2.0+1.20.1" -cameraoverhaul = "4057605" +cameraoverhaul = "5310618" [libraries] neoforge = { module = "net.neoforged:forge", version.ref = "neoforge" } @@ -18,7 +18,7 @@ curios = { module = "top.theillusivec4.curios:curios-forge", version.ref = "curi caelus = { module = "top.theillusivec4.caelus:caelus-forge", version.ref = "caelus" } -cameraoverhaul = { module = "curse.maven:camera-overhaul-forge-443034", version.ref = "cameraoverhaul" } +cameraoverhaul = { module = "curse.maven:camera-overhaul-reforged-1011593", version.ref = "cameraoverhaul" } [plugins] neogradle = { id = "net.neoforged.gradle", version.ref = "neogradle" } diff --git a/NeoForge/src/main/java/dev/cammiescorner/icarus/neoforge/compat/CameraOverhaulCompat.java b/NeoForge/src/main/java/dev/cammiescorner/icarus/neoforge/compat/CameraOverhaulCompat.java new file mode 100644 index 0000000..27f72d9 --- /dev/null +++ b/NeoForge/src/main/java/dev/cammiescorner/icarus/neoforge/compat/CameraOverhaulCompat.java @@ -0,0 +1,78 @@ +/** + * MIT License + *
+ * Copyright (c) 2020 Mirsario + *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + *
+ * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package dev.cammiescorner.icarus.neoforge.compat; + +import dev.cammiescorner.icarus.IcarusConfig; +import mirsario.cameraoverhaul.core.callbacks.CameraUpdateCallback; +import mirsario.cameraoverhaul.core.callbacks.ModifyCameraTransformCallback; +import mirsario.cameraoverhaul.core.structures.Transform; +import net.minecraft.client.Camera; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec2; +import net.minecraft.world.phys.Vec3; + +public class CameraOverhaulCompat implements CameraUpdateCallback, ModifyCameraTransformCallback { + + private double prevRollOffset; + private Transform storedTransform; + + public static void load() { + CameraUpdateCallback.EVENT.Register(new CameraOverhaulCompat()); + } + + @Override + public void OnCameraUpdate(Camera camera, Transform cameraTransform, float deltaTime) { + float pitch = camera.getXRot(); + float rollAmount = (pitch < -90 || pitch > 90) ? IcarusConfig.rollAmount : -IcarusConfig.rollAmount; + Vec3 velocity = camera.getEntity().getDeltaMovement(); + Vec2 relativeXZVelocity = rotate(new Vec2((float) velocity.x, (float) velocity.z), 360.0F - (float) cameraTransform.eulerRot.y); + + rollOffset(cameraTransform, relativeXZVelocity, deltaTime, rollAmount); + + storedTransform = cameraTransform; + } + + public static Vec2 rotate(Vec2 vec, float degrees) { + double radians = Math.toRadians(degrees); + float sin = (float) Math.sin(radians); + float cos = (float) Math.cos(radians); + + return new Vec2((cos * vec.x) - (sin * vec.y), (sin * vec.x) + (cos * vec.y)); + } + + private void rollOffset(Transform transform, Vec2 relativeXZVelocity, double deltaTime, float intensity) { + double strafingRollOffset = -relativeXZVelocity.x * 15.0D; + double lerpSpeed = 1.0D; + + prevRollOffset = strafingRollOffset = Mth.lerp(Mth.clamp(deltaTime * lerpSpeed, 0.0D, 1.0D), prevRollOffset, strafingRollOffset); + + transform.eulerRot = transform.eulerRot.add(0.0D, 0.0D, strafingRollOffset * intensity); + } + + @Override + public Transform ModifyCameraTransform(Camera camera, Transform transform) { + return storedTransform != null ? storedTransform : transform; + } +} diff --git a/NeoForge/src/main/java/dev/cammiescorner/icarus/neoforge/entrypoints/Client.java b/NeoForge/src/main/java/dev/cammiescorner/icarus/neoforge/entrypoints/Client.java index 2f95826..52e382a 100644 --- a/NeoForge/src/main/java/dev/cammiescorner/icarus/neoforge/entrypoints/Client.java +++ b/NeoForge/src/main/java/dev/cammiescorner/icarus/neoforge/entrypoints/Client.java @@ -7,6 +7,7 @@ import dev.cammiescorner.icarus.client.models.*; import dev.cammiescorner.icarus.client.renderers.WingsLayer; import dev.cammiescorner.icarus.item.WingItem; +import dev.cammiescorner.icarus.neoforge.compat.CameraOverhaulCompat; import dev.cammiescorner.icarus.util.ColorHelper; import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.entity.LivingEntityRenderer; @@ -16,6 +17,7 @@ import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterColorHandlersEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @@ -26,6 +28,11 @@ public class Client { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { + + if (ModList.get().isLoaded("cameraoverhaul")) { + CameraOverhaulCompat.load(); + } + event.enqueueWork(() -> ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () -> new ConfigScreenHandler.ConfigScreenFactory((minecraft, parent) -> new ConfigScreen(parent, null, Icarus.CONFIGURATOR.getConfig(IcarusConfig.class))))); } diff --git a/NeoForge/src/main/resources/META-INF/mods.toml b/NeoForge/src/main/resources/META-INF/mods.toml index 7710cf8..35fd8bb 100644 --- a/NeoForge/src/main/resources/META-INF/mods.toml +++ b/NeoForge/src/main/resources/META-INF/mods.toml @@ -44,6 +44,6 @@ config = "${mod_id}.neoforge.mixins.json" "forge" ] dependencies = [ - "cameraoverhaul(optional){curseforge:443034}#(ignore:modrinth)", + "camera-overhaul-reforged(optional){modrinth:LwcpSm6L}{curseforge:1011593}", "figura(optional){modrinth:s9gIPDom}{curseforge:901503}" ]