From 157b4366693e44ebd9751cd871ce8c246956ca16 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Fri, 27 Feb 2026 17:14:17 -0500 Subject: [PATCH 01/16] wip forge 1.21.11 changes --- forge/build.gradle | 60 ++++++++++-------------- gradle.properties | 1 + gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 16 +++---- 4 files changed, 35 insertions(+), 44 deletions(-) diff --git a/forge/build.gradle b/forge/build.gradle index c52bc7d..a2ebb7f 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,16 +1,15 @@ plugins { id 'multiloader-loader' - id 'net.minecraftforge.gradle' version '[6.0.24,6.2)' - id 'org.spongepowered.mixin' version '0.7-SNAPSHOT' + id 'net.minecraftforge.gradle' version '7.0.0-beta.46' id 'idea' } base { archivesName = "${mod_name}-forge-${minecraft_version}" } -mixin { - config("${mod_id}.mixins.json") - config("${mod_id}.forge.mixins.json") -} +//mixin { +// config("${mod_id}.mixins.json") +// config("${mod_id}.forge.mixins.json") +//} jar { manifest { attributes["MixinConfigs"] = "${mod_id}.mixins.json,${mod_id}.forge.mixins.json" @@ -20,10 +19,6 @@ jar { minecraft { mappings channel: 'official', version: minecraft_version - copyIdeResources = true //Calls processResources when in dev - - reobf = false // Forge 1.20.6+ uses official mappings at runtime, so we shouldn't reobf from official to SRG - // Automatically enable forge AccessTransformers if the file exists // This location is hardcoded in Forge and can not be changed. // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 @@ -34,52 +29,47 @@ minecraft { } runs { + configureEach { + args "-mixin.config=${mod_id}.mixins.json" + args "-mixin.config=${mod_id}.forge.mixins.json" + } + client { - workingDirectory file('runs/client') - ideaModule "${rootProject.name}.${project.name}.main" - taskName 'Client' - mods { - modClientRun { - source sourceSets.main - } - } + workingDir = file('runs/client') } data { - workingDirectory file('runs/data') - ideaModule "${rootProject.name}.${project.name}.main" + workingDir = file('runs/data') args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - taskName 'Data' - mods { - modDataRun { - source sourceSets.main - } - } } } } sourceSets.main.resources.srcDir 'src/generated/resources' +repositories { + maven minecraft.mavenizer + maven fg.forgeMaven + maven fg.minecraftLibsMaven +} + dependencies { - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT:processor") + implementation minecraft.dependency("net.minecraftforge:forge:${minecraft_version}-${forge_version}") + + // This is currently bugged due to the absence of obfuscation mappings + //annotationProcessor "org.spongepowered:mixin:0.8.5-SNAPSHOT:processor" + + implementation "me.shedaniel.cloth:cloth-config-forge:${cloth_config_version}" } publishing { publications { mavenJava(MavenPublication) { - fg.component(it) + } } } -sourceSets.each { - def dir = layout.buildDirectory.dir("sourcesSets/$it.name") - it.output.resourcesDir = dir - it.java.destinationDirectory = dir -} - // Implement mcgradleconventions loader attribute def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', String) ['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements'].each { variant -> diff --git a/gradle.properties b/gradle.properties index a223eee..68c7d39 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,6 +25,7 @@ fabric_version=0.139.5+1.21.11 fabric_loader_version=0.18.2 # Forge, see https://files.minecraftforge.net/net/minecraftforge/forge/ for new versions +net.minecraftforge.gradle.merge-source-sets=true forge_version=61.0.1 forge_loader_version_range=[61,) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da..bad7c24 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle b/settings.gradle index 8942572..e4f1533 100644 --- a/settings.gradle +++ b/settings.gradle @@ -26,22 +26,22 @@ pluginManagement { includeGroupAndSubgroups("org.spongepowered") } } - exclusiveContent { - forRepository { +// exclusiveContent { +// forRepository { maven { name = 'Forge' url = uri('https://maven.minecraftforge.net') } - } - filter { - includeGroupAndSubgroups('net.minecraftforge') - } - } +// } +// filter { +// includeGroupAndSubgroups('net.minecraftforge') +// } +// } } } plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' } // This should match the folder name of the project, or else IDEA may complain (see https://youtrack.jetbrains.com/issue/IDEA-317606) From aa5ad0fd74ce20f6403e9868bc932981fd646472 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Fri, 27 Feb 2026 17:24:12 -0500 Subject: [PATCH 02/16] Reformat and optimize imports --- .../src/main/groovy/multiloader-common.gradle | 16 ++++++++-------- common/build.gradle | 2 +- .../java/me/collinb/dynamicview/Constants.java | 1 - .../me/collinb/dynamicview/config/ModConfig.java | 1 + fabric/build.gradle | 2 +- forge/build.gradle | 2 +- .../me/collinb/dynamicview/DynamicViewForge.java | 2 -- forge/src/main/resources/META-INF/mods.toml | 2 +- gradle.properties | 9 +-------- neoforge/build.gradle | 2 +- .../collinb/dynamicview/DynamicViewNeoForge.java | 1 - settings.gradle | 8 ++++---- 12 files changed, 19 insertions(+), 29 deletions(-) diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle index 458be6d..eba985a 100644 --- a/buildSrc/src/main/groovy/multiloader-common.gradle +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -27,14 +27,14 @@ repositories { } exclusiveContent { forRepositories( - maven { - name = 'ParchmentMC' - url = 'https://maven.parchmentmc.org/' - }, - maven { - name = "NeoForge" - url = 'https://maven.neoforged.net/releases' - } + maven { + name = 'ParchmentMC' + url = 'https://maven.parchmentmc.org/' + }, + maven { + name = "NeoForge" + url = 'https://maven.neoforged.net/releases' + } ) filter { includeGroup('org.parchmentmc.data') } } diff --git a/common/build.gradle b/common/build.gradle index 5e73c51..4c9afc2 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -51,7 +51,7 @@ def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', Strin } } sourceSets.configureEach { - [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant-> + [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant -> configurations.named("$variant") { attributes { attribute(loaderAttribute, 'common') diff --git a/common/src/main/java/me/collinb/dynamicview/Constants.java b/common/src/main/java/me/collinb/dynamicview/Constants.java index 1817a13..017d17f 100644 --- a/common/src/main/java/me/collinb/dynamicview/Constants.java +++ b/common/src/main/java/me/collinb/dynamicview/Constants.java @@ -1,6 +1,5 @@ package me.collinb.dynamicview; -import net.minecraft.client.Minecraft; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java b/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java index 2b020c5..eed85f7 100644 --- a/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java +++ b/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java @@ -16,6 +16,7 @@ public static void init() { @ConfigEntry.Gui.CollapsibleObject public EnabledContexts enabledContexts = new EnabledContexts(); + public static class EnabledContexts { public boolean swimming = true; public boolean crawling = true; diff --git a/fabric/build.gradle b/fabric/build.gradle index 91a3154..ccaca99 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -51,7 +51,7 @@ def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', Strin } } sourceSets.configureEach { - [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant-> + [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant -> configurations.named("$variant") { attributes { attribute(loaderAttribute, 'fabric') diff --git a/forge/build.gradle b/forge/build.gradle index a2ebb7f..6d939ee 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -80,7 +80,7 @@ def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', Strin } } sourceSets.configureEach { - [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant-> + [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant -> configurations.named("$variant") { attributes { attribute(loaderAttribute, 'forge') diff --git a/forge/src/main/java/me/collinb/dynamicview/DynamicViewForge.java b/forge/src/main/java/me/collinb/dynamicview/DynamicViewForge.java index 60f8c20..976b006 100644 --- a/forge/src/main/java/me/collinb/dynamicview/DynamicViewForge.java +++ b/forge/src/main/java/me/collinb/dynamicview/DynamicViewForge.java @@ -1,10 +1,8 @@ package me.collinb.dynamicview; -import me.collinb.dynamicview.config.ModConfig; import net.minecraft.client.Minecraft; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.TickEvent; - import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index ad7590b..57c4d43 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -2,7 +2,7 @@ modLoader = "javafml" #mandatory loaderVersion = "${forge_loader_version_range}" #mandatory This is typically bumped every Minecraft version by Forge. See https://files.minecraftforge.net/ for a list of versions. license = "${license}" # Review your options at https://choosealicense.com/. #issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional -clientSideOnly=true #optional +clientSideOnly = true #optional [[mods]] #mandatory modId = "${mod_id}" #mandatory version = "${version}" #mandatory diff --git a/gradle.properties b/gradle.properties index 68c7d39..a85b677 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,9 @@ # Important Notes: # Every field you add must be added to the root build.gradle expandProps map. # Project -version=1.0-SNAPSHOT +version=1.0.0 group=me.collinb java_version=21 - # Common minecraft_version=1.21.11 mod_name=DynamicView @@ -15,28 +14,22 @@ credits= description=Dynamically switch player view minecraft_version_range=[1.21.11, 1.22) neo_form_version=1.21.11-20251209.172050 - # The version of ParchmentMC that is used, see https://parchmentmc.org/docs/getting-started#choose-a-version for new versions parchment_minecraft=1.21.10 parchment_version=2025.10.12 - # Fabric, see https://fabricmc.net/develop/ for new versions fabric_version=0.139.5+1.21.11 fabric_loader_version=0.18.2 - # Forge, see https://files.minecraftforge.net/net/minecraftforge/forge/ for new versions net.minecraftforge.gradle.merge-source-sets=true forge_version=61.0.1 forge_loader_version_range=[61,) - # NeoForge, see https://projects.neoforged.net/neoforged/neoforge for new versions neoforge_version=21.11.3-beta neoforge_loader_version_range=[4,) - # Configs modmenu_version=17.0.0-beta.2 cloth_config_version=21.11.153 - # Gradle org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 55d3997..7bcc18c 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -53,7 +53,7 @@ def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', Strin } } sourceSets.configureEach { - [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName, it.getTaskName(null, 'jarJar')].each { variant-> + [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName, it.getTaskName(null, 'jarJar')].each { variant -> configurations.named("$variant") { attributes { attribute(loaderAttribute, 'neoforge') diff --git a/neoforge/src/main/java/me/collinb/dynamicview/DynamicViewNeoForge.java b/neoforge/src/main/java/me/collinb/dynamicview/DynamicViewNeoForge.java index 632d984..3a7ec42 100644 --- a/neoforge/src/main/java/me/collinb/dynamicview/DynamicViewNeoForge.java +++ b/neoforge/src/main/java/me/collinb/dynamicview/DynamicViewNeoForge.java @@ -5,7 +5,6 @@ import net.minecraft.client.Minecraft; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.EventPriority; -import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.EventBusSubscriber; diff --git a/settings.gradle b/settings.gradle index e4f1533..c62d589 100644 --- a/settings.gradle +++ b/settings.gradle @@ -28,10 +28,10 @@ pluginManagement { } // exclusiveContent { // forRepository { - maven { - name = 'Forge' - url = uri('https://maven.minecraftforge.net') - } + maven { + name = 'Forge' + url = uri('https://maven.minecraftforge.net') + } // } // filter { // includeGroupAndSubgroups('net.minecraftforge') From 816b2101556d8bb9039b916a19dc0cf750de4c49 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Fri, 27 Feb 2026 17:28:32 -0500 Subject: [PATCH 03/16] Fix LICENSE --- LICENSE.txt => LICENSE | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) rename LICENSE.txt => LICENSE (97%) diff --git a/LICENSE.txt b/LICENSE similarity index 97% rename from LICENSE.txt rename to LICENSE index 87ed7a2..f288702 100644 --- a/LICENSE.txt +++ b/LICENSE @@ -1,24 +1,7 @@ -Copyright (c) 2026 - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see - - - GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -648,8 +631,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} + + Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -662,14 +645,14 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - {project} Copyright (C) {year} {fullname} + Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -681,12 +664,11 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. - +. From ae2dcccfcc18e7b4ece4ae1befa6982a71b0065a Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Fri, 27 Feb 2026 17:36:45 -0500 Subject: [PATCH 04/16] Improve mod description --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a85b677..d9dd908 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ mod_author=collin-b1 mod_id=dynamicview license=GPL-3.0 credits= -description=Dynamically switch player view +description=Automatically switches player perspective in specific contexts. minecraft_version_range=[1.21.11, 1.22) neo_form_version=1.21.11-20251209.172050 # The version of ParchmentMC that is used, see https://parchmentmc.org/docs/getting-started#choose-a-version for new versions From 68e8695488557364b4b9a3a5e878a965531053b5 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 18:33:28 -0500 Subject: [PATCH 05/16] Remove forge, fix camera distance calculation --- .../src/main/groovy/multiloader-common.gradle | 2 - .../collinb/dynamicview/CameraAnimation.java | 5 ++ .../dynamicview/mixin/CameraMixin.java | 9 +- forge/build.gradle | 90 ------------------- .../collinb/dynamicview/DynamicViewForge.java | 24 ----- .../dynamicview/mixin/MixinTitleScreen.java | 19 ---- .../platform/ForgePlatformHelper.java | 23 ----- forge/src/main/resources/META-INF/mods.toml | 27 ------ ...amicview.platform.services.IPlatformHelper | 1 - .../resources/dynamicview.forge.mixins.json | 14 --- gradle.properties | 4 - neoforge/build.gradle | 2 +- settings.gradle | 14 +-- 13 files changed, 14 insertions(+), 220 deletions(-) delete mode 100644 forge/build.gradle delete mode 100644 forge/src/main/java/me/collinb/dynamicview/DynamicViewForge.java delete mode 100644 forge/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java delete mode 100644 forge/src/main/java/me/collinb/dynamicview/platform/ForgePlatformHelper.java delete mode 100644 forge/src/main/resources/META-INF/mods.toml delete mode 100644 forge/src/main/resources/META-INF/services/me.collinb.dynamicview.platform.services.IPlatformHelper delete mode 100644 forge/src/main/resources/dynamicview.forge.mixins.json diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle index eba985a..8b7b8a5 100644 --- a/buildSrc/src/main/groovy/multiloader-common.gradle +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -99,8 +99,6 @@ processResources { 'description' : project.description, 'neoforge_version' : neoforge_version, 'neoforge_loader_version_range': neoforge_loader_version_range, - "forge_version" : forge_version, - "forge_loader_version_range" : forge_loader_version_range, 'credits' : credits, 'java_version' : java_version, 'modmenu_version' : modmenu_version, diff --git a/common/src/main/java/me/collinb/dynamicview/CameraAnimation.java b/common/src/main/java/me/collinb/dynamicview/CameraAnimation.java index f853988..047598a 100644 --- a/common/src/main/java/me/collinb/dynamicview/CameraAnimation.java +++ b/common/src/main/java/me/collinb/dynamicview/CameraAnimation.java @@ -38,6 +38,11 @@ public void tick() { if (Math.abs(currentDistance - targetDistance) < 0.1f && onAnimationComplete != null) { onAnimationComplete.run(); onAnimationComplete = null; + this.currentDistance = this.targetDistance; } } + + public boolean isCameraAnimating() { + return this.currentDistance != this.targetDistance; + } } diff --git a/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java b/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java index 9627df8..001fdbe 100644 --- a/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java +++ b/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java @@ -16,8 +16,11 @@ @Mixin(Camera.class) public abstract class CameraMixin { - @Inject(method = "getMaxZoom", at = @At("HEAD"), cancellable = true) + @Inject(method = "getMaxZoom", at = @At("TAIL"), cancellable = true) private void useSmoothZooming(float pMaxZoom, CallbackInfoReturnable cir) { + if (!CameraAnimation.INSTANCE.isCameraAnimating()) { + return; + } ModConfig config = AutoConfig.getConfigHolder(ModConfig.class).get(); if (DynamicView.isCameraDynamic() && config.animationEnabled) { float partial = getMC().getDeltaTracker().getGameTimeDeltaPartialTick(true); @@ -26,7 +29,9 @@ private void useSmoothZooming(float pMaxZoom, CallbackInfoReturnable cir) CameraAnimation.INSTANCE.previousDistance, CameraAnimation.INSTANCE.currentDistance ); - cir.setReturnValue(smoothDistance); + if (smoothDistance <= cir.getReturnValue()) { + cir.setReturnValue(smoothDistance); + } } } } diff --git a/forge/build.gradle b/forge/build.gradle deleted file mode 100644 index 6d939ee..0000000 --- a/forge/build.gradle +++ /dev/null @@ -1,90 +0,0 @@ -plugins { - id 'multiloader-loader' - id 'net.minecraftforge.gradle' version '7.0.0-beta.46' - id 'idea' -} -base { - archivesName = "${mod_name}-forge-${minecraft_version}" -} -//mixin { -// config("${mod_id}.mixins.json") -// config("${mod_id}.forge.mixins.json") -//} -jar { - manifest { - attributes["MixinConfigs"] = "${mod_id}.mixins.json,${mod_id}.forge.mixins.json" - } -} - -minecraft { - mappings channel: 'official', version: minecraft_version - - // Automatically enable forge AccessTransformers if the file exists - // This location is hardcoded in Forge and can not be changed. - // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 - // Forge still uses SRG names during compile time, so we cannot use the common AT's - def at = file('src/main/resources/META-INF/accesstransformer.cfg') - if (at.exists()) { - accessTransformer = at - } - - runs { - configureEach { - args "-mixin.config=${mod_id}.mixins.json" - args "-mixin.config=${mod_id}.forge.mixins.json" - } - - client { - workingDir = file('runs/client') - } - - data { - workingDir = file('runs/data') - args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - } - } -} - -sourceSets.main.resources.srcDir 'src/generated/resources' - -repositories { - maven minecraft.mavenizer - maven fg.forgeMaven - maven fg.minecraftLibsMaven -} - -dependencies { - implementation minecraft.dependency("net.minecraftforge:forge:${minecraft_version}-${forge_version}") - - // This is currently bugged due to the absence of obfuscation mappings - //annotationProcessor "org.spongepowered:mixin:0.8.5-SNAPSHOT:processor" - - implementation "me.shedaniel.cloth:cloth-config-forge:${cloth_config_version}" -} - -publishing { - publications { - mavenJava(MavenPublication) { - - } - } -} - -// Implement mcgradleconventions loader attribute -def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', String) -['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements'].each { variant -> - configurations.named("$variant") { - attributes { - attribute(loaderAttribute, 'forge') - } - } -} -sourceSets.configureEach { - [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant -> - configurations.named("$variant") { - attributes { - attribute(loaderAttribute, 'forge') - } - } - } -} diff --git a/forge/src/main/java/me/collinb/dynamicview/DynamicViewForge.java b/forge/src/main/java/me/collinb/dynamicview/DynamicViewForge.java deleted file mode 100644 index 976b006..0000000 --- a/forge/src/main/java/me/collinb/dynamicview/DynamicViewForge.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.collinb.dynamicview; - -import net.minecraft.client.Minecraft; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.listener.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - -@Mod(Constants.MOD_ID) -public class DynamicViewForge { - - public DynamicViewForge() { - DynamicView.init(); - } - - @Mod.EventBusSubscriber(modid = Constants.MOD_ID, value = Dist.CLIENT) - public static class ClientEvents { - - @SubscribeEvent - public static void onClientTick(TickEvent.ClientTickEvent event) { - DynamicView.preTick(Minecraft.getInstance()); - } - } -} diff --git a/forge/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java b/forge/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java deleted file mode 100644 index d052078..0000000 --- a/forge/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.collinb.dynamicview.mixin; - -import me.collinb.dynamicview.Constants; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.TitleScreen; -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; - -@Mixin(TitleScreen.class) -public class MixinTitleScreen { - - @Inject(at = @At("HEAD"), method = "init()V") - private void init(CallbackInfo info) { - Constants.LOG.info("This line is printed by the DynamicView mixin from Forge!"); - Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); - } -} diff --git a/forge/src/main/java/me/collinb/dynamicview/platform/ForgePlatformHelper.java b/forge/src/main/java/me/collinb/dynamicview/platform/ForgePlatformHelper.java deleted file mode 100644 index be7ecbf..0000000 --- a/forge/src/main/java/me/collinb/dynamicview/platform/ForgePlatformHelper.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.collinb.dynamicview.platform; - -import me.collinb.dynamicview.platform.services.IPlatformHelper; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.loading.FMLLoader; - -public class ForgePlatformHelper implements IPlatformHelper { - - @Override - public String getPlatformName() { - return "Forge"; - } - - @Override - public boolean isModLoaded(String modId) { - return ModList.get().isLoaded(modId); - } - - @Override - public boolean isDevelopmentEnvironment() { - return !FMLLoader.isProduction(); - } -} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 57c4d43..0000000 --- a/forge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,27 +0,0 @@ -modLoader = "javafml" #mandatory -loaderVersion = "${forge_loader_version_range}" #mandatory This is typically bumped every Minecraft version by Forge. See https://files.minecraftforge.net/ for a list of versions. -license = "${license}" # Review your options at https://choosealicense.com/. -#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional -clientSideOnly = true #optional -[[mods]] #mandatory -modId = "${mod_id}" #mandatory -version = "${version}" #mandatory -displayName = "${mod_name}" #mandatory -#updateJSONURL="https://change.me.example.invalid/updates.json" #optional, see https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/ -#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional, displayed in the mod UI -logoFile = "${mod_id}.png" #optional -credits = "${credits}" #optional -authors = "${mod_author}" #optional -description = '''${description}''' #mandatory Supports multiline text -[[dependencies."${mod_id}"]] #optional -modId = "forge" #mandatory -mandatory = true #mandatory -versionRange = "[${forge_version},)" #mandatory -ordering = "NONE" # The order that this dependency should load in relation to your mod, required to be either 'BEFORE' or 'AFTER' if the dependency is not mandatory -side = "BOTH" # Side this dependency is applied on - 'BOTH', 'CLIENT' or 'SERVER' -[[dependencies."${mod_id}"]] -modId = "minecraft" -mandatory = true -versionRange = "${minecraft_version_range}" -ordering = "NONE" -side = "BOTH" diff --git a/forge/src/main/resources/META-INF/services/me.collinb.dynamicview.platform.services.IPlatformHelper b/forge/src/main/resources/META-INF/services/me.collinb.dynamicview.platform.services.IPlatformHelper deleted file mode 100644 index a03ccb5..0000000 --- a/forge/src/main/resources/META-INF/services/me.collinb.dynamicview.platform.services.IPlatformHelper +++ /dev/null @@ -1 +0,0 @@ -me.collinb.dynamicview.platform.ForgePlatformHelper diff --git a/forge/src/main/resources/dynamicview.forge.mixins.json b/forge/src/main/resources/dynamicview.forge.mixins.json deleted file mode 100644 index 56d14bd..0000000 --- a/forge/src/main/resources/dynamicview.forge.mixins.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "me.collinb.dynamicview.mixin", - "compatibilityLevel": "JAVA_18", - "mixins": [], - "client": [ - "MixinTitleScreen" - ], - "server": [], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/gradle.properties b/gradle.properties index d9dd908..5060d0a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,10 +20,6 @@ parchment_version=2025.10.12 # Fabric, see https://fabricmc.net/develop/ for new versions fabric_version=0.139.5+1.21.11 fabric_loader_version=0.18.2 -# Forge, see https://files.minecraftforge.net/net/minecraftforge/forge/ for new versions -net.minecraftforge.gradle.merge-source-sets=true -forge_version=61.0.1 -forge_loader_version_range=[61,) # NeoForge, see https://projects.neoforged.net/neoforged/neoforge for new versions neoforge_version=21.11.3-beta neoforge_loader_version_range=[4,) diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 7bcc18c..4eab637 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -4,7 +4,7 @@ plugins { } dependencies { - implementation "me.shedaniel.cloth:cloth-config-neoforge:${cloth_config_version}" + compileOnly "me.shedaniel.cloth:cloth-config-neoforge:${cloth_config_version}" } neoForge { diff --git a/settings.gradle b/settings.gradle index c62d589..181e16e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -26,17 +26,6 @@ pluginManagement { includeGroupAndSubgroups("org.spongepowered") } } -// exclusiveContent { -// forRepository { - maven { - name = 'Forge' - url = uri('https://maven.minecraftforge.net') - } -// } -// filter { -// includeGroupAndSubgroups('net.minecraftforge') -// } -// } } } @@ -48,5 +37,4 @@ plugins { rootProject.name = 'DynamicView' include('common') include('fabric') -include('neoforge') -include('forge') +include('neoforge') \ No newline at end of file From 90e2841f07ad790cdaa01212dfe0f9f1c8adb97b Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 18:40:08 -0500 Subject: [PATCH 06/16] Github build workflow --- .github/workflows/ci.yml | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..1027a90 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,37 @@ +name: Build + +on: + push: + branches: + - 'main' + tags: + - 'v*' + pull_request: + branches: + - 'main' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: 21 + + - name: Grant execute permission for Gradle wrapper + run: chmod +x ./gradlew + + - name: Build with Gradle + run: ./gradlew build + + - name: Upload artifacts + uses: actions/upload-artifact@v7 + with: + name: jars + path: build/libs/dynamicview-*.jar \ No newline at end of file From e1ad475c28dfaf046349883f7918857eab7a38aa Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 20:33:09 -0500 Subject: [PATCH 07/16] More config options, code cleanup --- README.md | 11 +++++++ .../me/collinb/dynamicview/DynamicView.java | 9 +++--- .../{ => camera}/CameraAnimation.java | 4 +-- .../dynamicview/config/ConfigScreen.java | 4 --- .../collinb/dynamicview/config/ModConfig.java | 30 ++++++++++++++---- .../dynamicview/mixin/CameraMixin.java | 2 +- .../dynamicview/mixin/EntityAccessor.java | 2 +- .../dynamicview/mixin/LocalPlayerMixin.java | 21 ++++++------ .../dynamicview/mixin/MinecraftMixin.java | 18 ----------- .../assets/dynamicview/lang/en_us.json | 14 +++++--- .../main/resources/dynamicview.mixins.json | 3 +- common/src/main/resources/icon.png | Bin 0 -> 916 bytes .../dynamicview/mixin/MixinTitleScreen.java | 19 ----------- .../resources/dynamicview.fabric.mixins.json | 4 +-- fabric/src/main/resources/fabric.mod.json | 2 +- gradle.properties | 2 +- neoforge/build.gradle | 2 +- .../dynamicview/mixin/MixinTitleScreen.java | 19 ----------- .../resources/META-INF/neoforge.mods.toml | 2 +- .../dynamicview.neoforge.mixins.json | 4 +-- 20 files changed, 70 insertions(+), 102 deletions(-) create mode 100644 README.md rename common/src/main/java/me/collinb/dynamicview/{ => camera}/CameraAnimation.java (95%) delete mode 100644 common/src/main/java/me/collinb/dynamicview/config/ConfigScreen.java delete mode 100644 common/src/main/java/me/collinb/dynamicview/mixin/MinecraftMixin.java create mode 100644 common/src/main/resources/icon.png delete mode 100644 fabric/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java delete mode 100644 neoforge/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java diff --git a/README.md b/README.md new file mode 100644 index 0000000..dba6ed8 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +DynamicView Icon + +# DynamicView + +DynamicView is a Fabric and NeoForge mod which automatically changes the player's perspective. It has configurable +contexts including: + +- Swimming +- Crawling +- Flying +- Riding \ No newline at end of file diff --git a/common/src/main/java/me/collinb/dynamicview/DynamicView.java b/common/src/main/java/me/collinb/dynamicview/DynamicView.java index 2e72cd1..620de26 100644 --- a/common/src/main/java/me/collinb/dynamicview/DynamicView.java +++ b/common/src/main/java/me/collinb/dynamicview/DynamicView.java @@ -1,5 +1,6 @@ package me.collinb.dynamicview; +import me.collinb.dynamicview.camera.CameraAnimation; import me.collinb.dynamicview.config.ModConfig; import me.collinb.dynamicview.platform.Services; import me.shedaniel.autoconfig.AutoConfig; @@ -14,13 +15,13 @@ public class DynamicView { public static void setCameraType(CameraType cameraType) { if (!isCameraDynamic() && getMC().options.getCameraType() != cameraType) { previousCameraType = getMC().options.getCameraType(); - Constants.LOG.info("Setting previousCameraType={}", getMC().options.getCameraType()); + Constants.LOG.debug("Setting previousCameraType={}", getMC().options.getCameraType()); if (cameraType != null) { getMC().options.setCameraType(cameraType); } CameraAnimation.INSTANCE.currentDistance = 0.0f; CameraAnimation.INSTANCE.targetDistance = 4.0f; - Constants.LOG.info("Setting cameraType={}", cameraType); + Constants.LOG.debug("Setting cameraType={}", cameraType); } } @@ -31,7 +32,7 @@ public static void unsetCameraType() { if (config.animationEnabled) { CameraAnimation.INSTANCE.onAnimationComplete = () -> { getMC().options.setCameraType(previousCameraType); - Constants.LOG.info("Resetting cameraType={}", previousCameraType); + Constants.LOG.debug("Resetting cameraType={}", previousCameraType); previousCameraType = null; }; } else { @@ -43,7 +44,7 @@ public static void unsetCameraType() { } public static void init() { - Constants.LOG.info("Hello from Common init on {}! we are currently in a {} environment!", Services.PLATFORM.getPlatformName(), Services.PLATFORM.getEnvironmentName()); + Constants.LOG.debug("Hello from Common init on {}! we are currently in a {} environment!", Services.PLATFORM.getPlatformName(), Services.PLATFORM.getEnvironmentName()); } public static void preTick(Minecraft mc) { diff --git a/common/src/main/java/me/collinb/dynamicview/CameraAnimation.java b/common/src/main/java/me/collinb/dynamicview/camera/CameraAnimation.java similarity index 95% rename from common/src/main/java/me/collinb/dynamicview/CameraAnimation.java rename to common/src/main/java/me/collinb/dynamicview/camera/CameraAnimation.java index 047598a..05455fa 100644 --- a/common/src/main/java/me/collinb/dynamicview/CameraAnimation.java +++ b/common/src/main/java/me/collinb/dynamicview/camera/CameraAnimation.java @@ -1,9 +1,9 @@ -package me.collinb.dynamicview; +package me.collinb.dynamicview.camera; import me.collinb.dynamicview.config.ModConfig; import me.shedaniel.autoconfig.AutoConfig; -public class CameraAnimation { +public final class CameraAnimation { public static CameraAnimation INSTANCE = new CameraAnimation(); private final ModConfig config; diff --git a/common/src/main/java/me/collinb/dynamicview/config/ConfigScreen.java b/common/src/main/java/me/collinb/dynamicview/config/ConfigScreen.java deleted file mode 100644 index 80d9812..0000000 --- a/common/src/main/java/me/collinb/dynamicview/config/ConfigScreen.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.collinb.dynamicview.config; - -public final class ConfigScreen { -} diff --git a/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java b/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java index eed85f7..d107be7 100644 --- a/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java +++ b/common/src/main/java/me/collinb/dynamicview/config/ModConfig.java @@ -6,7 +6,9 @@ import me.shedaniel.autoconfig.ConfigHolder; import me.shedaniel.autoconfig.annotation.Config; import me.shedaniel.autoconfig.annotation.ConfigEntry; +import me.shedaniel.autoconfig.annotation.ConfigEntry.Gui.EnumHandler.EnumDisplayOption; import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; +import net.minecraft.client.CameraType; @Config(name = Constants.MOD_ID) public class ModConfig implements ConfigData { @@ -15,16 +17,32 @@ public static void init() { } @ConfigEntry.Gui.CollapsibleObject - public EnabledContexts enabledContexts = new EnabledContexts(); + public Contexts contexts = new Contexts(); + + public static class Contexts { + public boolean swimmingEnabled = true; + @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) + public CameraType swimmingCamera = CameraType.THIRD_PERSON_BACK; + + public boolean crawlingEnabled = true; + @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) + public CameraType crawlingCamera = CameraType.FIRST_PERSON; + + public boolean flyingEnabled = true; + @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) + public CameraType flyingCamera = CameraType.THIRD_PERSON_BACK; + + public boolean ridingEnabled = true; + @ConfigEntry.Gui.EnumHandler(option = EnumDisplayOption.BUTTON) + public CameraType ridingCamera = CameraType.THIRD_PERSON_BACK; - public static class EnabledContexts { - public boolean swimming = true; - public boolean crawling = true; - public boolean flying = true; - public boolean riding = true; } public boolean animationEnabled = true; + + @ConfigEntry.BoundedDiscrete(min = 0, max = 10) public float animationEnterEasing = 0.2f; + + @ConfigEntry.BoundedDiscrete(min = 0, max = 10) public float animationExitEasing = 0.6f; } diff --git a/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java b/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java index 001fdbe..7d560dc 100644 --- a/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java +++ b/common/src/main/java/me/collinb/dynamicview/mixin/CameraMixin.java @@ -1,7 +1,7 @@ package me.collinb.dynamicview.mixin; -import me.collinb.dynamicview.CameraAnimation; import me.collinb.dynamicview.DynamicView; +import me.collinb.dynamicview.camera.CameraAnimation; import me.collinb.dynamicview.config.ModConfig; import me.shedaniel.autoconfig.AutoConfig; import net.minecraft.client.Camera; diff --git a/common/src/main/java/me/collinb/dynamicview/mixin/EntityAccessor.java b/common/src/main/java/me/collinb/dynamicview/mixin/EntityAccessor.java index 23833d2..46f9092 100644 --- a/common/src/main/java/me/collinb/dynamicview/mixin/EntityAccessor.java +++ b/common/src/main/java/me/collinb/dynamicview/mixin/EntityAccessor.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(Entity.class) -public class EntityAccessor { +public abstract class EntityAccessor { @Shadow @Final protected static EntityDataAccessor DATA_POSE; diff --git a/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java b/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java index 75d9a18..7d5a989 100644 --- a/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java +++ b/common/src/main/java/me/collinb/dynamicview/mixin/LocalPlayerMixin.java @@ -3,7 +3,6 @@ import me.collinb.dynamicview.DynamicView; import me.collinb.dynamicview.config.ModConfig; import me.shedaniel.autoconfig.AutoConfig; -import net.minecraft.client.CameraType; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.world.entity.Entity; @@ -16,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LocalPlayer.class) -public class LocalPlayerMixin { +public abstract class LocalPlayerMixin { @Unique private boolean dynamicView$wasSwimming = false; @@ -24,15 +23,15 @@ public class LocalPlayerMixin { @Inject(method = "startRiding", at = @At("TAIL")) private void startRiding(Entity p_108667_, boolean p_108668_, boolean p_435382_, CallbackInfoReturnable cir) { ModConfig config = AutoConfig.getConfigHolder(ModConfig.class).get(); - if (config.enabledContexts.riding) { - DynamicView.setCameraType(CameraType.THIRD_PERSON_BACK); + if (config.contexts.ridingEnabled) { + DynamicView.setCameraType(config.contexts.ridingCamera); } } @Inject(method = "removeVehicle", at = @At("TAIL")) private void removeVehicle(CallbackInfo ci) { ModConfig config = AutoConfig.getConfigHolder(ModConfig.class).get(); - if (config.enabledContexts.riding) { + if (config.contexts.ridingEnabled) { DynamicView.unsetCameraType(); } } @@ -46,15 +45,15 @@ private void updatePose(EntityDataAccessor pKey, CallbackInfo ci) { LocalPlayer player = (LocalPlayer) (Object) this; if (player.getPose() == Pose.SWIMMING) { - if (player.isSwimming() && config.enabledContexts.swimming) { - DynamicView.setCameraType(CameraType.THIRD_PERSON_BACK); + if (player.isInWater() && config.contexts.swimmingEnabled) { + DynamicView.setCameraType(config.contexts.swimmingCamera); dynamicView$wasSwimming = true; - } else if (config.enabledContexts.crawling) { - DynamicView.setCameraType(CameraType.THIRD_PERSON_BACK); + } else if (!player.isInWater() && config.contexts.crawlingEnabled) { + DynamicView.setCameraType(config.contexts.crawlingCamera); dynamicView$wasSwimming = true; } - } else if (player.getPose() == Pose.FALL_FLYING && config.enabledContexts.flying) { - DynamicView.setCameraType(CameraType.THIRD_PERSON_BACK); + } else if (player.getPose() == Pose.FALL_FLYING && config.contexts.flyingEnabled) { + DynamicView.setCameraType(config.contexts.flyingCamera); dynamicView$wasSwimming = true; } else if (dynamicView$wasSwimming) { DynamicView.unsetCameraType(); diff --git a/common/src/main/java/me/collinb/dynamicview/mixin/MinecraftMixin.java b/common/src/main/java/me/collinb/dynamicview/mixin/MinecraftMixin.java deleted file mode 100644 index 8bcc8a0..0000000 --- a/common/src/main/java/me/collinb/dynamicview/mixin/MinecraftMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package me.collinb.dynamicview.mixin; - -import me.collinb.dynamicview.Constants; -import net.minecraft.client.Minecraft; -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; - -@Mixin(Minecraft.class) -public class MinecraftMixin { - - @Inject(at = @At("TAIL"), method = "") - private void init(CallbackInfo info) { - Constants.LOG.info("This line is printed by the DynamicView common mixin!"); - Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); - } -} diff --git a/common/src/main/resources/assets/dynamicview/lang/en_us.json b/common/src/main/resources/assets/dynamicview/lang/en_us.json index 4105eb3..44ded66 100644 --- a/common/src/main/resources/assets/dynamicview/lang/en_us.json +++ b/common/src/main/resources/assets/dynamicview/lang/en_us.json @@ -1,9 +1,13 @@ { - "text.autoconfig.dynamicview.option.enabledContexts": "Enabled Contexts", - "text.autoconfig.dynamicview.option.enabledContexts.swimming": "Swimming", - "text.autoconfig.dynamicview.option.enabledContexts.crawling": "Crawling", - "text.autoconfig.dynamicview.option.enabledContexts.flying": "Flying", - "text.autoconfig.dynamicview.option.enabledContexts.riding": "Riding", + "text.autoconfig.dynamicview.option.contexts": "Contexts", + "text.autoconfig.dynamicview.option.contexts.swimmingEnabled": "Swimming Enabled", + "text.autoconfig.dynamicview.option.contexts.swimmingCamera": "Swimming Camera", + "text.autoconfig.dynamicview.option.contexts.crawlingEnabled": "Crawling Enabled", + "text.autoconfig.dynamicview.option.contexts.crawlingCamera": "Crawling Camera", + "text.autoconfig.dynamicview.option.contexts.flyingEnabled": "Flying Enabled", + "text.autoconfig.dynamicview.option.contexts.flyingCamera": "Flying Camera", + "text.autoconfig.dynamicview.option.contexts.ridingEnabled": "Riding Enabled", + "text.autoconfig.dynamicview.option.contexts.ridingCamera": "Riding Camera", "text.autoconfig.dynamicview.option.animationEnabled": "Enable Zoom Animation", "text.autoconfig.dynamicview.option.animationEnterEasing": "Animation Enter Easing", "text.autoconfig.dynamicview.option.animationExitEasing": "Animation Exit Easing" diff --git a/common/src/main/resources/dynamicview.mixins.json b/common/src/main/resources/dynamicview.mixins.json index dc0228f..8e9f2f7 100644 --- a/common/src/main/resources/dynamicview.mixins.json +++ b/common/src/main/resources/dynamicview.mixins.json @@ -7,8 +7,7 @@ "client": [ "CameraMixin", "EntityAccessor", - "LocalPlayerMixin", - "MinecraftMixin" + "LocalPlayerMixin" ], "server": [], "injectors": { diff --git a/common/src/main/resources/icon.png b/common/src/main/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6208d69cf8dbd3c4f5bdd22082b1bba182e2db84 GIT binary patch literal 916 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>VD|HLaSW-L z^Y*TNc5t9XL!tK8tx;?Fy1dP;ISxAVT4l;wTXZhSb7jh7WDPGr$giMuS7yq&$feyL z4pvJz%06>v=bIf{^z-1|zY$WRYz*lP1qkAB?2~tm|DJ_e%%3@r>-kNqJtgxO ze0!e0hv|SM!yHB=qW6#8fhR{67S#Q}HMOAb*_V|Cc6Co8Ebjl?CwOjq-9NtPfB#J{ z_?PoE*5Z5xYlAU^1v3)C{a#X@_56F?mh-G<&dlNHpFgYTyP(lctNkI{{4Z2p{J4|h z?HPs#JPhaHMBbD4>?f}M+&*s~&vWzjcAU?*&tCn|CVF|f-MRM9Pp7&+{PXqj?uRyy zMUnJCbpK|YRNHiB_ILTNzWMtL*1f2B&mJI%>=Nu#JDh+Rx$PkDtHZ zeYaxn+}b)d>-t=8Z||G(E33}8g`p1Jn(rj>1U z`}BGHzx-v{di|&5dgLSmPAtFc>Xd)IjU9jC))1>a(DGVzzF_4o8SL_`fTGn zd+p}d{onI%y#5ok^!1-N_pfWCCMQXTI|}z4!@vGzx>@^u>-C3+?e@Rt3<*UfOfW0- s`V8iv()o!D|JwH-maW7{SHHRc?^rGzzfN=;Fq<)Wy85}Sb4q9e0KveTMF0Q* literal 0 HcmV?d00001 diff --git a/fabric/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java b/fabric/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java deleted file mode 100644 index b2e6282..0000000 --- a/fabric/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.collinb.dynamicview.mixin; - -import me.collinb.dynamicview.Constants; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.TitleScreen; -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; - -@Mixin(TitleScreen.class) -public class MixinTitleScreen { - - @Inject(at = @At("HEAD"), method = "init()V") - private void init(CallbackInfo info) { - Constants.LOG.info("This line is printed by the DynamicView mixin from Fabric!"); - Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); - } -} diff --git a/fabric/src/main/resources/dynamicview.fabric.mixins.json b/fabric/src/main/resources/dynamicview.fabric.mixins.json index e635a28..9f0dc84 100644 --- a/fabric/src/main/resources/dynamicview.fabric.mixins.json +++ b/fabric/src/main/resources/dynamicview.fabric.mixins.json @@ -5,9 +5,7 @@ "refmap": "${mod_id}.refmap.json", "compatibilityLevel": "JAVA_21", "mixins": [], - "client": [ - "MixinTitleScreen" - ], + "client": [], "server": [], "injectors": { "defaultRequire": 1 diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 9553858..5d938a4 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -12,7 +12,7 @@ "sources": "https://github.com/collin-b1/DynamicView" }, "license": "${license}", - "icon": "${mod_id}.png", + "icon": "icon.png", "environment": "*", "entrypoints": { "client": [ diff --git a/gradle.properties b/gradle.properties index 5060d0a..22c52bc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ group=me.collinb java_version=21 # Common minecraft_version=1.21.11 -mod_name=DynamicView +mod_name=Dynamic View mod_author=collin-b1 mod_id=dynamicview license=GPL-3.0 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 4eab637..7bcc18c 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -4,7 +4,7 @@ plugins { } dependencies { - compileOnly "me.shedaniel.cloth:cloth-config-neoforge:${cloth_config_version}" + implementation "me.shedaniel.cloth:cloth-config-neoforge:${cloth_config_version}" } neoForge { diff --git a/neoforge/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java b/neoforge/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java deleted file mode 100644 index a3009cf..0000000 --- a/neoforge/src/main/java/me/collinb/dynamicview/mixin/MixinTitleScreen.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.collinb.dynamicview.mixin; - -import me.collinb.dynamicview.Constants; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.TitleScreen; -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; - -@Mixin(TitleScreen.class) -public class MixinTitleScreen { - - @Inject(at = @At("HEAD"), method = "init()V") - private void init(CallbackInfo info) { - Constants.LOG.info("This line is printed by the DynamicView mixin from NeoForge!"); - Constants.LOG.info("MC Version: {}", Minecraft.getInstance().getVersionType()); - } -} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index a476356..cdd0a53 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -8,7 +8,7 @@ version = "${version}" #mandatory displayName = "${mod_name}" #mandatory #updateJSONURL="https://change.me.example.invalid/updates.json" #optional, see https://docs.neoforged.net/docs/misc/updatechecker/ #displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional, displayed in the mod UI -logoFile = "${mod_id}.png" #optional +logoFile = "icon.png" #optional credits = "${credits}" #optional authors = "${mod_author}" #optional description = '''${description}''' #mandatory Supports multiline text diff --git a/neoforge/src/main/resources/dynamicview.neoforge.mixins.json b/neoforge/src/main/resources/dynamicview.neoforge.mixins.json index fffc3f0..9ea9ca7 100644 --- a/neoforge/src/main/resources/dynamicview.neoforge.mixins.json +++ b/neoforge/src/main/resources/dynamicview.neoforge.mixins.json @@ -4,9 +4,7 @@ "package": "me.collinb.dynamicview.mixin", "compatibilityLevel": "JAVA_21", "mixins": [], - "client": [ - "MixinTitleScreen" - ], + "client": [], "server": [], "injectors": { "defaultRequire": 1 From d100a427f03149e91a9556abf2f9789544da1a0b Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 20:33:58 -0500 Subject: [PATCH 08/16] Fix workflow typo --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1027a90..d5a2b5f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,12 +3,12 @@ name: Build on: push: branches: - - 'main' + - 'master' tags: - 'v*' pull_request: branches: - - 'main' + - 'master' jobs: build: From f7ce879c16fa42e6e07c039ee796ebd7023ede67 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 20:40:43 -0500 Subject: [PATCH 09/16] Change build workflow Gradle setup --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5a2b5f..b385f13 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,8 +24,8 @@ jobs: distribution: 'temurin' java-version: 21 - - name: Grant execute permission for Gradle wrapper - run: chmod +x ./gradlew + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 - name: Build with Gradle run: ./gradlew build @@ -34,4 +34,5 @@ jobs: uses: actions/upload-artifact@v7 with: name: jars - path: build/libs/dynamicview-*.jar \ No newline at end of file + path: build/libs/dynamicview-*.jar + retention-days: 30 \ No newline at end of file From c09ba88569b689d69a7d1843c60ca1e43176c6f7 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 20:54:48 -0500 Subject: [PATCH 10/16] Change build workflow upload artifacts --- .github/workflows/ci.yml | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b385f13..80ec72c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,15 +24,28 @@ jobs: distribution: 'temurin' java-version: 21 + - name: Get data from gradle.properties + id: mod_data + uses: christian-draeger/read-properties@1.1.1 + with: + path: './gradle.properties' + properties: 'mod_id mod_version minecraft_version' + - name: Setup Gradle uses: gradle/actions/setup-gradle@v5 - name: Build with Gradle run: ./gradlew build - - name: Upload artifacts + - name: Upload Fabric build + uses: actions/upload-artifact@v7 + with: + name: ${steps.mod_data.outputs.mod_id}-fabric-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.mod_version}.jar + path: fabric/build/libs/${steps.mod_data.outputs.mod_id}-fabric-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.mod_version}.jar + retention-days: 90 + - name: Upload NeoForge build uses: actions/upload-artifact@v7 with: - name: jars - path: build/libs/dynamicview-*.jar - retention-days: 30 \ No newline at end of file + name: ${steps.mod_data.outputs.mod_id}-neoforge-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.mod_version}.jar + path: neoforge/build/libs/${steps.mod_data.outputs.mod_id}-neoforge-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.mod_version}.jar + retention-days: 90 \ No newline at end of file From 995148868c73565864b8b1b47c52b6e7257c20c7 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 21:00:26 -0500 Subject: [PATCH 11/16] Fix typo mod_version -> version --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80ec72c..224f94d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: uses: christian-draeger/read-properties@1.1.1 with: path: './gradle.properties' - properties: 'mod_id mod_version minecraft_version' + properties: 'mod_id version minecraft_version' - name: Setup Gradle uses: gradle/actions/setup-gradle@v5 @@ -40,12 +40,12 @@ jobs: - name: Upload Fabric build uses: actions/upload-artifact@v7 with: - name: ${steps.mod_data.outputs.mod_id}-fabric-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.mod_version}.jar - path: fabric/build/libs/${steps.mod_data.outputs.mod_id}-fabric-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.mod_version}.jar + name: ${steps.mod_data.outputs.mod_id}-fabric-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.version}.jar + path: fabric/build/libs/${steps.mod_data.outputs.mod_id}-fabric-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.version}.jar retention-days: 90 - name: Upload NeoForge build uses: actions/upload-artifact@v7 with: - name: ${steps.mod_data.outputs.mod_id}-neoforge-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.mod_version}.jar - path: neoforge/build/libs/${steps.mod_data.outputs.mod_id}-neoforge-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.mod_version}.jar + name: ${steps.mod_data.outputs.mod_id}-neoforge-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.version}.jar + path: neoforge/build/libs/${steps.mod_data.outputs.mod_id}-neoforge-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.version}.jar retention-days: 90 \ No newline at end of file From 24b4714dc11a902dbbcd272dd19129dafa30083c Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 21:11:17 -0500 Subject: [PATCH 12/16] Fabric build dependency change --- fabric/build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index ccaca99..1372688 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -11,11 +11,14 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" - modApi "com.terraformersmc:modmenu:${project.modmenu_version}" + modImplementation("com.terraformersmc:modmenu:${modmenu_version}") { + exclude module: "fabric-api" + } modApi("me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}") { exclude(group: "net.fabricmc.fabric-api") } + include "me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}" } loom { From fdc316b3a663a8e2b4e4a427339acd46efe10dc4 Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 21:14:27 -0500 Subject: [PATCH 13/16] Add space to mod name --- README.md | 4 ++-- common/src/main/java/me/collinb/dynamicview/Constants.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dba6ed8..bad1dbc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ DynamicView Icon -# DynamicView +# Dynamic View -DynamicView is a Fabric and NeoForge mod which automatically changes the player's perspective. It has configurable +Dynamic View is a Fabric and NeoForge mod which automatically changes the player's perspective. It has configurable contexts including: - Swimming diff --git a/common/src/main/java/me/collinb/dynamicview/Constants.java b/common/src/main/java/me/collinb/dynamicview/Constants.java index 017d17f..a399002 100644 --- a/common/src/main/java/me/collinb/dynamicview/Constants.java +++ b/common/src/main/java/me/collinb/dynamicview/Constants.java @@ -6,6 +6,6 @@ public class Constants { public static final String MOD_ID = "dynamicview"; - public static final String MOD_NAME = "DynamicView"; + public static final String MOD_NAME = "Dynamic View"; public static final Logger LOG = LoggerFactory.getLogger(MOD_NAME); } From 049fc41dabc8aa3a0a11f4089dd067098ed5a3df Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 21:19:01 -0500 Subject: [PATCH 14/16] Change repository order --- buildSrc/src/main/groovy/multiloader-common.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle index 8b7b8a5..2fd28c7 100644 --- a/buildSrc/src/main/groovy/multiloader-common.gradle +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -38,12 +38,12 @@ repositories { ) filter { includeGroup('org.parchmentmc.data') } } + maven { url "https://maven.shedaniel.me/" } + maven { url "https://maven.terraformersmc.com/releases/" } maven { name = 'BlameJared' url = 'https://maven.blamejared.com' } - maven { url "https://maven.shedaniel.me/" } - maven { url "https://maven.terraformersmc.com/releases/" } } // Declare capabilities on the outgoing configurations. From 3ce61a5d7522bb9c9591ce2d01d434597089f33f Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 21:35:02 -0500 Subject: [PATCH 15/16] Remove BlameJared repository --- buildSrc/src/main/groovy/multiloader-common.gradle | 4 ---- 1 file changed, 4 deletions(-) diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle index 2fd28c7..72b8575 100644 --- a/buildSrc/src/main/groovy/multiloader-common.gradle +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -40,10 +40,6 @@ repositories { } maven { url "https://maven.shedaniel.me/" } maven { url "https://maven.terraformersmc.com/releases/" } - maven { - name = 'BlameJared' - url = 'https://maven.blamejared.com' - } } // Declare capabilities on the outgoing configurations. From 2eda8ca7c2571187d91a4dcb94243e589a6be18f Mon Sep 17 00:00:00 2001 From: collin-b1 Date: Sat, 28 Feb 2026 21:52:05 -0500 Subject: [PATCH 16/16] Fix templating in build process --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 224f94d..109db4a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,12 +40,12 @@ jobs: - name: Upload Fabric build uses: actions/upload-artifact@v7 with: - name: ${steps.mod_data.outputs.mod_id}-fabric-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.version}.jar - path: fabric/build/libs/${steps.mod_data.outputs.mod_id}-fabric-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.version}.jar + name: ${{ steps.mod_data.outputs.mod_id }}-fabric-${{ steps.mod_data.outputs.minecraft_version }}-${{ steps.mod_data.outputs.version }}.jar + path: fabric/build/libs/${{ steps.mod_data.outputs.mod_id }}-fabric-${{ steps.mod_data.outputs.minecraft_version }}-${{ steps.mod_data.outputs.version }}.jar retention-days: 90 - name: Upload NeoForge build uses: actions/upload-artifact@v7 with: - name: ${steps.mod_data.outputs.mod_id}-neoforge-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.version}.jar - path: neoforge/build/libs/${steps.mod_data.outputs.mod_id}-neoforge-${steps.mod_data.outputs.minecraft_version}-${steps.mod_data.outputs.version}.jar + name: ${{ steps.mod_data.outputs.mod_id }}-neoforge-${{ steps.mod_data.outputs.minecraft_version }}-${{ steps.mod_data.outputs.version }}.jar + path: neoforge/build/libs/${{ steps.mod_data.outputs.mod_id }}-neoforge-${{ steps.mod_data.outputs.minecraft_version }}-${{ steps.mod_data.outputs.version }}.jar retention-days: 90 \ No newline at end of file