diff --git a/.gitignore b/.gitignore index 5e80e0a..c14be0d 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ addon.local.gradle.kts addon.late.local.gradle addon.late.local.gradle.kts layout.json + +# Generated D.TS files (rebuilt by gradle on every build) +src/main/resources/assets/npcgecko/api diff --git a/.gitmodules b/.gitmodules index d8252cb..52012b8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,7 @@ -[submodule "src/api"] - path = src/api - url = https://github.com/KAMKEEL/CustomNPC-Plus-API.git +[submodule "CustomNPC-Plus"] + path = CustomNPC-Plus + url = https://github.com/KAMKEEL/CustomNPC-Plus.git branch = dev +[submodule "GeckoLib"] + path = GeckoLib + url = https://github.com/Goodbird-git/Geckolib-Unofficial-1.7.10.git diff --git a/CustomNPC-Plus b/CustomNPC-Plus new file mode 160000 index 0000000..6bf33e4 --- /dev/null +++ b/CustomNPC-Plus @@ -0,0 +1 @@ +Subproject commit 6bf33e4296d555a28793658ae101145bc21d9b25 diff --git a/GeckoLib b/GeckoLib new file mode 160000 index 0000000..19da3e3 --- /dev/null +++ b/GeckoLib @@ -0,0 +1 @@ +Subproject commit 19da3e3fc07ce7fa6dcff0af62c8cb09f8bf12db diff --git a/build.gradle b/build.gradle index c14868b..dcec51b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,30 @@ plugins { id 'com.gtnewhorizons.gtnhconvention' + id 'dts.typescript-generator' } +apply from: 'gradle.submodules.gradle' + version = "1.3" -group= "com.goodbird.npcgecko" +group = "com.goodbird.npcgecko" + +// ============================================================================ +// TypeScript Definition Generation Task +// Generates .d.ts files from Java API sources for scripting IDE support +// ============================================================================ +tasks.named("generateTypeScriptDefinitions").configure { + sourceDirectories = ['src/main/java'] + outputDirectory = "src/main/resources/assets/${project.property("modId")}/api" + apiPackages = ['com.goodbird.npcgecko.api'] as Set + cleanOutputFirst = true + patchesDirectory = "dts-patches" + implementationPackages = [ + 'com.goodbird.npcgecko.data', + 'com.goodbird.npcgecko.entity', + 'com.goodbird.npcgecko.tile', + 'com.goodbird.npcgecko.client' + ] as Set +} +processResources.dependsOn generateTypeScriptDefinitions +sourcesJar.dependsOn generateTypeScriptDefinitions diff --git a/dependencies.gradle b/dependencies.gradle index 2b5dbd9..c6ca428 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,9 +34,9 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.5.4-GTNH:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.74-GTNH:dev") runtimeOnlyNonPublishable("curse.maven:Nashorn-374413:2924946") - implementation rfg.deobf(name: "CustomNPC-Plus-1.10.2") - implementation name: "geckolib3-1.0.4-beta" + // CustomNPC+ and GeckoLib are managed as submodule dependencies + // See gradle.submodules.gradle for details } diff --git a/gradle.properties b/gradle.properties index 859aa9f..9d0a507 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,11 +3,16 @@ modName = CustomNPC-Plus-Gecko-Addon # This is a case-sensitive string to identify your mod. Convention is to use lower case. modId = npcgecko modGroup = com.goodbird.npcgecko -modVersion = 1.1 +modVersion = 1.3 gtnh.modules.codeStyle=true gtnh.modules.gitVersion=false +# JVM args for Gradle daemon - increase for faster builds +org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=1g +org.gradle.parallel=true +org.gradle.caching=true + # Whether to use modGroup as the maven publishing group. # Due to a history of using JitPack, the default is com.github.GTNewHorizons for all mods. useModGroupForPublishing = false diff --git a/gradle.submodules.gradle b/gradle.submodules.gradle new file mode 100644 index 0000000..e349681 --- /dev/null +++ b/gradle.submodules.gradle @@ -0,0 +1,111 @@ +// ============================================================================ +// Submodule Dependency Management +// ============================================================================ +// Manages CustomNPC+ and GeckoLib as git submodule dependencies. +// +// How it works: +// - Both mods are git submodules built automatically alongside this mod +// - Their dev JARs are referenced as devOnlyNonPublishable dependencies +// - This means: available at COMPILE + RUNTIME, but NOT in the output JAR +// - ./gradlew build -> builds CNPC+ & GeckoLib first, then clean addon-only JAR +// - ./gradlew runClient -> builds CNPC+ & GeckoLib first, then runs with all on classpath +// +// First-time setup: +// ./gradlew initSubmodules (clones/updates submodules recursively) +// ============================================================================ + +def isWindows = System.getProperty('os.name').toLowerCase().contains('windows') + +// Resolve the gradlew executable for a submodule directory +def gradlewFor = { File submoduleDir -> + if (isWindows) { + return new File(submoduleDir, 'gradlew.bat').absolutePath + } else { + return new File(submoduleDir, 'gradlew').absolutePath + } +} + +// Helper: find the dev JAR in a submodule's build output (resolved at execution time) +def findDevJar = { String submoduleDir -> + def libsDir = file("${submoduleDir}/build/libs") + if (!libsDir.exists()) return [] + return libsDir.listFiles()?.findAll { it.name.endsWith('-dev.jar') && !it.name.contains('-preshadow') } ?: [] +} + +// ---- Submodule Init Task ---- +tasks.register('initSubmodules', Exec) { + group = 'submodules' + description = 'Initialize and update all git submodules recursively' + commandLine 'git', 'submodule', 'update', '--init', '--recursive' +} + +// Helper: clean old dev JARs from a submodule's build/libs before rebuilding +// Prevents stale JARs from different versions accumulating on the classpath +def cleanDevJars = { String submoduleDir -> + def libsDir = file("${submoduleDir}/build/libs") + if (libsDir.exists()) { + libsDir.listFiles()?.each { if (it.name.endsWith('.jar')) it.delete() } + } +} + +// ---- Build CustomNPC+ ---- +// Uses -Pnomixin to avoid embedding Mixin into the JAR (UniMixins provides it at runtime) +tasks.register('buildCNPC', Exec) { + group = 'submodules' + description = 'Builds CustomNPC+ dev JAR from submodule source (no embedded Mixin)' + workingDir file('CustomNPC-Plus') + + doFirst { cleanDevJars('CustomNPC-Plus') } + + def gradlew = gradlewFor(file('CustomNPC-Plus')) + if (isWindows) { + commandLine 'cmd', '/c', gradlew, 'build', '-Pnomixin', '-x', 'test' + } else { + commandLine gradlew, 'build', '-Pnomixin', '-x', 'test' + } + + // Gradle up-to-date checking + inputs.dir file('CustomNPC-Plus/src') + outputs.dir file('CustomNPC-Plus/build/libs') +} + +// ---- Build GeckoLib ---- +tasks.register('buildGeckoLib', Exec) { + group = 'submodules' + description = 'Builds GeckoLib dev JAR from submodule source' + workingDir file('GeckoLib') + + doFirst { cleanDevJars('GeckoLib') } + + def gradlew = gradlewFor(file('GeckoLib')) + if (isWindows) { + commandLine 'cmd', '/c', gradlew, 'build', '-x', 'test' + } else { + commandLine gradlew, 'build', '-x', 'test' + } + + // Gradle up-to-date checking + inputs.dir file('GeckoLib/src') + outputs.dir file('GeckoLib/build/libs') +} + +// ---- Convenience: build all submodules ---- +tasks.register('buildSubmodules') { + group = 'submodules' + description = 'Builds all submodule dev JARs' + dependsOn 'buildCNPC', 'buildGeckoLib' +} + +// ---- Auto-build: submodules compile before this mod ---- +tasks.named('compileJava').configure { + dependsOn 'buildCNPC', 'buildGeckoLib' +} + +// ---- Dependency Declarations ---- +// devOnlyNonPublishable = compile + runtime, but NOT in output JAR and NOT published +// Dev JARs are already deobfuscated (MCP names), so no rfg.deobf() needed +// Using lazy file resolution so JARs are found AFTER submodule build tasks execute +dependencies { + devOnlyNonPublishable files({ findDevJar('CustomNPC-Plus') }) + devOnlyNonPublishable files({ findDevJar('GeckoLib') }) +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e09..e2847c8 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.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/lib/CustomNPC-Plus-1.10.2.jar b/lib/CustomNPC-Plus-1.10.2.jar deleted file mode 100644 index 9b10418..0000000 Binary files a/lib/CustomNPC-Plus-1.10.2.jar and /dev/null differ diff --git a/lib/geckolib3-1.0.4-beta.jar b/lib/geckolib3-1.0.4-beta.jar deleted file mode 100644 index 28616a9..0000000 Binary files a/lib/geckolib3-1.0.4-beta.jar and /dev/null differ diff --git a/repositories.gradle b/repositories.gradle index 0113c66..3d8e0fb 100644 --- a/repositories.gradle +++ b/repositories.gradle @@ -1,7 +1,5 @@ -// Add any additional repositories for your dependencies here +// Additional repositories for dependencies +// Submodule dependencies (CustomNPC+, GeckoLib) are managed via gradle.submodules.gradle repositories { - flatDir { - dirs 'lib' - } } diff --git a/settings.gradle b/settings.gradle index 1e614a5..308dbe2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,6 +10,7 @@ pluginManagement { includeGroupByRegex("com\\.gtnewhorizons\\..+") } } + maven { url "https://jitpack.io" } gradlePluginPortal() mavenCentral() mavenLocal() @@ -17,5 +18,10 @@ pluginManagement { } plugins { - id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.15' + id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.27' +} + +// Include the D.TS generator plugin from CustomNPC+ submodule +if (file('CustomNPC-Plus/gradle-plugins/settings.gradle').exists()) { + includeBuild 'CustomNPC-Plus/gradle-plugins' } diff --git a/src/main/java/com/goodbird/npcgecko/client/renderer/RenderCustomModel.java b/src/main/java/com/goodbird/npcgecko/client/renderer/RenderCustomModel.java index 29008ae..72d0624 100644 --- a/src/main/java/com/goodbird/npcgecko/client/renderer/RenderCustomModel.java +++ b/src/main/java/com/goodbird/npcgecko/client/renderer/RenderCustomModel.java @@ -143,7 +143,7 @@ public class RenderCustomModel extends GeoEntityRenderer { } @Override - protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + public ResourceLocation getEntityTexture(Entity p_110775_1_) { return super.getTextureLocation((EntityCustomModel) p_110775_1_); } }