From 81833f4a427c62bda38c33e28aee9a1928e916fe Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Mon, 1 Jul 2024 00:43:04 +0200 Subject: [PATCH 01/25] Testing out Manifold preprocessor for easier cross version compatibility. --- build.gradle | 42 ++++++++++++++++++- common/build.gradle | 2 +- .../java/me/pandamods/pandalib/PandaLib.java | 6 ++- .../api/config/holders/ConfigHolder.java | 6 ++- fabric/build.gradle | 8 ---- fabric/src/main/resources/fabric.mod.json | 2 +- forge/build.gradle | 8 ---- forge/src/main/resources/META-INF/mods.toml | 2 +- gradle.properties | 28 ++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- neoforge/build.gradle | 8 ---- .../resources/META-INF/neoforge.mods.toml | 8 ++-- settings.gradle | 39 ++++++++++++++++- versionProperties/1.20.5.properties | 28 +++++++++++++ versionProperties/1.21.properties | 28 +++++++++++++ 15 files changed, 161 insertions(+), 56 deletions(-) create mode 100644 versionProperties/1.20.5.properties create mode 100644 versionProperties/1.21.properties diff --git a/build.gradle b/build.gradle index 2b23159..e68b392 100644 --- a/build.gradle +++ b/build.gradle @@ -2,9 +2,32 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false id "com.github.johnrengelman.shadow" version "8.1.1" apply false + id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha" id "me.modmuss50.mod-publish-plugin" version "0.5.1" } +def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { + StringBuilder sb = new StringBuilder(); + + sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n"); + + for (int i = 0; i < AvailableVersion.size(); i++) { + String versionString = AvailableVersion[i].replace(".", "_"); + sb.append("MC_" + versionString + "=" + i.toString() + "\n"); + + if (versionIndex == i) + sb.append("MC_VER=" + i.toString() + "\n"); + } + + new File(projectDir, "build.properties").text = sb.toString() +} + +project.gradle.ext.getProperties().each { prop -> + rootProject.ext.set(prop.key, prop.value) +} + +writeBuildGradlePredefine(rootProject.availableVersions, rootProject.versionIndex) + architectury { minecraft = rootProject.minecraft_version } @@ -36,11 +59,28 @@ subprojects { officialMojangMappings() parchment "org.parchmentmc.data:parchment-${rootProject.parchment_version}@zip" } + + annotationProcessor("systems.manifold:manifold-preprocessor:${rootProject.manifold_version}") + } + + processResources { + def replaceProperties = [ + version: rootProject.version, + + compatible_fabricmc_versions: rootProject.compatible_fabricmc_versions, + compatible_forgemc_versions: rootProject.compatible_forgemc_versions, + ] + + inputs.properties replaceProperties + filesMatching(["fabric.mod.json", "META-INF/mods.toml", "META-INF/neoforge.mods.toml"]) { + expand replaceProperties + } } tasks.withType(JavaCompile).configureEach { options.encoding = "UTF-8" - options.release = 21 + options.release = rootProject.java_version as Integer + options.compilerArgs += ["-Xplugin:Manifold"] } java { diff --git a/common/build.gradle b/common/build.gradle index 50a7065..392f9b2 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,5 +1,5 @@ architectury { - common rootProject.enabled_platforms.split(",") + common rootProject.supported_modloaders.split(",") } loom { diff --git a/common/src/main/java/me/pandamods/pandalib/PandaLib.java b/common/src/main/java/me/pandamods/pandalib/PandaLib.java index d77d9a9..97df79d 100644 --- a/common/src/main/java/me/pandamods/pandalib/PandaLib.java +++ b/common/src/main/java/me/pandamods/pandalib/PandaLib.java @@ -28,6 +28,10 @@ public static void init() { } public static ResourceLocation ID(String path) { - return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); + #if MC_VER == MC_1_21 + return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); + #else + return new ResourceLocation(MOD_ID, path); + #endif } } diff --git a/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java b/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java index d78862d..037053f 100644 --- a/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java +++ b/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java @@ -44,7 +44,11 @@ public ConfigHolder(Class configClass, Config config) { this.logger = LoggerFactory.getLogger(config.modId() + " | Config"); this.gson = getNewDefault().buildGson(new GsonBuilder()).setPrettyPrinting().create(); - this.resourceLocation = ResourceLocation.fromNamespaceAndPath(config.modId(), config.name()); + #if MC_VER == MC_1_21 + this.resourceLocation = ResourceLocation.fromNamespaceAndPath(config.modId(), config.name()); + #else + this.resourceLocation = new ResourceLocation(config.modId(), config.name()); + #endif this.synchronize = config.synchronize(); if (this.load()) { diff --git a/fabric/build.gradle b/fabric/build.gradle index d055cab..ab66405 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -35,14 +35,6 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } } -processResources { - inputs.property 'version', rootProject.mod_version - - filesMatching('fabric.mod.json') { - expand version: rootProject.mod_version - } -} - shadowJar { configurations = [project.configurations.shadowCommon] archiveClassifier = "dev-shadow" diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index c38b7f9..1e44ec4 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -26,7 +26,7 @@ "depends": { "fabric": "*", "fabric-api": "*", - "minecraft": ">=1.21", + "minecraft": "${compatible_fabricmc_versions}", "architectury": "*" }, "custom": { diff --git a/forge/build.gradle b/forge/build.gradle index 5ce0e24..0d775e9 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -36,14 +36,6 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } } -processResources { - inputs.property 'version', rootProject.mod_version - - filesMatching('META-INF/mods.toml') { - expand version: rootProject.mod_version - } -} - shadowJar { configurations = [project.configurations.shadowCommon] archiveClassifier = "dev-shadow" diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 75240ad..92bafc1 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -22,7 +22,7 @@ side = "BOTH" [[dependencies.pandalib]] modId = "minecraft" mandatory = true -versionRange = "[1.21,)" +versionRange = "${compatible_forgemc_versions}" ordering = "NONE" side = "BOTH" diff --git a/gradle.properties b/gradle.properties index 6721e12..765b223 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,36 +1,24 @@ org.gradle.jvmargs = -Xmx2G org.gradle.parallel = true +game_version = 1.20.5 + +# Mod Info +mod_id = pandalib +mod_name = PandaLib +mod_description = "A multi purpose library with a Config API and a bit of utility code." + # Mod properties mod_version = 0.3 maven_group = me.pandamods archives_name = pandalib -enabled_platforms = fabric,neoforge - -# Minecraft properties -minecraft_version = 1.21 -parchment_version=1.21:2024.06.23 - -# Mod Loader Dependencies -fabric_loader_version = 0.15.11 -fabric_api_version = 0.100.4+1.21 - -forge_version = 51.0.18 - -neoforge_version = 21.0.42-beta # Publish Mods Properties is_dry_run = false -supported_game_version = 1.21 - -use_ranged_game_version = false -max_supported_game_version = latest - enable_fabric_publishing = true enable_forge_publishing = true enable_neoforge_publishing = true # Dependencies -architectury_version = 13.0.2 -modmenu_version = 11.0.1 \ No newline at end of file +manifold_version=2024.1.20 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a80b22c..a441313 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.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 847a7e1..3ba1dd7 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -35,14 +35,6 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } } -processResources { - inputs.property 'version', rootProject.mod_version - - filesMatching('META-INF/neoforge.mods.toml') { - expand version: rootProject.mod_version - } -} - shadowJar { configurations = [project.configurations.shadowCommon] archiveClassifier = "dev-shadow" diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index cbb94f3..d99114a 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[1,)" +loaderVersion = "*" license = "LGPL-3" issueTrackerURL="https://github.com/PandaDap2006/PandaLib/issues" showAsResourcePack=false @@ -15,21 +15,21 @@ description = "A multi purpose library with a Config API and a bit of utility co [[dependencies.pandalib]] modId = "neoforge" type = "required" -versionRange = "[20.5.21-beta,)" +versionRange = "*" ordering = "NONE" side = "BOTH" [[dependencies.pandalib]] modId = "minecraft" type = "required" -versionRange = "[1.21,)" +versionRange = "${compatible_forgemc_versions}" ordering = "NONE" side = "BOTH" [[dependencies.pandalib]] modId = "architectury" type = "required" -versionRange = "[13,)" +versionRange = "*" ordering = "AFTER" side = "BOTH" diff --git a/settings.gradle b/settings.gradle index 9d18cae..a456668 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,9 +7,46 @@ pluginManagement { } } +def loadProperties() { + String defaultVersion = "1.21" + + List availableVersions = fileTree("versionProperties").files.name + for (int i = 0; i < availableVersions.size(); i++) { + availableVersions[i] = availableVersions[i].replaceAll("\\.properties", "") + } + + availableVersions.sort() + println "Avalible Minecraft versions: ${availableVersions}" + + String selectedVersion = "" + int versionIndex = -1 + println "Avalible MC versions: ${availableVersions}" + if (hasProperty("game_version")) { + selectedVersion = game_version + versionIndex = availableVersions.indexOf(game_version) + } + if (versionIndex == -1) { + println "No 'game_version' set or the set 'game_version' is invalid! Defaulting to ${defaultVersion}." + selectedVersion = defaultVersion + versionIndex = availableVersions.indexOf(defaultVersion) + assert versionIndex != -1 + } + + println "Loading properties file at " + selectedVersion + ".properties" + var properties = new Properties() + properties.load(new FileInputStream("${rootDir}/versionProperties/${selectedVersion}.properties")) + + properties.each { prop -> + gradle.ext.set(prop.key, prop.value) + } + gradle.ext.availableVersions = availableVersions + gradle.ext.versionIndex = versionIndex +} +loadProperties() + rootProject.name = "PandaLib" include("common") include("fabric") //include("forge") -include("neoforge") \ No newline at end of file +include("neoforge") diff --git a/versionProperties/1.20.5.properties b/versionProperties/1.20.5.properties new file mode 100644 index 0000000..5d46c9e --- /dev/null +++ b/versionProperties/1.20.5.properties @@ -0,0 +1,28 @@ +java_version = 21 + +# Mod properties +supported_modloaders = fabric,neoforge + +compatible_fabricmc_versions = >=1.20.5 <1.21 +compatible_forgemc_versions = [1.20.5,1.21) + +# Minecraft properties +minecraft_version = 1.20.5 +parchment_version=1.20.6:2024.06.16 + +# Mod Loader Dependencies +fabric_loader_version = 0.15.11 +fabric_api_version = 0.97.8+1.20.5 + +forge_version = 51.0.18 +neoforge_version = 20.5.21-beta + +# Dependencies +architectury_version = 12.0.28 +modmenu_version = 10.0.0 + +# Publish Mods Properties +supported_game_version = 1.20.5 + +use_ranged_game_version = true +max_supported_game_version = 1.20.6 diff --git a/versionProperties/1.21.properties b/versionProperties/1.21.properties new file mode 100644 index 0000000..a05f8c6 --- /dev/null +++ b/versionProperties/1.21.properties @@ -0,0 +1,28 @@ +java_version = 21 + +# Mod properties +supported_modloaders = fabric,neoforge + +compatible_fabricmc_versions = >=1.21 +compatible_forgemc_versions = [1.21,) + +# Minecraft properties +minecraft_version = 1.21 +parchment_version=1.21:2024.06.23 + +# Mod Loader Dependencies +fabric_loader_version = 0.15.11 +fabric_api_version = 0.100.4+1.21 + +forge_version = 51.0.18 +neoforge_version = 21.0.42-beta + +# Dependencies +architectury_version = 13.0.2 +modmenu_version = 11.0.1 + +# Publish Mods Properties +supported_game_version = 1.21 + +use_ranged_game_version = false +max_supported_game_version = latest From abfa503fb8eb60842a0cda77af5be5ee13aa60dd Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Mon, 1 Jul 2024 17:40:24 +0200 Subject: [PATCH 02/25] Add JSON properties loader and improve dependencies Added a JSON properties loader in build.gradle to read mod properties from JSON. This also enhances the mod project structure by relocating mod dependencies to the 'gradleConfigs' directory. Modified versionProperties files and mod metadata files to improve clarity and flexibility. --- .gitignore | 3 +- build.gradle | 28 ++++++++++- .../resources/{ => assets/pandalib}/icon.png | Bin fabric/build.gradle | 6 ++- fabric/src/main/resources/fabric.mod.json | 8 ++-- forge/build.gradle | 2 + forge/src/main/resources/META-INF/mods.toml | 13 +++-- gradle.properties | 45 ++++++++++-------- gradle.properties.json | 20 ++++++++ gradleConfigs/DependencyHelper.gradle | 33 +++++++++++++ neoforge/build.gradle | 19 ++++++++ .../resources/META-INF/neoforge.mods.toml | 6 +-- versionProperties/1.20.5.properties | 8 ++-- versionProperties/1.21.properties | 8 ++-- 14 files changed, 152 insertions(+), 47 deletions(-) rename common/src/main/resources/{ => assets/pandalib}/icon.png (100%) create mode 100644 gradle.properties.json create mode 100644 gradleConfigs/DependencyHelper.gradle diff --git a/.gitignore b/.gitignore index ccb0c56..e12438a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ classes/ .metadata .vscode .settings -*.launch \ No newline at end of file +*.launch +build.properties \ No newline at end of file diff --git a/build.gradle b/build.gradle index e68b392..7a12387 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,7 @@ +import com.google.gson.Gson +import com.google.gson.JsonObject +import com.google.gson.JsonPrimitive + plugins { id "architectury-plugin" version "3.4-SNAPSHOT" id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false @@ -6,6 +10,25 @@ plugins { id "me.modmuss50.mod-publish-plugin" version "0.5.1" } +def loadJsonProperties() { + File jsonPropertiesFile = file("${rootDir}/gradle.properties.json") + if (jsonPropertiesFile.exists()) { + JsonObject properties = new Gson().fromJson(jsonPropertiesFile.text, JsonObject.class) + + properties.entrySet().each {entry -> + def key = entry.getKey() + def value = entry.getValue() + + if(value instanceof JsonObject){ + gradle.ext.set(key, value) + } else if(value instanceof JsonPrimitive){ + gradle.ext.set(key, value.asString) + } + } + } +} +loadJsonProperties() + def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { StringBuilder sb = new StringBuilder(); @@ -65,7 +88,10 @@ subprojects { processResources { def replaceProperties = [ - version: rootProject.version, + version: rootProject.mod_version, + id: rootProject.archives_name, + name: rootProject.mod_name, + description: rootProject.mod_description, compatible_fabricmc_versions: rootProject.compatible_fabricmc_versions, compatible_forgemc_versions: rootProject.compatible_forgemc_versions, diff --git a/common/src/main/resources/icon.png b/common/src/main/resources/assets/pandalib/icon.png similarity index 100% rename from common/src/main/resources/icon.png rename to common/src/main/resources/assets/pandalib/icon.png diff --git a/fabric/build.gradle b/fabric/build.gradle index ab66405..22b33a4 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -2,6 +2,8 @@ plugins { id "com.github.johnrengelman.shadow" } +apply from: rootProject.file("gradleConfigs/DependencyHelper.gradle") + architectury { platformSetupLoomIde() fabric() @@ -29,12 +31,12 @@ dependencies { modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" - modApi("com.terraformersmc:modmenu:${rootProject.modmenu_version}") - common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } } +addModApi(rootProject.modmenu, "com.terraformersmc:modmenu:${rootProject.modmenu_version}") + shadowJar { configurations = [project.configurations.shadowCommon] archiveClassifier = "dev-shadow" diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 1e44ec4..ada4eae 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,13 +1,13 @@ { "schemaVersion": 1, - "id": "pandalib", + "id": "${id}", "version": "${version}", - "name": "PandaLib", - "description": "A multi purpose library with a Config API and a bit of utility code. More features planned", + "name": "${name}", + "description": "${description}", "authors": [ "The Panda Oliver" ], - "icon": "icon.png", + "icon": "assets/pandalib/icon.png", "contact": { "issues": "https://github.com/PandaDap2006/PandaLib/issues", "sources": "https://github.com/PandaDap2006/PandaLib" diff --git a/forge/build.gradle b/forge/build.gradle index 0d775e9..670000a 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -2,6 +2,8 @@ plugins { id "com.github.johnrengelman.shadow" } +apply from: rootProject.file("gradleConfigs/DependencyHelper.gradle") + architectury { platformSetupLoomIde() forge() diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 92bafc1..a9094d5 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,21 +1,20 @@ modLoader = "javafml" -loaderVersion = "[51,)" +loaderVersion = "*" license = "LGPL-3" issueTrackerURL="https://github.com/PandaDap2006/PandaLib/issues" -showAsResourcePack=false [[mods]] modId = "pandalib" version = "${version}" -displayName = "PandaLib" +displayName = "${name}" authors = "The Panda Oliver" -logoFile = "icon.png" -description = "A multi purpose library with a Config API and a bit of utility code. More features planned" +logoFile = "assets/pandalib/icon.png" +description = "${description}" [[dependencies.pandalib]] modId = "forge" mandatory = true -versionRange = "[51,)" +versionRange = "*" ordering = "NONE" side = "BOTH" @@ -29,6 +28,6 @@ side = "BOTH" [[dependencies.pandalib]] modId = "architectury" mandatory = true -versionRange = "[13,)" +versionRange = "*" ordering = "AFTER" side = "BOTH" \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 765b223..2f8c5db 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,24 +1,27 @@ org.gradle.jvmargs = -Xmx2G org.gradle.parallel = true -game_version = 1.20.5 - -# Mod Info -mod_id = pandalib -mod_name = PandaLib -mod_description = "A multi purpose library with a Config API and a bit of utility code." - -# Mod properties -mod_version = 0.3 -maven_group = me.pandamods -archives_name = pandalib - -# Publish Mods Properties -is_dry_run = false - -enable_fabric_publishing = true -enable_forge_publishing = true -enable_neoforge_publishing = true - -# Dependencies -manifold_version=2024.1.20 \ No newline at end of file +#game_version = 1.20.5 +# +## Mod Info +#mod_name = PandaLib +#mod_description = A multipurpose library with a Config API and a bit of utility code. +# +## Mod properties +#mod_version = 0.3 +#maven_group = me.pandamods +#archives_name = pandalib +# +## Publish Mods Properties +#is_dry_run = false +# +#enable_fabric_publishing = true +#enable_forge_publishing = true +#enable_neoforge_publishing = true +# +## Dependencies +#manifold_version = 2024.1.20 +# +## Mod Dependencies Settings +## Fabric +#modmenu = 2 \ No newline at end of file diff --git a/gradle.properties.json b/gradle.properties.json new file mode 100644 index 0000000..a054618 --- /dev/null +++ b/gradle.properties.json @@ -0,0 +1,20 @@ +{ + "game_version": "1.21", + + "mod_name": "PandaLib", + "mod_description": "A multipurpose library with a Config API and a bit of utility code.", + + "mod_version": "0.3", + "maven_group": "me.pandamods", + "archives_name": "pandalib", + + "is_dry_run": false, + + "enable_fabric_publishing": true, + "enable_forge_publishing": true, + "enable_neoforge_publishing": true, + + "manifold_version": "2024.1.20", + + "modmenu": 2 +} \ No newline at end of file diff --git a/gradleConfigs/DependencyHelper.gradle b/gradleConfigs/DependencyHelper.gradle new file mode 100644 index 0000000..cd7e674 --- /dev/null +++ b/gradleConfigs/DependencyHelper.gradle @@ -0,0 +1,33 @@ +project.ext.addMod = { param, String path -> + switch(param as int){ + case 1: + project.dependencies { + add('modCompileOnly', path) + } + break + case 2: + project.dependencies { + add('modImplementation', path) + } + break + default: + println("Invalid Parameter") + } +} + +project.ext.addModApi = { param, String path -> + switch(param as int){ + case 1: + project.dependencies { + add('modCompileOnlyApi', path) + } + break + case 2: + project.dependencies { + add('modApi', path) + } + break + default: + println("Invalid Parameter") + } +} \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 3ba1dd7..f99f3af 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -2,6 +2,8 @@ plugins { id "com.github.johnrengelman.shadow" } +apply from: rootProject.file("gradleConfigs/DependencyHelper.gradle") + architectury { platformSetupLoomIde() neoForge() @@ -35,6 +37,23 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } } +processResources { + def replaceProperties = [ + version: rootProject.version, + id: rootProject.archives_name, + name: rootProject.mod_name, + description: rootProject.mod_description, + + compatible_fabricmc_versions: rootProject.compatible_fabricmc_versions, + compatible_forgemc_versions: rootProject.compatible_forgemc_versions, + ] + + inputs.properties replaceProperties + filesMatching(["META-INF/neoforge.mods.toml"]) { + expand replaceProperties + } +} + shadowJar { configurations = [project.configurations.shadowCommon] archiveClassifier = "dev-shadow" diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index d99114a..44a2d84 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -7,10 +7,10 @@ showAsResourcePack=false [[mods]] modId = "pandalib" version = "${version}" -displayName = "PandaLib" +displayName = "${name}" authors = "The Panda Oliver" -logoFile = "icon.png" -description = "A multi purpose library with a Config API and a bit of utility code. More features planned" +logoFile = "assets/pandalib/icon.png" +description = "${description}" [[dependencies.pandalib]] modId = "neoforge" diff --git a/versionProperties/1.20.5.properties b/versionProperties/1.20.5.properties index 5d46c9e..1efda8d 100644 --- a/versionProperties/1.20.5.properties +++ b/versionProperties/1.20.5.properties @@ -17,12 +17,12 @@ fabric_api_version = 0.97.8+1.20.5 forge_version = 51.0.18 neoforge_version = 20.5.21-beta -# Dependencies -architectury_version = 12.0.28 -modmenu_version = 10.0.0 - # Publish Mods Properties supported_game_version = 1.20.5 use_ranged_game_version = true max_supported_game_version = 1.20.6 + +# Mod Dependencies +architectury_version = 12.0.28 +modmenu_version = 10.0.0 diff --git a/versionProperties/1.21.properties b/versionProperties/1.21.properties index a05f8c6..63e6641 100644 --- a/versionProperties/1.21.properties +++ b/versionProperties/1.21.properties @@ -17,12 +17,12 @@ fabric_api_version = 0.100.4+1.21 forge_version = 51.0.18 neoforge_version = 21.0.42-beta -# Dependencies -architectury_version = 13.0.2 -modmenu_version = 11.0.1 - # Publish Mods Properties supported_game_version = 1.21 use_ranged_game_version = false max_supported_game_version = latest + +# Mod Dependencies +architectury_version = 13.0.2 +modmenu_version = 11.0.1 \ No newline at end of file From 590b202e2f75ebe29516b9b56f184bec5bd571fa Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Mon, 1 Jul 2024 23:59:15 +0200 Subject: [PATCH 03/25] Refactor property loading into separate Gradle script The changes consolidate redundant property loading code into a new 'PropertiesHelper' Gradle script. It's now a separate function that is included and invoked in 'build.gradle'. Additionally, the 'game_version' was updated to 'latest', and previously commented-out properties in 'gradle.properties' were uncommented. --- build.gradle | 45 +---------------------- gradle.properties | 48 ++++++++++++------------ gradle.properties.json | 2 +- gradleConfigs/PropertiesHelper.gradle | 53 +++++++++++++++++++++++++++ settings.gradle | 38 +------------------ 5 files changed, 81 insertions(+), 105 deletions(-) create mode 100644 gradleConfigs/PropertiesHelper.gradle diff --git a/build.gradle b/build.gradle index 7a12387..12e1164 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,3 @@ -import com.google.gson.Gson -import com.google.gson.JsonObject -import com.google.gson.JsonPrimitive - plugins { id "architectury-plugin" version "3.4-SNAPSHOT" id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false @@ -10,46 +6,9 @@ plugins { id "me.modmuss50.mod-publish-plugin" version "0.5.1" } -def loadJsonProperties() { - File jsonPropertiesFile = file("${rootDir}/gradle.properties.json") - if (jsonPropertiesFile.exists()) { - JsonObject properties = new Gson().fromJson(jsonPropertiesFile.text, JsonObject.class) - - properties.entrySet().each {entry -> - def key = entry.getKey() - def value = entry.getValue() - - if(value instanceof JsonObject){ - gradle.ext.set(key, value) - } else if(value instanceof JsonPrimitive){ - gradle.ext.set(key, value.asString) - } - } - } -} -loadJsonProperties() - -def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { - StringBuilder sb = new StringBuilder(); - - sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n"); - - for (int i = 0; i < AvailableVersion.size(); i++) { - String versionString = AvailableVersion[i].replace(".", "_"); - sb.append("MC_" + versionString + "=" + i.toString() + "\n"); - - if (versionIndex == i) - sb.append("MC_VER=" + i.toString() + "\n"); - } - - new File(projectDir, "build.properties").text = sb.toString() -} - -project.gradle.ext.getProperties().each { prop -> - rootProject.ext.set(prop.key, prop.value) -} +apply from: rootProject.file("gradleConfigs/PropertiesHelper.gradle") -writeBuildGradlePredefine(rootProject.availableVersions, rootProject.versionIndex) +loadProperties(rootProject.game_version) architectury { minecraft = rootProject.minecraft_version diff --git a/gradle.properties b/gradle.properties index 2f8c5db..9a4abe3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,27 +1,27 @@ org.gradle.jvmargs = -Xmx2G org.gradle.parallel = true -#game_version = 1.20.5 -# -## Mod Info -#mod_name = PandaLib -#mod_description = A multipurpose library with a Config API and a bit of utility code. -# -## Mod properties -#mod_version = 0.3 -#maven_group = me.pandamods -#archives_name = pandalib -# -## Publish Mods Properties -#is_dry_run = false -# -#enable_fabric_publishing = true -#enable_forge_publishing = true -#enable_neoforge_publishing = true -# -## Dependencies -#manifold_version = 2024.1.20 -# -## Mod Dependencies Settings -## Fabric -#modmenu = 2 \ No newline at end of file +game_version = 1.20.5 + +# Mod Info +mod_name = PandaLib +mod_description = A multipurpose library with a Config API and a bit of utility code. + +# Mod properties +mod_version = 0.3 +maven_group = me.pandamods +archives_name = pandalib + +# Publish Mods Properties +is_dry_run = false + +enable_fabric_publishing = true +enable_forge_publishing = true +enable_neoforge_publishing = true + +# Dependencies +manifold_version = 2024.1.20 + +# Mod Dependencies Settings +# Fabric +modmenu = 2 \ No newline at end of file diff --git a/gradle.properties.json b/gradle.properties.json index a054618..b4015d1 100644 --- a/gradle.properties.json +++ b/gradle.properties.json @@ -1,5 +1,5 @@ { - "game_version": "1.21", + "game_version": "latest", "mod_name": "PandaLib", "mod_description": "A multipurpose library with a Config API and a bit of utility code.", diff --git a/gradleConfigs/PropertiesHelper.gradle b/gradleConfigs/PropertiesHelper.gradle new file mode 100644 index 0000000..000397d --- /dev/null +++ b/gradleConfigs/PropertiesHelper.gradle @@ -0,0 +1,53 @@ +project.ext.loadProperties = { version -> + String defaultVersion = "1.21" + + List availableVersions = fileTree("versionProperties").files.name + for (int i = 0; i < availableVersions.size(); i++) { + availableVersions[i] = availableVersions[i].replaceAll("\\.properties", "") + } + + availableVersions.sort() + println "Avalible Minecraft versions: ${availableVersions}" + + String selectedVersion = "" + int versionIndex = -1 + println "Avalible MC versions: ${availableVersions}" + if (version instanceof String) { + selectedVersion = version as String + versionIndex = availableVersions.indexOf(version as String) + } + if (versionIndex == -1) { + println "No 'game_version' set or the set 'game_version' is invalid! Defaulting to ${defaultVersion}." + selectedVersion = defaultVersion + versionIndex = availableVersions.indexOf(defaultVersion) + assert versionIndex != -1 + } + + println "Loading properties file at " + selectedVersion + ".properties" + var properties = new Properties() + properties.load(new FileInputStream("${rootDir}/versionProperties/${selectedVersion}.properties")) + + properties.each { prop -> + project.ext.set(prop.key, prop.value) + } + project.ext.availableVersions = availableVersions + project.ext.versionIndex = versionIndex + + writeBuildGradlePredefine(availableVersions, versionIndex) +} + +def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { + StringBuilder sb = new StringBuilder(); + + sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n"); + + for (int i = 0; i < AvailableVersion.size(); i++) { + String versionString = AvailableVersion[i].replace(".", "_"); + sb.append("MC_" + versionString + "=" + i.toString() + "\n"); + + if (versionIndex == i) + sb.append("MC_VER=" + i.toString() + "\n"); + } + + new File(projectDir, "build.properties").text = sb.toString() +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index a456668..7b4289e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,46 +4,10 @@ pluginManagement { maven { url "https://maven.minecraftforge.net/" } maven { url "https://maven.architectury.dev/" } gradlePluginPortal() + mavenLocal() } } -def loadProperties() { - String defaultVersion = "1.21" - - List availableVersions = fileTree("versionProperties").files.name - for (int i = 0; i < availableVersions.size(); i++) { - availableVersions[i] = availableVersions[i].replaceAll("\\.properties", "") - } - - availableVersions.sort() - println "Avalible Minecraft versions: ${availableVersions}" - - String selectedVersion = "" - int versionIndex = -1 - println "Avalible MC versions: ${availableVersions}" - if (hasProperty("game_version")) { - selectedVersion = game_version - versionIndex = availableVersions.indexOf(game_version) - } - if (versionIndex == -1) { - println "No 'game_version' set or the set 'game_version' is invalid! Defaulting to ${defaultVersion}." - selectedVersion = defaultVersion - versionIndex = availableVersions.indexOf(defaultVersion) - assert versionIndex != -1 - } - - println "Loading properties file at " + selectedVersion + ".properties" - var properties = new Properties() - properties.load(new FileInputStream("${rootDir}/versionProperties/${selectedVersion}.properties")) - - properties.each { prop -> - gradle.ext.set(prop.key, prop.value) - } - gradle.ext.availableVersions = availableVersions - gradle.ext.versionIndex = versionIndex -} -loadProperties() - rootProject.name = "PandaLib" include("common") From 32678aa966976aafa1039ce26b094aa96db1b067 Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Tue, 2 Jul 2024 20:52:01 +0200 Subject: [PATCH 04/25] "Updated library to support multiple Minecraft versions" This commit enables multi-version support for the PandaLib mod library. It includes updates to the Gradle configurations, build settings, and includes significant code refactoring, including updating of conditionals, configurations, and method calls. Also, added some features like retrieving the game version during build-time and enhanced properties loading for the different versions. --- .gitignore | 1 + build.gradle | 84 ++++++++++++-- common/build.gradle | 2 +- .../java/me/pandamods/pandalib/PandaLib.java | 2 +- .../api/config/holders/ConfigHolder.java | 2 +- .../pandalib/api/util/NetworkHelper.java | 40 +++++-- .../pandalib/network/ConfigNetworking.java | 103 +++++++++++++----- .../packets/ClientConfigPacketData.java | 2 + .../packets/CommonConfigPacketData.java | 2 + .../main/resources/architectury.common.json | 1 + .../resources/pandalib-common.mixins.json | 1 - fabric/build.gradle | 8 +- fabric/src/main/resources/fabric.mod.json | 1 + .../src/main/resources/pandalib.mixins.json | 1 - forge/build.gradle | 9 +- .../pandalib/forge/PandaLibForge.java | 7 -- forge/src/main/resources/pandalib.mixins.json | 1 - gradle.properties | 3 +- gradle.properties.json | 20 ---- gradleConfigs/DependencyHelper.gradle | 33 ------ gradleConfigs/PropertiesHelper.gradle | 53 --------- neoforge/build.gradle | 24 +--- .../src/main/resources/pandalib.mixins.json | 1 - settings.gradle | 47 +++++++- versionProperties/1.19.2.properties | 27 +++++ versionProperties/1.20.5.properties | 4 +- versionProperties/1.20.properties | 25 +++++ versionProperties/1.21.properties | 3 - 28 files changed, 301 insertions(+), 206 deletions(-) delete mode 100644 gradle.properties.json delete mode 100644 gradleConfigs/DependencyHelper.gradle delete mode 100644 gradleConfigs/PropertiesHelper.gradle create mode 100644 versionProperties/1.19.2.properties create mode 100644 versionProperties/1.20.properties diff --git a/.gitignore b/.gitignore index e12438a..5124bdc 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ classes/ .vscode .settings *.launch +/.architectury-transformer/ build.properties \ No newline at end of file diff --git a/build.gradle b/build.gradle index 12e1164..43f002c 100644 --- a/build.gradle +++ b/build.gradle @@ -6,9 +6,27 @@ plugins { id "me.modmuss50.mod-publish-plugin" version "0.5.1" } -apply from: rootProject.file("gradleConfigs/PropertiesHelper.gradle") +def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { + StringBuilder sb = new StringBuilder(); -loadProperties(rootProject.game_version) + sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n"); + + for (int i = 0; i < AvailableVersion.size(); i++) { + String versionString = AvailableVersion[i].replace(".", "_"); + sb.append("MC_" + versionString + "=" + i.toString() + "\n"); + + if (versionIndex == i) + sb.append("MC_VER=" + i.toString() + "\n"); + } + + new File(projectDir, "build.properties").text = sb.toString() +} + +project.gradle.ext.getProperties().each { prop -> + rootProject.ext.set(prop.key, prop.value) +} + +writeBuildGradlePredefine(rootProject.availableVersions, rootProject.versionIndex) architectury { minecraft = rootProject.minecraft_version @@ -20,10 +38,45 @@ allprojects { } subprojects { + apply plugin: "com.github.johnrengelman.shadow" apply plugin: "dev.architectury.loom" apply plugin: "architectury-plugin" apply plugin: "maven-publish" + project.ext.addMod = { param, String path -> + switch(param as int){ + case 1: + project.dependencies { + add('modCompileOnly', path) + } + break + case 2: + project.dependencies { + add('modImplementation', path) + } + break + default: + println("Invalid Parameter") + } + } + + project.ext.addModApi = { param, String path -> + switch(param as int){ + case 1: + project.dependencies { + add('modCompileOnlyApi', path) + } + break + case 2: + project.dependencies { + add('modApi', path) + } + break + default: + println("Invalid Parameter") + } + } + base { archivesName = "${rootProject.archives_name}-${project.name}" } @@ -33,6 +86,17 @@ subprojects { name = "ParchmentMC" url = "https://maven.parchmentmc.org" } + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + } + filter { + includeGroup "maven.modrinth" + } + } } dependencies { @@ -43,17 +107,23 @@ subprojects { } annotationProcessor("systems.manifold:manifold-preprocessor:${rootProject.manifold_version}") + + if (rootProject.hasProperty("embed_joml") && rootProject.embed_joml == "true" && project != project(":common")) + include(implementation("org.joml:joml:${rootProject.joml_version}")) + else + implementation("org.joml:joml:${rootProject.joml_version}") } processResources { def replaceProperties = [ + java_version: rootProject.java_version, version: rootProject.mod_version, id: rootProject.archives_name, name: rootProject.mod_name, description: rootProject.mod_description, compatible_fabricmc_versions: rootProject.compatible_fabricmc_versions, - compatible_forgemc_versions: rootProject.compatible_forgemc_versions, + compatible_forgemc_versions: rootProject.compatible_forgemc_versions ] inputs.properties replaceProperties @@ -88,7 +158,7 @@ subprojects { } publishMods { - var using_ranged_game_version = Boolean.parseBoolean(rootProject.use_ranged_game_version) + var using_ranged_game_version = rootProject.hasProperty("latest_supported_game_version") var is_fabric_publishing_enabled = Boolean.parseBoolean(rootProject.enable_fabric_publishing) var is_forge_publishing_enabled = Boolean.parseBoolean(rootProject.enable_forge_publishing) var is_neoforge_publishing_enabled = Boolean.parseBoolean(rootProject.enable_neoforge_publishing) @@ -100,7 +170,7 @@ publishMods { changelog = rootProject.file("Changelog.md").text var supported_version_str = using_ranged_game_version ? - "${rootProject.supported_game_version}-${rootProject.max_supported_game_version}" : + "${rootProject.supported_game_version}-${rootProject.latest_supported_game_version}" : rootProject.supported_game_version discord { @@ -118,7 +188,7 @@ publishMods { if (using_ranged_game_version) minecraftVersionRange { start = rootProject.supported_game_version - end = rootProject.max_supported_game_version + end = rootProject.latest_supported_game_version } else minecraftVersions.add(rootProject.supported_game_version) @@ -140,7 +210,7 @@ publishMods { if (using_ranged_game_version) minecraftVersionRange { start = rootProject.supported_game_version - end = rootProject.max_supported_game_version + end = rootProject.latest_supported_game_version } else minecraftVersions.add(rootProject.supported_game_version) diff --git a/common/build.gradle b/common/build.gradle index 392f9b2..280cd77 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -3,7 +3,7 @@ architectury { } loom { -// accessWidenerPath = file("src/main/resources/pandalib.accesswidener") + accessWidenerPath = file("src/main/resources/pandalib.accesswidener") } dependencies { diff --git a/common/src/main/java/me/pandamods/pandalib/PandaLib.java b/common/src/main/java/me/pandamods/pandalib/PandaLib.java index 97df79d..405bca4 100644 --- a/common/src/main/java/me/pandamods/pandalib/PandaLib.java +++ b/common/src/main/java/me/pandamods/pandalib/PandaLib.java @@ -28,7 +28,7 @@ public static void init() { } public static ResourceLocation ID(String path) { - #if MC_VER == MC_1_21 + #if MC_VER >= MC_1_21 return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); #else return new ResourceLocation(MOD_ID, path); diff --git a/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java b/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java index 037053f..cbd66ff 100644 --- a/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java +++ b/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java @@ -44,7 +44,7 @@ public ConfigHolder(Class configClass, Config config) { this.logger = LoggerFactory.getLogger(config.modId() + " | Config"); this.gson = getNewDefault().buildGson(new GsonBuilder()).setPrettyPrinting().create(); - #if MC_VER == MC_1_21 + #if MC_VER >= MC_1_21 this.resourceLocation = ResourceLocation.fromNamespaceAndPath(config.modId(), config.name()); #else this.resourceLocation = new ResourceLocation(config.modId(), config.name()); diff --git a/common/src/main/java/me/pandamods/pandalib/api/util/NetworkHelper.java b/common/src/main/java/me/pandamods/pandalib/api/util/NetworkHelper.java index fa00184..370f1b9 100644 --- a/common/src/main/java/me/pandamods/pandalib/api/util/NetworkHelper.java +++ b/common/src/main/java/me/pandamods/pandalib/api/util/NetworkHelper.java @@ -15,22 +15,38 @@ import dev.architectury.networking.NetworkManager; import dev.architectury.platform.Platform; import dev.architectury.utils.Env; +import net.minecraft.resources.ResourceLocation; +#if MC_VER >= MC_1_20_5 import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +#endif public class NetworkHelper { - public static void registerS2C(CustomPacketPayload.Type packetType, StreamCodec codec, - NetworkManager.NetworkReceiver receiver) { - if (Platform.getEnvironment().equals(Env.SERVER)) { - NetworkManager.registerS2CPayloadType(packetType, codec); - } else { - NetworkManager.registerReceiver(NetworkManager.s2c(), packetType, codec, receiver); + #if MC_VER >= MC_1_20_5 + public static void registerS2C(CustomPacketPayload.Type packetType, + StreamCodec codec, + NetworkManager.NetworkReceiver receiver) { + if (Platform.getEnvironment().equals(Env.SERVER)) { + NetworkManager.registerS2CPayloadType(packetType, codec); + } else { + NetworkManager.registerReceiver(NetworkManager.s2c(), packetType, codec, receiver); + } } - } - public static void registerC2S(CustomPacketPayload.Type packetType, StreamCodec codec, - NetworkManager.NetworkReceiver receiver) { - NetworkManager.registerReceiver(NetworkManager.c2s(), packetType, codec, receiver); - } -} + public static void registerC2S(CustomPacketPayload.Type packetType, + StreamCodec codec, + NetworkManager.NetworkReceiver receiver) { + NetworkManager.registerReceiver(NetworkManager.c2s(), packetType, codec, receiver); + } + #else + public static void registerS2C(ResourceLocation id, NetworkManager.NetworkReceiver receiver) { + if (Platform.getEnvironment().equals(Env.CLIENT)) + NetworkManager.registerReceiver(NetworkManager.serverToClient(), id, receiver); + } + + public static void registerC2S(ResourceLocation id, NetworkManager.NetworkReceiver receiver) { + NetworkManager.registerReceiver(NetworkManager.clientToServer(), id, receiver); + } + #endif +} \ No newline at end of file diff --git a/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java b/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java index 94e8f8e..1551fa0 100644 --- a/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java +++ b/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java @@ -12,25 +12,37 @@ package me.pandamods.pandalib.network; -import dev.architectury.event.events.common.PlayerEvent; import dev.architectury.networking.NetworkManager; -import dev.architectury.platform.Platform; -import dev.architectury.utils.Env; +import io.netty.buffer.Unpooled; +import me.pandamods.pandalib.PandaLib; import me.pandamods.pandalib.api.config.ConfigData; import me.pandamods.pandalib.api.config.PandaLibConfig; import me.pandamods.pandalib.api.config.holders.ClientConfigHolder; import me.pandamods.pandalib.api.config.holders.CommonConfigHolder; import me.pandamods.pandalib.api.util.NetworkHelper; +#if MC_VER >= MC_1_20_5 import me.pandamods.pandalib.network.packets.ClientConfigPacketData; import me.pandamods.pandalib.network.packets.CommonConfigPacketData; +#endif +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; public class ConfigNetworking { + #if MC_VER <= MC_1_20 + public static final ResourceLocation CONFIG_PACKET = new ResourceLocation(PandaLib.MOD_ID, "config_sync"); + #endif + public static void registerPackets() { - NetworkHelper.registerS2C(CommonConfigPacketData.TYPE, CommonConfigPacketData.STREAM_CODEC, ConfigNetworking::CommonConfigReceiver); + #if MC_VER >= MC_1_20_5 + NetworkHelper.registerS2C(CommonConfigPacketData.TYPE, CommonConfigPacketData.STREAM_CODEC, ConfigNetworking::CommonConfigReceiver); + + NetworkHelper.registerC2S(ClientConfigPacketData.TYPE, ClientConfigPacketData.STREAM_CODEC, ConfigNetworking::ClientConfigReceiver); + #else + NetworkHelper.registerS2C(CONFIG_PACKET, ConfigNetworking::CommonConfigReceiver); - NetworkHelper.registerC2S(ClientConfigPacketData.TYPE, ClientConfigPacketData.STREAM_CODEC, ConfigNetworking::ClientConfigReceiver); + NetworkHelper.registerC2S(CONFIG_PACKET, ConfigNetworking::ClientConfigReceiver); + #endif } public static void SyncCommonConfigs(ServerPlayer serverPlayer) { @@ -41,7 +53,14 @@ public static void SyncCommonConfigs(ServerPlayer serverPlayer) { public static void SyncCommonConfig(ServerPlayer serverPlayer, CommonConfigHolder holder) { holder.logger.info("Sending common config '{}' to {}", holder.resourceLocation().toString(), serverPlayer.getDisplayName().getString()); - NetworkManager.sendToPlayer(serverPlayer, new CommonConfigPacketData(holder.resourceLocation().toString(), holder.getGson().toJson(holder.get()))); + #if MC_VER >= MC_1_20_5 + NetworkManager.sendToPlayer(serverPlayer, new CommonConfigPacketData(holder.resourceLocation().toString(), holder.getGson().toJson(holder.get()))); + #else + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeResourceLocation(holder.resourceLocation()); + byteBuf.writeUtf(holder.getGson().toJson(holder.get())); + NetworkManager.sendToPlayer(serverPlayer, CONFIG_PACKET, byteBuf); + #endif } public static void SyncClientConfigs() { @@ -52,28 +71,58 @@ public static void SyncClientConfigs() { public static void SyncClientConfig(ClientConfigHolder holder) { holder.logger.info("Sending client config '{}' to server", holder.resourceLocation().toString()); - NetworkManager.sendToServer(new ClientConfigPacketData(holder.resourceLocation().toString(), holder.getGson().toJson(holder.get()))); + #if MC_VER >= MC_1_20_5 + NetworkManager.sendToServer(new ClientConfigPacketData(holder.resourceLocation().toString(), holder.getGson().toJson(holder.get()))); + #else + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeResourceLocation(holder.resourceLocation()); + byteBuf.writeUtf(holder.getGson().toJson(holder.get())); + NetworkManager.sendToServer(CONFIG_PACKET, byteBuf); + #endif } - private static void ClientConfigReceiver(ClientConfigPacketData packetData, NetworkManager.PacketContext packetContext) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(packetData.resourceLocation()); - PandaLibConfig.getConfig(resourceLocation).ifPresent(configHolder -> { - if (configHolder instanceof ClientConfigHolder) { - configHolder.logger.info("Received client config '{}' from {}", - configHolder.resourceLocation().toString(), packetContext.getPlayer().getDisplayName().getString()); - packetContext.getPlayer().pandaLib$setConfig(configHolder.getGson() - .fromJson(packetData.configJson(), configHolder.getConfigClass())); - } - }); - } + #if MC_VER >= MC_1_20_5 + private static void ClientConfigReceiver(ClientConfigPacketData packetData, NetworkManager.PacketContext packetContext) { + ResourceLocation resourceLocation = ResourceLocation.tryParse(packetData.resourceLocation()); + PandaLibConfig.getConfig(resourceLocation).ifPresent(configHolder -> { + if (configHolder instanceof ClientConfigHolder) { + configHolder.logger.info("Received client config '{}' from {}", + configHolder.resourceLocation().toString(), packetContext.getPlayer().getDisplayName().getString()); + packetContext.getPlayer().pandaLib$setConfig(configHolder.getGson() + .fromJson(packetData.configJson(), configHolder.getConfigClass())); + } + }); + } - private static void CommonConfigReceiver(CommonConfigPacketData packetData, NetworkManager.PacketContext packetContext) { - ResourceLocation resourceLocation = ResourceLocation.tryParse(packetData.resourceLocation()); - PandaLibConfig.getConfig(resourceLocation).ifPresent(configHolder -> { - if (configHolder instanceof CommonConfigHolder commonConfigHolder) { - configHolder.logger.info("Received common config '{}' from server", configHolder.resourceLocation().toString()); - commonConfigHolder.setCommonConfig(configHolder.getGson().fromJson(packetData.configJson(), configHolder.getConfigClass())); - } - }); - } + private static void CommonConfigReceiver(CommonConfigPacketData packetData, NetworkManager.PacketContext packetContext) { + ResourceLocation resourceLocation = ResourceLocation.tryParse(packetData.resourceLocation()); + PandaLibConfig.getConfig(resourceLocation).ifPresent(configHolder -> { + if (configHolder instanceof CommonConfigHolder commonConfigHolder) { + configHolder.logger.info("Received common config '{}' from server", configHolder.resourceLocation().toString()); + commonConfigHolder.setCommonConfig(configHolder.getGson().fromJson(packetData.configJson(), configHolder.getConfigClass())); + } + }); + } + #else + private static void ClientConfigReceiver(FriendlyByteBuf buf, NetworkManager.PacketContext context) { + ResourceLocation resourceLocation = buf.readResourceLocation(); + PandaLibConfig.getConfig(resourceLocation).ifPresent(configHolder -> { + if (configHolder instanceof ClientConfigHolder) { + configHolder.logger.info("Received client config '{}' from {}", + configHolder.resourceLocation().toString(), context.getPlayer().getDisplayName().getString()); + context.getPlayer().pandaLib$setConfig(configHolder.getGson().fromJson(buf.readUtf(), configHolder.getConfigClass())); + } + }); + } + + private static void CommonConfigReceiver(FriendlyByteBuf buf, NetworkManager.PacketContext context) { + ResourceLocation resourceLocation = buf.readResourceLocation(); + PandaLibConfig.getConfig(resourceLocation).ifPresent(configHolder -> { + if (configHolder instanceof CommonConfigHolder commonConfigHolder) { + configHolder.logger.info("Received common config '{}' from server", configHolder.resourceLocation().toString()); + commonConfigHolder.setCommonConfig(configHolder.getGson().fromJson(buf.readUtf(), configHolder.getConfigClass())); + } + }); + } + #endif } diff --git a/common/src/main/java/me/pandamods/pandalib/network/packets/ClientConfigPacketData.java b/common/src/main/java/me/pandamods/pandalib/network/packets/ClientConfigPacketData.java index e1c5ce6..83f7870 100644 --- a/common/src/main/java/me/pandamods/pandalib/network/packets/ClientConfigPacketData.java +++ b/common/src/main/java/me/pandamods/pandalib/network/packets/ClientConfigPacketData.java @@ -10,6 +10,7 @@ * along with this program. If not, see . */ +#if MC_VER >= MC_1_20_5 package me.pandamods.pandalib.network.packets; import io.netty.buffer.ByteBuf; @@ -34,3 +35,4 @@ public Type type() { return TYPE; } } +#endif diff --git a/common/src/main/java/me/pandamods/pandalib/network/packets/CommonConfigPacketData.java b/common/src/main/java/me/pandamods/pandalib/network/packets/CommonConfigPacketData.java index a74302d..228549c 100644 --- a/common/src/main/java/me/pandamods/pandalib/network/packets/CommonConfigPacketData.java +++ b/common/src/main/java/me/pandamods/pandalib/network/packets/CommonConfigPacketData.java @@ -10,6 +10,7 @@ * along with this program. If not, see . */ +#if MC_VER >= MC_1_20_5 package me.pandamods.pandalib.network.packets; import io.netty.buffer.ByteBuf; @@ -34,3 +35,4 @@ public Type type() { return TYPE; } } +#endif diff --git a/common/src/main/resources/architectury.common.json b/common/src/main/resources/architectury.common.json index 3112840..492afbd 100644 --- a/common/src/main/resources/architectury.common.json +++ b/common/src/main/resources/architectury.common.json @@ -1,4 +1,5 @@ { + "accessWidener": "pandalib.accesswidener", "injected_interfaces": { "net/minecraft/world/entity/player/Player": ["me/pandamods/pandalib/extensions/PlayerExtension"] } diff --git a/common/src/main/resources/pandalib-common.mixins.json b/common/src/main/resources/pandalib-common.mixins.json index 961a2e5..6271b98 100644 --- a/common/src/main/resources/pandalib-common.mixins.json +++ b/common/src/main/resources/pandalib-common.mixins.json @@ -1,7 +1,6 @@ { "required": true, "package": "me.pandamods.pandalib.mixin", - "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "client": [], "mixins": [ diff --git a/fabric/build.gradle b/fabric/build.gradle index 22b33a4..cb05ac2 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -2,15 +2,13 @@ plugins { id "com.github.johnrengelman.shadow" } -apply from: rootProject.file("gradleConfigs/DependencyHelper.gradle") - architectury { platformSetupLoomIde() fabric() } loom { -// accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath } configurations { @@ -31,6 +29,9 @@ dependencies { modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" + // Used for testing + modRuntimeOnly "maven.modrinth:pandas-falling-trees:0.12.3-fabric,${rootProject.minecraft_version}" + common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } } @@ -44,4 +45,5 @@ shadowJar { remapJar { input.set shadowJar.archiveFile + injectAccessWidener = true } \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index ada4eae..addc7da 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -27,6 +27,7 @@ "fabric": "*", "fabric-api": "*", "minecraft": "${compatible_fabricmc_versions}", + "java": ">=${java_version}", "architectury": "*" }, "custom": { diff --git a/fabric/src/main/resources/pandalib.mixins.json b/fabric/src/main/resources/pandalib.mixins.json index bfb045e..7863206 100644 --- a/fabric/src/main/resources/pandalib.mixins.json +++ b/fabric/src/main/resources/pandalib.mixins.json @@ -1,7 +1,6 @@ { "required": true, "package": "me.pandamods.pandalib.mixin.fabric", - "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "client": [ ], diff --git a/forge/build.gradle b/forge/build.gradle index 670000a..5491e0e 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -2,19 +2,17 @@ plugins { id "com.github.johnrengelman.shadow" } -apply from: rootProject.file("gradleConfigs/DependencyHelper.gradle") - architectury { platformSetupLoomIde() forge() } loom { -// accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath forge { -// convertAccessWideners = true -// extraAccessWideners.add loom.accessWidenerPath.get().asFile.name + convertAccessWideners = true + extraAccessWideners.add loom.accessWidenerPath.get().asFile.name mixinConfig "pandalib-common.mixins.json" mixinConfig "pandalib.mixins.json" @@ -45,4 +43,5 @@ shadowJar { remapJar { input.set shadowJar.archiveFile + injectAccessWidener = true } \ No newline at end of file diff --git a/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java b/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java index 571083c..18a9bf7 100644 --- a/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java +++ b/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java @@ -1,20 +1,13 @@ package me.pandamods.pandalib.forge; -import dev.architectury.platform.forge.EventBuses; import me.pandamods.pandalib.PandaLib; -import me.pandamods.pandalib.api.client.screen.config.menu.ConfigScreenProvider; -import me.pandamods.test.PandaLibTest; import net.minecraftforge.client.ConfigScreenHandler; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod(PandaLib.MOD_ID) public class PandaLibForge { public PandaLibForge() { PandaLib.init(); - ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () -> - new ConfigScreenHandler.ConfigScreenFactory((minecraft, screen) -> - new ConfigScreenProvider<>(screen, PandaLibTest.CLIENT_CONFIG).get())); } } diff --git a/forge/src/main/resources/pandalib.mixins.json b/forge/src/main/resources/pandalib.mixins.json index b297051..5928754 100644 --- a/forge/src/main/resources/pandalib.mixins.json +++ b/forge/src/main/resources/pandalib.mixins.json @@ -1,7 +1,6 @@ { "required": true, "package": "me.pandamods.pandalib.mixin.forge", - "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "client": [ ], diff --git a/gradle.properties b/gradle.properties index 9a4abe3..086b60a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,13 +13,14 @@ maven_group = me.pandamods archives_name = pandalib # Publish Mods Properties -is_dry_run = false +is_dry_run = true enable_fabric_publishing = true enable_forge_publishing = true enable_neoforge_publishing = true # Dependencies +joml_version = 1.10.5 manifold_version = 2024.1.20 # Mod Dependencies Settings diff --git a/gradle.properties.json b/gradle.properties.json deleted file mode 100644 index b4015d1..0000000 --- a/gradle.properties.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "game_version": "latest", - - "mod_name": "PandaLib", - "mod_description": "A multipurpose library with a Config API and a bit of utility code.", - - "mod_version": "0.3", - "maven_group": "me.pandamods", - "archives_name": "pandalib", - - "is_dry_run": false, - - "enable_fabric_publishing": true, - "enable_forge_publishing": true, - "enable_neoforge_publishing": true, - - "manifold_version": "2024.1.20", - - "modmenu": 2 -} \ No newline at end of file diff --git a/gradleConfigs/DependencyHelper.gradle b/gradleConfigs/DependencyHelper.gradle deleted file mode 100644 index cd7e674..0000000 --- a/gradleConfigs/DependencyHelper.gradle +++ /dev/null @@ -1,33 +0,0 @@ -project.ext.addMod = { param, String path -> - switch(param as int){ - case 1: - project.dependencies { - add('modCompileOnly', path) - } - break - case 2: - project.dependencies { - add('modImplementation', path) - } - break - default: - println("Invalid Parameter") - } -} - -project.ext.addModApi = { param, String path -> - switch(param as int){ - case 1: - project.dependencies { - add('modCompileOnlyApi', path) - } - break - case 2: - project.dependencies { - add('modApi', path) - } - break - default: - println("Invalid Parameter") - } -} \ No newline at end of file diff --git a/gradleConfigs/PropertiesHelper.gradle b/gradleConfigs/PropertiesHelper.gradle deleted file mode 100644 index 000397d..0000000 --- a/gradleConfigs/PropertiesHelper.gradle +++ /dev/null @@ -1,53 +0,0 @@ -project.ext.loadProperties = { version -> - String defaultVersion = "1.21" - - List availableVersions = fileTree("versionProperties").files.name - for (int i = 0; i < availableVersions.size(); i++) { - availableVersions[i] = availableVersions[i].replaceAll("\\.properties", "") - } - - availableVersions.sort() - println "Avalible Minecraft versions: ${availableVersions}" - - String selectedVersion = "" - int versionIndex = -1 - println "Avalible MC versions: ${availableVersions}" - if (version instanceof String) { - selectedVersion = version as String - versionIndex = availableVersions.indexOf(version as String) - } - if (versionIndex == -1) { - println "No 'game_version' set or the set 'game_version' is invalid! Defaulting to ${defaultVersion}." - selectedVersion = defaultVersion - versionIndex = availableVersions.indexOf(defaultVersion) - assert versionIndex != -1 - } - - println "Loading properties file at " + selectedVersion + ".properties" - var properties = new Properties() - properties.load(new FileInputStream("${rootDir}/versionProperties/${selectedVersion}.properties")) - - properties.each { prop -> - project.ext.set(prop.key, prop.value) - } - project.ext.availableVersions = availableVersions - project.ext.versionIndex = versionIndex - - writeBuildGradlePredefine(availableVersions, versionIndex) -} - -def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { - StringBuilder sb = new StringBuilder(); - - sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n"); - - for (int i = 0; i < AvailableVersion.size(); i++) { - String versionString = AvailableVersion[i].replace(".", "_"); - sb.append("MC_" + versionString + "=" + i.toString() + "\n"); - - if (versionIndex == i) - sb.append("MC_VER=" + i.toString() + "\n"); - } - - new File(projectDir, "build.properties").text = sb.toString() -} \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle index f99f3af..e487b18 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -2,15 +2,13 @@ plugins { id "com.github.johnrengelman.shadow" } -apply from: rootProject.file("gradleConfigs/DependencyHelper.gradle") - architectury { platformSetupLoomIde() neoForge() } loom { -// accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath } configurations { @@ -37,23 +35,6 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } } -processResources { - def replaceProperties = [ - version: rootProject.version, - id: rootProject.archives_name, - name: rootProject.mod_name, - description: rootProject.mod_description, - - compatible_fabricmc_versions: rootProject.compatible_fabricmc_versions, - compatible_forgemc_versions: rootProject.compatible_forgemc_versions, - ] - - inputs.properties replaceProperties - filesMatching(["META-INF/neoforge.mods.toml"]) { - expand replaceProperties - } -} - shadowJar { configurations = [project.configurations.shadowCommon] archiveClassifier = "dev-shadow" @@ -61,5 +42,6 @@ shadowJar { remapJar { input.set shadowJar.archiveFile -// atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) + injectAccessWidener = true + atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) } \ No newline at end of file diff --git a/neoforge/src/main/resources/pandalib.mixins.json b/neoforge/src/main/resources/pandalib.mixins.json index a2df905..d6bfffc 100644 --- a/neoforge/src/main/resources/pandalib.mixins.json +++ b/neoforge/src/main/resources/pandalib.mixins.json @@ -1,7 +1,6 @@ { "required": true, "package": "me.pandamods.pandalib.mixin.neoforge", - "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "client": [ ], diff --git a/settings.gradle b/settings.gradle index 7b4289e..7e92689 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,13 +4,52 @@ pluginManagement { maven { url "https://maven.minecraftforge.net/" } maven { url "https://maven.architectury.dev/" } gradlePluginPortal() - mavenLocal() } } +def loadProperties() { + String defaultVersion = "1.21" + + List availableVersions = fileTree("versionProperties").files.name + for (int i = 0; i < availableVersions.size(); i++) { + availableVersions[i] = availableVersions[i].replaceAll("\\.properties", "") + } + + availableVersions.sort() + println "Avalible Minecraft versions: ${availableVersions}" + + String selectedVersion = "" + int versionIndex = -1 + println "Avalible MC versions: ${availableVersions}" + if (hasProperty("game_version")) { + selectedVersion = game_version + versionIndex = availableVersions.indexOf(game_version) + } + if (versionIndex == -1) { + println "No 'game_version' set or the set 'game_version' is invalid! Defaulting to ${defaultVersion}." + selectedVersion = defaultVersion + versionIndex = availableVersions.indexOf(defaultVersion) + assert versionIndex != -1 + } + + println "Loading properties file at " + selectedVersion + ".properties" + var properties = new Properties() + properties.load(new FileInputStream("${rootDir}/versionProperties/${selectedVersion}.properties")) + + properties.each { prop -> + gradle.ext.set(prop.key, prop.value) + } + gradle.ext.availableVersions = availableVersions + gradle.ext.versionIndex = versionIndex +} +loadProperties() + rootProject.name = "PandaLib" include("common") -include("fabric") -//include("forge") -include("neoforge") +for (loader in ((String) gradle.supported_modloaders).split(",")) { + def loaderName = loader.strip() + println "Adding loader " + loaderName + include(loaderName) +} + diff --git a/versionProperties/1.19.2.properties b/versionProperties/1.19.2.properties new file mode 100644 index 0000000..f2b239c --- /dev/null +++ b/versionProperties/1.19.2.properties @@ -0,0 +1,27 @@ +java_version = 17 + +# Mod properties +supported_modloaders = fabric,forge + +compatible_fabricmc_versions = =1.19.2 +compatible_forgemc_versions = 1.19.2 + +# Minecraft properties +minecraft_version = 1.19.2 +parchment_version=1.19.2:2022.11.27 + +# Mod Loader Dependencies +fabric_loader_version = 0.15.11 +fabric_api_version = 0.77.0+1.19.2 + +forge_version = 43.4.0 + +# Publish Mods Properties +supported_game_version = 1.19.2 + +# Dependencies +embed_joml=true + +# Mod Dependencies +architectury_version = 6.6.92 +modmenu_version = 4.2.0-beta.2 diff --git a/versionProperties/1.20.5.properties b/versionProperties/1.20.5.properties index 1efda8d..0bdc33a 100644 --- a/versionProperties/1.20.5.properties +++ b/versionProperties/1.20.5.properties @@ -19,9 +19,7 @@ neoforge_version = 20.5.21-beta # Publish Mods Properties supported_game_version = 1.20.5 - -use_ranged_game_version = true -max_supported_game_version = 1.20.6 +latest_supported_game_version = 1.20.6 # Mod Dependencies architectury_version = 12.0.28 diff --git a/versionProperties/1.20.properties b/versionProperties/1.20.properties new file mode 100644 index 0000000..37bc335 --- /dev/null +++ b/versionProperties/1.20.properties @@ -0,0 +1,25 @@ +java_version = 17 + +# Mod properties +supported_modloaders = fabric,forge + +compatible_fabricmc_versions = >=1.20 <1.20.5 +compatible_forgemc_versions = [1.20,1.20.5) + +# Minecraft properties +minecraft_version = 1.20 +parchment_version=1.20.1:2023.09.03 + +# Mod Loader Dependencies +fabric_loader_version = 0.15.11 +fabric_api_version = 0.83.0+1.20 + +forge_version = 46.0.14 + +# Publish Mods Properties +supported_game_version = 1.20 +latest_supported_game_version = 1.20.4 + +# Mod Dependencies +architectury_version = 9.2.14 +modmenu_version = 7.0.1 diff --git a/versionProperties/1.21.properties b/versionProperties/1.21.properties index 63e6641..b48618b 100644 --- a/versionProperties/1.21.properties +++ b/versionProperties/1.21.properties @@ -20,9 +20,6 @@ neoforge_version = 21.0.42-beta # Publish Mods Properties supported_game_version = 1.21 -use_ranged_game_version = false -max_supported_game_version = latest - # Mod Dependencies architectury_version = 13.0.2 modmenu_version = 11.0.1 \ No newline at end of file From a3de63ed9372f2f182ca11c6bbca5d4edcfcf5ea Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Wed, 3 Jul 2024 13:07:53 +0200 Subject: [PATCH 05/25] Move modLoaders addition to module-specific blocks The modLoaders values fabric, forge, and neoforge were previously set globally. This commit changes that behaviour, adding each loader value only when its specific project is found. This makes the script more efficient as it avoids loading unnecessary modules. --- build.gradle | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 43f002c..1fa362e 100644 --- a/build.gradle +++ b/build.gradle @@ -288,14 +288,19 @@ publishMods { commitish = "main" tagName = "release/${rootProject.mod_version}-${supported_version_str}" - modLoaders.addAll("fabric", "forge", "neoforge") file = project(":common").remapJar.archiveFile - if (findProject(":fabric")) + if (findProject(":fabric")) { + modLoaders.add("fabric") additionalFiles.from(project(":fabric").remapJar.archiveFile) - if (findProject(":forge")) + } + if (findProject(":forge")) { + modLoaders.add("forge") additionalFiles.from(project(":forge").remapJar.archiveFile) - if (findProject(":neoforge")) + } + if (findProject(":neoforge")) { + modLoaders.add("neoforge") additionalFiles.from(project(":neoforge").remapJar.archiveFile) + } } } \ No newline at end of file From 9449f8bb2b319a4ccfa9d21e70db5d8bdcb07191 Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Wed, 3 Jul 2024 14:15:55 +0200 Subject: [PATCH 06/25] Refactor build.gradle scripts for clarity & consistency Revised build.gradle scripts across projects for improved readability and consistent formatting. Changes primarily involve adjusting indentation and replacing `rootProject` references with the property name only. Removed unused `addModApi` in fabric/build.gradle. --- build.gradle | 526 ++++++++++++++++++++---------------------- common/build.gradle | 8 +- fabric/build.gradle | 46 ++-- forge/build.gradle | 46 ++-- gradle.properties | 6 +- neoforge/build.gradle | 44 ++-- settings.gradle | 2 +- 7 files changed, 325 insertions(+), 353 deletions(-) diff --git a/build.gradle b/build.gradle index 1fa362e..303e1e1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,306 +1,282 @@ plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false - id "com.github.johnrengelman.shadow" version "8.1.1" apply false - id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha" - id "me.modmuss50.mod-publish-plugin" version "0.5.1" + id "architectury-plugin" version "3.4-SNAPSHOT" + id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false + id "com.github.johnrengelman.shadow" version "8.1.1" apply false + id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha" + id "me.modmuss50.mod-publish-plugin" version "0.5.1" } def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder() - sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n"); + sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n") - for (int i = 0; i < AvailableVersion.size(); i++) { - String versionString = AvailableVersion[i].replace(".", "_"); - sb.append("MC_" + versionString + "=" + i.toString() + "\n"); + for (int i = 0; i < AvailableVersion.size(); i++) { + String versionString = AvailableVersion[i].replace(".", "_") + sb.append("MC_" + versionString + "=" + i.toString() + "\n") - if (versionIndex == i) - sb.append("MC_VER=" + i.toString() + "\n"); - } + if (versionIndex == i) + sb.append("MC_VER=" + i.toString() + "\n") + } - new File(projectDir, "build.properties").text = sb.toString() + new File(projectDir, "build.properties").text = sb.toString() } project.gradle.ext.getProperties().each { prop -> - rootProject.ext.set(prop.key, prop.value) + ext.set(prop.key, prop.value) } -writeBuildGradlePredefine(rootProject.availableVersions, rootProject.versionIndex) +writeBuildGradlePredefine(availableVersions, versionIndex) architectury { - minecraft = rootProject.minecraft_version + minecraft = minecraft_version } allprojects { - group = rootProject.maven_group - version = "${rootProject.mod_version}-${rootProject.minecraft_version}" + group = maven_group + version = "${mod_version}-${minecraft_version}" } subprojects { - apply plugin: "com.github.johnrengelman.shadow" - apply plugin: "dev.architectury.loom" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - project.ext.addMod = { param, String path -> - switch(param as int){ - case 1: - project.dependencies { - add('modCompileOnly', path) - } - break - case 2: - project.dependencies { - add('modImplementation', path) - } - break - default: - println("Invalid Parameter") - } - } - - project.ext.addModApi = { param, String path -> - switch(param as int){ - case 1: - project.dependencies { - add('modCompileOnlyApi', path) - } - break - case 2: - project.dependencies { - add('modApi', path) - } - break - default: - println("Invalid Parameter") - } - } - - base { - archivesName = "${rootProject.archives_name}-${project.name}" - } - - repositories { - maven { - name = "ParchmentMC" - url = "https://maven.parchmentmc.org" - } - exclusiveContent { - forRepository { - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - } - } - filter { - includeGroup "maven.modrinth" - } - } - } - - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.layered() { - officialMojangMappings() - parchment "org.parchmentmc.data:parchment-${rootProject.parchment_version}@zip" - } - - annotationProcessor("systems.manifold:manifold-preprocessor:${rootProject.manifold_version}") - - if (rootProject.hasProperty("embed_joml") && rootProject.embed_joml == "true" && project != project(":common")) - include(implementation("org.joml:joml:${rootProject.joml_version}")) - else - implementation("org.joml:joml:${rootProject.joml_version}") - } - - processResources { - def replaceProperties = [ - java_version: rootProject.java_version, - version: rootProject.mod_version, - id: rootProject.archives_name, - name: rootProject.mod_name, - description: rootProject.mod_description, - - compatible_fabricmc_versions: rootProject.compatible_fabricmc_versions, - compatible_forgemc_versions: rootProject.compatible_forgemc_versions - ] - - inputs.properties replaceProperties - filesMatching(["fabric.mod.json", "META-INF/mods.toml", "META-INF/neoforge.mods.toml"]) { - expand replaceProperties - } - } - - tasks.withType(JavaCompile).configureEach { - options.encoding = "UTF-8" - options.release = rootProject.java_version as Integer - options.compilerArgs += ["-Xplugin:Manifold"] - } - - java { - withSourcesJar() - } - - publishing { - publications { - mavenJava(MavenPublication) { - groupId = rootProject.maven_group - artifactId = "${rootProject.archives_name}-${project.name}" - version = project.version - from components.java - } - } - - repositories { - } - } + apply plugin: "com.github.johnrengelman.shadow" + apply plugin: "dev.architectury.loom" + apply plugin: "architectury-plugin" + apply plugin: "maven-publish" + + base { + archivesName = "${archives_name}-${project.name}" + } + + configurations { + includeJar + implementation.extendsFrom includeJar + include.extendsFrom includeJar + + includeModJar + modImplementation.extendsFrom includeModJar + include.extendsFrom includeModJar + } + + repositories { + maven { + name = "ParchmentMC" + url = "https://maven.parchmentmc.org" + } + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + } + filter { + includeGroup "maven.modrinth" + } + } + } + + dependencies { + minecraft "com.mojang:minecraft:${minecraft_version}" + mappings loom.layered() { + officialMojangMappings() + parchment "org.parchmentmc.data:parchment-${parchment_version}@zip" + } + + annotationProcessor("systems.manifold:manifold-preprocessor:${manifold_version}") + + if (hasProperty("embed_joml") && embed_joml == "true" && project != project(":common")) + includeJar("org.joml:joml:${joml_version}") + else + implementation("org.joml:joml:${joml_version}") + } + + processResources { + def replaceProperties = [ + java_version : java_version, + version : mod_version, + id : archives_name, + name : mod_name, + description : mod_description, + + compatible_fabricmc_versions: compatible_fabricmc_versions, + compatible_forgemc_versions : compatible_forgemc_versions + ] + + inputs.properties replaceProperties + filesMatching(["fabric.mod.json", "META-INF/mods.toml", "META-INF/neoforge.mods.toml"]) { + expand replaceProperties + } + } + + tasks.withType(JavaCompile).configureEach { + options.encoding = "UTF-8" + options.release = java_version as Integer + options.compilerArgs += ["-Xplugin:Manifold"] + } + + java { + withSourcesJar() + } + + publishing { + publications { + mavenJava(MavenPublication) { + groupId = maven_group + artifactId = "${archives_name}-${project.name}" + version = project.version + from components.java + } + } + + repositories { + } + } } publishMods { - var using_ranged_game_version = rootProject.hasProperty("latest_supported_game_version") - var is_fabric_publishing_enabled = Boolean.parseBoolean(rootProject.enable_fabric_publishing) - var is_forge_publishing_enabled = Boolean.parseBoolean(rootProject.enable_forge_publishing) - var is_neoforge_publishing_enabled = Boolean.parseBoolean(rootProject.enable_neoforge_publishing) - - dryRun = Boolean.parseBoolean(rootProject.is_dry_run) + var using_ranged_game_version = hasProperty("latest_supported_game_version") + var is_fabric_publishing_enabled = Boolean.parseBoolean(enable_fabric_publishing) + var is_forge_publishing_enabled = Boolean.parseBoolean(enable_forge_publishing) + var is_neoforge_publishing_enabled = Boolean.parseBoolean(enable_neoforge_publishing) + + dryRun = Boolean.parseBoolean(is_dry_run) - version = rootProject.mod_version - type = BETA - changelog = rootProject.file("Changelog.md").text + version = mod_version + type = BETA + changelog = file("Changelog.md").text - var supported_version_str = using_ranged_game_version ? - "${rootProject.supported_game_version}-${rootProject.latest_supported_game_version}" : - rootProject.supported_game_version + var supported_version_str = using_ranged_game_version ? + "${supported_game_version}-${latest_supported_game_version}" : + supported_game_version - discord { - webhookUrl = providers.environmentVariable("DISCORD_WEBHOOK") - dryRunWebhookUrl = providers.environmentVariable("DISCORD_WEBHOOK_DRY_RUN") - username = "Mod Release" - avatarUrl = "https://avatars.githubusercontent.com/u/70108603?v=4" - content = changelog.map { "# PandaLib ${rootProject.mod_version} Release for ${supported_version_str} \n" + it} - } + discord { + webhookUrl = providers.environmentVariable("DISCORD_WEBHOOK") + dryRunWebhookUrl = providers.environmentVariable("DISCORD_WEBHOOK_DRY_RUN") + username = "Mod Release" + avatarUrl = "https://avatars.githubusercontent.com/u/70108603?v=4" + content = changelog.map { "# PandaLib ${mod_version} Release for ${supported_version_str} \n" + it } + } - def curseforgeOptions = curseforgeOptions { - accessToken = providers.environmentVariable("CURSEFORGE_API_KEY") - projectId = "975460" + def curseforgeOptions = curseforgeOptions { + accessToken = providers.environmentVariable("CURSEFORGE_API_KEY") + projectId = "975460" - if (using_ranged_game_version) - minecraftVersionRange { - start = rootProject.supported_game_version - end = rootProject.latest_supported_game_version - } - else - minecraftVersions.add(rootProject.supported_game_version) + if (using_ranged_game_version) + minecraftVersionRange { + start = supported_game_version + end = latest_supported_game_version + } + else + minecraftVersions.add(supported_game_version) - javaVersions.add(JavaVersion.VERSION_21) - - clientRequired = true - serverRequired = true - - projectSlug = "pandalib" - - requires("architectury-api") - } - - def modrinthOptions = modrinthOptions { - accessToken = providers.environmentVariable("MODRINTH_API_KEY") - projectId = "mEEGbEIu" - - if (using_ranged_game_version) - minecraftVersionRange { - start = rootProject.supported_game_version - end = rootProject.latest_supported_game_version - } - else - minecraftVersions.add(rootProject.supported_game_version) - - requires("architectury-api") - } - - def fabricOptions = publishOptions { - file = project(":fabric").remapJar.archiveFile - modLoaders.add("fabric") - displayName = "[Fabric ${supported_version_str}] ${rootProject.mod_version}" - } - - def forgeOptions = publishOptions { - file = project(":forge").remapJar.archiveFile - modLoaders.add("forge") - displayName = "[Forge ${supported_version_str}] ${rootProject.mod_version}" - } - - def neoForgeOptions = publishOptions { - file = project(":neoforge").remapJar.archiveFile - modLoaders.add("neoforge") - displayName = "[NeoForge ${supported_version_str}] ${rootProject.mod_version}" - } - - if (findProject(":fabric") && is_fabric_publishing_enabled) { - curseforge("curseforgeFabric") { - from(curseforgeOptions, fabricOptions) - - announcementTitle = "Download for Fabric ${supported_version_str} from CurseForge" - - requires("fabric-api") - } - - modrinth("modrinthFabric") { - from(modrinthOptions, fabricOptions) - - announcementTitle = "Download for Fabric ${supported_version_str} from Modrinth" - - requires("fabric-api") - } - } - - if (findProject(":forge") && is_forge_publishing_enabled) { - curseforge("curseforgeForge") { - from(curseforgeOptions, forgeOptions) - - announcementTitle = "Download for Forge ${supported_version_str} from CurseForge" - } - - modrinth("modrinthForge") { - from(modrinthOptions, forgeOptions) - - announcementTitle = "Download for Forge ${supported_version_str} from Modrinth" - } - } - - if (findProject(":neoforge") && is_neoforge_publishing_enabled) { - curseforge("curseforgeNeoForge") { - from(curseforgeOptions, neoForgeOptions) - - announcementTitle = "Download for NeoForge ${supported_version_str} from CurseForge" - } - - modrinth("modrinthNeoForge") { - from(modrinthOptions, neoForgeOptions) - - announcementTitle = "Download for NeoForge ${supported_version_str} from Modrinth" - } - } - - github { - accessToken = providers.environmentVariable("GITHUB_API_KEY") - repository = "PandaDap2006/PandaLib" - commitish = "main" - tagName = "release/${rootProject.mod_version}-${supported_version_str}" - - file = project(":common").remapJar.archiveFile - - if (findProject(":fabric")) { - modLoaders.add("fabric") - additionalFiles.from(project(":fabric").remapJar.archiveFile) - } - if (findProject(":forge")) { - modLoaders.add("forge") - additionalFiles.from(project(":forge").remapJar.archiveFile) - } - if (findProject(":neoforge")) { - modLoaders.add("neoforge") - additionalFiles.from(project(":neoforge").remapJar.archiveFile) - } - } + javaVersions.add(JavaVersion.VERSION_21) + + clientRequired = true + serverRequired = true + + projectSlug = "pandalib" + + requires("architectury-api") + } + + def modrinthOptions = modrinthOptions { + accessToken = providers.environmentVariable("MODRINTH_API_KEY") + projectId = "mEEGbEIu" + + if (using_ranged_game_version) + minecraftVersionRange { + start = supported_game_version + end = latest_supported_game_version + } + else + minecraftVersions.add(supported_game_version) + + requires("architectury-api") + } + + def fabricOptions = publishOptions { + file = project(":fabric").remapJar.archiveFile + modLoaders.add("fabric") + displayName = "[Fabric ${supported_version_str}] ${mod_version}" + } + + def forgeOptions = publishOptions { + file = project(":forge").remapJar.archiveFile + modLoaders.add("forge") + displayName = "[Forge ${supported_version_str}] ${mod_version}" + } + + def neoForgeOptions = publishOptions { + file = project(":neoforge").remapJar.archiveFile + modLoaders.add("neoforge") + displayName = "[NeoForge ${supported_version_str}] ${mod_version}" + } + + if (findProject(":fabric") && is_fabric_publishing_enabled) { + curseforge("curseforgeFabric") { + from(curseforgeOptions, fabricOptions) + + announcementTitle = "Download for Fabric ${supported_version_str} from CurseForge" + + requires("fabric-api") + } + + modrinth("modrinthFabric") { + from(modrinthOptions, fabricOptions) + + announcementTitle = "Download for Fabric ${supported_version_str} from Modrinth" + + requires("fabric-api") + } + } + + if (findProject(":forge") && is_forge_publishing_enabled) { + curseforge("curseforgeForge") { + from(curseforgeOptions, forgeOptions) + + announcementTitle = "Download for Forge ${supported_version_str} from CurseForge" + } + + modrinth("modrinthForge") { + from(modrinthOptions, forgeOptions) + + announcementTitle = "Download for Forge ${supported_version_str} from Modrinth" + } + } + + if (findProject(":neoforge") && is_neoforge_publishing_enabled) { + curseforge("curseforgeNeoForge") { + from(curseforgeOptions, neoForgeOptions) + + announcementTitle = "Download for NeoForge ${supported_version_str} from CurseForge" + } + + modrinth("modrinthNeoForge") { + from(modrinthOptions, neoForgeOptions) + + announcementTitle = "Download for NeoForge ${supported_version_str} from Modrinth" + } + } + + github { + accessToken = providers.environmentVariable("GITHUB_API_KEY") + repository = "PandaDap2006/PandaLib" + commitish = "main" + tagName = "release/${mod_version}-${supported_version_str}" + + file = project(":common").remapJar.archiveFile + + if (findProject(":fabric")) { + modLoaders.add("fabric") + additionalFiles.from(project(":fabric").remapJar.archiveFile) + } + if (findProject(":forge")) { + modLoaders.add("forge") + additionalFiles.from(project(":forge").remapJar.archiveFile) + } + if (findProject(":neoforge")) { + modLoaders.add("neoforge") + additionalFiles.from(project(":neoforge").remapJar.archiveFile) + } + } } \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle index 280cd77..143198a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,13 +1,13 @@ architectury { - common rootProject.supported_modloaders.split(",") + common rootProject.supported_modloaders.split(",") } loom { - accessWidenerPath = file("src/main/resources/pandalib.accesswidener") + accessWidenerPath = file("src/main/resources/pandalib.accesswidener") } dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "dev.architectury:architectury:${rootProject.architectury_version}" + modApi "dev.architectury:architectury:${rootProject.architectury_version}" } \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index cb05ac2..a510352 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,49 +1,49 @@ plugins { - id "com.github.johnrengelman.shadow" + id "com.github.johnrengelman.shadow" } architectury { - platformSetupLoomIde() - fabric() + platformSetupLoomIde() + fabric() } loom { - accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath } configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common + common + shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentFabric.extendsFrom common } repositories { - maven { url = "https://maven.terraformersmc.com/releases/" } + maven { url = "https://maven.terraformersmc.com/releases/" } } dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" + modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" + modApi "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}" - modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" + modApi "dev.architectury:architectury-fabric:${architectury_version}" - // Used for testing - modRuntimeOnly "maven.modrinth:pandas-falling-trees:0.12.3-fabric,${rootProject.minecraft_version}" + modApi("com.terraformersmc:modmenu:${modmenu_version}") - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } -} + // Used for testing + modRuntimeOnly "maven.modrinth:pandas-falling-trees:0.12.3-fabric,${minecraft_version}" -addModApi(rootProject.modmenu, "com.terraformersmc:modmenu:${rootProject.modmenu_version}") + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } +} shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" } remapJar { - input.set shadowJar.archiveFile - injectAccessWidener = true + input.set shadowJar.archiveFile + injectAccessWidener = true } \ No newline at end of file diff --git a/forge/build.gradle b/forge/build.gradle index 5491e0e..c1152ac 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,47 +1,47 @@ plugins { - id "com.github.johnrengelman.shadow" + id "com.github.johnrengelman.shadow" } architectury { - platformSetupLoomIde() - forge() + platformSetupLoomIde() + forge() } loom { - accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath - forge { - convertAccessWideners = true - extraAccessWideners.add loom.accessWidenerPath.get().asFile.name + forge { + convertAccessWideners = true + extraAccessWideners.add loom.accessWidenerPath.get().asFile.name - mixinConfig "pandalib-common.mixins.json" - mixinConfig "pandalib.mixins.json" - } + mixinConfig "pandalib-common.mixins.json" + mixinConfig "pandalib.mixins.json" + } } configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentForge.extendsFrom common + common + shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentForge.extendsFrom common } dependencies { - forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}" + forge "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}" + modApi "dev.architectury:architectury-forge:${architectury_version}" - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } } shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" } remapJar { - input.set shadowJar.archiveFile - injectAccessWidener = true + input.set shadowJar.archiveFile + injectAccessWidener = true } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 086b60a..12c596e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,8 +21,4 @@ enable_neoforge_publishing = true # Dependencies joml_version = 1.10.5 -manifold_version = 2024.1.20 - -# Mod Dependencies Settings -# Fabric -modmenu = 2 \ No newline at end of file +manifold_version = 2024.1.20 \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle index e487b18..e8569b7 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,47 +1,47 @@ plugins { - id "com.github.johnrengelman.shadow" + id "com.github.johnrengelman.shadow" } architectury { - platformSetupLoomIde() - neoForge() + platformSetupLoomIde() + neoForge() } loom { - accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath } configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentNeoForge.extendsFrom common + common + shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentNeoForge.extendsFrom common } repositories { - maven { - name = "NeoForged" - url = "https://maven.neoforged.net/releases" - } + maven { + name = "NeoForged" + url = "https://maven.neoforged.net/releases" + } } dependencies { - neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" + neoForge "net.neoforged:neoforge:${neoforge_version}" - modApi "dev.architectury:architectury-neoforge:${rootProject.architectury_version}" + modApi "dev.architectury:architectury-neoforge:${architectury_version}" - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } } shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" } remapJar { - input.set shadowJar.archiveFile - injectAccessWidener = true - atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) + input.set shadowJar.archiveFile + injectAccessWidener = true + atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 7e92689..d2fc456 100644 --- a/settings.gradle +++ b/settings.gradle @@ -44,7 +44,7 @@ def loadProperties() { } loadProperties() -rootProject.name = "PandaLib" +rootProject.name = archives_name include("common") for (loader in ((String) gradle.supported_modloaders).split(",")) { From ca61ecd1cc900ee64fab7bc6cb5e06ed88656d6c Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Wed, 3 Jul 2024 14:34:53 +0200 Subject: [PATCH 07/25] Update build.gradle files and game version The build.gradle files in fabric, neoforge, and forge have been updated to have consistent function calls style. The 'implementation' and 'modImplementation' extension orders in the build.gradle have been rearranged for clarity. Gradle properties have also been updated with a new game version. --- build.gradle | 4 ++-- fabric/build.gradle | 6 +++--- forge/build.gradle | 4 ++-- gradle.properties | 2 +- neoforge/build.gradle | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 303e1e1..1abc331 100644 --- a/build.gradle +++ b/build.gradle @@ -49,12 +49,12 @@ subprojects { configurations { includeJar - implementation.extendsFrom includeJar include.extendsFrom includeJar + implementation.extendsFrom includeJar includeModJar - modImplementation.extendsFrom includeModJar include.extendsFrom includeModJar + modImplementation.extendsFrom includeModJar } repositories { diff --git a/fabric/build.gradle b/fabric/build.gradle index a510352..3b5722a 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -25,14 +25,14 @@ repositories { dependencies { modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}" + modApi("net.fabricmc.fabric-api:fabric-api:${fabric_api_version}") - modApi "dev.architectury:architectury-fabric:${architectury_version}" + modApi("dev.architectury:architectury-fabric:${architectury_version}") modApi("com.terraformersmc:modmenu:${modmenu_version}") // Used for testing - modRuntimeOnly "maven.modrinth:pandas-falling-trees:0.12.3-fabric,${minecraft_version}" + modRuntimeOnly("maven.modrinth:pandas-falling-trees:0.12.3-fabric,${minecraft_version}") common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } diff --git a/forge/build.gradle b/forge/build.gradle index c1152ac..9cbbbf0 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -28,9 +28,9 @@ configurations { } dependencies { - forge "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + forge("net.minecraftforge:forge:${minecraft_version}-${forge_version}") - modApi "dev.architectury:architectury-forge:${architectury_version}" + modApi("dev.architectury:architectury-forge:${architectury_version}") common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } diff --git a/gradle.properties b/gradle.properties index 12c596e..fade13b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs = -Xmx2G org.gradle.parallel = true -game_version = 1.20.5 +game_version = 1.21 # Mod Info mod_name = PandaLib diff --git a/neoforge/build.gradle b/neoforge/build.gradle index e8569b7..63ed59d 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -27,9 +27,9 @@ repositories { } dependencies { - neoForge "net.neoforged:neoforge:${neoforge_version}" + neoForge("net.neoforged:neoforge:${neoforge_version}") - modApi "dev.architectury:architectury-neoforge:${architectury_version}" + modApi("dev.architectury:architectury-neoforge:${architectury_version}") common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } From de2894ad456bee7fbb6d607c9b3d785ca0d7d038 Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Wed, 3 Jul 2024 16:22:16 +0200 Subject: [PATCH 08/25] Remove shadow plugin and update project variables The shadow plugin from com.github.johnrengelman was removed in the 'fabric', 'neoforge', and 'forge' build files. The hardcoded project details in the build.gradle file were replaced with variables defined in gradle.properties. This will allow more flexibility in project configurations and simplify future updates. --- build.gradle | 8 ++++---- fabric/build.gradle | 4 ---- forge/build.gradle | 4 ---- gradle.properties | 4 ++++ neoforge/build.gradle | 4 ---- 5 files changed, 8 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index 1abc331..86e0614 100644 --- a/build.gradle +++ b/build.gradle @@ -154,12 +154,12 @@ publishMods { dryRunWebhookUrl = providers.environmentVariable("DISCORD_WEBHOOK_DRY_RUN") username = "Mod Release" avatarUrl = "https://avatars.githubusercontent.com/u/70108603?v=4" - content = changelog.map { "# PandaLib ${mod_version} Release for ${supported_version_str} \n" + it } + content = changelog.map { "# ${mod_name} ${mod_version} Release for ${supported_version_str} \n" + it } } def curseforgeOptions = curseforgeOptions { accessToken = providers.environmentVariable("CURSEFORGE_API_KEY") - projectId = "975460" + projectId = curseforge_project_id if (using_ranged_game_version) minecraftVersionRange { @@ -181,7 +181,7 @@ publishMods { def modrinthOptions = modrinthOptions { accessToken = providers.environmentVariable("MODRINTH_API_KEY") - projectId = "mEEGbEIu" + projectId = modrinth_project_id if (using_ranged_game_version) minecraftVersionRange { @@ -260,7 +260,7 @@ publishMods { github { accessToken = providers.environmentVariable("GITHUB_API_KEY") - repository = "PandaDap2006/PandaLib" + repository = github_repo commitish = "main" tagName = "release/${mod_version}-${supported_version_str}" diff --git a/fabric/build.gradle b/fabric/build.gradle index 3b5722a..97bfda7 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,7 +1,3 @@ -plugins { - id "com.github.johnrengelman.shadow" -} - architectury { platformSetupLoomIde() fabric() diff --git a/forge/build.gradle b/forge/build.gradle index 9cbbbf0..c038f59 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,7 +1,3 @@ -plugins { - id "com.github.johnrengelman.shadow" -} - architectury { platformSetupLoomIde() forge() diff --git a/gradle.properties b/gradle.properties index fade13b..29d3e03 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,6 +19,10 @@ enable_fabric_publishing = true enable_forge_publishing = true enable_neoforge_publishing = true +curseforge_project_id = 975460 +modrinth_project_id = mEEGbEIu +github_repo = PandaDap2006/PandaLib + # Dependencies joml_version = 1.10.5 manifold_version = 2024.1.20 \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 63ed59d..23b94ec 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,7 +1,3 @@ -plugins { - id "com.github.johnrengelman.shadow" -} - architectury { platformSetupLoomIde() neoForge() From c37f892c066ef86c744b43622a8ef1537af96fdf Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Wed, 3 Jul 2024 16:25:57 +0200 Subject: [PATCH 09/25] Upgrade architectury.loom version The architectury.loom version was updated from 1.6-SNAPSHOT to 1.7-SNAPSHOT in the build.gradle file. This change ensures the codebase is using the most recent stable version of the architectury.loom plugin. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 86e0614..9b03a5f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false id "com.github.johnrengelman.shadow" version "8.1.1" apply false id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha" id "me.modmuss50.mod-publish-plugin" version "0.5.1" From 3f638ffb01c0736c9b185bfa1203d31d7d3ac956 Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Wed, 3 Jul 2024 18:06:54 +0200 Subject: [PATCH 10/25] Upgrade architectury.loom version The architectury.loom version was updated from 1.6-SNAPSHOT to 1.7-SNAPSHOT in the build.gradle file. This change ensures the codebase is using the most recent stable version of the architectury.loom plugin. --- buildAll.bat | 15 +++++++++++++++ common/build.gradle | 8 ++++---- .../src/main/resources/architectury.common.json | 1 - fabric/build.gradle | 2 +- fabric/src/main/resources/fabric.mod.json | 2 +- forge/build.gradle | 6 +++--- forge/src/main/resources/META-INF/mods.toml | 4 ++-- gradle.properties | 2 +- neoforge/build.gradle | 4 ++-- .../main/resources/META-INF/neoforge.mods.toml | 5 ++--- publishLocalyAll.bat | 15 +++++++++++++++ versionProperties/1.19.2.properties | 2 +- versionProperties/1.20.5.properties | 3 +-- versionProperties/1.20.properties | 2 +- versionProperties/1.21.properties | 3 +-- 15 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 buildAll.bat create mode 100644 publishLocalyAll.bat diff --git a/buildAll.bat b/buildAll.bat new file mode 100644 index 0000000..3800b69 --- /dev/null +++ b/buildAll.bat @@ -0,0 +1,15 @@ +@echo off & setlocal enabledelayedexpansion + +echo ==================== Cleaning workspace to build ==================== + call .\gradlew.bat clean --no-daemon + +@rem Loop trough everything in the version properties folder +for %%f in (versionProperties\*) do ( + @rem Get the name of the version that is going to be compiled + set version=%%~nf + + echo ==================== Building !version! ==================== + call .\gradlew.bat build -PmcVer="!version!" --no-daemon +) + +endlocal diff --git a/common/build.gradle b/common/build.gradle index 143198a..69433a7 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,13 +1,13 @@ architectury { - common rootProject.supported_modloaders.split(",") + common supported_modloaders.split(",") } loom { - accessWidenerPath = file("src/main/resources/pandalib.accesswidener") +// accessWidenerPath = file("src/main/resources/pandalib.accesswidener") } dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" - modApi "dev.architectury:architectury:${rootProject.architectury_version}" + modApi "dev.architectury:architectury:${architectury_version}" } \ No newline at end of file diff --git a/common/src/main/resources/architectury.common.json b/common/src/main/resources/architectury.common.json index 492afbd..3112840 100644 --- a/common/src/main/resources/architectury.common.json +++ b/common/src/main/resources/architectury.common.json @@ -1,5 +1,4 @@ { - "accessWidener": "pandalib.accesswidener", "injected_interfaces": { "net/minecraft/world/entity/player/Player": ["me/pandamods/pandalib/extensions/PlayerExtension"] } diff --git a/fabric/build.gradle b/fabric/build.gradle index 97bfda7..babef61 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -4,7 +4,7 @@ architectury { } loom { - accessWidenerPath = project(":common").loom.accessWidenerPath +// accessWidenerPath = project(":common").loom.accessWidenerPath } configurations { diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index addc7da..55aabc6 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -12,7 +12,7 @@ "issues": "https://github.com/PandaDap2006/PandaLib/issues", "sources": "https://github.com/PandaDap2006/PandaLib" }, - "license": "LGPL-3", + "license": "GPL-3", "environment": "*", "entrypoints": { "main": [ diff --git a/forge/build.gradle b/forge/build.gradle index c038f59..8e467d6 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -4,11 +4,11 @@ architectury { } loom { - accessWidenerPath = project(":common").loom.accessWidenerPath +// accessWidenerPath = project(":common").loom.accessWidenerPath forge { - convertAccessWideners = true - extraAccessWideners.add loom.accessWidenerPath.get().asFile.name +// convertAccessWideners = true +// extraAccessWideners.add loom.accessWidenerPath.get().asFile.name mixinConfig "pandalib-common.mixins.json" mixinConfig "pandalib.mixins.json" diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index a9094d5..4fa80ed 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,10 +1,10 @@ modLoader = "javafml" loaderVersion = "*" -license = "LGPL-3" +license = "GPL-3" issueTrackerURL="https://github.com/PandaDap2006/PandaLib/issues" [[mods]] -modId = "pandalib" +modId = "${id}" version = "${version}" displayName = "${name}" authors = "The Panda Oliver" diff --git a/gradle.properties b/gradle.properties index 29d3e03..a07d8df 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ mod_name = PandaLib mod_description = A multipurpose library with a Config API and a bit of utility code. # Mod properties -mod_version = 0.3 +mod_version = 0.4 maven_group = me.pandamods archives_name = pandalib diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 23b94ec..38b8bc9 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -4,7 +4,7 @@ architectury { } loom { - accessWidenerPath = project(":common").loom.accessWidenerPath +// accessWidenerPath = project(":common").loom.accessWidenerPath } configurations { @@ -39,5 +39,5 @@ shadowJar { remapJar { input.set shadowJar.archiveFile injectAccessWidener = true - atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) +// atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) } \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 44a2d84..350ca05 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -1,11 +1,10 @@ modLoader = "javafml" loaderVersion = "*" -license = "LGPL-3" +license = "GPL-3" issueTrackerURL="https://github.com/PandaDap2006/PandaLib/issues" -showAsResourcePack=false [[mods]] -modId = "pandalib" +modId = "${id}" version = "${version}" displayName = "${name}" authors = "The Panda Oliver" diff --git a/publishLocalyAll.bat b/publishLocalyAll.bat new file mode 100644 index 0000000..35fd1b8 --- /dev/null +++ b/publishLocalyAll.bat @@ -0,0 +1,15 @@ +@echo off & setlocal enabledelayedexpansion + +echo ==================== Cleaning workspace to build ==================== + call .\gradlew.bat clean --no-daemon + +@rem Loop trough everything in the version properties folder +for %%f in (versionProperties\*) do ( + @rem Get the name of the version that is going to be compiled + set version=%%~nf + + echo ==================== Building !version! ==================== + call .\gradlew.bat publishToMavenLocal -PmcVer="!version!" --no-daemon +) + +endlocal diff --git a/versionProperties/1.19.2.properties b/versionProperties/1.19.2.properties index f2b239c..252e422 100644 --- a/versionProperties/1.19.2.properties +++ b/versionProperties/1.19.2.properties @@ -8,7 +8,7 @@ compatible_forgemc_versions = 1.19.2 # Minecraft properties minecraft_version = 1.19.2 -parchment_version=1.19.2:2022.11.27 +parchment_version = 1.19.2:2022.11.27 # Mod Loader Dependencies fabric_loader_version = 0.15.11 diff --git a/versionProperties/1.20.5.properties b/versionProperties/1.20.5.properties index 0bdc33a..7a3d8f6 100644 --- a/versionProperties/1.20.5.properties +++ b/versionProperties/1.20.5.properties @@ -8,13 +8,12 @@ compatible_forgemc_versions = [1.20.5,1.21) # Minecraft properties minecraft_version = 1.20.5 -parchment_version=1.20.6:2024.06.16 +parchment_version = 1.20.6:2024.06.16 # Mod Loader Dependencies fabric_loader_version = 0.15.11 fabric_api_version = 0.97.8+1.20.5 -forge_version = 51.0.18 neoforge_version = 20.5.21-beta # Publish Mods Properties diff --git a/versionProperties/1.20.properties b/versionProperties/1.20.properties index 37bc335..93c5435 100644 --- a/versionProperties/1.20.properties +++ b/versionProperties/1.20.properties @@ -8,7 +8,7 @@ compatible_forgemc_versions = [1.20,1.20.5) # Minecraft properties minecraft_version = 1.20 -parchment_version=1.20.1:2023.09.03 +parchment_version = 1.20.1:2023.09.03 # Mod Loader Dependencies fabric_loader_version = 0.15.11 diff --git a/versionProperties/1.21.properties b/versionProperties/1.21.properties index b48618b..818bd4f 100644 --- a/versionProperties/1.21.properties +++ b/versionProperties/1.21.properties @@ -8,13 +8,12 @@ compatible_forgemc_versions = [1.21,) # Minecraft properties minecraft_version = 1.21 -parchment_version=1.21:2024.06.23 +parchment_version = 1.21:2024.06.23 # Mod Loader Dependencies fabric_loader_version = 0.15.11 fabric_api_version = 0.100.4+1.21 -forge_version = 51.0.18 neoforge_version = 21.0.42-beta # Publish Mods Properties From 23c59c66c6097f277b04f0ae2391fcf4784c1999 Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Thu, 4 Jul 2024 21:55:50 +0200 Subject: [PATCH 11/25] Add access widener support and fix json removal Added support for access wideners in multiple build.gradle files and added an accessWidener reference in architectury.common.json. Also added a Gradle task named "removeAWfromArchitecturyJson" in build.gradle for removing the "accessWidener" reference from the generated architectury.common.json file at build time. Downgraded manifold version due to a compiler bug. --- build.gradle | 22 +++++++++++++++++++ buildAll.bat | 15 ------------- common/build.gradle | 2 +- .../main/resources/architectury.common.json | 1 + fabric/build.gradle | 2 +- forge/build.gradle | 6 ++--- gradle.properties | 3 ++- neoforge/build.gradle | 4 ++-- publishLocalyAll.bat | 15 ------------- 9 files changed, 32 insertions(+), 38 deletions(-) delete mode 100644 buildAll.bat delete mode 100644 publishLocalyAll.bat diff --git a/build.gradle b/build.gradle index 9b03a5f..8e07dd3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,8 @@ +import groovy.json.JsonSlurper +import groovy.json.JsonBuilder + plugins { + id "java" id "architectury-plugin" version "3.4-SNAPSHOT" id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false id "com.github.johnrengelman.shadow" version "8.1.1" apply false @@ -108,6 +112,24 @@ subprojects { } } + // Fix for Access widener reference not getting removed from architectury.common.json when build + tasks.register("removeAWfromArchitecturyJson") { + doLast { + def jsonFile = file("$buildDir/resources/main/architectury.common.json") + + if (jsonFile.exists()) { + def jsonContent = new JsonSlurper().parse(jsonFile) + + jsonContent.remove("accessWidener") + jsonFile.write(new JsonBuilder(jsonContent).toPrettyString()) + } + } + } + + jar { + dependsOn removeAWfromArchitecturyJson + } + tasks.withType(JavaCompile).configureEach { options.encoding = "UTF-8" options.release = java_version as Integer diff --git a/buildAll.bat b/buildAll.bat deleted file mode 100644 index 3800b69..0000000 --- a/buildAll.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off & setlocal enabledelayedexpansion - -echo ==================== Cleaning workspace to build ==================== - call .\gradlew.bat clean --no-daemon - -@rem Loop trough everything in the version properties folder -for %%f in (versionProperties\*) do ( - @rem Get the name of the version that is going to be compiled - set version=%%~nf - - echo ==================== Building !version! ==================== - call .\gradlew.bat build -PmcVer="!version!" --no-daemon -) - -endlocal diff --git a/common/build.gradle b/common/build.gradle index 69433a7..7d7344b 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -3,7 +3,7 @@ architectury { } loom { -// accessWidenerPath = file("src/main/resources/pandalib.accesswidener") + accessWidenerPath = file("src/main/resources/pandalib.accesswidener") } dependencies { diff --git a/common/src/main/resources/architectury.common.json b/common/src/main/resources/architectury.common.json index 3112840..492afbd 100644 --- a/common/src/main/resources/architectury.common.json +++ b/common/src/main/resources/architectury.common.json @@ -1,4 +1,5 @@ { + "accessWidener": "pandalib.accesswidener", "injected_interfaces": { "net/minecraft/world/entity/player/Player": ["me/pandamods/pandalib/extensions/PlayerExtension"] } diff --git a/fabric/build.gradle b/fabric/build.gradle index babef61..97bfda7 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -4,7 +4,7 @@ architectury { } loom { -// accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath } configurations { diff --git a/forge/build.gradle b/forge/build.gradle index 8e467d6..c038f59 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -4,11 +4,11 @@ architectury { } loom { -// accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath forge { -// convertAccessWideners = true -// extraAccessWideners.add loom.accessWidenerPath.get().asFile.name + convertAccessWideners = true + extraAccessWideners.add loom.accessWidenerPath.get().asFile.name mixinConfig "pandalib-common.mixins.json" mixinConfig "pandalib.mixins.json" diff --git a/gradle.properties b/gradle.properties index a07d8df..5155d7b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,4 +25,5 @@ github_repo = PandaDap2006/PandaLib # Dependencies joml_version = 1.10.5 -manifold_version = 2024.1.20 \ No newline at end of file +# 2024.1.0 is used because of a weird java compiler bug +manifold_version = 2024.1.0 \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 38b8bc9..23b94ec 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -4,7 +4,7 @@ architectury { } loom { -// accessWidenerPath = project(":common").loom.accessWidenerPath + accessWidenerPath = project(":common").loom.accessWidenerPath } configurations { @@ -39,5 +39,5 @@ shadowJar { remapJar { input.set shadowJar.archiveFile injectAccessWidener = true -// atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) + atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) } \ No newline at end of file diff --git a/publishLocalyAll.bat b/publishLocalyAll.bat deleted file mode 100644 index 35fd1b8..0000000 --- a/publishLocalyAll.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off & setlocal enabledelayedexpansion - -echo ==================== Cleaning workspace to build ==================== - call .\gradlew.bat clean --no-daemon - -@rem Loop trough everything in the version properties folder -for %%f in (versionProperties\*) do ( - @rem Get the name of the version that is going to be compiled - set version=%%~nf - - echo ==================== Building !version! ==================== - call .\gradlew.bat publishToMavenLocal -PmcVer="!version!" --no-daemon -) - -endlocal From 87e400b86741eeb1ac7230f792a1e3770c1083c4 Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Thu, 4 Jul 2024 23:41:58 +0200 Subject: [PATCH 12/25] Remove publishing flags and rename project The publishing flags for Fabric, Forge, and NeoForge in the build.gradle file have been removed. This assumes that if those projects are found, they will be published automatically. Additionally, the project's name in the settings.gradle file has been changed from `archives_name` to `mod_name`. The properties enabling Fabric, Forge, and NeoForge publishing have also been removed from the gradle.properties file. --- build.gradle | 9 +++------ gradle.properties | 4 ---- settings.gradle | 2 +- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 8e07dd3..64a8dc3 100644 --- a/build.gradle +++ b/build.gradle @@ -157,9 +157,6 @@ subprojects { publishMods { var using_ranged_game_version = hasProperty("latest_supported_game_version") - var is_fabric_publishing_enabled = Boolean.parseBoolean(enable_fabric_publishing) - var is_forge_publishing_enabled = Boolean.parseBoolean(enable_forge_publishing) - var is_neoforge_publishing_enabled = Boolean.parseBoolean(enable_neoforge_publishing) dryRun = Boolean.parseBoolean(is_dry_run) @@ -234,7 +231,7 @@ publishMods { displayName = "[NeoForge ${supported_version_str}] ${mod_version}" } - if (findProject(":fabric") && is_fabric_publishing_enabled) { + if (findProject(":fabric")) { curseforge("curseforgeFabric") { from(curseforgeOptions, fabricOptions) @@ -252,7 +249,7 @@ publishMods { } } - if (findProject(":forge") && is_forge_publishing_enabled) { + if (findProject(":forge")) { curseforge("curseforgeForge") { from(curseforgeOptions, forgeOptions) @@ -266,7 +263,7 @@ publishMods { } } - if (findProject(":neoforge") && is_neoforge_publishing_enabled) { + if (findProject(":neoforge")) { curseforge("curseforgeNeoForge") { from(curseforgeOptions, neoForgeOptions) diff --git a/gradle.properties b/gradle.properties index 5155d7b..bbe45f3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,10 +15,6 @@ archives_name = pandalib # Publish Mods Properties is_dry_run = true -enable_fabric_publishing = true -enable_forge_publishing = true -enable_neoforge_publishing = true - curseforge_project_id = 975460 modrinth_project_id = mEEGbEIu github_repo = PandaDap2006/PandaLib diff --git a/settings.gradle b/settings.gradle index d2fc456..6295b3b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -44,7 +44,7 @@ def loadProperties() { } loadProperties() -rootProject.name = archives_name +rootProject.name = mod_name include("common") for (loader in ((String) gradle.supported_modloaders).split(",")) { From 4eb6987a53384a269f5aaf0b9524558e10b6b4c1 Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Fri, 5 Jul 2024 16:16:16 +0200 Subject: [PATCH 13/25] Add role pinging in Discord notifications and version setting Extended code in build.gradle file to set version-related properties during build, as well as include role ID in Discord notifications for releases. The "pinged_discord_role_id" has also been added to gradle.properties file to allow efficient pinging of respective roles in Discord during notifications for mod releases. --- build.gradle | 7 +++++-- gradle.properties | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 64a8dc3..fb0fed3 100644 --- a/build.gradle +++ b/build.gradle @@ -18,9 +18,12 @@ def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { for (int i = 0; i < AvailableVersion.size(); i++) { String versionString = AvailableVersion[i].replace(".", "_") sb.append("MC_" + versionString + "=" + i.toString() + "\n") + ext.set("MC_" + versionString, i.toString()) - if (versionIndex == i) + if (versionIndex == i) { sb.append("MC_VER=" + i.toString() + "\n") + ext.set("MC_VER", i.toString()) + } } new File(projectDir, "build.properties").text = sb.toString() @@ -173,7 +176,7 @@ publishMods { dryRunWebhookUrl = providers.environmentVariable("DISCORD_WEBHOOK_DRY_RUN") username = "Mod Release" avatarUrl = "https://avatars.githubusercontent.com/u/70108603?v=4" - content = changelog.map { "# ${mod_name} ${mod_version} Release for ${supported_version_str} \n" + it } + content = changelog.map { "# ${mod_name} ${mod_version} Release for ${supported_version_str} \n" + it + "\n<@&${pinged_discord_role_id}>" } } def curseforgeOptions = curseforgeOptions { diff --git a/gradle.properties b/gradle.properties index bbe45f3..28303bb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,6 +19,8 @@ curseforge_project_id = 975460 modrinth_project_id = mEEGbEIu github_repo = PandaDap2006/PandaLib +pinged_discord_role_id = 1258786696229687296 + # Dependencies joml_version = 1.10.5 # 2024.1.0 is used because of a weird java compiler bug From 93e96c94ee5e906b7ee0e91cee3f002f16135a64 Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Fri, 5 Jul 2024 17:43:27 +0200 Subject: [PATCH 14/25] Update build configuration and dependency requirements The build.gradle file has been updated to address properties from the rootProject and to dynamically determine required dependencies. Elements like 'curseforge_project_slug', 'required_curseforge_mods', 'required_modrinth_mods' etc., have been introduced to dynamically set respective parameters instead of being hard coded. --- build.gradle | 24 ++++++++++++++++-------- gradle.properties | 8 ++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index fb0fed3..89763b0 100644 --- a/build.gradle +++ b/build.gradle @@ -91,7 +91,7 @@ subprojects { annotationProcessor("systems.manifold:manifold-preprocessor:${manifold_version}") - if (hasProperty("embed_joml") && embed_joml == "true" && project != project(":common")) + if (rootProject.hasProperty("embed_joml") && embed_joml == "true" && project != project(":common")) includeJar("org.joml:joml:${joml_version}") else implementation("org.joml:joml:${joml_version}") @@ -159,7 +159,7 @@ subprojects { } publishMods { - var using_ranged_game_version = hasProperty("latest_supported_game_version") + var using_ranged_game_version = rootProject.hasProperty("latest_supported_game_version") dryRun = Boolean.parseBoolean(is_dry_run) @@ -191,14 +191,14 @@ publishMods { else minecraftVersions.add(supported_game_version) - javaVersions.add(JavaVersion.VERSION_21) + javaVersions.add(JavaVersion.toVersion(java_version)) clientRequired = true serverRequired = true - projectSlug = "pandalib" + projectSlug = curseforge_project_slug - requires("architectury-api") + requires(required_curseforge_mods) } def modrinthOptions = modrinthOptions { @@ -213,7 +213,7 @@ publishMods { else minecraftVersions.add(supported_game_version) - requires("architectury-api") + requires(required_modrinth_mods) } def fabricOptions = publishOptions { @@ -240,7 +240,7 @@ publishMods { announcementTitle = "Download for Fabric ${supported_version_str} from CurseForge" - requires("fabric-api") + requires(required_fabric_mods) } modrinth("modrinthFabric") { @@ -248,7 +248,7 @@ publishMods { announcementTitle = "Download for Fabric ${supported_version_str} from Modrinth" - requires("fabric-api") + requires(required_fabric_mods) } } @@ -257,12 +257,16 @@ publishMods { from(curseforgeOptions, forgeOptions) announcementTitle = "Download for Forge ${supported_version_str} from CurseForge" + + requires(required_forge_mods) } modrinth("modrinthForge") { from(modrinthOptions, forgeOptions) announcementTitle = "Download for Forge ${supported_version_str} from Modrinth" + + requires(required_forge_mods) } } @@ -271,12 +275,16 @@ publishMods { from(curseforgeOptions, neoForgeOptions) announcementTitle = "Download for NeoForge ${supported_version_str} from CurseForge" + + requires(required_neoforge_mods) } modrinth("modrinthNeoForge") { from(modrinthOptions, neoForgeOptions) announcementTitle = "Download for NeoForge ${supported_version_str} from Modrinth" + + requires(required_neoforge_mods) } } diff --git a/gradle.properties b/gradle.properties index 28303bb..1895c7c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,11 +16,19 @@ archives_name = pandalib is_dry_run = true curseforge_project_id = 975460 +curseforge_project_slug = pandalib modrinth_project_id = mEEGbEIu github_repo = PandaDap2006/PandaLib pinged_discord_role_id = 1258786696229687296 +required_curseforge_mods = ["architectury-api"] +required_modrinth_mods = ["architectury-api"] + +required_fabric_mods = ["fabric-api"] +required_forge_mods = [] +required_neoforge_mods = [] + # Dependencies joml_version = 1.10.5 # 2024.1.0 is used because of a weird java compiler bug From 45d65ebfc21935272baad04be3a5c7dfc43a66dc Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Fri, 5 Jul 2024 23:09:39 +0200 Subject: [PATCH 15/25] Update support section in README The support section in README.md has been updated to include a button to support through Ko-fi, and a revised message around purchasing a server for additional support. The previous banner and text have been replaced to better encourage supporting the development of the mods. --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6d1c052..53e0dc6 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,12 @@ If you have any of your own questions, please leave them [here](https://github.c You can also join my [Discord](https://discord.gg/wjPt4vEfXb) --- -### Do you need a cheap Minecraft server and want to support me, click the banner below and sign up, you can also use my code to get 15% off you first month at Kinetic Hosting. -[![](https://github.com/PandaDap2006/PandaDap2006/blob/main/assets_for_readme/kinetic_hosting_banner.png?raw=true)](https://billing.kinetichosting.net/aff.php?aff=476) +## Support me +[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/S6S0WO38H) + +You can also support me by clicking the link below and signing up, every purchased server will help support me and the development of my mods. +![Partner Banner](https://github.com/PandaDap2006/PandaDap2006/blob/main/assets_for_readme/kinetic_hosting_banner_v2.png?raw=true) +https://t.ly/B1Kui ## License The project is licensed under the GNU GPLv3 \ No newline at end of file From fbd4dbc03709bd645559c170d2134626ed9e487b Mon Sep 17 00:00:00 2001 From: Panda Mods Date: Fri, 5 Jul 2024 23:13:08 +0200 Subject: [PATCH 16/25] Update affiliate link in README The plain affiliate link was replaced with a clearly labelled textual hyperlink. This makes the README file cleaner and the call to action for the users more obvious. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53e0dc6..5e071da 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ You can also join my [Discord](https://discord.gg/wjPt4vEfXb) You can also support me by clicking the link below and signing up, every purchased server will help support me and the development of my mods. ![Partner Banner](https://github.com/PandaDap2006/PandaDap2006/blob/main/assets_for_readme/kinetic_hosting_banner_v2.png?raw=true) -https://t.ly/B1Kui +**[Sign up](https://t.ly/B1Kui)** ## License The project is licensed under the GNU GPLv3 \ No newline at end of file From cc43787e124258808cf0573f2462fb935b9fdd42 Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Thu, 8 Aug 2024 23:26:43 +0200 Subject: [PATCH 17/25] Remove old build configuration files and migrate to Kotlin DSL Deleted multiple old build.gradle files and settings.gradle file, replacing them with new Kotlin DSL equivalents. Updated all relevant module dependencies and configurations to ensure compatibility with the new setup. This restructuring aims to improve build script readability and maintainability. --- Changelog.md => CHANGELOG.md | 0 build.gradle | 312 ---------------- build.gradle.kts | 339 ++++++++++++++++++ common/build.gradle | 13 - common/build.gradle.kts | 17 + .../main/resources/architectury.common.json | 5 +- fabric/build.gradle | 45 --- fabric/build.gradle.kts | 74 ++++ fabric/src/main/resources/fabric.mod.json | 23 +- forge/build.gradle | 43 --- forge/build.gradle.kts | 53 +++ forge/src/main/resources/META-INF/mods.toml | 24 +- gradle.properties | 43 ++- neoforge/build.gradle | 43 --- neoforge/build.gradle.kts | 41 +++ .../resources/META-INF/neoforge.mods.toml | 28 +- settings.gradle | 55 --- settings.gradle.kts | 63 ++++ versionProperties/1.19.2.properties | 42 ++- versionProperties/1.20.5.properties | 41 ++- versionProperties/1.20.properties | 41 ++- versionProperties/1.21.properties | 39 +- 22 files changed, 744 insertions(+), 640 deletions(-) rename Changelog.md => CHANGELOG.md (100%) delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 common/build.gradle create mode 100644 common/build.gradle.kts delete mode 100644 fabric/build.gradle create mode 100644 fabric/build.gradle.kts delete mode 100644 forge/build.gradle create mode 100644 forge/build.gradle.kts delete mode 100644 neoforge/build.gradle create mode 100644 neoforge/build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/Changelog.md b/CHANGELOG.md similarity index 100% rename from Changelog.md rename to CHANGELOG.md diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 89763b0..0000000 --- a/build.gradle +++ /dev/null @@ -1,312 +0,0 @@ -import groovy.json.JsonSlurper -import groovy.json.JsonBuilder - -plugins { - id "java" - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false - id "com.github.johnrengelman.shadow" version "8.1.1" apply false - id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha" - id "me.modmuss50.mod-publish-plugin" version "0.5.1" -} - -def writeBuildGradlePredefine(List AvailableVersion, int versionIndex) { - StringBuilder sb = new StringBuilder() - - sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n") - - for (int i = 0; i < AvailableVersion.size(); i++) { - String versionString = AvailableVersion[i].replace(".", "_") - sb.append("MC_" + versionString + "=" + i.toString() + "\n") - ext.set("MC_" + versionString, i.toString()) - - if (versionIndex == i) { - sb.append("MC_VER=" + i.toString() + "\n") - ext.set("MC_VER", i.toString()) - } - } - - new File(projectDir, "build.properties").text = sb.toString() -} - -project.gradle.ext.getProperties().each { prop -> - ext.set(prop.key, prop.value) -} - -writeBuildGradlePredefine(availableVersions, versionIndex) - -architectury { - minecraft = minecraft_version -} - -allprojects { - group = maven_group - version = "${mod_version}-${minecraft_version}" -} - -subprojects { - apply plugin: "com.github.johnrengelman.shadow" - apply plugin: "dev.architectury.loom" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - base { - archivesName = "${archives_name}-${project.name}" - } - - configurations { - includeJar - include.extendsFrom includeJar - implementation.extendsFrom includeJar - - includeModJar - include.extendsFrom includeModJar - modImplementation.extendsFrom includeModJar - } - - repositories { - maven { - name = "ParchmentMC" - url = "https://maven.parchmentmc.org" - } - exclusiveContent { - forRepository { - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - } - } - filter { - includeGroup "maven.modrinth" - } - } - } - - dependencies { - minecraft "com.mojang:minecraft:${minecraft_version}" - mappings loom.layered() { - officialMojangMappings() - parchment "org.parchmentmc.data:parchment-${parchment_version}@zip" - } - - annotationProcessor("systems.manifold:manifold-preprocessor:${manifold_version}") - - if (rootProject.hasProperty("embed_joml") && embed_joml == "true" && project != project(":common")) - includeJar("org.joml:joml:${joml_version}") - else - implementation("org.joml:joml:${joml_version}") - } - - processResources { - def replaceProperties = [ - java_version : java_version, - version : mod_version, - id : archives_name, - name : mod_name, - description : mod_description, - - compatible_fabricmc_versions: compatible_fabricmc_versions, - compatible_forgemc_versions : compatible_forgemc_versions - ] - - inputs.properties replaceProperties - filesMatching(["fabric.mod.json", "META-INF/mods.toml", "META-INF/neoforge.mods.toml"]) { - expand replaceProperties - } - } - - // Fix for Access widener reference not getting removed from architectury.common.json when build - tasks.register("removeAWfromArchitecturyJson") { - doLast { - def jsonFile = file("$buildDir/resources/main/architectury.common.json") - - if (jsonFile.exists()) { - def jsonContent = new JsonSlurper().parse(jsonFile) - - jsonContent.remove("accessWidener") - jsonFile.write(new JsonBuilder(jsonContent).toPrettyString()) - } - } - } - - jar { - dependsOn removeAWfromArchitecturyJson - } - - tasks.withType(JavaCompile).configureEach { - options.encoding = "UTF-8" - options.release = java_version as Integer - options.compilerArgs += ["-Xplugin:Manifold"] - } - - java { - withSourcesJar() - } - - publishing { - publications { - mavenJava(MavenPublication) { - groupId = maven_group - artifactId = "${archives_name}-${project.name}" - version = project.version - from components.java - } - } - - repositories { - } - } -} - -publishMods { - var using_ranged_game_version = rootProject.hasProperty("latest_supported_game_version") - - dryRun = Boolean.parseBoolean(is_dry_run) - - version = mod_version - type = BETA - changelog = file("Changelog.md").text - - var supported_version_str = using_ranged_game_version ? - "${supported_game_version}-${latest_supported_game_version}" : - supported_game_version - - discord { - webhookUrl = providers.environmentVariable("DISCORD_WEBHOOK") - dryRunWebhookUrl = providers.environmentVariable("DISCORD_WEBHOOK_DRY_RUN") - username = "Mod Release" - avatarUrl = "https://avatars.githubusercontent.com/u/70108603?v=4" - content = changelog.map { "# ${mod_name} ${mod_version} Release for ${supported_version_str} \n" + it + "\n<@&${pinged_discord_role_id}>" } - } - - def curseforgeOptions = curseforgeOptions { - accessToken = providers.environmentVariable("CURSEFORGE_API_KEY") - projectId = curseforge_project_id - - if (using_ranged_game_version) - minecraftVersionRange { - start = supported_game_version - end = latest_supported_game_version - } - else - minecraftVersions.add(supported_game_version) - - javaVersions.add(JavaVersion.toVersion(java_version)) - - clientRequired = true - serverRequired = true - - projectSlug = curseforge_project_slug - - requires(required_curseforge_mods) - } - - def modrinthOptions = modrinthOptions { - accessToken = providers.environmentVariable("MODRINTH_API_KEY") - projectId = modrinth_project_id - - if (using_ranged_game_version) - minecraftVersionRange { - start = supported_game_version - end = latest_supported_game_version - } - else - minecraftVersions.add(supported_game_version) - - requires(required_modrinth_mods) - } - - def fabricOptions = publishOptions { - file = project(":fabric").remapJar.archiveFile - modLoaders.add("fabric") - displayName = "[Fabric ${supported_version_str}] ${mod_version}" - } - - def forgeOptions = publishOptions { - file = project(":forge").remapJar.archiveFile - modLoaders.add("forge") - displayName = "[Forge ${supported_version_str}] ${mod_version}" - } - - def neoForgeOptions = publishOptions { - file = project(":neoforge").remapJar.archiveFile - modLoaders.add("neoforge") - displayName = "[NeoForge ${supported_version_str}] ${mod_version}" - } - - if (findProject(":fabric")) { - curseforge("curseforgeFabric") { - from(curseforgeOptions, fabricOptions) - - announcementTitle = "Download for Fabric ${supported_version_str} from CurseForge" - - requires(required_fabric_mods) - } - - modrinth("modrinthFabric") { - from(modrinthOptions, fabricOptions) - - announcementTitle = "Download for Fabric ${supported_version_str} from Modrinth" - - requires(required_fabric_mods) - } - } - - if (findProject(":forge")) { - curseforge("curseforgeForge") { - from(curseforgeOptions, forgeOptions) - - announcementTitle = "Download for Forge ${supported_version_str} from CurseForge" - - requires(required_forge_mods) - } - - modrinth("modrinthForge") { - from(modrinthOptions, forgeOptions) - - announcementTitle = "Download for Forge ${supported_version_str} from Modrinth" - - requires(required_forge_mods) - } - } - - if (findProject(":neoforge")) { - curseforge("curseforgeNeoForge") { - from(curseforgeOptions, neoForgeOptions) - - announcementTitle = "Download for NeoForge ${supported_version_str} from CurseForge" - - requires(required_neoforge_mods) - } - - modrinth("modrinthNeoForge") { - from(modrinthOptions, neoForgeOptions) - - announcementTitle = "Download for NeoForge ${supported_version_str} from Modrinth" - - requires(required_neoforge_mods) - } - } - - github { - accessToken = providers.environmentVariable("GITHUB_API_KEY") - repository = github_repo - commitish = "main" - tagName = "release/${mod_version}-${supported_version_str}" - - file = project(":common").remapJar.archiveFile - - if (findProject(":fabric")) { - modLoaders.add("fabric") - additionalFiles.from(project(":fabric").remapJar.archiveFile) - } - if (findProject(":forge")) { - modLoaders.add("forge") - additionalFiles.from(project(":forge").remapJar.archiveFile) - } - if (findProject(":neoforge")) { - modLoaders.add("neoforge") - additionalFiles.from(project(":neoforge").remapJar.archiveFile) - } - } -} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..cec4f97 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,339 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import net.fabricmc.loom.api.LoomGradleExtensionAPI +import net.fabricmc.loom.task.RemapJarTask + +plugins { + java + + id("architectury-plugin") version "3.4-SNAPSHOT" + id("dev.architectury.loom") version "1.7-SNAPSHOT" apply false + + id("com.github.johnrengelman.shadow") version "8.1.1" apply false + id("systems.manifold.manifold-gradle-plugin") version "0.0.2-alpha" + + id("maven-publish") + id("me.modmuss50.mod-publish-plugin") version "0.6.3" +} + +fun writeBuildGradlePredefine(AvailableVersion: List, versionIndex: Int) { + val sb = StringBuilder() + + sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n") + + for ((index, s) in AvailableVersion.withIndex()) { + val versionString = s.replace(".", "_") + sb.append("MC_${versionString}=${index}\n") + ext.set("MC_${versionString}", index.toString()) + + if (versionIndex == index) { + sb.append("MC_VER=${index}\n") + ext.set("MC_VER", index.toString()) + } + } + + File(projectDir, "build.properties").writeText(sb.toString()) +} + +project.gradle.extra.properties.forEach { prop -> + ext.set(prop.key, prop.value) +} + +writeBuildGradlePredefine(project.properties["availableVersions"] as List, project.properties["versionIndex"] as Int) + +// gradle.properties +val supportedModLoaders: String by project + +val projectArchivesName: String by project +val projectGroup: String by project + +val modId: String by project +val modVersion: String by project +val projectJavaVersion: String by project +val modName: String by project +val modDescription: String by project +val modAuthor: String by project + +val minecraftVersion: String by project + +val parchmentVersion: String by project +val parchmentMinecraftVersion: String by project + +val jomlVersion = properties["jomlVersion"] +val manifoldVersion: String by project + +val architecturyVersion: String by project + +val fabricCompatibleVersions: String by project +val forgeCompatibleVersions: String by project +val neoForgeCompatibleVersions: String by project + +architectury.minecraft = minecraftVersion + +allprojects { + apply(plugin = "java") + + base.archivesName = projectArchivesName + version = "${modVersion}-${minecraftVersion}" + group = projectGroup +} + +subprojects { + val isMinecraftSubProject = findProject("common") != null && project("common") != project + val isFabric = findProject("fabric") != null && project("fabric") == project + val isForge = findProject("forge") != null && project("forge") == project + val isNeoForge = findProject("neoforge") != null && project("neoforge") == project + + apply(plugin = "architectury-plugin") + apply(plugin = "dev.architectury.loom") + + apply(plugin = "maven-publish") + apply(plugin = "com.github.johnrengelman.shadow") + + val loom = project.extensions.getByName("loom") + loom.silentMojangMappingsLicense() + + configurations { + create("common") + create("shadowCommon") + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + + create("jarShadow") + implementation.get().extendsFrom(configurations["jarShadow"]) + + create("modShadow") + getByName("modImplementation").extendsFrom(configurations["modShadow"]) + getByName("include").extendsFrom(configurations["modShadow"]) + } + + repositories { + mavenCentral() + mavenLocal() + + maven("https://maven.parchmentmc.org") + maven("https://maven.fabricmc.net/") + maven("https://maven.minecraftforge.net/") + maven("https://maven.neoforged.net/releases/") + } + + @Suppress("UnstableApiUsage") + dependencies { + "minecraft"("com.mojang:minecraft:${minecraftVersion}") + "mappings"(loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-${parchmentMinecraftVersion}:${parchmentVersion}@zip") + }) + + if (isMinecraftSubProject) { + "modApi"("dev.architectury:architectury-${project.name}:${architecturyVersion}") + } else { + "modApi"("dev.architectury:architectury:${architecturyVersion}") + } + + if (jomlVersion != null) { + "jarShadow"("org.joml:joml:${jomlVersion}") + } + + compileOnly("org.jetbrains:annotations:24.1.0") + annotationProcessor("systems.manifold:manifold-preprocessor:${manifoldVersion}") + } + + tasks.withType().configureEach { + options.encoding = "UTF-8" + options.release.set(JavaLanguageVersion.of(projectJavaVersion).asInt()) + options.compilerArgs.add("-Xplugin:Manifold") + } + + if (isMinecraftSubProject) { + tasks.withType().configureEach { + configurations = listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("jarShadow")) + archiveClassifier.set("dev-shadow") + + exclude("architectury.common.json") + } + + tasks.withType().configureEach { + val shadowJar = tasks.getByName("shadowJar") + inputFile.set(shadowJar.archiveFile) + dependsOn(shadowJar) + } + } + + tasks { + processResources { + val properties = mapOf( + "minecraftVersion" to minecraftVersion, + + "modId" to modId, + "modVersion" to modVersion, + "modName" to modName, + "modDescription" to modDescription, + "modAuthor" to modAuthor, + + "fabricCompatibleVersions" to fabricCompatibleVersions, + "forgeCompatibleVersions" to forgeCompatibleVersions, + "neoForgeCompatibleVersions" to neoForgeCompatibleVersions + ) + + inputs.properties(properties) + filesMatching(listOf("META-INF/mods.toml", "META-INF/neoforge.mods.toml", "pack.mcmeta", "fabric.mod.json")) { + expand(properties) + } + } + + jar { + manifest { + attributes(mapOf( + "Specification-Title" to modName, + "Specification-Vendor" to modAuthor, + "Specification-Version" to modVersion, + "Implementation-Title" to name, + "Implementation-Vendor" to modAuthor, + "Implementation-Version" to archiveVersion + )) + } + } + + jar.get().archiveClassifier.set("dev") + } + + java { + withSourcesJar() + } + + // Maven Publishing + publishing { + publications { + create("mod") { + groupId = projectGroup + artifactId = "${projectArchivesName}-${project.name}" + version = project.version as String + + from(components["java"]) + } + } + + repositories { + } + } +} + +// Mod Publishing +val publishingDryRun: String by project +val publishingReleaseType: String by project + +val publishingMinecraftVersion: String by project +val publishingLatestMinecraftVersion = properties["publishingLatestMinecraftVersion"] + +val publishingCurseForgeProjectId: String by project +val publishingModrinthProjectId: String by project + +val publishingGitHubRepo: String by project + +var curseForgeAPIKey = providers.environmentVariable("CURSEFORGE_API_KEY") +var modrinthAPIKey = providers.environmentVariable("MODRINTH_API_KEY") +var githubAPIKey = providers.environmentVariable("GITHUB_API_KEY") + +publishMods { + dryRun = publishingDryRun.toBoolean() + + version = modVersion + changelog = rootProject.file("CHANGELOG.md").readText() + + // Set the release type + type = when (publishingReleaseType.toInt()) { + 2 -> ALPHA + 1 -> BETA + else -> STABLE + } + + val isRangedVersion = publishingLatestMinecraftVersion != null + val minecraftVersionStr = if (isRangedVersion) { + "${publishingMinecraftVersion}-${publishingLatestMinecraftVersion}" + } else { + publishingLatestMinecraftVersion + } + + // Creates publish options for each supported mod loader + supportedModLoaders.toString().split(",").forEach { + val loaderName = it + val loaderDisplayName = when (it) { + "fabric" -> "Fabric" + "forge" -> "Forge" + "neoforge" -> "NeoForge" + else -> it + } + + val remapJar = project(":" + loaderName).tasks.getByName("remapJar") + + curseforge("curseforge_${loaderName}") { + accessToken = curseForgeAPIKey + displayName = "[${loaderDisplayName} ${minecraftVersionStr}] v${modVersion}" + + projectId = publishingCurseForgeProjectId + + modLoaders.add(loaderName) + file = remapJar.archiveFile + + if (isRangedVersion) + minecraftVersionRange { + start = publishingMinecraftVersion + end = publishingLatestMinecraftVersion as String + } + else + minecraftVersions.add(publishingMinecraftVersion) + + javaVersions.add(JavaVersion.VERSION_21) + + clientRequired = true + serverRequired = true + + if (loaderName == "fabric") + requires("fabric-api") + } + + modrinth("modrinth_" + loaderName) { + accessToken = modrinthAPIKey + displayName = "[${loaderDisplayName} ${minecraftVersionStr}] v${modVersion}" + + projectId = publishingModrinthProjectId + + modLoaders.add(loaderName) + file = remapJar.archiveFile + + if (isRangedVersion) + minecraftVersionRange { + start = publishingMinecraftVersion + end = publishingLatestMinecraftVersion as String + } + else + minecraftVersions.add(publishingMinecraftVersion) + + if (loaderName == "fabric") + requires("fabric-api") + } + } + + var githubRepository = publishingGitHubRepo + var releaseType = when (publishingReleaseType.toInt()) { + 2 -> "alpha" + 1 -> "beta" + else -> "stable" + } + var githubTagName = "${releaseType}/${modVersion}-${minecraftVersionStr}" + github { + accessToken = githubAPIKey + repository = githubRepository + tagName = githubTagName + commitish = "main" + + modLoaders.addAll(supportedModLoaders.trim().split(",")) + val commonRemapJar = project(":common").tasks.getByName("remapJar") + file = commonRemapJar.archiveFile + + supportedModLoaders.toString().split(",").forEach { + val modRemapJar = project(":$it").tasks.getByName("remapJar") + additionalFiles.from(modRemapJar.archiveFile) + } + } +} diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index 7d7344b..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -architectury { - common supported_modloaders.split(",") -} - -loom { - accessWidenerPath = file("src/main/resources/pandalib.accesswidener") -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" - - modApi "dev.architectury:architectury:${architectury_version}" -} \ No newline at end of file diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..3e81b9b --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,17 @@ +// gradle.properties +val modId: String by project +val supportedModLoaders: String by project + +val fabricLoaderVersion: String by project + +architectury { + common(supportedModLoaders.split(",")) +} + +loom.accessWidenerPath.set(file("src/main/resources/${modId}.accesswidener")) + +dependencies { + // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies + // Do NOT use other classes from fabric loader + modImplementation("net.fabricmc:fabric-loader:${fabricLoaderVersion}") +} diff --git a/common/src/main/resources/architectury.common.json b/common/src/main/resources/architectury.common.json index 492afbd..caca6e2 100644 --- a/common/src/main/resources/architectury.common.json +++ b/common/src/main/resources/architectury.common.json @@ -1,6 +1,3 @@ { - "accessWidener": "pandalib.accesswidener", - "injected_interfaces": { - "net/minecraft/world/entity/player/Player": ["me/pandamods/pandalib/extensions/PlayerExtension"] - } + "accessWidener": "pandalib.accesswidener" } \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index 97bfda7..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,45 +0,0 @@ -architectury { - platformSetupLoomIde() - fabric() -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common -} - -repositories { - maven { url = "https://maven.terraformersmc.com/releases/" } -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" - modApi("net.fabricmc.fabric-api:fabric-api:${fabric_api_version}") - - modApi("dev.architectury:architectury-fabric:${architectury_version}") - - modApi("com.terraformersmc:modmenu:${modmenu_version}") - - // Used for testing - modRuntimeOnly("maven.modrinth:pandas-falling-trees:0.12.3-fabric,${minecraft_version}") - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } -} - -shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - injectAccessWidener = true -} \ No newline at end of file diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 0000000..500f6ac --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,74 @@ +// gradle.properties +val fabricLoaderVersion: String by project +val fabricApiVersion: String by project + +val modmenuVersion: String by project + +architectury { + platformSetupLoomIde() + fabric() +} + +loom { + accessWidenerPath.set(project(":common").loom.accessWidenerPath) +} + +configurations { + getByName("developmentFabric").extendsFrom(configurations["common"]) +} + +repositories { + maven { url = uri("https://maven.terraformersmc.com/releases/") } +} + +dependencies { + modImplementation("net.fabricmc:fabric-loader:${fabricLoaderVersion}") + modApi("net.fabricmc.fabric-api:fabric-api:${fabricApiVersion}") + + modApi("com.terraformersmc:modmenu:${modmenuVersion}") + + "common"(project(":common", "namedElements")) { isTransitive = false } + "shadowCommon"(project(":common", "transformProductionFabric")) { isTransitive = false } +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-Fabric") + + remapJar { + injectAccessWidener.set(true) + } + + sourcesJar { + val commonSources = project(":common").tasks.sourcesJar + dependsOn(commonSources) + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} + +components { + java.run { + if (this is AdhocComponentWithVariants) + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) { skip() } + } +} + +publishing { + publications.create("mavenFabric") { + artifactId = "${project.properties["archives_base_name"]}" + "-Fabric" + from(components["java"]) + } + + repositories { + mavenLocal() + maven { + val releasesRepoUrl = "https://example.com/releases" + val snapshotsRepoUrl = "https://example.com/snapshots" + url = uri(if (project.version.toString().endsWith("SNAPSHOT") || project.version.toString().startsWith("0")) snapshotsRepoUrl else releasesRepoUrl) + name = "ExampleRepo" + credentials { + username = project.properties["repoLogin"]?.toString() + password = project.properties["repoPassword"]?.toString() + } + } + } +} \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 55aabc6..9944517 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,18 +1,18 @@ { "schemaVersion": 1, - "id": "${id}", - "version": "${version}", - "name": "${name}", - "description": "${description}", - "authors": [ - "The Panda Oliver" - ], - "icon": "assets/pandalib/icon.png", + "id": "${modId}", + "version": "${modVersion}", + "name": "${modName}", + "description": "${modDescription}", + "authors": [ + "${modAuthor}" + ], "contact": { "issues": "https://github.com/PandaDap2006/PandaLib/issues", "sources": "https://github.com/PandaDap2006/PandaLib" }, "license": "GPL-3", + "icon": "assets/${modId}/icon.png", "environment": "*", "entrypoints": { "main": [ @@ -20,14 +20,13 @@ ] }, "mixins": [ - "pandalib.mixins.json", - "pandalib-common.mixins.json" + "${modId}.mixins.json", + "${modId}-common.mixins.json" ], "depends": { "fabric": "*", "fabric-api": "*", - "minecraft": "${compatible_fabricmc_versions}", - "java": ">=${java_version}", + "minecraft": "${fabricCompatibleVersions}", "architectury": "*" }, "custom": { diff --git a/forge/build.gradle b/forge/build.gradle deleted file mode 100644 index c038f59..0000000 --- a/forge/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -architectury { - platformSetupLoomIde() - forge() -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath - - forge { - convertAccessWideners = true - extraAccessWideners.add loom.accessWidenerPath.get().asFile.name - - mixinConfig "pandalib-common.mixins.json" - mixinConfig "pandalib.mixins.json" - } -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentForge.extendsFrom common -} - -dependencies { - forge("net.minecraftforge:forge:${minecraft_version}-${forge_version}") - - modApi("dev.architectury:architectury-forge:${architectury_version}") - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } -} - -shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - injectAccessWidener = true -} \ No newline at end of file diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts new file mode 100644 index 0000000..b3ea56a --- /dev/null +++ b/forge/build.gradle.kts @@ -0,0 +1,53 @@ +// gradle.properties +val modId: String by project + +val forgeVersion: String by project + +architectury { + platformSetupLoomIde() + forge() +} + +loom { + accessWidenerPath.set(project(":common").loom.accessWidenerPath) + + forge { + convertAccessWideners.set(true) + extraAccessWideners.add(loom.accessWidenerPath.get().asFile.name) + + // Fixes Mixin Patcher issue with Forge + useCustomMixin.set(false) + + mixinConfig("${modId}-common.mixins.json") + mixinConfig("${modId}.mixins.json") + } +} + +configurations { + getByName("developmentForge").extendsFrom(configurations["common"]) +} + +dependencies { + forge("net.minecraftforge:forge:${forgeVersion}") + + "common"(project(":common", "namedElements")) { isTransitive = false } + "shadowCommon"(project(":common", "transformProductionForge")) { isTransitive = false } +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-Forge") + + shadowJar { + exclude("fabric.mod.json") + } + + remapJar { + injectAccessWidener = true + } + + sourcesJar { + val commonSources = project(":common").tasks.sourcesJar + dependsOn(commonSources) + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 4fa80ed..1b9f605 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,31 +1,33 @@ modLoader = "javafml" loaderVersion = "*" -license = "GPL-3" issueTrackerURL="https://github.com/PandaDap2006/PandaLib/issues" +license = "GPL-3" [[mods]] -modId = "${id}" -version = "${version}" -displayName = "${name}" -authors = "The Panda Oliver" -logoFile = "assets/pandalib/icon.png" -description = "${description}" +modId = "${modId}" +version = "${modVersion}" +displayName = "${modName}" +authors = "${modAuthor}" +description = ''' +${modDescription} +''' +logoFile = "assets/${modId}/icon.png" -[[dependencies.pandalib]] +[[dependencies.${modId}]] modId = "forge" mandatory = true versionRange = "*" ordering = "NONE" side = "BOTH" -[[dependencies.pandalib]] +[[dependencies.${modId}]] modId = "minecraft" mandatory = true -versionRange = "${compatible_forgemc_versions}" +versionRange = "${forgeCompatibleVersions}" ordering = "NONE" side = "BOTH" -[[dependencies.pandalib]] +[[dependencies.${modId}]] modId = "architectury" mandatory = true versionRange = "*" diff --git a/gradle.properties b/gradle.properties index 1895c7c..8b3b1f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,35 +1,34 @@ -org.gradle.jvmargs = -Xmx2G +org.gradle.jvmargs = -Xmx4G org.gradle.parallel = true -game_version = 1.21 +fabric.loom.multiProjectOptimisation = true + +# Project Settings +projectArchivesName = pandalib +projectGroup = me.pandamods # Mod Info -mod_name = PandaLib -mod_description = A multipurpose library with a Config API and a bit of utility code. +modId = pandalib +modVersion = 0.4 -# Mod properties -mod_version = 0.4 -maven_group = me.pandamods -archives_name = pandalib +modName = PandaLib +modDescription = A multipurpose library with a Config API and a bit of utility code. +modAuthor = The Panda Oliver -# Publish Mods Properties -is_dry_run = true +# Minecraft +minecraftVersion = 1.21 -curseforge_project_id = 975460 -curseforge_project_slug = pandalib -modrinth_project_id = mEEGbEIu -github_repo = PandaDap2006/PandaLib +# Publishing Mods Config +publishingDryRun = true -pinged_discord_role_id = 1258786696229687296 +# 0 = STABLE | 1 = BETA | 2 = ALPHA +publishingReleaseType = 0 -required_curseforge_mods = ["architectury-api"] -required_modrinth_mods = ["architectury-api"] +publishingCurseForgeProjectId = 975460 +publishingModrinthProjectId = mEEGbEIu -required_fabric_mods = ["fabric-api"] -required_forge_mods = [] -required_neoforge_mods = [] +publishingGitHubRepo = PandaDap2006/PandaLib # Dependencies -joml_version = 1.10.5 # 2024.1.0 is used because of a weird java compiler bug -manifold_version = 2024.1.0 \ No newline at end of file +manifoldVersion = 2024.1.0 \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle deleted file mode 100644 index 23b94ec..0000000 --- a/neoforge/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -architectury { - platformSetupLoomIde() - neoForge() -} - -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentNeoForge.extendsFrom common -} - -repositories { - maven { - name = "NeoForged" - url = "https://maven.neoforged.net/releases" - } -} - -dependencies { - neoForge("net.neoforged:neoforge:${neoforge_version}") - - modApi("dev.architectury:architectury-neoforge:${architectury_version}") - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } -} - -shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - injectAccessWidener = true - atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) -} \ No newline at end of file diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts new file mode 100644 index 0000000..83c0615 --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,41 @@ +// gradle.properties +val neoForgeVersion: String by project + +architectury { + platformSetupLoomIde() + neoForge() +} + +configurations { + getByName("developmentNeoForge").extendsFrom(configurations["common"]) +} + +loom { + accessWidenerPath.set(project(":common").loom.accessWidenerPath) +} + +dependencies { + neoForge("net.neoforged:neoforge:${neoForgeVersion}") + + "common"(project(":common", "namedElements")) { isTransitive = false } + "shadowCommon"(project(":common", "transformProductionNeoForge")) { isTransitive = false } +} + +tasks { + base.archivesName.set(base.archivesName.get() + "-NeoForge") + + shadowJar { + exclude("fabric.mod.json") + } + + remapJar { + injectAccessWidener = true + atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) + } + + sourcesJar { + val commonSources = project(":common").tasks.sourcesJar + dependsOn(commonSources) + from(commonSources.get().archiveFile.map { zipTree(it) }) + } +} \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 350ca05..5da17f3 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -1,31 +1,33 @@ modLoader = "javafml" loaderVersion = "*" -license = "GPL-3" issueTrackerURL="https://github.com/PandaDap2006/PandaLib/issues" +license = "GPL-3" [[mods]] -modId = "${id}" -version = "${version}" -displayName = "${name}" -authors = "The Panda Oliver" -logoFile = "assets/pandalib/icon.png" -description = "${description}" +modId = "${modId}" +version = "${modVersion}" +displayName = "${modName}" +authors = "${modAuthor}" +description = ''' +${modDescription} +''' +logoFile = "assets/${modId}/icon.png" -[[dependencies.pandalib]] +[[dependencies.${modId}]] modId = "neoforge" type = "required" versionRange = "*" ordering = "NONE" side = "BOTH" -[[dependencies.pandalib]] +[[dependencies.${modId}]] modId = "minecraft" type = "required" -versionRange = "${compatible_forgemc_versions}" +versionRange = "${neoForgeCompatibleVersions}" ordering = "NONE" side = "BOTH" -[[dependencies.pandalib]] +[[dependencies.${modId}]] modId = "architectury" type = "required" versionRange = "*" @@ -33,6 +35,6 @@ ordering = "AFTER" side = "BOTH" [[mixins]] -config = "pandalib-common.mixins.json" +config = "${modId}-common.mixins.json" [[mixins]] -config = "pandalib.mixins.json" \ No newline at end of file +config = "${modId}.mixins.json" \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 6295b3b..0000000 --- a/settings.gradle +++ /dev/null @@ -1,55 +0,0 @@ -pluginManagement { - repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.minecraftforge.net/" } - maven { url "https://maven.architectury.dev/" } - gradlePluginPortal() - } -} - -def loadProperties() { - String defaultVersion = "1.21" - - List availableVersions = fileTree("versionProperties").files.name - for (int i = 0; i < availableVersions.size(); i++) { - availableVersions[i] = availableVersions[i].replaceAll("\\.properties", "") - } - - availableVersions.sort() - println "Avalible Minecraft versions: ${availableVersions}" - - String selectedVersion = "" - int versionIndex = -1 - println "Avalible MC versions: ${availableVersions}" - if (hasProperty("game_version")) { - selectedVersion = game_version - versionIndex = availableVersions.indexOf(game_version) - } - if (versionIndex == -1) { - println "No 'game_version' set or the set 'game_version' is invalid! Defaulting to ${defaultVersion}." - selectedVersion = defaultVersion - versionIndex = availableVersions.indexOf(defaultVersion) - assert versionIndex != -1 - } - - println "Loading properties file at " + selectedVersion + ".properties" - var properties = new Properties() - properties.load(new FileInputStream("${rootDir}/versionProperties/${selectedVersion}.properties")) - - properties.each { prop -> - gradle.ext.set(prop.key, prop.value) - } - gradle.ext.availableVersions = availableVersions - gradle.ext.versionIndex = versionIndex -} -loadProperties() - -rootProject.name = mod_name - -include("common") -for (loader in ((String) gradle.supported_modloaders).split(",")) { - def loaderName = loader.strip() - println "Adding loader " + loaderName - include(loaderName) -} - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..92e73d0 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,63 @@ +import java.io.FileInputStream +import java.util.* + +pluginManagement.repositories { + maven { + name = "Architectury" + url = uri("https://maven.architectury.dev/") + } + maven { + name = "Fabric" + url = uri("https://maven.fabricmc.net/") + } + maven { + name = "Forge" + url = uri("https://maven.minecraftforge.net/") + } + maven { + name = "NeoForge" + url = uri("https://maven.neoforged.net/releases/") + } + gradlePluginPortal() +} + +val minecraftVersion: String by settings + +fun loadProperties() { + val defaultVersion = "1.21" + + val availableVersions: MutableList = fileTree("versionProperties").files.map { file -> file.name }.toMutableList() + for ((index, s) in availableVersions.withIndex()) { + availableVersions[index] = s.replace(".properties", "") + } + + availableVersions.sort() + println("Available Minecraft versions: ${availableVersions}") + + var selectedVersion = minecraftVersion + var versionIndex = availableVersions.indexOf(minecraftVersion) + if (versionIndex == -1) { + println("No 'minecraftVersion' set or the set 'minecraftVersion' is invalid! Defaulting to ${defaultVersion}.") + selectedVersion = defaultVersion + versionIndex = availableVersions.indexOf(defaultVersion) + } + + println("Loading properties file at ${selectedVersion}.properties") + val properties = Properties() + properties.load(FileInputStream("${rootDir}/versionProperties/${selectedVersion}.properties")) + + for (property in properties) { + gradle.extra.set(property.key.toString(), property.value.toString()) + } + gradle.extra.set("availableVersions", availableVersions) + gradle.extra.set("versionIndex", versionIndex) +} +loadProperties() + +rootProject.name = "PandaMods Template" + +include("common") +gradle.extra.properties["supportedModLoaders"].toString().split(",").forEach { + println("Adding loader ${it}") + include(it) +} diff --git a/versionProperties/1.19.2.properties b/versionProperties/1.19.2.properties index 252e422..94f1f17 100644 --- a/versionProperties/1.19.2.properties +++ b/versionProperties/1.19.2.properties @@ -1,27 +1,35 @@ -java_version = 17 +projectJavaVersion = 17 +supportedModLoaders = fabric,forge -# Mod properties -supported_modloaders = fabric,forge +# Mappings +parchmentVersion = 2022.11.27 +parchmentMinecraftVersion = 1.19.2 -compatible_fabricmc_versions = =1.19.2 -compatible_forgemc_versions = 1.19.2 +# Mod Publishing config +publishingMinecraftVersion = 1.19.2 +# Uncomment the next line to publish to versions in the range of 'publishingMinecraftVersion' and 'publishingLatestMinecraftVersion' +#publishingLatestMinecraftVersion = 1.19.2 -# Minecraft properties -minecraft_version = 1.19.2 -parchment_version = 1.19.2:2022.11.27 +# Fabric +fabricLoaderVersion = 0.15.11 +fabricApiVersion = 0.77.0+1.19.2 -# Mod Loader Dependencies -fabric_loader_version = 0.15.11 -fabric_api_version = 0.77.0+1.19.2 +fabricCompatibleVersions = =1.19.2 -forge_version = 43.4.0 +# Forge +forgeVersion = 1.19.2-43.4.0 -# Publish Mods Properties -supported_game_version = 1.19.2 +forgeCompatibleVersions = 1.19.2 + +# NeoForge is not supported for versions below 1.20.5 +# NeoForge +#neoForgeVersion = 21.0.159 + +#neoForgeCompatibleVersions = [1.21,) # Dependencies -embed_joml=true +jomlVersion = 1.10.5 # Mod Dependencies -architectury_version = 6.6.92 -modmenu_version = 4.2.0-beta.2 +architecturyVersion = 6.6.92 +modmenuVersion = 4.2.0-beta.2 \ No newline at end of file diff --git a/versionProperties/1.20.5.properties b/versionProperties/1.20.5.properties index 7a3d8f6..be69f23 100644 --- a/versionProperties/1.20.5.properties +++ b/versionProperties/1.20.5.properties @@ -1,25 +1,32 @@ -java_version = 21 +projectJavaVersion = 21 +supportedModLoaders = fabric,neoforge -# Mod properties -supported_modloaders = fabric,neoforge +# Mappings +parchmentVersion = 2024.06.16 +parchmentMinecraftVersion = 1.20.6 -compatible_fabricmc_versions = >=1.20.5 <1.21 -compatible_forgemc_versions = [1.20.5,1.21) +# Mod Publishing config +publishingMinecraftVersion = 1.20.5 +# Uncomment the next line to publish to versions in the range of 'publishingMinecraftVersion' and 'publishingLatestMinecraftVersion' +publishingLatestMinecraftVersion = 1.20.6 -# Minecraft properties -minecraft_version = 1.20.5 -parchment_version = 1.20.6:2024.06.16 +# Fabric +fabricLoaderVersion = 0.15.11 +fabricApiVersion = 0.97.8+1.20.5 -# Mod Loader Dependencies -fabric_loader_version = 0.15.11 -fabric_api_version = 0.97.8+1.20.5 +fabricCompatibleVersions = >=1.20.5 <1.21 -neoforge_version = 20.5.21-beta +# Forge is not supported for versions above 1.20.4 +# Forge +#forgeVersion = 1.20.6-50.1.0 -# Publish Mods Properties -supported_game_version = 1.20.5 -latest_supported_game_version = 1.20.6 +#forgeCompatibleVersions = [1.20.5,1.21) + +# NeoForge +neoForgeVersion = 20.5.21-beta + +neoForgeCompatibleVersions = [1.20.5,1.21) # Mod Dependencies -architectury_version = 12.0.28 -modmenu_version = 10.0.0 +architecturyVersion = 12.0.28 +modmenuVersion = 10.0.0 \ No newline at end of file diff --git a/versionProperties/1.20.properties b/versionProperties/1.20.properties index 93c5435..5d56e5d 100644 --- a/versionProperties/1.20.properties +++ b/versionProperties/1.20.properties @@ -1,25 +1,32 @@ -java_version = 17 +projectJavaVersion = 17 +supportedModLoaders = fabric,forge -# Mod properties -supported_modloaders = fabric,forge +# Mappings +parchmentVersion = 2023.09.03 +parchmentMinecraftVersion = 1.20.1 -compatible_fabricmc_versions = >=1.20 <1.20.5 -compatible_forgemc_versions = [1.20,1.20.5) +# Mod Publishing config +publishingMinecraftVersion = 1.20 +# Uncomment the next line to publish to versions in the range of 'publishingMinecraftVersion' and 'publishingLatestMinecraftVersion' +publishingLatestMinecraftVersion = 1.20.4 -# Minecraft properties -minecraft_version = 1.20 -parchment_version = 1.20.1:2023.09.03 +# Fabric +fabricLoaderVersion = 0.15.11 +fabricApiVersion = 0.83.0+1.20 -# Mod Loader Dependencies -fabric_loader_version = 0.15.11 -fabric_api_version = 0.83.0+1.20 +fabricCompatibleVersions = >=1.20 <=1.20.4 -forge_version = 46.0.14 +# Forge +forgeVersion = 1.20-46.0.14 -# Publish Mods Properties -supported_game_version = 1.20 -latest_supported_game_version = 1.20.4 +forgeCompatibleVersions = [1.20,1.20.4] + +# NeoForge is not supported for versions below 1.20.5 +# NeoForge +#neoForgeVersion = 20.5.21-beta + +#neoForgeCompatibleVersions = [1.20,1.20.4] # Mod Dependencies -architectury_version = 9.2.14 -modmenu_version = 7.0.1 +architecturyVersion = 9.2.14 +modmenuVersion = 7.0.1 \ No newline at end of file diff --git a/versionProperties/1.21.properties b/versionProperties/1.21.properties index 818bd4f..d9a3576 100644 --- a/versionProperties/1.21.properties +++ b/versionProperties/1.21.properties @@ -1,24 +1,31 @@ -java_version = 21 +projectJavaVersion = 21 +supportedModLoaders = fabric,neoforge -# Mod properties -supported_modloaders = fabric,neoforge +# Mappings +parchmentVersion = 2024.07.28 +parchmentMinecraftVersion = 1.21 -compatible_fabricmc_versions = >=1.21 -compatible_forgemc_versions = [1.21,) +# Mod Publishing config +publishingMinecraftVersion = 1.21 +# Uncomment the next line to publish to versions in the range of 'publishingMinecraftVersion' and 'publishingLatestMinecraftVersion' +#publishingLatestMinecraftVersion = 1.21 -# Minecraft properties -minecraft_version = 1.21 -parchment_version = 1.21:2024.06.23 +# Fabric +fabricLoaderVersion = 0.15.11 +fabricApiVersion = 0.100.4+1.21 -# Mod Loader Dependencies -fabric_loader_version = 0.15.11 -fabric_api_version = 0.100.4+1.21 +fabricCompatibleVersions = >=1.21 -neoforge_version = 21.0.42-beta +# Forge +forgeVersion = 1.21-51.0.31 -# Publish Mods Properties -supported_game_version = 1.21 +forgeCompatibleVersions = [1.21,) + +# NeoForge +neoForgeVersion = 21.0.159 + +neoForgeCompatibleVersions = [1.21,) # Mod Dependencies -architectury_version = 13.0.2 -modmenu_version = 11.0.1 \ No newline at end of file +architecturyVersion = 13.0.2 +modmenuVersion = 11.0.1 \ No newline at end of file From 40a95cc06fc0d741926989d3e989ecd25fa0f5a1 Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Fri, 9 Aug 2024 20:59:34 +0200 Subject: [PATCH 18/25] Standardize naming conventions and add deprecation annotations. Updated naming conventions for archives across build scripts to lowercase. Added deprecation annotations to methods in PlayerExtension and PlayerMixin. Adjusted project properties and dependencies for improved consistency and clarity. --- build.gradle.kts | 14 +++++---- .../pandalib/extensions/PlayerExtension.java | 2 ++ .../pandamods/pandalib/mixin/PlayerMixin.java | 2 ++ fabric/build.gradle.kts | 30 +------------------ forge/build.gradle.kts | 2 +- gradle.properties | 5 ++-- neoforge/build.gradle.kts | 2 +- settings.gradle.kts | 2 +- 8 files changed, 19 insertions(+), 40 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index cec4f97..30285b1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -78,10 +78,10 @@ allprojects { } subprojects { - val isMinecraftSubProject = findProject("common") != null && project("common") != project - val isFabric = findProject("fabric") != null && project("fabric") == project - val isForge = findProject("forge") != null && project("forge") == project - val isNeoForge = findProject("neoforge") != null && project("neoforge") == project + val isMinecraftSubProject = findProject(":common") != project + val isFabric = findProject(":fabric") == project + val isForge = findProject(":forge") == project + val isNeoForge = findProject(":neoforge") == project apply(plugin = "architectury-plugin") apply(plugin = "dev.architectury.loom") @@ -117,7 +117,7 @@ subprojects { } @Suppress("UnstableApiUsage") - dependencies { + dependencies { "minecraft"("com.mojang:minecraft:${minecraftVersion}") "mappings"(loom.layered { officialMojangMappings() @@ -290,6 +290,8 @@ publishMods { if (loaderName == "fabric") requires("fabric-api") + + requires("architectury-api") } modrinth("modrinth_" + loaderName) { @@ -311,6 +313,8 @@ publishMods { if (loaderName == "fabric") requires("fabric-api") + + requires("architectury-api") } } diff --git a/common/src/main/java/me/pandamods/pandalib/extensions/PlayerExtension.java b/common/src/main/java/me/pandamods/pandalib/extensions/PlayerExtension.java index 007d104..445538f 100644 --- a/common/src/main/java/me/pandamods/pandalib/extensions/PlayerExtension.java +++ b/common/src/main/java/me/pandamods/pandalib/extensions/PlayerExtension.java @@ -20,7 +20,9 @@ import net.minecraft.resources.ResourceLocation; public interface PlayerExtension { + @Deprecated(forRemoval = true, since = "0.4") default void pandaLib$setConfig(T config) {} + @Deprecated(forRemoval = true, since = "0.4") default T pandaLib$getConfig(Class configClass) { return PandaLibConfig.getConfig(configClass).get(); } diff --git a/common/src/main/java/me/pandamods/pandalib/mixin/PlayerMixin.java b/common/src/main/java/me/pandamods/pandalib/mixin/PlayerMixin.java index 8bbf8d6..b2fb07d 100644 --- a/common/src/main/java/me/pandamods/pandalib/mixin/PlayerMixin.java +++ b/common/src/main/java/me/pandamods/pandalib/mixin/PlayerMixin.java @@ -29,6 +29,7 @@ protected PlayerMixin(EntityType entityType, Level level super(entityType, level); } + @Deprecated(forRemoval = true, since = "0.4") @SuppressWarnings("unchecked") @Override public void pandaLib$setConfig(T config) { @@ -38,6 +39,7 @@ protected PlayerMixin(EntityType entityType, Level level } } + @Deprecated(forRemoval = true, since = "0.4") @Override public T pandaLib$getConfig(Class configClass) { ConfigHolder holder = PandaLibConfig.getConfig(configClass); diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 500f6ac..4695e5b 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -32,7 +32,7 @@ dependencies { } tasks { - base.archivesName.set(base.archivesName.get() + "-Fabric") + base.archivesName.set(base.archivesName.get() + "-fabric") remapJar { injectAccessWidener.set(true) @@ -43,32 +43,4 @@ tasks { dependsOn(commonSources) from(commonSources.get().archiveFile.map { zipTree(it) }) } -} - -components { - java.run { - if (this is AdhocComponentWithVariants) - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements.get()) { skip() } - } -} - -publishing { - publications.create("mavenFabric") { - artifactId = "${project.properties["archives_base_name"]}" + "-Fabric" - from(components["java"]) - } - - repositories { - mavenLocal() - maven { - val releasesRepoUrl = "https://example.com/releases" - val snapshotsRepoUrl = "https://example.com/snapshots" - url = uri(if (project.version.toString().endsWith("SNAPSHOT") || project.version.toString().startsWith("0")) snapshotsRepoUrl else releasesRepoUrl) - name = "ExampleRepo" - credentials { - username = project.properties["repoLogin"]?.toString() - password = project.properties["repoPassword"]?.toString() - } - } - } } \ No newline at end of file diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index b3ea56a..0027816 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -35,7 +35,7 @@ dependencies { } tasks { - base.archivesName.set(base.archivesName.get() + "-Forge") + base.archivesName.set(base.archivesName.get() + "-forge") shadowJar { exclude("fabric.mod.json") diff --git a/gradle.properties b/gradle.properties index 8b3b1f4..6aa44bc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ minecraftVersion = 1.21 publishingDryRun = true # 0 = STABLE | 1 = BETA | 2 = ALPHA -publishingReleaseType = 0 +publishingReleaseType = 1 publishingCurseForgeProjectId = 975460 publishingModrinthProjectId = mEEGbEIu @@ -30,5 +30,4 @@ publishingModrinthProjectId = mEEGbEIu publishingGitHubRepo = PandaDap2006/PandaLib # Dependencies -# 2024.1.0 is used because of a weird java compiler bug -manifoldVersion = 2024.1.0 \ No newline at end of file +manifoldVersion = 2024.1.29 \ No newline at end of file diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 83c0615..baff6a2 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -22,7 +22,7 @@ dependencies { } tasks { - base.archivesName.set(base.archivesName.get() + "-NeoForge") + base.archivesName.set(base.archivesName.get() + "-neoforge") shadowJar { exclude("fabric.mod.json") diff --git a/settings.gradle.kts b/settings.gradle.kts index 92e73d0..5911f71 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -54,7 +54,7 @@ fun loadProperties() { } loadProperties() -rootProject.name = "PandaMods Template" +rootProject.name = "PandaLib" include("common") gradle.extra.properties["supportedModLoaders"].toString().split(",").forEach { From 328a41a65f61109cbdfb069c27aded18baa90e78 Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Fri, 9 Aug 2024 21:41:28 +0200 Subject: [PATCH 19/25] Moved the model api from Extra Details to PandaLib --- build.gradle.kts | 23 +++ .../java/me/pandamods/pandalib/PandaLib.java | 8 + .../model/client/animation/Animatable.java | 18 ++ .../client/animation/AnimatableInstance.java | 41 +++++ .../animation/states/AnimationController.java | 43 +++++ .../animation/states/AnimationState.java | 63 +++++++ .../model/client/animation/states/State.java | 69 ++++++++ .../animation/states/TransitionState.java | 50 ++++++ .../model/client/render/ModelRenderer.java | 141 +++++++++++++++ .../client/render/PLInternalShaders.java | 43 +++++ .../api/model/client/render/PLRenderType.java | 51 ++++++ .../api/model/resource/AssimpResources.java | 134 ++++++++++++++ .../model/resource/animation/Animation.java | 49 ++++++ .../api/model/resource/animation/Channel.java | 84 +++++++++ .../resource/loader/AnimationLoader.java | 60 +++++++ .../model/resource/loader/ModelLoader.java | 163 ++++++++++++++++++ .../api/model/resource/model/Mesh.java | 61 +++++++ .../api/model/resource/model/Model.java | 48 ++++++ .../api/model/resource/model/Node.java | 142 +++++++++++++++ .../pandalib/network/ConfigNetworking.java | 6 +- .../pandamods/pandalib/utils/AssimpUtils.java | 81 +++++++++ .../pandamods/pandalib/utils/BlockUtils.java | 51 ++++++ .../pandamods/pandalib/utils/MathUtils.java | 70 ++++++++ .../utils/PLSpriteCoordinateExpander.java | 71 ++++++++ .../pandamods/pandalib/utils/PrintUtils.java | 139 +++++++++++++++ gradle.properties | 3 +- 26 files changed, 1708 insertions(+), 4 deletions(-) create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/animation/Animatable.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/animation/AnimatableInstance.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/AnimationController.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/AnimationState.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/State.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/TransitionState.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/render/ModelRenderer.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLInternalShaders.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLRenderType.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/resource/AssimpResources.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/resource/animation/Animation.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/resource/animation/Channel.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/resource/loader/AnimationLoader.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/resource/loader/ModelLoader.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Mesh.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Model.java create mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Node.java create mode 100644 common/src/main/java/me/pandamods/pandalib/utils/AssimpUtils.java create mode 100644 common/src/main/java/me/pandamods/pandalib/utils/BlockUtils.java create mode 100644 common/src/main/java/me/pandamods/pandalib/utils/MathUtils.java create mode 100644 common/src/main/java/me/pandamods/pandalib/utils/PLSpriteCoordinateExpander.java create mode 100644 common/src/main/java/me/pandamods/pandalib/utils/PrintUtils.java diff --git a/build.gradle.kts b/build.gradle.kts index 30285b1..90b2b1f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -58,6 +58,7 @@ val minecraftVersion: String by project val parchmentVersion: String by project val parchmentMinecraftVersion: String by project +val lwjglVersion: String by project val jomlVersion = properties["jomlVersion"] val manifoldVersion: String by project @@ -130,6 +131,20 @@ subprojects { "modApi"("dev.architectury:architectury:${architecturyVersion}") } + if (isMinecraftSubProject) { + // Assimp Library + "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}") + + // Assimp natives + "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-windows") + + "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-linux") + + "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-macos") + } else { + implementation("org.lwjgl:lwjgl-assimp:${lwjglVersion}") + } + if (jomlVersion != null) { "jarShadow"("org.joml:joml:${jomlVersion}") } @@ -150,6 +165,14 @@ subprojects { archiveClassifier.set("dev-shadow") exclude("architectury.common.json") + + var librariesLocation = "${projectArchivesName}.libraries" + + // Relocate assimp so it will not cause any conflicts with other mods also using it. + relocate("org.lwjgl.assimp", "${librariesLocation}.org.lwjgl.assimp") + relocate("windows.x64.org.lwjgl.assimp", "${librariesLocation}.windows.x64.org.lwjgl.assimp") + relocate("linux.x64.org.lwjgl.assimp", "${librariesLocation}.linux.x64.org.lwjgl.assimp") + relocate("macos.x64.org.lwjgl.assimp", "${librariesLocation}.macos.x64.org.lwjgl.assimp") } tasks.withType().configureEach { diff --git a/common/src/main/java/me/pandamods/pandalib/PandaLib.java b/common/src/main/java/me/pandamods/pandalib/PandaLib.java index 405bca4..22b8ae1 100644 --- a/common/src/main/java/me/pandamods/pandalib/PandaLib.java +++ b/common/src/main/java/me/pandamods/pandalib/PandaLib.java @@ -13,9 +13,14 @@ package me.pandamods.pandalib; import com.mojang.logging.LogUtils; +import dev.architectury.event.events.client.ClientReloadShadersEvent; +import dev.architectury.registry.ReloadListenerRegistry; +import me.pandamods.pandalib.api.model.client.render.PLInternalShaders; +import me.pandamods.pandalib.api.model.resource.AssimpResources; import me.pandamods.pandalib.event.EventHandler; import me.pandamods.pandalib.network.ConfigNetworking; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; import org.slf4j.Logger; public class PandaLib { @@ -23,6 +28,9 @@ public class PandaLib { public static final Logger LOGGER = LogUtils.getLogger(); public static void init() { + ClientReloadShadersEvent.EVENT.register(PLInternalShaders::register); + ReloadListenerRegistry.register(PackType.CLIENT_RESOURCES, new AssimpResources(), ID("assimp_loader")); + ConfigNetworking.registerPackets(); EventHandler.Register(); } diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/Animatable.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/Animatable.java new file mode 100644 index 0000000..a923208 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/Animatable.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.animation; + +public interface Animatable { + AnimatableInstance getAnimatableInstance(); + float getTick(); +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/AnimatableInstance.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/AnimatableInstance.java new file mode 100644 index 0000000..553eeab --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/AnimatableInstance.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.animation; + +import me.pandamods.pandalib.api.model.client.animation.states.State; + +public class AnimatableInstance { + private final Animatable animatable; + private State state; + + public AnimatableInstance(Animatable animatable) { + this.animatable = animatable; + } + + public float getTick(float partialTick) { + return this.animatable.getTick(); + } + + public float getTick() { + return getTick(0); + } + + public void setState(State state) { + this.state = state; + this.state.start(this.getTick()); + } + + public State getState() { + return state; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/AnimationController.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/AnimationController.java new file mode 100644 index 0000000..9391956 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/AnimationController.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.animation.states; + +import me.pandamods.pandalib.api.model.client.animation.Animatable; +import me.pandamods.pandalib.api.model.client.animation.AnimatableInstance; +import me.pandamods.pandalib.api.model.resource.model.Model; +import me.pandamods.pandalib.api.model.resource.model.Node; + +public interface AnimationController { + State registerStates(T t); + + default void animate(T t, Model model, float partialTick) { + AnimatableInstance instance = t.getAnimatableInstance(); + State state = instance.getState(); + if (state == null) + instance.setState(state = registerStates(t)); + + if (state == null) + throw new NullPointerException("Animation state is NULL"); + + state.updateTime(instance, partialTick); + state.checkStateSwitch(instance); + for (Node node : model.getNodes()) { + processBoneTransform(node, instance); + } + } + + default void processBoneTransform(Node node, AnimatableInstance instance) { +// node.setLocalTransform(instance.getState().getBoneTransform(node)); + node.getRelativeTransform().set(instance.getState().getBoneTransform(node)); + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/AnimationState.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/AnimationState.java new file mode 100644 index 0000000..3318026 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/AnimationState.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.animation.states; + +import me.pandamods.pandalib.api.model.client.animation.AnimatableInstance; +import me.pandamods.pandalib.api.model.resource.animation.Animation; +import me.pandamods.pandalib.api.model.resource.AssimpResources; +import me.pandamods.pandalib.api.model.resource.animation.Channel; +import me.pandamods.pandalib.api.model.resource.model.Node; +import net.minecraft.resources.ResourceLocation; +import org.joml.Matrix4f; + +public class AnimationState extends State { + private final Animation animation; + private final boolean loop; + + public AnimationState(ResourceLocation resourceLocation) { + this(resourceLocation, false); + } + + public AnimationState(ResourceLocation resourceLocation, boolean loop) { + this(AssimpResources.getAnimation(resourceLocation), loop); + } + + public AnimationState(Animation animation, boolean loop) { + this.animation = animation; + this.loop = loop; + } + + @Override + public Matrix4f getBoneTransform(Node node) { + Channel channel = this.animation.getChannel(node.getName()); + if (channel != null) { + return channel.getMatrix(this.getTime()); + } + return new Matrix4f(node.getInitialTransform()); + } + + @Override + public void updateTime(AnimatableInstance instance, float partialTick) { + super.updateTime(instance, partialTick); + + if (loop && this.isFinished()) { + this.start(this.getStartTick() + (this.getDuration() * 20)); + this.updateTime(instance, partialTick); + } + } + + @Override + public float getDuration() { + return this.animation.getDuration(); + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/State.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/State.java new file mode 100644 index 0000000..6528f35 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/State.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.animation.states; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import me.pandamods.pandalib.api.model.client.animation.AnimatableInstance; +import me.pandamods.pandalib.api.model.resource.model.Node; +import org.joml.Matrix4f; +import oshi.util.tuples.Pair; + +import java.util.List; +import java.util.function.Supplier; + +public abstract class State { + private final List, State>> nextStates = new ObjectArrayList<>(); + private float startTick = 0; + private float time = 0; + + public void start(float startTick) { + this.startTick = startTick; + this.time = 0; + } + + public void checkStateSwitch(AnimatableInstance instance) { + for (Pair, State> nextState : this.nextStates) { + if (nextState.getA().get()) { + instance.setState(nextState.getB()); + } + } + } + + public abstract Matrix4f getBoneTransform(Node node); + + public void updateTime(AnimatableInstance instance, float partialTick) { + this.time = (instance.getTick(partialTick) - this.startTick) / 20; + } + + public float getStartTick() { + return startTick; + } + + public float getTime() { + return time; + } + + public boolean isFinished() { + return this.time >= this.getDuration(); + } + + public abstract float getDuration(); + + public void nextState(Supplier condition, State state) { + this.nextStates.add(new Pair<>(condition, state)); + } + + public void nextTransitionState(Supplier condition, State state, float duration) { + nextState(condition, new TransitionState(this, state, duration)); + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/TransitionState.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/TransitionState.java new file mode 100644 index 0000000..627301e --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/animation/states/TransitionState.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.animation.states; + +import me.pandamods.pandalib.api.model.resource.model.Node; +import me.pandamods.pandalib.utils.MathUtils; +import org.joml.Matrix4f; + +public class TransitionState extends State { + private final State previousState; + private final State nextState; + private final float duration; + + public TransitionState(State previousState, State nextState, float duration) { + this.previousState = previousState; + this.nextState = nextState; + this.duration = duration; + + nextState(this::isFinished, nextState); + } + + @Override + public Matrix4f getBoneTransform(Node node) { + float alpha = this.getTime() / getDuration(); + Matrix4f previousMatrix = previousState.getBoneTransform(node); + Matrix4f nextMatrix = nextState.getBoneTransform(node); + return MathUtils.lerpMatrix(previousMatrix, nextMatrix, alpha); + } + + @Override + public void start(float startTick) { + super.start(startTick); + this.nextState.start(startTick); + } + + @Override + public float getDuration() { + return this.duration; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/ModelRenderer.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/ModelRenderer.java new file mode 100644 index 0000000..89ba0a1 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/ModelRenderer.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import me.pandamods.pandalib.api.model.resource.model.Mesh; +import me.pandamods.pandalib.api.model.resource.model.Model; +import me.pandamods.pandalib.api.model.resource.model.Node; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import org.joml.*; + +import java.awt.*; +import java.util.List; +import java.util.function.Function; + +public class ModelRenderer { + public static void render(Model model, PoseStack poseStack, int overlayUV, int lightmapUV, Function vertexConsumerProvider) { + List meshes = model.getMeshes(); + + renderNode(model, model.getRootNode(), poseStack, overlayUV, lightmapUV, vertexConsumerProvider, meshes); + } + + public static void renderNode(Model model, Node node, PoseStack poseStack, int overlayUV, int lightmapUV, + Function vertexConsumerProvider, List meshes) { + if (node.isVisible()) { + for (Integer meshIndex : node.getMeshIndexes()) { + Mesh mesh = meshes.get(meshIndex); + renderMesh(model, mesh, node, poseStack, overlayUV, lightmapUV, vertexConsumerProvider.apply(mesh.getMaterialName())); + } + } + node.getChildren().forEach(child -> renderNode(model, child, poseStack, overlayUV, lightmapUV, vertexConsumerProvider, meshes)); + } + + public static void renderMesh(Model model, Mesh mesh, Node meshNode, PoseStack poseStack, int overlayUV, int lightmapUV, VertexConsumer vertexConsumer) { + Vector2f uvCoords = new Vector2f(); + + Vector3f position = new Vector3f(); + Vector3f normal = new Vector3f(); + + for (Integer i : mesh.getIndices()) { + float posX = mesh.getVertices()[i * 3]; + float posY = mesh.getVertices()[i * 3 + 1]; + float posZ = mesh.getVertices()[i * 3 + 2]; + position.set(posX, posY, posZ).mulPosition(meshNode.getGlobalTransform()); + + float u = mesh.getUvs()[i * 2]; + float v = mesh.getUvs()[i * 2 + 1]; + uvCoords.set(u, v); + + float normX = mesh.getNormals()[i * 3]; + float normY = mesh.getNormals()[i * 3 + 1]; + float normZ = mesh.getNormals()[i * 3 + 2]; + normal.set(normX, normY, normZ).mulDirection(meshNode.getGlobalTransform()); + + if (mesh.getBoneIndices() != null && mesh.getBoneWeights() != null) { + Vector3f finalPosition = new Vector3f(); + Vector3f finalNormal = new Vector3f(); + + boolean hasWeights = false; + + for (int j = 0; j < 4; j++) { + int boneIndex = mesh.getBoneIndices()[i * 4 + j]; + float boneWeight = mesh.getBoneWeights()[i * 4 + j]; + if (boneIndex == -1 || boneWeight == 0) continue; + hasWeights = true; + + Node boneNode = model.getNodes().get(boneIndex); + Matrix4f boneTransform = boneNode.getGlobalTransform(); + Matrix4f inverseBoneTransform = new Matrix4f(boneNode.getInitialGlobalTransform()).invert(); + + Vector3f bonePosition = new Vector3f(position).mulPosition(inverseBoneTransform).mulPosition(boneTransform); + Vector3f boneNormal = new Vector3f(normal).mulDirection(inverseBoneTransform).mulDirection(boneTransform); + + finalPosition.add(bonePosition.mul(boneWeight)); + finalNormal.add(boneNormal.mul(boneWeight)); + } + + if (hasWeights) { + position.set(finalPosition); + normal.set(finalNormal); + } + } + + vertexConsumer + .addVertex(poseStack.last(), position.x(), position.y(), position.z()) + .setColor(1f, 1f, 1f, 1f) + .setUv(uvCoords.x(), uvCoords.y()) + .setOverlay(overlayUV) + .setLight(lightmapUV) + .setNormal(poseStack.last(), normal.x(), normal.y(), normal.z()); + } + } + + public static void renderModelDebug(Model model, PoseStack poseStack, MultiBufferSource bufferSource) { + model.getNodes().forEach(node -> renderNodeDebug(node, poseStack, bufferSource)); + } + + private static void renderNodeDebug(Node node, PoseStack poseStack, MultiBufferSource bufferSource) { + poseStack.pushPose(); + poseStack.mulPose(node.getGlobalTransform()); + + float length = 0.9f; + + VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + + vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); + vertexConsumer.setColor(Color.green.getRGB()); + + vertexConsumer.addVertex(poseStack.last(), 0, length, 0); + vertexConsumer.setColor(Color.green.getRGB()); + + vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + + vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); + vertexConsumer.setColor(Color.red.getRGB()); + + vertexConsumer.addVertex(poseStack.last(), length, 0, 0); + vertexConsumer.setColor(Color.red.getRGB()); + + vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + + vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); + vertexConsumer.setColor(Color.blue.getRGB()); + + vertexConsumer.addVertex(poseStack.last(), 0, 0, length); + vertexConsumer.setColor(Color.blue.getRGB()); + poseStack.popPose(); + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLInternalShaders.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLInternalShaders.java new file mode 100644 index 0000000..3b9e153 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLInternalShaders.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.render; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import dev.architectury.event.events.client.ClientReloadShadersEvent; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.server.packs.resources.ResourceProvider; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +public class PLInternalShaders { + private static ShaderInstance renderTypeMesh; + + public static void setRenderTypeMesh(ShaderInstance instance) { + renderTypeMesh = instance; + } + + @Nullable + public static ShaderInstance getRenderTypeMesh() { + return renderTypeMesh; + } + + public static void register(ResourceProvider resourceProvider, ClientReloadShadersEvent.ShadersSink shadersSink) { + try { + shadersSink.registerShader(new ShaderInstance(resourceProvider, "pandalib/mesh", + DefaultVertexFormat.NEW_ENTITY), PLInternalShaders::setRenderTypeMesh); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLRenderType.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLRenderType.java new file mode 100644 index 0000000..44bf6d3 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLRenderType.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.client.render; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.Util; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.Function; + +public class PLRenderType extends RenderType { + private static final ShaderStateShard MESH_SHADER = + new ShaderStateShard(PLInternalShaders::getRenderTypeMesh); + + + public static final RenderType CUTOUT_MESH = create("cutout_mesh", + DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.TRIANGLES, 131072, true, false, + CompositeState.builder() + .setLightmapState(LIGHTMAP) + .setShaderState(MESH_SHADER) + .setTextureState(BLOCK_SHEET) + .createCompositeState(true) + ); + + public static final Function CUTOUT_MESH_ENTITY = Util.memoize((resourceLocation) -> { + CompositeState compositeState = CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_CUTOUT_SHADER) + .setTextureState(new TextureStateShard(resourceLocation, false, false)) + .setTransparencyState(NO_TRANSPARENCY).setLightmapState(LIGHTMAP).setOverlayState(OVERLAY) + .createCompositeState(true); + return create("cutout_mesh_entity", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.TRIANGLES, 1536, + true, false, compositeState); + }); + + public PLRenderType(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, boolean affectsCrumbling, + boolean sortOnUpload, Runnable setupState, Runnable clearState) { + super(name, format, mode, bufferSize, affectsCrumbling, sortOnUpload, setupState, clearState); + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/AssimpResources.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/AssimpResources.java new file mode 100644 index 0000000..f5ae729 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/AssimpResources.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.resource; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import me.pandamods.pandalib.api.model.resource.animation.Animation; +import me.pandamods.pandalib.api.model.resource.loader.AnimationLoader; +import me.pandamods.pandalib.api.model.resource.loader.ModelLoader; +import me.pandamods.pandalib.api.model.resource.model.Model; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.PreparableReloadListener; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; +import org.jetbrains.annotations.NotNull; +import org.lwjgl.assimp.*; + +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class AssimpResources implements PreparableReloadListener { + private static Map MODELS = new Object2ObjectOpenHashMap<>(); + private static Map ANIMATIONS = new Object2ObjectOpenHashMap<>(); + + /** + * Retrieves a Model object associated with the given resource location. + * + * @param resourceLocation The resource location of the mode. + * @return The Model object associated with the resource location. + * Mesh object might be empty if the Mesh was never loaded. + */ + public static Model getModel(ResourceLocation resourceLocation) { + Model model = MODELS.get(resourceLocation); + if (model == null) MODELS.put(resourceLocation, model = new Model()); + return model; + } + + /** + * Retrieves an Animation object associated with the given resource location. + * + * @param resourceLocation The resource location of the animation. + * @return The Animation object associated with the resource location. + * Animation object might be empty if the Animation was never loaded. + */ + public static Animation getAnimation(ResourceLocation resourceLocation) { + Animation animation = ANIMATIONS.get(resourceLocation); + if (animation == null) ANIMATIONS.put(resourceLocation, animation = new Animation()); + return animation; + } + + @Override + public @NotNull CompletableFuture reload(PreparationBarrier preparationBarrier, ResourceManager resourceManager, + ProfilerFiller preparationsProfiler, ProfilerFiller reloadProfiler, + Executor backgroundExecutor, Executor gameExecutor) { + List scenes = new ObjectArrayList<>(); + + Map models = new Object2ObjectOpenHashMap<>(); + Map animations = new Object2ObjectOpenHashMap<>(); + + return CompletableFuture.allOf(loadAssimpScene(backgroundExecutor, resourceManager, scenes::add, models::put, animations::put)) + .thenCompose(preparationBarrier::wait) + .thenAcceptAsync(unused -> { + MODELS = models; + ANIMATIONS = animations; + scenes.forEach(Assimp::aiReleaseImport); + }, gameExecutor); + } + + private CompletableFuture loadAssimpScene(Executor executor, ResourceManager resourceManager, + Consumer addScene, + BiConsumer putModel, + BiConsumer putAnimation + ) { + return CompletableFuture.supplyAsync(() -> resourceManager.listResources("assimp", resource -> true), executor) + .thenApplyAsync(resources -> { + Map> sceneTasks = new HashMap<>(); + + for (ResourceLocation resourceLocation : resources.keySet()) { + AIScene scene = loadAssimpScene(resourceManager, resourceLocation); + addScene.accept(scene); + + if (scene != null) sceneTasks.put(resourceLocation, CompletableFuture.supplyAsync(() -> scene, executor)); + } + return sceneTasks; + }, executor).thenAcceptAsync(resource -> { + for (Map.Entry> entry : resource.entrySet()) { + ResourceLocation resourceLocation = entry.getKey(); + AIScene scene = entry.getValue().join(); + + Model model = ModelLoader.loadScene(AssimpResources.getModel(resourceLocation), scene); + putModel.accept(resourceLocation, model); + + for (int i = 0; i < scene.mNumAnimations(); i++) { + AIAnimation aiAnimation = AIAnimation.create(scene.mAnimations().get(i)); + ResourceLocation animationLocation = resourceLocation; + if (scene.mNumAnimations() > 1) animationLocation = animationLocation.withSuffix("/" + aiAnimation.mName().dataString()); + + Animation animation = AnimationLoader.loadAnimation(AssimpResources.getAnimation(animationLocation), aiAnimation); + putAnimation.accept(animationLocation, animation); + } + } + }, executor); + } + + private AIScene loadAssimpScene(ResourceManager resourceManager, ResourceLocation resourceLocation) { + try (InputStream inputStream = resourceManager.getResourceOrThrow(resourceLocation).open()) { + byte[] bytes = inputStream.readAllBytes(); + ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length); + buffer.put(bytes); + buffer.flip(); + return Assimp.aiImportFileFromMemory(buffer, + Assimp.aiProcess_Triangulate | Assimp.aiProcess_PopulateArmatureData | Assimp.aiProcess_LimitBoneWeights, ""); + } + catch (Exception e) { + throw new RuntimeException(new FileNotFoundException(resourceLocation.toString())); + } + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/animation/Animation.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/animation/Animation.java new file mode 100644 index 0000000..133599a --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/animation/Animation.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.resource.animation; + +import java.util.ArrayList; +import java.util.List; + +public class Animation { + private List channels = new ArrayList<>(); + + private float duration; + + public Animation() {} + + public Animation(List channels, float duration) { + set(channels, duration); + } + + public Animation set(List channels, float duration) { + this.channels = channels; + this.duration = duration; + return this; + } + + public float getDuration() { + return duration; + } + + public List getChannels() { + return channels; + } + + public Channel getChannel(String name) { + return channels.stream() + .filter(channel -> channel.name().equals(name)) + .findFirst() + .orElse(null); + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/animation/Channel.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/animation/Channel.java new file mode 100644 index 0000000..c78f884 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/animation/Channel.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.resource.animation; + +import org.joml.*; + +import java.util.List; + +public record Channel(String name, List> positionKeys, List> rotationKeys, List> scalingKeys) { + public Vector3fc interpolatePosition(float time) { + if (positionKeys.isEmpty()) return new Vector3f(); + + List> keys = positionKeys(); + for (int i = 0; i < keys.size() - 1; i++) { + Key key1 = keys.get(i); + Key key2 = keys.get(i+1); + + if (key1.time() <= time && key2.time() >= time) { + float keyDuration = key2.time() - key1.time(); + float interpolatedTime = (time - key1.time()) / keyDuration; + return key1.value().lerp(key2.value(), interpolatedTime, new Vector3f()); + } + } + return keys.get(keys.size() - 1).value(); + } + + public Quaternionfc interpolateRotation(float time) { + if (rotationKeys.isEmpty()) return new Quaternionf(); + + List> keys = rotationKeys(); + for (int i = 0; i < keys.size() - 1; i++) { + Key key1 = keys.get(i); + Key key2 = keys.get(i+1); + + if (key1.time() <= time && key2.time() >= time) { + float keyDuration = key2.time() - key1.time(); + float interpolatedTime = (time - key1.time()) / keyDuration; + return key1.value().nlerp(key2.value(), interpolatedTime, new Quaternionf()); + } + } + return keys.get(keys.size() - 1).value(); + } + + public Vector3fc interpolateScale(float time) { + if (scalingKeys.isEmpty()) return new Vector3f(1); + + List> keys = scalingKeys(); + for (int i = 0; i < keys.size() - 1; i++) { + Key key1 = keys.get(i); + Key key2 = keys.get(i+1); + + if (key1.time() <= time && key2.time() >= time) { + float keyDuration = key2.time() - key1.time(); + float interpolatedTime = (time - key1.time()) / keyDuration; + return key1.value().lerp(key2.value(), interpolatedTime, new Vector3f()); + } + } + return keys.get(keys.size() - 1).value(); + } + + public Matrix4f getMatrix(float time, Matrix4f dist) { + dist.identity(); + dist.translate(this.interpolatePosition(time)); + dist.rotate(this.interpolateRotation(time)); + dist.scale(this.interpolateScale(time)); + return dist; + } + + public Matrix4f getMatrix(float time) { + return getMatrix(time, new Matrix4f()); + } + + public record Key(float time, T value) { } +} \ No newline at end of file diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/loader/AnimationLoader.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/loader/AnimationLoader.java new file mode 100644 index 0000000..564b99e --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/loader/AnimationLoader.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.resource.loader; + +import me.pandamods.pandalib.api.model.resource.animation.Animation; +import me.pandamods.pandalib.api.model.resource.animation.Channel; +import org.joml.*; +import org.lwjgl.assimp.*; + +import java.util.ArrayList; +import java.util.List; + +public class AnimationLoader { + public static Animation loadAnimation(Animation animation, AIAnimation aiAnimation) { + List channels = new ArrayList<>(); + for (int i = 0; i < aiAnimation.mNumChannels(); i++) { + AINodeAnim aiNodeAnim = AINodeAnim.create(aiAnimation.mChannels().get(i)); + + List> positionKeys = new ArrayList<>(); + List> rotationKeys = new ArrayList<>(); + List> scalingKeys = new ArrayList<>(); + + //Todo move the position key processing to a separate method + for (AIVectorKey key : aiNodeAnim.mPositionKeys()) { + AIVector3D vector = key.mValue(); + positionKeys.add(new Channel.Key<>((float) (key.mTime() / aiAnimation.mTicksPerSecond()), + new Vector3f(vector.x(), vector.y(), vector.z()))); + } + + //Todo move the rotation key processing to a separate method + for (AIQuatKey key : aiNodeAnim.mRotationKeys()) { + AIQuaternion quaternion = key.mValue(); + rotationKeys.add(new Channel.Key<>((float) (key.mTime() / aiAnimation.mTicksPerSecond()), + new Quaternionf(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w()))); + } + + //Todo move the scaling key processing to a separate method + for (AIVectorKey key : aiNodeAnim.mScalingKeys()) { + AIVector3D vector = key.mValue(); + scalingKeys.add(new Channel.Key<>((float) (key.mTime() / aiAnimation.mTicksPerSecond()), + new Vector3f(vector.x(), vector.y(), vector.z()))); + } + + channels.add(new Channel(aiNodeAnim.mNodeName().dataString(), positionKeys, rotationKeys, scalingKeys)); + } + + float duration = (float) (aiAnimation.mDuration() / aiAnimation.mTicksPerSecond()); + return animation.set(channels, duration); + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/loader/ModelLoader.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/loader/ModelLoader.java new file mode 100644 index 0000000..966a937 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/loader/ModelLoader.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.resource.loader; + +import me.pandamods.pandalib.api.model.resource.model.Mesh; +import me.pandamods.pandalib.api.model.resource.model.Model; +import me.pandamods.pandalib.api.model.resource.model.Node; +import me.pandamods.pandalib.utils.AssimpUtils; +import org.lwjgl.assimp.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ModelLoader { + public static Model loadScene(Model model, AIScene scene) { + List meshes = new ArrayList<>(); + List materials = new ArrayList<>(); + List nodes = new ArrayList<>(); + + // Build Node Tree + Node rootNode = buildNodeTree(scene.mRootNode(), null, nodes); + + // Process Materials + for (int i = 0; i < scene.mNumMaterials(); i++) { + AIMaterial material = AIMaterial.create(scene.mMaterials().get(i)); + AIString materialName = AIString.create(); + Assimp.aiGetMaterialString(material, Assimp.AI_MATKEY_NAME, Assimp.aiTextureType_NONE, 0, materialName); + String materialNameStr = materialName.dataString(); + materials.add(materialNameStr); + } + + // Process Meshes + for (int i = 0; i < scene.mNumMeshes(); i++) { + AIMesh aiMesh = AIMesh.create(scene.mMeshes().get(i)); + Mesh mesh = processMesh(aiMesh, materials, nodes); + meshes.add(mesh); + } + + return model.set(rootNode, meshes, nodes); + } + + public static Node buildNodeTree(AINode aiNode, Node parent, List nodes) { + String name = aiNode.mName().dataString(); + Node node = new Node(name, AssimpUtils.toMatrix4f(aiNode.mTransformation()), parent); + nodes.add(node); + + for (int i = 0; i < aiNode.mNumMeshes(); i++) { + node.getMeshIndexes().add(aiNode.mMeshes().get(i)); + } + + for (int i = 0; i < aiNode.mNumChildren(); i++) { + AINode childNode = AINode.create(aiNode.mChildren().get(i)); + buildNodeTree(childNode, node, nodes); + } + return node; + } + + // Mesh Processing Section + public static Mesh processMesh(AIMesh aiMesh, List materials, List nodes) { + int[] indices = processIndices(aiMesh); + float[] vertices = processVertices(aiMesh); + float[] uvs = processUVCoords(aiMesh); + float[] normals = processNormals(aiMesh); + int[] boneIndices = new int[vertices.length / 3 * 4]; + float[] boneWeights = new float[vertices.length / 3 * 4]; + + processBones(aiMesh, nodes, boneIndices, boneWeights); + + return new Mesh(indices, vertices, uvs, normals, boneIndices, boneWeights, materials.get(aiMesh.mMaterialIndex())); + } + + private static int[] processIndices(AIMesh aiMesh) { + List indices = new ArrayList<>(); + for (AIFace face : aiMesh.mFaces()) { + for (int i = 0; i < face.mNumIndices(); i++) { + indices.add(face.mIndices().get(i)); + } + } + return indices.stream().mapToInt(Integer::intValue).toArray(); + } + + private static float[] processVertices(AIMesh aiMesh) { + AIVector3D.Buffer buffer = aiMesh.mVertices(); + float[] data = new float[buffer.remaining() * 3]; + int pos = 0; + while (buffer.remaining() > 0) { + AIVector3D vector = buffer.get(); + data[pos++] = vector.x(); + data[pos++] = vector.y(); + data[pos++] = vector.z(); + } + return data; + } + + private static float[] processUVCoords(AIMesh aiMesh) { + AIVector3D.Buffer buffer = aiMesh.mTextureCoords(0); + float[] data = new float[buffer.remaining() * 2]; + int pos = 0; + while (buffer.remaining() > 0) { + AIVector3D vector = buffer.get(); + data[pos++] = vector.x(); + data[pos++] = 1 - vector.y(); + } + return data; + } + + private static float[] processNormals(AIMesh aiMesh) { + AIVector3D.Buffer buffer = aiMesh.mNormals(); + float[] data = new float[buffer.remaining() * 3]; + int pos = 0; + while (buffer.remaining() > 0) { + AIVector3D vector = buffer.get(); + data[pos++] = vector.x(); + data[pos++] = vector.y(); + data[pos++] = vector.z(); + } + return data; + } + + private static void processBones(AIMesh aiMesh, List nodes, int[] boneIndices, float[] boneWeights) { + Arrays.fill(boneIndices, -1); + Arrays.fill(boneWeights, 0.0f); + + for (int i = 0; i < aiMesh.mNumBones(); i++) { + AIBone aiBone = AIBone.create(aiMesh.mBones().get(i)); + Node boneNode = findNode(aiBone.mNode(), nodes); + + for (int j = 0; j < aiBone.mNumWeights(); j++) { + AIVertexWeight aiVertexWeight = aiBone.mWeights().get(j); + int vertexId = aiVertexWeight.mVertexId(); + float weight = aiVertexWeight.mWeight(); + + for (int k = 0; k < 4; k++) { + if (boneWeights[vertexId * 4 + k] == 0) { + boneIndices[vertexId * 4 + k] = nodes.indexOf(boneNode); + boneWeights[vertexId * 4 + k] = weight; + break; + } + } + } + } + } + + private static Node findNode(AINode aiNode, List nodes) { + for (Node node : nodes) { + if (AssimpUtils.AINodeEqualsNode(aiNode, node)) { + return node; + } + } + return null; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Mesh.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Mesh.java new file mode 100644 index 0000000..e01484a --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Mesh.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.resource.model; + +public class Mesh { + private final int[] indices; + private final float[] vertices; + private final float[] uvs; + private final float[] normals; + private final int[] boneIndices; + private final float[] boneWeights; + private final String materialName; + + public Mesh(int[] indices, float[] vertices, float[] uvs, float[] normals, int[] boneIndices, float[] boneWeights, String materialName) { + this.indices = indices; + this.vertices = vertices; + this.uvs = uvs; + this.normals = normals; + this.boneIndices = boneIndices; + this.boneWeights = boneWeights; + this.materialName = materialName; + } + + public int[] getIndices() { + return indices; + } + + public float[] getVertices() { + return vertices; + } + + public float[] getUvs() { + return uvs; + } + + public float[] getNormals() { + return normals; + } + + public int[] getBoneIndices() { + return boneIndices; + } + + public float[] getBoneWeights() { + return boneWeights; + } + + public String getMaterialName() { + return materialName; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Model.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Model.java new file mode 100644 index 0000000..e3aaa98 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Model.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.resource.model; + +import java.util.*; +import java.util.List; + +public class Model { + private List meshes = new ArrayList<>(); + private List nodes = new ArrayList<>(); + + private Node rootNode; + + public Model() {} + + public Model(Node rootNode, List meshes, List nodes) { + set(rootNode, meshes, nodes); + } + + public Model set(Node rootNode, List meshes, List nodes) { + this.meshes = meshes; + this.rootNode = rootNode; + this.nodes = nodes; + return this; + } + + public List getMeshes() { + return meshes; + } + + public List getNodes() { + return nodes; + } + + public Node getRootNode() { + return rootNode; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Node.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Node.java new file mode 100644 index 0000000..f9c604e --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/model/Node.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.api.model.resource.model; + +import org.joml.Matrix4f; + +import java.util.ArrayList; +import java.util.List; + +public class Node { + private final String name; + private final Node parent; + private boolean visible = true; + + private final Matrix4f initialTransform; + private final Matrix4f relativeTransform; + + private final List children = new ArrayList<>(); + private final List meshIndexes = new ArrayList<>(); + + public Node(String name, Matrix4f transformation, Node parent) { + this.name = name; + this.parent = parent; + this.initialTransform = new Matrix4f(transformation); + this.relativeTransform = transformation; + + if (parent != null) + parent.children.add(this); + } + + public Node findNode(String name) { + for (Node child : this.children) { + if (child.name.equals(name)) { + return child; + } + } + + for (Node child : this.children) { + Node foundNode = child.findNode(name); + if (foundNode != null) return foundNode; + } + return null; + } + + public String getName() { + return name; + } + + public Node getParent() { + return parent; + } + + public List getChildren() { + return children; + } + + public List getMeshIndexes() { + return meshIndexes; + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + + public boolean isVisible() { + return visible; + } + + /** + * Returns the initial relative transform of this node. + * This transformation is the transformation of the node when it was created. + * + * @return the initial transformation of this node + */ + public Matrix4f getInitialTransform() { + return initialTransform; + } + + /** + * Returns the relative transformation of this node. + * This transformation is relative to the parent node. + * + * @return the relative transformation of this node + */ + public Matrix4f getRelativeTransform() { + return relativeTransform; + } + + /** + * Returns the initial global transformation of this node. + * This transformation is relative to the root node. + * + * @return the initial global transformation of this node + */ + public Matrix4f getInitialGlobalTransform() { + Matrix4f globalTransform = new Matrix4f(); + if (getParent() != null) { + globalTransform.mul(getParent().getInitialGlobalTransform()); + } + globalTransform.mul(getInitialTransform()); + return globalTransform; + } + + /** + * Returns the global transformation of this node. + * This transformation is relative to the root node. + * + * @return the global transformation of this node + */ + public Matrix4f getGlobalTransform() { + Matrix4f globalTransform = new Matrix4f(); + if (getParent() != null) { + globalTransform.mul(getParent().getGlobalTransform()); + } + globalTransform.mul(getRelativeTransform()); + return globalTransform; + } + + /** + * Sets the local transformation of this node. + * This transformation is relative to the parent node. + * + * @param transform the new local transformation + */ + public void setLocalTransform(Matrix4f transform) { + this.initialTransform.mul(transform, this.relativeTransform); + } + + public Matrix4f getLocalTransform() { + return this.relativeTransform.mul(new Matrix4f(initialTransform).invert(), new Matrix4f()); + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java b/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java index 1551fa0..015cfd1 100644 --- a/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java +++ b/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java @@ -85,10 +85,10 @@ public static void SyncClientConfig(ClientConfigHolder holder) { private static void ClientConfigReceiver(ClientConfigPacketData packetData, NetworkManager.PacketContext packetContext) { ResourceLocation resourceLocation = ResourceLocation.tryParse(packetData.resourceLocation()); PandaLibConfig.getConfig(resourceLocation).ifPresent(configHolder -> { - if (configHolder instanceof ClientConfigHolder) { + if (configHolder instanceof ClientConfigHolder clientConfigHolder) { configHolder.logger.info("Received client config '{}' from {}", configHolder.resourceLocation().toString(), packetContext.getPlayer().getDisplayName().getString()); - packetContext.getPlayer().pandaLib$setConfig(configHolder.getGson() + clientConfigHolder.putConfig(packetContext.getPlayer(), configHolder.getGson() .fromJson(packetData.configJson(), configHolder.getConfigClass())); } }); @@ -110,7 +110,7 @@ private static void ClientConfigReceiver(FriendlyByteBuf buf, NetworkManager.Pac if (configHolder instanceof ClientConfigHolder) { configHolder.logger.info("Received client config '{}' from {}", configHolder.resourceLocation().toString(), context.getPlayer().getDisplayName().getString()); - context.getPlayer().pandaLib$setConfig(configHolder.getGson().fromJson(buf.readUtf(), configHolder.getConfigClass())); + clientConfigHolder.putConfig(packetContext.getPlayer(), configHolder.getGson().fromJson(buf.readUtf(), configHolder.getConfigClass())); } }); } diff --git a/common/src/main/java/me/pandamods/pandalib/utils/AssimpUtils.java b/common/src/main/java/me/pandamods/pandalib/utils/AssimpUtils.java new file mode 100644 index 0000000..a6f502d --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/utils/AssimpUtils.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.utils; + +import me.pandamods.pandalib.api.model.resource.model.Node; +import org.joml.*; +import org.lwjgl.assimp.*; + +import java.util.Objects; + +public class AssimpUtils { + // Conversion methods + @SuppressWarnings("unused") + public static Matrix4f toMatrix4f(AIMatrix4x4 aiMatrix) { + return new Matrix4f( + aiMatrix.a1(), aiMatrix.b1(), aiMatrix.c1(), aiMatrix.d1(), + aiMatrix.a2(), aiMatrix.b2(), aiMatrix.c2(), aiMatrix.d2(), + aiMatrix.a3(), aiMatrix.b3(), aiMatrix.c3(), aiMatrix.d3(), + aiMatrix.a4(), aiMatrix.b4(), aiMatrix.c4(), aiMatrix.d4() + ); + } + + @SuppressWarnings("unused") + public static Matrix3f toMatrix3f(AIMatrix3x3 aiMatrix) { + return new Matrix3f( + aiMatrix.a1(), aiMatrix.b1(), aiMatrix.c1(), + aiMatrix.a2(), aiMatrix.b2(), aiMatrix.c2(), + aiMatrix.a3(), aiMatrix.b3(), aiMatrix.c3() + ); + } + + @SuppressWarnings("unused") + public static Vector3f toVector3f(AIVector3D vector) { + return new Vector3f(vector.x(), vector.y(), vector.z()); + } + + @SuppressWarnings("unused") + public static Vector2f toVector2f(AIVector2D vector) { + return new Vector2f(vector.x(), vector.y()); + } + + @SuppressWarnings("unused") + public static Quaternionf toQuaternionf(AIQuaternion quaternion) { + return new Quaternionf(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w()); + } + + // Equals methods + @SuppressWarnings("unused") + public static boolean AINodeEqualsAINode(AINode node1, AINode node2) { + boolean namesEqual = Objects.equals(node1.mName().dataString(), node2.mName().dataString()); + boolean parentsEqual = (node1.mParent() != null) == (node2.mParent() != null); + if (node1.mParent() != null && node2.mParent() != null) { + parentsEqual = Objects.equals(node1.mParent().mName().dataString(), node2.mParent().mName().dataString()); + } + boolean childrenEqual = node1.mNumChildren() == node2.mNumChildren(); + boolean meshesEqual = node1.mNumMeshes() == node2.mNumMeshes(); + return namesEqual && parentsEqual && childrenEqual && meshesEqual; + } + + @SuppressWarnings("unused") + public static boolean AINodeEqualsNode(AINode aiNode, Node node) { + boolean namesEqual = Objects.equals(aiNode.mName().dataString(), node.getName()); + boolean parentsEqual = (aiNode.mParent() != null) == (node.getParent() != null); + if (aiNode.mParent() != null && node.getParent() != null) { + parentsEqual = Objects.equals(aiNode.mParent().mName().dataString(), node.getParent().getName()); + } + boolean childrenEqual = aiNode.mNumChildren() == node.getChildren().size(); + boolean meshesEqual = aiNode.mNumMeshes() == node.getMeshIndexes().size(); + return namesEqual && parentsEqual && childrenEqual && meshesEqual; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/utils/BlockUtils.java b/common/src/main/java/me/pandamods/pandalib/utils/BlockUtils.java new file mode 100644 index 0000000..989e7f0 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/utils/BlockUtils.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.utils; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.AttachFace; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; + +public class BlockUtils { + public static void translateBlock(BlockState blockState, PoseStack poseStack) { + poseStack.translate(0.5f, 0.5f, 0.5f); + float direction = getYRotation(blockState); + poseStack.mulPose(Axis.YP.rotationDegrees(direction)); + + if (blockState.hasProperty(BlockStateProperties.ATTACH_FACE)) { + AttachFace face = blockState.getValue(BlockStateProperties.ATTACH_FACE); + switch (face) { + case CEILING -> poseStack.mulPose(Axis.XP.rotationDegrees(180)); + case WALL -> poseStack.mulPose(Axis.XP.rotationDegrees(90)); + } + } + poseStack.translate(0, -0.5f, 0); + } + + public static float getYRotation(BlockState blockState) { + if (blockState.hasProperty(BlockStateProperties.ROTATION_16)) + return (360f/16f) * blockState.getValue(BlockStateProperties.ROTATION_16); + + if (blockState.hasProperty(HorizontalDirectionalBlock.FACING)) + return -blockState.getValue(HorizontalDirectionalBlock.FACING).toYRot(); + + if (blockState.hasProperty(DirectionalBlock.FACING)) + return -blockState.getValue(DirectionalBlock.FACING).toYRot(); + + return 0; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/utils/MathUtils.java b/common/src/main/java/me/pandamods/pandalib/utils/MathUtils.java new file mode 100644 index 0000000..e9c9e1b --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/utils/MathUtils.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.utils; + +import com.mojang.blaze3d.vertex.PoseStack; +import org.joml.Matrix4f; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public class MathUtils { + public static Matrix4f lerpMatrix(Matrix4f matrix, Matrix4f other, float alpha) { + return lerpMatrix(matrix, other, alpha, new Matrix4f()); + } + + public static Matrix4f lerpMatrix(Matrix4f matrix, Matrix4f other, float alpha, Matrix4f dist) { + Vector3f translation = new Vector3f(); + Quaternionf rotation = new Quaternionf(); + Vector3f scale = new Vector3f(); + + Vector3f otherTranslation = new Vector3f(); + Quaternionf otherRotation = new Quaternionf(); + Vector3f otherScale = new Vector3f(); + + matrix.getTranslation(translation); + matrix.getUnnormalizedRotation(rotation); + matrix.getScale(scale); + + other.getTranslation(otherTranslation); + other.getUnnormalizedRotation(otherRotation); + other.getScale(otherScale); + + translation.lerp(otherTranslation, alpha); + rotation.slerp(otherRotation, alpha); + scale.lerp(otherScale, alpha); + + return dist.translationRotateScale(translation, rotation, scale); + } + + public static Vector3f rotateVector(Vector3f target, Vector3f rotation) { + return target.rotateZ(rotation.z).rotateY(rotation.y).rotateX(rotation.x); + } + + public static PoseStack rotateVector(PoseStack stack, Vector3f rotation) { + stack.mulPose(new Quaternionf().identity().rotateZYX(rotation.z, rotation.y, rotation.x)); + return stack; + } + + public static Vector3f rotateByPivot(Vector3f target, Vector3f pivot, Vector3f rotation) { + target.add(pivot); + rotateVector(target, rotation); + return target.sub(pivot); + } + + public static PoseStack rotateByPivot(PoseStack stack, Vector3f pivot, Vector3f rotation) { + stack.translate(pivot.x, pivot.y, pivot.z); + rotateVector(stack, rotation); + stack.translate(-pivot.x, -pivot.y, -pivot.z); + return stack; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/utils/PLSpriteCoordinateExpander.java b/common/src/main/java/me/pandamods/pandalib/utils/PLSpriteCoordinateExpander.java new file mode 100644 index 0000000..f4cb9e8 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/utils/PLSpriteCoordinateExpander.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.utils; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; + +@Environment(value=EnvType.CLIENT) +public class PLSpriteCoordinateExpander implements VertexConsumer { + private final VertexConsumer delegate; + private final TextureAtlasSprite sprite; + + public PLSpriteCoordinateExpander(VertexConsumer delegate, TextureAtlasSprite sprite) { + this.delegate = delegate; + this.sprite = sprite; + } + + @Override + public VertexConsumer addVertex(float x, float y, float z) { + this.delegate.addVertex(x, y, z); + return this; + } + + @Override + public VertexConsumer setColor(int red, int green, int blue, int alpha) { + this.delegate.setColor(red, green, blue, alpha); + return this; + } + + @Override + public VertexConsumer setUv(float u, float v) { + this.delegate.setUv(this.sprite.getU(u), this.sprite.getV(v)); + return this; + } + + @Override + public VertexConsumer setUv1(int u, int v) { + this.delegate.setUv1(u, v); + return this; + } + + @Override + public VertexConsumer setUv2(int u, int v) { + this.delegate.setUv2(u, v); + return this; + } + + @Override + public VertexConsumer setNormal(float x, float y, float z) { + this.delegate.setNormal(x, y, z); + return this; + } + + @Override + public void addVertex(float x, float y, float z, int color, float u, float v, int packedOverlay, int packedLight, float normalX, float normalY, float normalZ) { + this.delegate.addVertex(x, y, z, color, this.sprite.getU(u), this.sprite.getV(v), + packedOverlay, packedLight, normalX, normalY, normalZ); + } +} \ No newline at end of file diff --git a/common/src/main/java/me/pandamods/pandalib/utils/PrintUtils.java b/common/src/main/java/me/pandamods/pandalib/utils/PrintUtils.java new file mode 100644 index 0000000..3dd91a9 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/utils/PrintUtils.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) + * + * 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 + * any later version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package me.pandamods.pandalib.utils; + +import org.jetbrains.annotations.ApiStatus; +import org.joml.*; + +import java.text.NumberFormat; + +public class PrintUtils { + // Vector2 + @SuppressWarnings("unused") + public static String getVector2String(Vector2fc vector) { + return getVector2String(vector.x(), vector.y()); + } + + @SuppressWarnings("unused") + public static String getVector2String(Vector2dc vector) { + return getVector2String(vector.x(), vector.y()); + } + + @SuppressWarnings("unused") + public static String getVector2String(Vector2ic vector) { + return getVector2String(vector.x(), vector.y()); + } + + @SuppressWarnings("unused") + public static String getVector2String(double x, double y) { + return "Vector2[" + x + ", " + y + "]"; + } + + // Vector3 + @SuppressWarnings("unused") + public static String getVector3String(Vector3fc vector) { + return getVector3String(vector.x(), vector.y(), vector.z()); + } + + @SuppressWarnings("unused") + public static String getVector3String(Vector3dc vector) { + return getVector3String(vector.x(), vector.y(), vector.z()); + } + + @SuppressWarnings("unused") + public static String getVector3String(Vector3ic vector) { + return getVector3String(vector.x(), vector.y(), vector.z()); + } + + @SuppressWarnings("unused") + public static String getVector3String(double x, double y, double z) { + return "Vector3[" + x + ", " + y + ", " + z + "]"; + } + + // Vector4 + @SuppressWarnings("unused") + public static String getVector4String(Vector4fc vector) { + return getVector4String(vector.x(), vector.y(), vector.z(), vector.w()); + } + + @SuppressWarnings("unused") + public static String getVector4String(Vector4dc vector) { + return getVector4String(vector.x(), vector.y(), vector.z(), vector.w()); + } + + @SuppressWarnings("unused") + public static String getVector4String(Vector4ic vector) { + return getVector4String(vector.x(), vector.y(), vector.z(), vector.w()); + } + + @SuppressWarnings("unused") + public static String getVector4String(double x, double y, double z, double w) { + return "Vector4[" + x + ", " + y + ", " + z + ", " + w + "]"; + } + + // Quaternion + @SuppressWarnings("unused") + public static String getQuaternionString(Quaternionfc quaternion) { + return getQuaternionString(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w()); + } + + @SuppressWarnings("unused") + public static String getQuaternionString(Quaterniondc quaternion) { + return getQuaternionString(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w()); + } + + @SuppressWarnings("unused") + private static String getQuaternionString(double x, double y, double z, double w) { + return "Quaternion[" + x + ", " + y + ", " + z + ", " + w + "]"; + } + + // Matrix3 + @SuppressWarnings("unused") + public static String getMatrix3String(Matrix3fc matrix) { + return "Matrix3[" + + "\n| Rotation (Euler): " + getVector3String(matrix.getEulerAnglesXYZ(new Vector3f())) + + "\n| Rotation (Quaternion): " + getQuaternionString(matrix.getNormalizedRotation(new Quaternionf())) + + "\n\\ Scale: " + getVector3String(matrix.getScale(new Vector3f())) + + "\n]"; + } + + @SuppressWarnings("unused") + public static String getMatrix3String(Matrix3dc matrix) { + return "Matrix3[" + + "\n| Rotation (Euler): " + getVector3String(matrix.getEulerAnglesXYZ(new Vector3d())) + + "\n| Rotation (Quaternion): " + getQuaternionString(matrix.getNormalizedRotation(new Quaterniond())) + + "\n\\ Scale: " + getVector3String(matrix.getScale(new Vector3d())) + + "\n]"; + } + + // Matrix4 + @SuppressWarnings("unused") + public static String getMatrix4String(Matrix4fc matrix) { + return "Matrix4[" + + "\n| Translation: " + getVector3String(matrix.getTranslation(new Vector3f())) + + "\n| Rotation (Euler): " + getVector3String(matrix.getEulerAnglesXYZ(new Vector3f())) + + "\n| Rotation (Quaternion): " + getQuaternionString(matrix.getNormalizedRotation(new Quaternionf())) + + "\n\\ Scale: " + getVector3String(matrix.getScale(new Vector3f())) + + "\n]"; + } + + @SuppressWarnings("unused") + public static String getMatrix4String(Matrix4dc matrix) { + return "Matrix4[" + + "\n| Translation: " + getVector3String(matrix.getTranslation(new Vector3d())) + + "\n| Rotation (Euler): " + getVector3String(matrix.getEulerAnglesXYZ(new Vector3d())) + + "\n| Rotation (Quaternion): " + getQuaternionString(matrix.getNormalizedRotation(new Quaterniond())) + + "\n\\ Scale: " + getVector3String(matrix.getScale(new Vector3d())) + + "\n]"; + } +} diff --git a/gradle.properties b/gradle.properties index 6aa44bc..fdb512d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -30,4 +30,5 @@ publishingModrinthProjectId = mEEGbEIu publishingGitHubRepo = PandaDap2006/PandaLib # Dependencies -manifoldVersion = 2024.1.29 \ No newline at end of file +lwjglVersion=3.3.3 +manifoldVersion = 2024.1.0 \ No newline at end of file From 4d174c6e88af32ded0265b8e4f637fe7fb4c9015 Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Tue, 13 Aug 2024 22:35:24 +0200 Subject: [PATCH 20/25] Fixed Assimp relocation issues and remapping issues. --- CHANGELOG.md | 4 + build.gradle.kts | 122 +++++++++++------- .../java/me/pandamods/pandalib/PandaLib.java | 20 +-- .../api/config/holders/ConfigHolder.java | 1 - .../pandalib/client/PandaLibClient.java | 11 ++ .../pandalib/network/ConfigNetworking.java | 3 - .../packets/ClientConfigPacketData.java | 2 +- .../packets/CommonConfigPacketData.java | 2 +- .../pandalib/platform/ModLoader.java | 5 + .../pandamods/pandalib/platform/Platform.java | 5 + .../pandamods/pandalib/platform/Services.java | 20 +++ .../pandamods/pandalib/utils/ClassUtils.java | 9 ++ .../minecraft/shaders/core/pandalib/mesh.fsh | 29 +++++ .../minecraft/shaders/core/pandalib/mesh.json | 33 +++++ .../minecraft/shaders/core/pandalib/mesh.vsh | 37 ++++++ fabric/build.gradle.kts | 19 +-- .../pandalib/fabric/PandaLibFabric.java | 20 +-- .../fabric/client/PandaLibClientFabric.java | 11 ++ .../fabric/platform/ModLoaderImpl.java | 11 ++ .../fabric/platform/PlatformImpl.java | 15 +++ .../me.pandamods.pandalib.platform.Platform | 1 + forge/build.gradle.kts | 1 + .../pandalib/forge/PandaLibForge.java | 9 +- .../forge/client/PandaLibClientForge.java | 12 ++ .../me.pandamods.pandalib.platform.Platform | 1 + gradle.properties | 2 - neoforge/build.gradle.kts | 26 ++-- .../pandalib/neoforge/PandaLibNeoForge.java | 12 -- .../client/PandaLibClientNeoForge.java | 13 ++ .../neoforge/platform/ModLoaderImpl.java | 11 ++ .../neoforge/platform/PlatformImpl.java | 13 ++ .../me.pandamods.pandalib.platform.Platform | 1 + 32 files changed, 349 insertions(+), 132 deletions(-) create mode 100644 common/src/main/java/me/pandamods/pandalib/client/PandaLibClient.java create mode 100644 common/src/main/java/me/pandamods/pandalib/platform/ModLoader.java create mode 100644 common/src/main/java/me/pandamods/pandalib/platform/Platform.java create mode 100644 common/src/main/java/me/pandamods/pandalib/platform/Services.java create mode 100644 common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.fsh create mode 100644 common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.json create mode 100644 common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.vsh create mode 100644 fabric/src/main/java/me/pandamods/pandalib/fabric/client/PandaLibClientFabric.java create mode 100644 fabric/src/main/java/me/pandamods/pandalib/fabric/platform/ModLoaderImpl.java create mode 100644 fabric/src/main/java/me/pandamods/pandalib/fabric/platform/PlatformImpl.java create mode 100644 fabric/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform create mode 100644 forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java create mode 100644 forge/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform create mode 100644 neoforge/src/main/java/me/pandamods/pandalib/neoforge/client/PandaLibClientNeoForge.java create mode 100644 neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/ModLoaderImpl.java create mode 100644 neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/PlatformImpl.java create mode 100644 neoforge/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform diff --git a/CHANGELOG.md b/CHANGELOG.md index 98bc122..397bffe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ ### Changelog 0.4 Beta +* **Model API** + * [Supported Formats](https://mevislab.github.io/examples/tutorials/thirdparty/assimp/) + * Animation API + * **License Update:** * Every update from this update and onwards will be licensed under the GNU GPLv3 (previously GNU LGPLv3) \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 90b2b1f..1851898 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,6 +15,9 @@ plugins { id("me.modmuss50.mod-publish-plugin") version "0.6.3" } +/** + * Borrowed from Distant Horizons + */ fun writeBuildGradlePredefine(AvailableVersion: List, versionIndex: Int) { val sb = StringBuilder() @@ -73,7 +76,7 @@ architectury.minecraft = minecraftVersion allprojects { apply(plugin = "java") - base.archivesName = projectArchivesName + tasks { base.archivesName = projectArchivesName } version = "${modVersion}-${minecraftVersion}" group = projectGroup } @@ -90,17 +93,29 @@ subprojects { apply(plugin = "maven-publish") apply(plugin = "com.github.johnrengelman.shadow") + tasks { base.archivesName = "${projectArchivesName}-${project.name}" } + val loom = project.extensions.getByName("loom") loom.silentMojangMappingsLicense() configurations { - create("common") - create("shadowCommon") + create("common") { + isCanBeResolved = true + isCanBeConsumed = false + } compileClasspath.get().extendsFrom(configurations["common"]) runtimeClasspath.get().extendsFrom(configurations["common"]) + // Files in this configuration will be bundled into your mod using the Shadow plugin. + // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. + create("shadowBundle") { + isCanBeResolved = true + isCanBeConsumed = false + } + create("jarShadow") implementation.get().extendsFrom(configurations["jarShadow"]) + getByName("shadowBundle").extendsFrom(configurations["jarShadow"]) create("modShadow") getByName("modImplementation").extendsFrom(configurations["modShadow"]) @@ -131,18 +146,23 @@ subprojects { "modApi"("dev.architectury:architectury:${architecturyVersion}") } + // Assimp Library + "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}") { + exclude(group = "org.lwjgl", module = "lwjgl") + } if (isMinecraftSubProject) { - // Assimp Library - "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}") - // Assimp natives - "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-windows") + "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-windows") { + exclude(group = "org.lwjgl", module = "lwjgl") + } - "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-linux") + "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-linux") { + exclude(group = "org.lwjgl", module = "lwjgl") + } - "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-macos") - } else { - implementation("org.lwjgl:lwjgl-assimp:${lwjglVersion}") + "jarShadow"("org.lwjgl:lwjgl-assimp:${lwjglVersion}:natives-macos") { + exclude(group = "org.lwjgl", module = "lwjgl") + } } if (jomlVersion != null) { @@ -153,38 +173,51 @@ subprojects { annotationProcessor("systems.manifold:manifold-preprocessor:${manifoldVersion}") } - tasks.withType().configureEach { - options.encoding = "UTF-8" - options.release.set(JavaLanguageVersion.of(projectJavaVersion).asInt()) - options.compilerArgs.add("-Xplugin:Manifold") - } - if (isMinecraftSubProject) { tasks.withType().configureEach { - configurations = listOf(project.configurations.getByName("shadowCommon"), project.configurations.getByName("jarShadow")) + configurations = listOf(project.configurations.getByName("shadowBundle")) archiveClassifier.set("dev-shadow") exclude("architectury.common.json") - var librariesLocation = "${projectArchivesName}.libraries" + if (isMinecraftSubProject) { + // Relocate assimp so it will not cause any conflicts with other mods also using it. + relocate("org.lwjgl.assimp", "$projectGroup.assimp") + // Relocate natives + relocate("windows.x64.org.lwjgl.assimp", "windows.x64.$projectGroup.assimp") + relocate("linux.x64.org.lwjgl.assimp", "linux.x64.$projectGroup.assimp") + relocate("macos.x64.org.lwjgl.assimp", "macos.x64.$projectGroup.assimp") + + relocate("META-INF.windows.arm64.org.lwjgl.assimp", "META-INF.windows.arm64.$projectGroup.assimp") + relocate("META-INF.windows.x64.org.lwjgl.assimp", "META-INF.windows.x64.$projectGroup.assimp") + relocate("META-INF.windows.x86.org.lwjgl.assimp", "META-INF.windows.x86.$projectGroup.assimp") + + relocate("META-INF.linux.arm32.org.lwjgl.assimp", "META-INF.linux.arm32.$projectGroup.assimp") + relocate("META-INF.linux.arm64.org.lwjgl.assimp", "META-INF.linux.arm64.$projectGroup.assimp") + relocate("META-INF.linux.x64.org.lwjgl.assimp", "META-INF.linux.x64.$projectGroup.assimp") + + relocate("META-INF.macos.arm64.org.lwjgl.assimp", "META-INF.macos.arm64.$projectGroup.assimp") + relocate("META-INF.macos.x64.org.lwjgl.assimp", "META-INF.macos.x64.$projectGroup.assimp") - // Relocate assimp so it will not cause any conflicts with other mods also using it. - relocate("org.lwjgl.assimp", "${librariesLocation}.org.lwjgl.assimp") - relocate("windows.x64.org.lwjgl.assimp", "${librariesLocation}.windows.x64.org.lwjgl.assimp") - relocate("linux.x64.org.lwjgl.assimp", "${librariesLocation}.linux.x64.org.lwjgl.assimp") - relocate("macos.x64.org.lwjgl.assimp", "${librariesLocation}.macos.x64.org.lwjgl.assimp") + if (jomlVersion != null) + relocate("org.joml", "$projectGroup.joml") + } } tasks.withType().configureEach { val shadowJar = tasks.getByName("shadowJar") inputFile.set(shadowJar.archiveFile) - dependsOn(shadowJar) } } - tasks { - processResources { - val properties = mapOf( + tasks.withType().configureEach { + options.encoding = "UTF-8" + options.release.set(JavaLanguageVersion.of(projectJavaVersion).asInt()) + options.compilerArgs.add("-Xplugin:Manifold") + } + + tasks.processResources { + val properties = mapOf( "minecraftVersion" to minecraftVersion, "modId" to modId, @@ -196,28 +229,25 @@ subprojects { "fabricCompatibleVersions" to fabricCompatibleVersions, "forgeCompatibleVersions" to forgeCompatibleVersions, "neoForgeCompatibleVersions" to neoForgeCompatibleVersions - ) + ) - inputs.properties(properties) - filesMatching(listOf("META-INF/mods.toml", "META-INF/neoforge.mods.toml", "pack.mcmeta", "fabric.mod.json")) { - expand(properties) - } + inputs.properties(properties) + filesMatching(listOf("META-INF/mods.toml", "META-INF/neoforge.mods.toml", "pack.mcmeta", "fabric.mod.json")) { + expand(properties) } + } - jar { - manifest { - attributes(mapOf( - "Specification-Title" to modName, - "Specification-Vendor" to modAuthor, - "Specification-Version" to modVersion, - "Implementation-Title" to name, - "Implementation-Vendor" to modAuthor, - "Implementation-Version" to archiveVersion - )) - } + tasks.jar { + manifest { + attributes(mapOf( + "Specification-Title" to modName, + "Specification-Vendor" to modAuthor, + "Specification-Version" to modVersion, + "Implementation-Title" to name, + "Implementation-Vendor" to modAuthor, + "Implementation-Version" to archiveVersion + )) } - - jar.get().archiveClassifier.set("dev") } java { diff --git a/common/src/main/java/me/pandamods/pandalib/PandaLib.java b/common/src/main/java/me/pandamods/pandalib/PandaLib.java index 22b8ae1..41b4510 100644 --- a/common/src/main/java/me/pandamods/pandalib/PandaLib.java +++ b/common/src/main/java/me/pandamods/pandalib/PandaLib.java @@ -1,15 +1,3 @@ -/* - * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) - * - * 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 - * any later version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package me.pandamods.pandalib; import com.mojang.logging.LogUtils; @@ -25,21 +13,21 @@ public class PandaLib { public static final String MOD_ID = "pandalib"; - public static final Logger LOGGER = LogUtils.getLogger(); + public static final Logger LOGGER = LogUtils.getLogger(); public static void init() { ClientReloadShadersEvent.EVENT.register(PLInternalShaders::register); - ReloadListenerRegistry.register(PackType.CLIENT_RESOURCES, new AssimpResources(), ID("assimp_loader")); + ReloadListenerRegistry.register(PackType.CLIENT_RESOURCES, new AssimpResources(), LOCATION("assimp_loader")); ConfigNetworking.registerPackets(); EventHandler.Register(); } - public static ResourceLocation ID(String path) { + public static ResourceLocation LOCATION(String path) { #if MC_VER >= MC_1_21 return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); #else return new ResourceLocation(MOD_ID, path); #endif } -} +} \ No newline at end of file diff --git a/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java b/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java index cbd66ff..80850ee 100644 --- a/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java +++ b/common/src/main/java/me/pandamods/pandalib/api/config/holders/ConfigHolder.java @@ -16,7 +16,6 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import dev.architectury.platform.Platform; -import me.pandamods.pandalib.PandaLib; import me.pandamods.pandalib.api.config.Config; import me.pandamods.pandalib.api.config.ConfigData; import me.pandamods.pandalib.utils.ClassUtils; diff --git a/common/src/main/java/me/pandamods/pandalib/client/PandaLibClient.java b/common/src/main/java/me/pandamods/pandalib/client/PandaLibClient.java new file mode 100644 index 0000000..8a19368 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/client/PandaLibClient.java @@ -0,0 +1,11 @@ +package me.pandamods.pandalib.client; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + + +@Environment(EnvType.CLIENT) +public class PandaLibClient { + public static void init() { + } +} \ No newline at end of file diff --git a/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java b/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java index 015cfd1..9d4948e 100644 --- a/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java +++ b/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java @@ -13,8 +13,6 @@ package me.pandamods.pandalib.network; import dev.architectury.networking.NetworkManager; -import io.netty.buffer.Unpooled; -import me.pandamods.pandalib.PandaLib; import me.pandamods.pandalib.api.config.ConfigData; import me.pandamods.pandalib.api.config.PandaLibConfig; import me.pandamods.pandalib.api.config.holders.ClientConfigHolder; @@ -24,7 +22,6 @@ import me.pandamods.pandalib.network.packets.ClientConfigPacketData; import me.pandamods.pandalib.network.packets.CommonConfigPacketData; #endif -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; diff --git a/common/src/main/java/me/pandamods/pandalib/network/packets/ClientConfigPacketData.java b/common/src/main/java/me/pandamods/pandalib/network/packets/ClientConfigPacketData.java index 83f7870..c7026a8 100644 --- a/common/src/main/java/me/pandamods/pandalib/network/packets/ClientConfigPacketData.java +++ b/common/src/main/java/me/pandamods/pandalib/network/packets/ClientConfigPacketData.java @@ -20,7 +20,7 @@ import net.minecraft.network.protocol.common.custom.CustomPacketPayload; public record ClientConfigPacketData(String resourceLocation, String configJson) implements CustomPacketPayload { - public static final Type TYPE = new Type<>(PandaLib.ID("client_config_sync")); + public static final Type TYPE = new Type<>(PandaLib.LOCATION("client_config_sync")); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, diff --git a/common/src/main/java/me/pandamods/pandalib/network/packets/CommonConfigPacketData.java b/common/src/main/java/me/pandamods/pandalib/network/packets/CommonConfigPacketData.java index 228549c..774ab4e 100644 --- a/common/src/main/java/me/pandamods/pandalib/network/packets/CommonConfigPacketData.java +++ b/common/src/main/java/me/pandamods/pandalib/network/packets/CommonConfigPacketData.java @@ -20,7 +20,7 @@ import net.minecraft.network.protocol.common.custom.CustomPacketPayload; public record CommonConfigPacketData(String resourceLocation, String configJson) implements CustomPacketPayload { - public static final Type TYPE = new Type<>(PandaLib.ID("common_config_sync")); + public static final Type TYPE = new Type<>(PandaLib.LOCATION("common_config_sync")); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, diff --git a/common/src/main/java/me/pandamods/pandalib/platform/ModLoader.java b/common/src/main/java/me/pandamods/pandalib/platform/ModLoader.java new file mode 100644 index 0000000..a8f0843 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/platform/ModLoader.java @@ -0,0 +1,5 @@ +package me.pandamods.pandalib.platform; + +public interface ModLoader { + boolean isModLoaded(String modId); +} diff --git a/common/src/main/java/me/pandamods/pandalib/platform/Platform.java b/common/src/main/java/me/pandamods/pandalib/platform/Platform.java new file mode 100644 index 0000000..c68b435 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/platform/Platform.java @@ -0,0 +1,5 @@ +package me.pandamods.pandalib.platform; + +public interface Platform { + ModLoader getModLoader(); +} diff --git a/common/src/main/java/me/pandamods/pandalib/platform/Services.java b/common/src/main/java/me/pandamods/pandalib/platform/Services.java new file mode 100644 index 0000000..54ac340 --- /dev/null +++ b/common/src/main/java/me/pandamods/pandalib/platform/Services.java @@ -0,0 +1,20 @@ +package me.pandamods.pandalib.platform; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.ServiceLoader; + +public class Services { + private static final Logger LOGGER = LogManager.getLogger(); + + public static final Platform PLATFORM = load(Platform.class); + + public static T load(Class serviceClass) { + T loadedService = ServiceLoader.load(serviceClass) + .findFirst() + .orElseThrow(() -> new NullPointerException("Failed to load service for " + serviceClass.getName())); + LOGGER.debug("Loaded {} for service {}", loadedService, serviceClass); + return loadedService; + } +} diff --git a/common/src/main/java/me/pandamods/pandalib/utils/ClassUtils.java b/common/src/main/java/me/pandamods/pandalib/utils/ClassUtils.java index 1a8e415..ae1b9bf 100644 --- a/common/src/main/java/me/pandamods/pandalib/utils/ClassUtils.java +++ b/common/src/main/java/me/pandamods/pandalib/utils/ClassUtils.java @@ -42,4 +42,13 @@ public static T getFieldUnsafely(Object parentObject, Field field) { throw new RuntimeException(e); } } + + public static boolean doesClassExist(String className) { + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } } diff --git a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.fsh b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.fsh new file mode 100644 index 0000000..50a03ed --- /dev/null +++ b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.fsh @@ -0,0 +1,29 @@ +#version 150 + +#moj_import + +uniform sampler2D Sampler0; + +uniform vec4 ColorModulator; +uniform float FogStart; +uniform float FogEnd; +uniform vec4 FogColor; + +in float vertexDistance; +in vec4 vertexColor; +in vec4 lightMapColor; +in vec4 overlayColor; +in vec2 texCoord0; + +out vec4 fragColor; + +void main() { + vec4 color = texture(Sampler0, texCoord0); + if (color.a < 0.1) { + discard; + } + color *= vertexColor * ColorModulator; + color.rgb = mix(overlayColor.rgb, color.rgb, overlayColor.a); + color *= lightMapColor; + fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); +} \ No newline at end of file diff --git a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.json b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.json new file mode 100644 index 0000000..c5877de --- /dev/null +++ b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.json @@ -0,0 +1,33 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "pandalib/mesh", + "fragment": "pandalib/mesh", + "attributes": [ + "Position", + "Color", + "UV0", + "UV1", + "UV2", + "Normal" + ], + "samplers": [ + { "name": "Sampler0" }, + { "name": "Sampler1" }, + { "name": "Sampler2" } + ], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, + { "name": "Light0_Direction", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, + { "name": "Light1_Direction", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, + { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, + { "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.vsh b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.vsh new file mode 100644 index 0000000..6cd06a9 --- /dev/null +++ b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.vsh @@ -0,0 +1,37 @@ +#version 150 + +#moj_import +#moj_import + +in vec3 Position; +in vec4 Color; +in vec2 UV0; +in ivec2 UV1; +in ivec2 UV2; +in vec3 Normal; + +uniform sampler2D Sampler1; +uniform sampler2D Sampler2; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; +uniform int FogShape; + +uniform vec3 Light0_Direction; +uniform vec3 Light1_Direction; + +out float vertexDistance; +out vec4 vertexColor; +out vec4 lightMapColor; +out vec4 overlayColor; +out vec2 texCoord0; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + + vertexDistance = fog_distance(Position, FogShape); + vertexColor = minecraft_mix_light(Light0_Direction, Light1_Direction, Normal, Color); + lightMapColor = texelFetch(Sampler2, UV2 / 16, 0); + overlayColor = texelFetch(Sampler1, UV1, 0); + texCoord0 = UV0; +} \ No newline at end of file diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 4695e5b..93b2d6e 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,3 +1,6 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import kotlin.text.set + // gradle.properties val fabricLoaderVersion: String by project val fabricApiVersion: String by project @@ -28,19 +31,9 @@ dependencies { modApi("com.terraformersmc:modmenu:${modmenuVersion}") "common"(project(":common", "namedElements")) { isTransitive = false } - "shadowCommon"(project(":common", "transformProductionFabric")) { isTransitive = false } + "shadowBundle"(project(":common", "transformProductionFabric")) } -tasks { - base.archivesName.set(base.archivesName.get() + "-fabric") - - remapJar { - injectAccessWidener.set(true) - } - - sourcesJar { - val commonSources = project(":common").tasks.sourcesJar - dependsOn(commonSources) - from(commonSources.get().archiveFile.map { zipTree(it) }) - } +tasks.remapJar { + injectAccessWidener.set(true) } \ No newline at end of file diff --git a/fabric/src/main/java/me/pandamods/pandalib/fabric/PandaLibFabric.java b/fabric/src/main/java/me/pandamods/pandalib/fabric/PandaLibFabric.java index 8e9ef41..7e07b54 100644 --- a/fabric/src/main/java/me/pandamods/pandalib/fabric/PandaLibFabric.java +++ b/fabric/src/main/java/me/pandamods/pandalib/fabric/PandaLibFabric.java @@ -1,23 +1,11 @@ -/* - * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) - * - * 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 - * any later version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package me.pandamods.pandalib.fabric; import me.pandamods.pandalib.PandaLib; import net.fabricmc.api.ModInitializer; public class PandaLibFabric implements ModInitializer { - @Override - public void onInitialize() { - PandaLib.init(); - } + @Override + public void onInitialize() { + PandaLib.init(); + } } diff --git a/fabric/src/main/java/me/pandamods/pandalib/fabric/client/PandaLibClientFabric.java b/fabric/src/main/java/me/pandamods/pandalib/fabric/client/PandaLibClientFabric.java new file mode 100644 index 0000000..997dc1f --- /dev/null +++ b/fabric/src/main/java/me/pandamods/pandalib/fabric/client/PandaLibClientFabric.java @@ -0,0 +1,11 @@ +package me.pandamods.pandalib.fabric.client; + +import me.pandamods.pandalib.client.PandaLibClient; +import net.fabricmc.api.ClientModInitializer; + +public class PandaLibClientFabric implements ClientModInitializer { + @Override + public void onInitializeClient() { + PandaLibClient.init(); + } +} diff --git a/fabric/src/main/java/me/pandamods/pandalib/fabric/platform/ModLoaderImpl.java b/fabric/src/main/java/me/pandamods/pandalib/fabric/platform/ModLoaderImpl.java new file mode 100644 index 0000000..afc369d --- /dev/null +++ b/fabric/src/main/java/me/pandamods/pandalib/fabric/platform/ModLoaderImpl.java @@ -0,0 +1,11 @@ +package me.pandamods.pandalib.fabric.platform; + +import me.pandamods.pandalib.platform.ModLoader; +import net.fabricmc.loader.api.FabricLoader; + +public class ModLoaderImpl implements ModLoader { + @Override + public boolean isModLoaded(String modId) { + return FabricLoader.getInstance().isModLoaded(modId); + } +} diff --git a/fabric/src/main/java/me/pandamods/pandalib/fabric/platform/PlatformImpl.java b/fabric/src/main/java/me/pandamods/pandalib/fabric/platform/PlatformImpl.java new file mode 100644 index 0000000..ce8209b --- /dev/null +++ b/fabric/src/main/java/me/pandamods/pandalib/fabric/platform/PlatformImpl.java @@ -0,0 +1,15 @@ +package me.pandamods.pandalib.fabric.platform; + +import me.pandamods.pandalib.platform.ModLoader; +import me.pandamods.pandalib.platform.Platform; + +import java.util.function.Supplier; + +public class PlatformImpl implements Platform { + private final ModLoader modLoader = new ModLoaderImpl(); + + @Override + public ModLoader getModLoader() { + return this.modLoader; + } +} diff --git a/fabric/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform b/fabric/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform new file mode 100644 index 0000000..33b4d0c --- /dev/null +++ b/fabric/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform @@ -0,0 +1 @@ +me.pandamods.pandalib.fabric.platform.PlatformImpl \ No newline at end of file diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index 0027816..7d64e73 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -25,6 +25,7 @@ loom { configurations { getByName("developmentForge").extendsFrom(configurations["common"]) + getByName("developmentForge").extendsFrom(configurations["jarShadow"]) } dependencies { diff --git a/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java b/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java index 18a9bf7..9281121 100644 --- a/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java +++ b/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java @@ -1,13 +1,14 @@ -package me.pandamods.pandalib.forge; +package me.pandamods.pandalib; -import me.pandamods.pandalib.PandaLib; -import net.minecraftforge.client.ConfigScreenHandler; -import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; @Mod(PandaLib.MOD_ID) public class PandaLibForge { public PandaLibForge() { PandaLib.init(); + + DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> PandaLibClientForge::new); } } diff --git a/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java b/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java new file mode 100644 index 0000000..0a09783 --- /dev/null +++ b/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java @@ -0,0 +1,12 @@ +package me.pandamods.pandalib.client; + +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.common.Mod; + +@OnlyIn(Dist.CLIENT) +public class PandaLibClientForge { + public PandaLibClientForge() { + PandaLibClient.init(); + } +} diff --git a/forge/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform b/forge/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform new file mode 100644 index 0000000..443eb5f --- /dev/null +++ b/forge/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform @@ -0,0 +1 @@ +me.pandamods.pandalib.forge.platform.PlatformImpl \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index fdb512d..116b986 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,6 @@ org.gradle.jvmargs = -Xmx4G org.gradle.parallel = true -fabric.loom.multiProjectOptimisation = true - # Project Settings projectArchivesName = pandalib projectGroup = me.pandamods diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index baff6a2..31008fe 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,3 +1,5 @@ +import org.gradle.kotlin.dsl.tasks + // gradle.properties val neoForgeVersion: String by project @@ -18,24 +20,14 @@ dependencies { neoForge("net.neoforged:neoforge:${neoForgeVersion}") "common"(project(":common", "namedElements")) { isTransitive = false } - "shadowCommon"(project(":common", "transformProductionNeoForge")) { isTransitive = false } + "shadowBundle"(project(":common", "transformProductionNeoForge")) } -tasks { - base.archivesName.set(base.archivesName.get() + "-neoforge") - - shadowJar { - exclude("fabric.mod.json") - } - - remapJar { - injectAccessWidener = true - atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) - } +tasks.shadowJar { + exclude("fabric.mod.json") +} - sourcesJar { - val commonSources = project(":common").tasks.sourcesJar - dependsOn(commonSources) - from(commonSources.get().archiveFile.map { zipTree(it) }) - } +tasks.remapJar { + injectAccessWidener = true + atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) } \ No newline at end of file diff --git a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java index 4efdfe6..dffeb17 100644 --- a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java +++ b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java @@ -1,15 +1,3 @@ -/* - * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) - * - * 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 - * any later version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package me.pandamods.pandalib.neoforge; import me.pandamods.pandalib.PandaLib; diff --git a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/client/PandaLibClientNeoForge.java b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/client/PandaLibClientNeoForge.java new file mode 100644 index 0000000..e9af34e --- /dev/null +++ b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/client/PandaLibClientNeoForge.java @@ -0,0 +1,13 @@ +package me.pandamods.pandalib.neoforge.client; + +import me.pandamods.pandalib.PandaLib; +import me.pandamods.pandalib.client.PandaLibClient; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.common.Mod; + +@Mod(value = PandaLib.MOD_ID, dist = Dist.CLIENT) +public class PandaLibClientNeoForge { + public PandaLibClientNeoForge() { + PandaLibClient.init(); + } +} diff --git a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/ModLoaderImpl.java b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/ModLoaderImpl.java new file mode 100644 index 0000000..8624c98 --- /dev/null +++ b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/ModLoaderImpl.java @@ -0,0 +1,11 @@ +package me.pandamods.pandalib.neoforge.platform; + +import me.pandamods.pandalib.platform.ModLoader; +import net.neoforged.fml.ModList; + +public class ModLoaderImpl implements ModLoader { + @Override + public boolean isModLoaded(String modId) { + return ModList.get().isLoaded(modId); + } +} diff --git a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/PlatformImpl.java b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/PlatformImpl.java new file mode 100644 index 0000000..be3ec93 --- /dev/null +++ b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/platform/PlatformImpl.java @@ -0,0 +1,13 @@ +package me.pandamods.pandalib.neoforge.platform; + +import me.pandamods.pandalib.platform.ModLoader; +import me.pandamods.pandalib.platform.Platform; + +public class PlatformImpl implements Platform { + private final ModLoader modLoader = new ModLoaderImpl(); + + @Override + public ModLoader getModLoader() { + return this.modLoader; + } +} diff --git a/neoforge/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform b/neoforge/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform new file mode 100644 index 0000000..30f3fc5 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/services/me.pandamods.pandalib.platform.Platform @@ -0,0 +1 @@ +me.pandamods.pandalib.neoforge.platform.PlatformImpl \ No newline at end of file From 6f290fa16052039d0b13559dfa61c4e152e90e62 Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Wed, 14 Aug 2024 22:38:52 +0200 Subject: [PATCH 21/25] Update changelog and build scripts Revised the CHANGELOG.md to include new sections for Technical Changes and updated the license information. Removed unused import statements from fabric and neoforge build scripts. --- CHANGELOG.md | 17 +++++++++++------ fabric/build.gradle.kts | 3 --- neoforge/build.gradle.kts | 2 -- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 397bffe..01a2021 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,12 @@ -### Changelog 0.4 Beta -* **Model API** - * [Supported Formats](https://mevislab.github.io/examples/tutorials/thirdparty/assimp/) - * Animation API +# Changelog 0.4 Beta +## Model API +* [Supported Formats](https://mevislab.github.io/examples/tutorials/thirdparty/assimp/) +* Animation API -* **License Update:** - * Every update from this update and onwards will be licensed under the GNU GPLv3 (previously GNU LGPLv3) \ No newline at end of file +## Technical Changes +* Updated Gradle to 8.8 +* Updated to Architectury Loom 1.7 +* Switched build script to Kotlin + +## License Update +* Every update from this update and onwards will be licensed under the GNU GPLv3 (previously GNU LGPLv3) \ No newline at end of file diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 93b2d6e..11180bf 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,6 +1,3 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import kotlin.text.set - // gradle.properties val fabricLoaderVersion: String by project val fabricApiVersion: String by project diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 31008fe..a78b0d2 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,5 +1,3 @@ -import org.gradle.kotlin.dsl.tasks - // gradle.properties val neoForgeVersion: String by project From a515f9afcce8d96baa748848d973862a328d9c46 Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Thu, 15 Aug 2024 06:50:15 +0200 Subject: [PATCH 22/25] Remove Forge support for versions 1.21 and above. Commented out Forge-related properties and dependencies for versions above 1.21. Cleaned up build logic and added embedded Joml feature to README. --- README.md | 1 + build.gradle.kts | 42 +++++++++++++++---------------- forge/build.gradle.kts | 24 ++++++------------ versionProperties/1.21.properties | 5 ++-- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 5e071da..f01db38 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ This Library was created to easily share code between The Panda Oliver's mods. ### Current Features: +- Embedded Joml for 1.19.2 - Config API - Automatic Config synchronisation diff --git a/build.gradle.kts b/build.gradle.kts index 1851898..08ddce7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -180,28 +180,26 @@ subprojects { exclude("architectury.common.json") - if (isMinecraftSubProject) { - // Relocate assimp so it will not cause any conflicts with other mods also using it. - relocate("org.lwjgl.assimp", "$projectGroup.assimp") - // Relocate natives - relocate("windows.x64.org.lwjgl.assimp", "windows.x64.$projectGroup.assimp") - relocate("linux.x64.org.lwjgl.assimp", "linux.x64.$projectGroup.assimp") - relocate("macos.x64.org.lwjgl.assimp", "macos.x64.$projectGroup.assimp") - - relocate("META-INF.windows.arm64.org.lwjgl.assimp", "META-INF.windows.arm64.$projectGroup.assimp") - relocate("META-INF.windows.x64.org.lwjgl.assimp", "META-INF.windows.x64.$projectGroup.assimp") - relocate("META-INF.windows.x86.org.lwjgl.assimp", "META-INF.windows.x86.$projectGroup.assimp") - - relocate("META-INF.linux.arm32.org.lwjgl.assimp", "META-INF.linux.arm32.$projectGroup.assimp") - relocate("META-INF.linux.arm64.org.lwjgl.assimp", "META-INF.linux.arm64.$projectGroup.assimp") - relocate("META-INF.linux.x64.org.lwjgl.assimp", "META-INF.linux.x64.$projectGroup.assimp") - - relocate("META-INF.macos.arm64.org.lwjgl.assimp", "META-INF.macos.arm64.$projectGroup.assimp") - relocate("META-INF.macos.x64.org.lwjgl.assimp", "META-INF.macos.x64.$projectGroup.assimp") - - if (jomlVersion != null) - relocate("org.joml", "$projectGroup.joml") - } + // Relocate assimp so it will not cause any conflicts with other mods also using it. + relocate("org.lwjgl.assimp", "$projectGroup.assimp") + // Relocate natives + relocate("windows.x64.org.lwjgl.assimp", "windows.x64.$projectGroup.assimp") + relocate("linux.x64.org.lwjgl.assimp", "linux.x64.$projectGroup.assimp") + relocate("macos.x64.org.lwjgl.assimp", "macos.x64.$projectGroup.assimp") + + relocate("META-INF.windows.arm64.org.lwjgl.assimp", "META-INF.windows.arm64.$projectGroup.assimp") + relocate("META-INF.windows.x64.org.lwjgl.assimp", "META-INF.windows.x64.$projectGroup.assimp") + relocate("META-INF.windows.x86.org.lwjgl.assimp", "META-INF.windows.x86.$projectGroup.assimp") + + relocate("META-INF.linux.arm32.org.lwjgl.assimp", "META-INF.linux.arm32.$projectGroup.assimp") + relocate("META-INF.linux.arm64.org.lwjgl.assimp", "META-INF.linux.arm64.$projectGroup.assimp") + relocate("META-INF.linux.x64.org.lwjgl.assimp", "META-INF.linux.x64.$projectGroup.assimp") + + relocate("META-INF.macos.arm64.org.lwjgl.assimp", "META-INF.macos.arm64.$projectGroup.assimp") + relocate("META-INF.macos.x64.org.lwjgl.assimp", "META-INF.macos.x64.$projectGroup.assimp") + + if (jomlVersion != null) + relocate("org.joml", "$projectGroup.joml") } tasks.withType().configureEach { diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index 7d64e73..ab7ef52 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -25,30 +25,20 @@ loom { configurations { getByName("developmentForge").extendsFrom(configurations["common"]) - getByName("developmentForge").extendsFrom(configurations["jarShadow"]) } dependencies { forge("net.minecraftforge:forge:${forgeVersion}") "common"(project(":common", "namedElements")) { isTransitive = false } - "shadowCommon"(project(":common", "transformProductionForge")) { isTransitive = false } + "shadowBundle"(project(":common", "transformProductionForge")) } -tasks { - base.archivesName.set(base.archivesName.get() + "-forge") - - shadowJar { - exclude("fabric.mod.json") - } - - remapJar { - injectAccessWidener = true - } +tasks.shadowJar { + exclude("fabric.mod.json") +} - sourcesJar { - val commonSources = project(":common").tasks.sourcesJar - dependsOn(commonSources) - from(commonSources.get().archiveFile.map { zipTree(it) }) - } +tasks.remapJar { + injectAccessWidener = true + atAccessWideners.add(loom.accessWidenerPath.get().asFile.name) } \ No newline at end of file diff --git a/versionProperties/1.21.properties b/versionProperties/1.21.properties index d9a3576..32d3b50 100644 --- a/versionProperties/1.21.properties +++ b/versionProperties/1.21.properties @@ -16,10 +16,11 @@ fabricApiVersion = 0.100.4+1.21 fabricCompatibleVersions = >=1.21 +# Forge is not supported for versions above 1.20.4 # Forge -forgeVersion = 1.21-51.0.31 +#forgeVersion = 1.21-51.0.31 -forgeCompatibleVersions = [1.21,) +#forgeCompatibleVersions = [1.21,) # NeoForge neoForgeVersion = 21.0.159 From bc43a5b88c637dde791387bef62a253bd7519ca4 Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Wed, 21 Aug 2024 18:48:23 +0200 Subject: [PATCH 23/25] Revise .gitignore for project structure and IntelliJ settings Reordered and updated .gitignore with clearer sections for build directories, IntelliJ settings, and Java-specific files. Added exclusions for gradle wrapper and Minecraft build directories to improve project cleanliness. --- .gitignore | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 5124bdc..2310e96 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,21 @@ +.gradle/ build/ -*.ipr +gradle/wrapper/gradle-wrapper.jar + +build.properties +.architectury-transformer + +### Minecraft ### run/ -*.iws -out/ -*.iml -.gradle/ -output/ -bin/ -libs/ -.classpath -.project +### IntelliJ IDEA ### .idea/ -classes/ -.metadata -.vscode -.settings -*.launch -/.architectury-transformer/ -build.properties \ No newline at end of file +*.iml +*.ipr +*.iws + +### Java ### +hs_err_*.log +replay_*.log +*.hprof +*.jfr \ No newline at end of file From 22e9d5c48d6d88ab7b6f892f16727733f80fe140 Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Wed, 21 Aug 2024 23:28:38 +0200 Subject: [PATCH 24/25] Remove PLInternalShaders and update various methods Deleted PLInternalShaders and related shader files to streamline the codebase. Updated conditional shader handling, added conditional rendering logic, and fixed version-specific issues across multiple components. --- build.gradle.kts | 11 +- .../java/me/pandamods/pandalib/PandaLib.java | 2 - .../model/client/render/ModelRenderer.java | 104 ++++++++++++++---- .../client/render/PLInternalShaders.java | 43 -------- .../api/model/client/render/PLRenderType.java | 13 --- .../api/model/resource/AssimpResources.java | 9 +- .../pandalib/network/ConfigNetworking.java | 10 +- .../pandamods/pandalib/utils/BlockUtils.java | 28 ++++- .../pandamods/pandalib/utils/MathUtils.java | 10 +- .../utils/PLSpriteCoordinateExpander.java | 60 ++++++++++ .../minecraft/shaders/core/pandalib/mesh.fsh | 29 ----- .../minecraft/shaders/core/pandalib/mesh.json | 33 ------ .../minecraft/shaders/core/pandalib/mesh.vsh | 37 ------- forge/build.gradle.kts | 4 + .../pandalib/forge/PandaLibForge.java | 4 +- .../forge/client/PandaLibClientForge.java | 3 +- gradle.properties | 4 +- .../pandalib/neoforge/PandaLibNeoForge.java | 9 ++ .../client/PandaLibClientNeoForge.java | 2 + versionProperties/1.21.properties | 2 +- 20 files changed, 216 insertions(+), 201 deletions(-) delete mode 100644 common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLInternalShaders.java delete mode 100644 common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.fsh delete mode 100644 common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.json delete mode 100644 common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.vsh diff --git a/build.gradle.kts b/build.gradle.kts index 08ddce7..961b1dd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -223,11 +223,11 @@ subprojects { "modName" to modName, "modDescription" to modDescription, "modAuthor" to modAuthor, + ).toMutableMap() - "fabricCompatibleVersions" to fabricCompatibleVersions, - "forgeCompatibleVersions" to forgeCompatibleVersions, - "neoForgeCompatibleVersions" to neoForgeCompatibleVersions - ) + if (isFabric) properties["fabricCompatibleVersions"] = fabricCompatibleVersions + if (isForge) properties["forgeCompatibleVersions"] = forgeCompatibleVersions + if (isNeoForge) properties["neoForgeCompatibleVersions"] = neoForgeCompatibleVersions inputs.properties(properties) filesMatching(listOf("META-INF/mods.toml", "META-INF/neoforge.mods.toml", "pack.mcmeta", "fabric.mod.json")) { @@ -302,7 +302,7 @@ publishMods { val minecraftVersionStr = if (isRangedVersion) { "${publishingMinecraftVersion}-${publishingLatestMinecraftVersion}" } else { - publishingLatestMinecraftVersion + publishingMinecraftVersion } // Creates publish options for each supported mod loader @@ -377,6 +377,7 @@ publishMods { } var githubTagName = "${releaseType}/${modVersion}-${minecraftVersionStr}" github { + displayName = "${modName} ${modVersion} MC${minecraftVersionStr}" accessToken = githubAPIKey repository = githubRepository tagName = githubTagName diff --git a/common/src/main/java/me/pandamods/pandalib/PandaLib.java b/common/src/main/java/me/pandamods/pandalib/PandaLib.java index 41b4510..afa5a61 100644 --- a/common/src/main/java/me/pandamods/pandalib/PandaLib.java +++ b/common/src/main/java/me/pandamods/pandalib/PandaLib.java @@ -3,7 +3,6 @@ import com.mojang.logging.LogUtils; import dev.architectury.event.events.client.ClientReloadShadersEvent; import dev.architectury.registry.ReloadListenerRegistry; -import me.pandamods.pandalib.api.model.client.render.PLInternalShaders; import me.pandamods.pandalib.api.model.resource.AssimpResources; import me.pandamods.pandalib.event.EventHandler; import me.pandamods.pandalib.network.ConfigNetworking; @@ -16,7 +15,6 @@ public class PandaLib { public static final Logger LOGGER = LogUtils.getLogger(); public static void init() { - ClientReloadShadersEvent.EVENT.register(PLInternalShaders::register); ReloadListenerRegistry.register(PackType.CLIENT_RESOURCES, new AssimpResources(), LOCATION("assimp_loader")); ConfigNetworking.registerPackets(); diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/ModelRenderer.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/ModelRenderer.java index 89ba0a1..ed50232 100644 --- a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/ModelRenderer.java +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/ModelRenderer.java @@ -93,13 +93,33 @@ public static void renderMesh(Model model, Mesh mesh, Node meshNode, PoseStack p } } - vertexConsumer - .addVertex(poseStack.last(), position.x(), position.y(), position.z()) - .setColor(1f, 1f, 1f, 1f) - .setUv(uvCoords.x(), uvCoords.y()) - .setOverlay(overlayUV) - .setLight(lightmapUV) - .setNormal(poseStack.last(), normal.x(), normal.y(), normal.z()); + #if MC_VER >= MC_1_21 + vertexConsumer + .addVertex(poseStack.last(), position.x(), position.y(), position.z()) + .setColor(1f, 1f, 1f, 1f) + .setUv(uvCoords.x(), uvCoords.y()) + .setOverlay(overlayUV) + .setLight(lightmapUV) + .setNormal(poseStack.last(), normal.x(), normal.y(), normal.z()); + #elif MC_VER >= MC_1_20_5 + vertexConsumer + .vertex(poseStack.last(), position.x(), position.y(), position.z()) + .color(1f, 1f, 1f, 1f) + .uv(uvCoords.x(), uvCoords.y()) + .overlayCoords(overlayUV) + .uv2(lightmapUV) + .normal(poseStack.last(), normal.x(), normal.y(), normal.z()) + .endVertex(); + #else + vertexConsumer + .vertex(poseStack.last().pose(), position.x(), position.y(), position.z()) + .color(1f, 1f, 1f, 1f) + .uv(uvCoords.x(), uvCoords.y()) + .overlayCoords(overlayUV) + .uv2(lightmapUV) + .normal(poseStack.last().normal(), normal.x(), normal.y(), normal.z()) + .endVertex(); + #endif } } @@ -109,33 +129,71 @@ public static void renderModelDebug(Model model, PoseStack poseStack, MultiBuffe private static void renderNodeDebug(Node node, PoseStack poseStack, MultiBufferSource bufferSource) { poseStack.pushPose(); - poseStack.mulPose(node.getGlobalTransform()); + #if MC_VER > MC_1_19_2 + #if MC_VER >= MC_1_20_5 + poseStack.mulPose(node.getGlobalTransform()); + #elif MC_VER == MC_1_20 + poseStack.mulPoseMatrix(node.getGlobalTransform()); + #endif float length = 0.9f; - VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + #if MC_VER >= MC_1_21 + VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); - vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); - vertexConsumer.setColor(Color.green.getRGB()); + vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); + vertexConsumer.setColor(Color.green.getRGB()); - vertexConsumer.addVertex(poseStack.last(), 0, length, 0); - vertexConsumer.setColor(Color.green.getRGB()); + vertexConsumer.addVertex(poseStack.last(), 0, length, 0); + vertexConsumer.setColor(Color.green.getRGB()); - vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); - vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); - vertexConsumer.setColor(Color.red.getRGB()); + vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); + vertexConsumer.setColor(Color.red.getRGB()); - vertexConsumer.addVertex(poseStack.last(), length, 0, 0); - vertexConsumer.setColor(Color.red.getRGB()); + vertexConsumer.addVertex(poseStack.last(), length, 0, 0); + vertexConsumer.setColor(Color.red.getRGB()); - vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); - vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); - vertexConsumer.setColor(Color.blue.getRGB()); + vertexConsumer.addVertex(poseStack.last(), 0, 0, 0); + vertexConsumer.setColor(Color.blue.getRGB()); - vertexConsumer.addVertex(poseStack.last(), 0, 0, length); - vertexConsumer.setColor(Color.blue.getRGB()); + vertexConsumer.addVertex(poseStack.last(), 0, 0, length); + vertexConsumer.setColor(Color.blue.getRGB()); + #else + VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + + vertexConsumer.vertex(poseStack.last().pose(), 0, 0, 0); + vertexConsumer.color(Color.green.getRGB()); + vertexConsumer.endVertex(); + + vertexConsumer.vertex(poseStack.last().pose(), 0, length, 0); + vertexConsumer.color(Color.green.getRGB()); + vertexConsumer.endVertex(); + + vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + + vertexConsumer.vertex(poseStack.last().pose(), 0, 0, 0); + vertexConsumer.color(Color.red.getRGB()); + vertexConsumer.endVertex(); + + vertexConsumer.vertex(poseStack.last().pose(), length, 0, 0); + vertexConsumer.color(Color.red.getRGB()); + vertexConsumer.endVertex(); + + vertexConsumer = bufferSource.getBuffer(RenderType.debugLineStrip(1)); + + vertexConsumer.vertex(poseStack.last().pose(), 0, 0, 0); + vertexConsumer.color(Color.blue.getRGB()); + vertexConsumer.endVertex(); + + vertexConsumer.vertex(poseStack.last().pose(), 0, 0, length); + vertexConsumer.color(Color.blue.getRGB()); + vertexConsumer.endVertex(); + #endif + #endif poseStack.popPose(); } } diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLInternalShaders.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLInternalShaders.java deleted file mode 100644 index 3b9e153..0000000 --- a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLInternalShaders.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2024 Oliver Froberg (The Panda Oliver) - * - * 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 - * any later version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package me.pandamods.pandalib.api.model.client.render; - -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import dev.architectury.event.events.client.ClientReloadShadersEvent; -import net.minecraft.client.renderer.ShaderInstance; -import net.minecraft.server.packs.resources.ResourceProvider; -import org.jetbrains.annotations.Nullable; - -import java.io.IOException; - -public class PLInternalShaders { - private static ShaderInstance renderTypeMesh; - - public static void setRenderTypeMesh(ShaderInstance instance) { - renderTypeMesh = instance; - } - - @Nullable - public static ShaderInstance getRenderTypeMesh() { - return renderTypeMesh; - } - - public static void register(ResourceProvider resourceProvider, ClientReloadShadersEvent.ShadersSink shadersSink) { - try { - shadersSink.registerShader(new ShaderInstance(resourceProvider, "pandalib/mesh", - DefaultVertexFormat.NEW_ENTITY), PLInternalShaders::setRenderTypeMesh); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLRenderType.java b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLRenderType.java index 44bf6d3..12e50d5 100644 --- a/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLRenderType.java +++ b/common/src/main/java/me/pandamods/pandalib/api/model/client/render/PLRenderType.java @@ -21,19 +21,6 @@ import java.util.function.Function; public class PLRenderType extends RenderType { - private static final ShaderStateShard MESH_SHADER = - new ShaderStateShard(PLInternalShaders::getRenderTypeMesh); - - - public static final RenderType CUTOUT_MESH = create("cutout_mesh", - DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.TRIANGLES, 131072, true, false, - CompositeState.builder() - .setLightmapState(LIGHTMAP) - .setShaderState(MESH_SHADER) - .setTextureState(BLOCK_SHEET) - .createCompositeState(true) - ); - public static final Function CUTOUT_MESH_ENTITY = Util.memoize((resourceLocation) -> { CompositeState compositeState = CompositeState.builder() .setShaderState(RENDERTYPE_ENTITY_CUTOUT_SHADER) diff --git a/common/src/main/java/me/pandamods/pandalib/api/model/resource/AssimpResources.java b/common/src/main/java/me/pandamods/pandalib/api/model/resource/AssimpResources.java index f5ae729..034530c 100644 --- a/common/src/main/java/me/pandamods/pandalib/api/model/resource/AssimpResources.java +++ b/common/src/main/java/me/pandamods/pandalib/api/model/resource/AssimpResources.java @@ -109,7 +109,14 @@ private CompletableFuture loadAssimpScene(Executor executor, ResourceManag for (int i = 0; i < scene.mNumAnimations(); i++) { AIAnimation aiAnimation = AIAnimation.create(scene.mAnimations().get(i)); ResourceLocation animationLocation = resourceLocation; - if (scene.mNumAnimations() > 1) animationLocation = animationLocation.withSuffix("/" + aiAnimation.mName().dataString()); + if (scene.mNumAnimations() > 1) { + #if MC_VER > MC_1_19_2 + animationLocation = animationLocation.withSuffix("/" + aiAnimation.mName().dataString()); + #else + animationLocation = new ResourceLocation(animationLocation.getNamespace(), + animationLocation.getPath() + "/" + aiAnimation.mName().dataString()); + #endif + } Animation animation = AnimationLoader.loadAnimation(AssimpResources.getAnimation(animationLocation), aiAnimation); putAnimation.accept(animationLocation, animation); diff --git a/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java b/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java index 9d4948e..8df69a1 100644 --- a/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java +++ b/common/src/main/java/me/pandamods/pandalib/network/ConfigNetworking.java @@ -13,6 +13,7 @@ package me.pandamods.pandalib.network; import dev.architectury.networking.NetworkManager; +import me.pandamods.pandalib.PandaLib; import me.pandamods.pandalib.api.config.ConfigData; import me.pandamods.pandalib.api.config.PandaLibConfig; import me.pandamods.pandalib.api.config.holders.ClientConfigHolder; @@ -21,13 +22,16 @@ #if MC_VER >= MC_1_20_5 import me.pandamods.pandalib.network.packets.ClientConfigPacketData; import me.pandamods.pandalib.network.packets.CommonConfigPacketData; +#else +import net.minecraft.network.FriendlyByteBuf; +import io.netty.buffer.Unpooled; #endif import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; public class ConfigNetworking { #if MC_VER <= MC_1_20 - public static final ResourceLocation CONFIG_PACKET = new ResourceLocation(PandaLib.MOD_ID, "config_sync"); + public static final ResourceLocation CONFIG_PACKET = PandaLib.LOCATION("config_sync"); #endif public static void registerPackets() { @@ -104,10 +108,10 @@ private static void CommonConfigReceiver(CommonConfigPacketData packetData, Netw private static void ClientConfigReceiver(FriendlyByteBuf buf, NetworkManager.PacketContext context) { ResourceLocation resourceLocation = buf.readResourceLocation(); PandaLibConfig.getConfig(resourceLocation).ifPresent(configHolder -> { - if (configHolder instanceof ClientConfigHolder) { + if (configHolder instanceof ClientConfigHolder clientConfigHolder) { configHolder.logger.info("Received client config '{}' from {}", configHolder.resourceLocation().toString(), context.getPlayer().getDisplayName().getString()); - clientConfigHolder.putConfig(packetContext.getPlayer(), configHolder.getGson().fromJson(buf.readUtf(), configHolder.getConfigClass())); + clientConfigHolder.putConfig(context.getPlayer(), configHolder.getGson().fromJson(buf.readUtf(), configHolder.getConfigClass())); } }); } diff --git a/common/src/main/java/me/pandamods/pandalib/utils/BlockUtils.java b/common/src/main/java/me/pandamods/pandalib/utils/BlockUtils.java index 989e7f0..ca79839 100644 --- a/common/src/main/java/me/pandamods/pandalib/utils/BlockUtils.java +++ b/common/src/main/java/me/pandamods/pandalib/utils/BlockUtils.java @@ -13,25 +13,41 @@ package me.pandamods.pandalib.utils; import com.mojang.blaze3d.vertex.PoseStack; +#if MC_VER <= MC_1_19_2 +import com.mojang.math.Quaternion; +#else import com.mojang.math.Axis; +#endif import net.minecraft.world.level.block.DirectionalBlock; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.AttachFace; import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import org.joml.Math; public class BlockUtils { public static void translateBlock(BlockState blockState, PoseStack poseStack) { poseStack.translate(0.5f, 0.5f, 0.5f); float direction = getYRotation(blockState); - poseStack.mulPose(Axis.YP.rotationDegrees(direction)); - + #if MC_VER <= MC_1_19_2 + poseStack.mulPose(Quaternion.fromXYZ(0, Math.toRadians(direction), 0)); + #else + poseStack.mulPose(Axis.YP.rotationDegrees(direction)); + #endif + if (blockState.hasProperty(BlockStateProperties.ATTACH_FACE)) { AttachFace face = blockState.getValue(BlockStateProperties.ATTACH_FACE); - switch (face) { - case CEILING -> poseStack.mulPose(Axis.XP.rotationDegrees(180)); - case WALL -> poseStack.mulPose(Axis.XP.rotationDegrees(90)); - } + #if MC_VER <= MC_1_19_2 + switch (face) { + case CEILING -> poseStack.mulPose(Quaternion.fromXYZ(Math.toRadians(180), 0, 0)); + case WALL -> poseStack.mulPose(Quaternion.fromXYZ(Math.toRadians(90), 0, 0)); + } + #else + switch (face) { + case CEILING -> poseStack.mulPose(Axis.XP.rotationDegrees(180)); + case WALL -> poseStack.mulPose(Axis.XP.rotationDegrees(90)); + } + #endif } poseStack.translate(0, -0.5f, 0); } diff --git a/common/src/main/java/me/pandamods/pandalib/utils/MathUtils.java b/common/src/main/java/me/pandamods/pandalib/utils/MathUtils.java index e9c9e1b..08c0b3c 100644 --- a/common/src/main/java/me/pandamods/pandalib/utils/MathUtils.java +++ b/common/src/main/java/me/pandamods/pandalib/utils/MathUtils.java @@ -13,6 +13,9 @@ package me.pandamods.pandalib.utils; import com.mojang.blaze3d.vertex.PoseStack; +#if MC_VER <= MC_1_19_2 +import com.mojang.math.Quaternion; +#endif import org.joml.Matrix4f; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -51,7 +54,12 @@ public static Vector3f rotateVector(Vector3f target, Vector3f rotation) { } public static PoseStack rotateVector(PoseStack stack, Vector3f rotation) { - stack.mulPose(new Quaternionf().identity().rotateZYX(rotation.z, rotation.y, rotation.x)); + Quaternionf quaternionf = new Quaternionf().rotateZYX(rotation.z, rotation.y, rotation.x); + #if MC_VER > MC_1_19_2 + stack.mulPose(quaternionf); + #else + stack.mulPose(new Quaternion(quaternionf.x, quaternionf.y, quaternionf.z, quaternionf.w)); + #endif return stack; } diff --git a/common/src/main/java/me/pandamods/pandalib/utils/PLSpriteCoordinateExpander.java b/common/src/main/java/me/pandamods/pandalib/utils/PLSpriteCoordinateExpander.java index f4cb9e8..4fc2653 100644 --- a/common/src/main/java/me/pandamods/pandalib/utils/PLSpriteCoordinateExpander.java +++ b/common/src/main/java/me/pandamods/pandalib/utils/PLSpriteCoordinateExpander.java @@ -27,6 +27,7 @@ public PLSpriteCoordinateExpander(VertexConsumer delegate, TextureAtlasSprite sp this.sprite = sprite; } + #if MC_VER >= MC_1_21 @Override public VertexConsumer addVertex(float x, float y, float z) { this.delegate.addVertex(x, y, z); @@ -68,4 +69,63 @@ public void addVertex(float x, float y, float z, int color, float u, float v, in this.delegate.addVertex(x, y, z, color, this.sprite.getU(u), this.sprite.getV(v), packedOverlay, packedLight, normalX, normalY, normalZ); } + #else + @Override + public VertexConsumer vertex(double x, double y, double z) { + this.delegate.vertex(x, y, z); + return this; + } + + @Override + public VertexConsumer color(int red, int green, int blue, int alpha) { + this.delegate.color(red, green, blue, alpha); + return this; + } + + @Override + public VertexConsumer uv(float u, float v) { + this.delegate.uv(u, v); + return this; + } + + @Override + public VertexConsumer overlayCoords(int u, int v) { + this.delegate.overlayCoords(u, v); + return this; + } + + @Override + public VertexConsumer uv2(int u, int v) { + this.delegate.uv2(u, v); + return this; + } + + @Override + public VertexConsumer normal(float x, float y, float z) { + this.delegate.normal(x, y, z); + return this; + } + + @Override + public void endVertex() { + this.delegate.endVertex(); + } + + @Override + public void defaultColor(int defaultR, int defaultG, int defaultB, int defaultA) { + this.delegate.defaultColor(defaultR, defaultG, defaultB, defaultA); + } + + @Override + public void unsetDefaultColor() { + this.delegate.unsetDefaultColor(); + } + + @Override + public void vertex(float x, float y, float z, float red, float green, float blue, float alpha, float texU, float texV, int overlayUV, int lightmapUV, + float normalX, float normalY, float normalZ) { + this.delegate.vertex(x, y, z, red, green, blue, alpha, this.sprite.getU(texU), this.sprite.getV(texV), + overlayUV, lightmapUV, normalX, normalY, normalZ); + } + #endif } \ No newline at end of file diff --git a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.fsh b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.fsh deleted file mode 100644 index 50a03ed..0000000 --- a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.fsh +++ /dev/null @@ -1,29 +0,0 @@ -#version 150 - -#moj_import - -uniform sampler2D Sampler0; - -uniform vec4 ColorModulator; -uniform float FogStart; -uniform float FogEnd; -uniform vec4 FogColor; - -in float vertexDistance; -in vec4 vertexColor; -in vec4 lightMapColor; -in vec4 overlayColor; -in vec2 texCoord0; - -out vec4 fragColor; - -void main() { - vec4 color = texture(Sampler0, texCoord0); - if (color.a < 0.1) { - discard; - } - color *= vertexColor * ColorModulator; - color.rgb = mix(overlayColor.rgb, color.rgb, overlayColor.a); - color *= lightMapColor; - fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); -} \ No newline at end of file diff --git a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.json b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.json deleted file mode 100644 index c5877de..0000000 --- a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "pandalib/mesh", - "fragment": "pandalib/mesh", - "attributes": [ - "Position", - "Color", - "UV0", - "UV1", - "UV2", - "Normal" - ], - "samplers": [ - { "name": "Sampler0" }, - { "name": "Sampler1" }, - { "name": "Sampler2" } - ], - "uniforms": [ - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, - { "name": "Light0_Direction", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, - { "name": "Light1_Direction", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, - { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, - { "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] } - ] -} \ No newline at end of file diff --git a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.vsh b/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.vsh deleted file mode 100644 index 6cd06a9..0000000 --- a/common/src/main/resources/assets/minecraft/shaders/core/pandalib/mesh.vsh +++ /dev/null @@ -1,37 +0,0 @@ -#version 150 - -#moj_import -#moj_import - -in vec3 Position; -in vec4 Color; -in vec2 UV0; -in ivec2 UV1; -in ivec2 UV2; -in vec3 Normal; - -uniform sampler2D Sampler1; -uniform sampler2D Sampler2; - -uniform mat4 ModelViewMat; -uniform mat4 ProjMat; -uniform int FogShape; - -uniform vec3 Light0_Direction; -uniform vec3 Light1_Direction; - -out float vertexDistance; -out vec4 vertexColor; -out vec4 lightMapColor; -out vec4 overlayColor; -out vec2 texCoord0; - -void main() { - gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); - - vertexDistance = fog_distance(Position, FogShape); - vertexColor = minecraft_mix_light(Light0_Direction, Light1_Direction, Normal, Color); - lightMapColor = texelFetch(Sampler2, UV2 / 16, 0); - overlayColor = texelFetch(Sampler1, UV1, 0); - texCoord0 = UV0; -} \ No newline at end of file diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index ab7ef52..d064cd6 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -1,5 +1,7 @@ // gradle.properties val modId: String by project +val projectGroup +: String by project val forgeVersion: String by project @@ -25,6 +27,8 @@ loom { configurations { getByName("developmentForge").extendsFrom(configurations["common"]) + // Required for embedding libraries into the jar because Forge is weird. + getByName("forgeRuntimeLibrary").extendsFrom(configurations["jarShadow"]) } dependencies { diff --git a/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java b/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java index 9281121..79d5912 100644 --- a/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java +++ b/forge/src/main/java/me/pandamods/pandalib/forge/PandaLibForge.java @@ -1,5 +1,7 @@ -package me.pandamods.pandalib; +package me.pandamods.pandalib.forge; +import me.pandamods.pandalib.PandaLib; +import me.pandamods.pandalib.forge.client.PandaLibClientForge; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; diff --git a/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java b/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java index 0a09783..4a58f78 100644 --- a/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java +++ b/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java @@ -1,5 +1,6 @@ -package me.pandamods.pandalib.client; +package me.pandamods.pandalib.forge.client; +import me.pandamods.pandalib.client.PandaLibClient; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.common.Mod; diff --git a/gradle.properties b/gradle.properties index 116b986..3005523 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ modAuthor = The Panda Oliver minecraftVersion = 1.21 # Publishing Mods Config -publishingDryRun = true +publishingDryRun = false # 0 = STABLE | 1 = BETA | 2 = ALPHA publishingReleaseType = 1 @@ -25,7 +25,7 @@ publishingReleaseType = 1 publishingCurseForgeProjectId = 975460 publishingModrinthProjectId = mEEGbEIu -publishingGitHubRepo = PandaDap2006/PandaLib +publishingGitHubRepo = PandaMods-Dev/PandaLib # Dependencies lwjglVersion=3.3.3 diff --git a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java index dffeb17..bbf9a4e 100644 --- a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java +++ b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/PandaLibNeoForge.java @@ -1,11 +1,20 @@ package me.pandamods.pandalib.neoforge; +import dev.architectury.platform.Platform; +import dev.architectury.utils.Env; import me.pandamods.pandalib.PandaLib; +import me.pandamods.pandalib.neoforge.client.PandaLibClientNeoForge; +import me.pandamods.pandalib.platform.Services; import net.neoforged.fml.common.Mod; @Mod(PandaLib.MOD_ID) public class PandaLibNeoForge { public PandaLibNeoForge() { PandaLib.init(); + + #if MC_VER < MC_1_21 + if (Platform.getEnvironment().equals(Env.CLIENT)) + new PandaLibClientNeoForge(); + #endif } } diff --git a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/client/PandaLibClientNeoForge.java b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/client/PandaLibClientNeoForge.java index e9af34e..a3d87fe 100644 --- a/neoforge/src/main/java/me/pandamods/pandalib/neoforge/client/PandaLibClientNeoForge.java +++ b/neoforge/src/main/java/me/pandamods/pandalib/neoforge/client/PandaLibClientNeoForge.java @@ -5,7 +5,9 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.common.Mod; +#if MC_VER >= MC_1_21 @Mod(value = PandaLib.MOD_ID, dist = Dist.CLIENT) +#endif public class PandaLibClientNeoForge { public PandaLibClientNeoForge() { PandaLibClient.init(); diff --git a/versionProperties/1.21.properties b/versionProperties/1.21.properties index 32d3b50..a8ab282 100644 --- a/versionProperties/1.21.properties +++ b/versionProperties/1.21.properties @@ -8,7 +8,7 @@ parchmentMinecraftVersion = 1.21 # Mod Publishing config publishingMinecraftVersion = 1.21 # Uncomment the next line to publish to versions in the range of 'publishingMinecraftVersion' and 'publishingLatestMinecraftVersion' -#publishingLatestMinecraftVersion = 1.21 +publishingLatestMinecraftVersion = 1.21.1 # Fabric fabricLoaderVersion = 0.15.11 From c957f7715e4c50c4282cf4f0d57ad32751264b9b Mon Sep 17 00:00:00 2001 From: The Panda Oliver Date: Fri, 23 Aug 2024 16:10:44 +0200 Subject: [PATCH 25/25] Update changelog and fix gradle configurations Updated the changelog to version 0.4.2 Beta with bug fixes. Corrected configurations in build.gradle.kts to fix the Mixin Patcher issue with Forge and properly resolve shadow JAR tasks. Cleaned up and relocated resource registration in class files for better modularity. --- CHANGELOG.md | 15 +---- build.gradle.kts | 64 +++++++++++-------- .../java/me/pandamods/pandalib/PandaLib.java | 2 - .../pandalib/client/PandaLibClient.java | 5 ++ forge/build.gradle.kts | 5 +- .../forge/client/PandaLibClientForge.java | 1 - gradle.properties | 4 +- 7 files changed, 50 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01a2021..f2547b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,3 @@ -# Changelog 0.4 Beta -## Model API -* [Supported Formats](https://mevislab.github.io/examples/tutorials/thirdparty/assimp/) -* Animation API - -## Technical Changes -* Updated Gradle to 8.8 -* Updated to Architectury Loom 1.7 -* Switched build script to Kotlin - -## License Update -* Every update from this update and onwards will be licensed under the GNU GPLv3 (previously GNU LGPLv3) \ No newline at end of file +## Changelog 0.4.2 Beta +* **Bug Fixes** + * The shared code between Forge, Fabric, and Neoforge is now shipped correctly. \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 961b1dd..14267cb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -113,9 +113,11 @@ subprojects { isCanBeConsumed = false } - create("jarShadow") + create("jarShadow") { + isCanBeResolved = true + isCanBeConsumed = false + } implementation.get().extendsFrom(configurations["jarShadow"]) - getByName("shadowBundle").extendsFrom(configurations["jarShadow"]) create("modShadow") getByName("modImplementation").extendsFrom(configurations["modShadow"]) @@ -174,41 +176,43 @@ subprojects { } if (isMinecraftSubProject) { - tasks.withType().configureEach { - configurations = listOf(project.configurations.getByName("shadowBundle")) + tasks.withType { + configurations = listOf(project.configurations.getByName("shadowBundle"), project.configurations.getByName("jarShadow")) archiveClassifier.set("dev-shadow") exclude("architectury.common.json") + } - // Relocate assimp so it will not cause any conflicts with other mods also using it. - relocate("org.lwjgl.assimp", "$projectGroup.assimp") - // Relocate natives - relocate("windows.x64.org.lwjgl.assimp", "windows.x64.$projectGroup.assimp") - relocate("linux.x64.org.lwjgl.assimp", "linux.x64.$projectGroup.assimp") - relocate("macos.x64.org.lwjgl.assimp", "macos.x64.$projectGroup.assimp") + tasks.withType { + val shadowJar = tasks.getByName("shadowJar") + inputFile.set(shadowJar.archiveFile) + } + } - relocate("META-INF.windows.arm64.org.lwjgl.assimp", "META-INF.windows.arm64.$projectGroup.assimp") - relocate("META-INF.windows.x64.org.lwjgl.assimp", "META-INF.windows.x64.$projectGroup.assimp") - relocate("META-INF.windows.x86.org.lwjgl.assimp", "META-INF.windows.x86.$projectGroup.assimp") + tasks.withType { + // Relocate assimp so it will not cause any conflicts with other mods also using it. + relocate("org.lwjgl.assimp", "$projectGroup.assimp") + // Relocate natives + relocate("windows.x64.org.lwjgl.assimp", "windows.x64.$projectGroup.assimp") + relocate("linux.x64.org.lwjgl.assimp", "linux.x64.$projectGroup.assimp") + relocate("macos.x64.org.lwjgl.assimp", "macos.x64.$projectGroup.assimp") - relocate("META-INF.linux.arm32.org.lwjgl.assimp", "META-INF.linux.arm32.$projectGroup.assimp") - relocate("META-INF.linux.arm64.org.lwjgl.assimp", "META-INF.linux.arm64.$projectGroup.assimp") - relocate("META-INF.linux.x64.org.lwjgl.assimp", "META-INF.linux.x64.$projectGroup.assimp") + relocate("META-INF.windows.arm64.org.lwjgl.assimp", "META-INF.windows.arm64.$projectGroup.assimp") + relocate("META-INF.windows.x64.org.lwjgl.assimp", "META-INF.windows.x64.$projectGroup.assimp") + relocate("META-INF.windows.x86.org.lwjgl.assimp", "META-INF.windows.x86.$projectGroup.assimp") - relocate("META-INF.macos.arm64.org.lwjgl.assimp", "META-INF.macos.arm64.$projectGroup.assimp") - relocate("META-INF.macos.x64.org.lwjgl.assimp", "META-INF.macos.x64.$projectGroup.assimp") + relocate("META-INF.linux.arm32.org.lwjgl.assimp", "META-INF.linux.arm32.$projectGroup.assimp") + relocate("META-INF.linux.arm64.org.lwjgl.assimp", "META-INF.linux.arm64.$projectGroup.assimp") + relocate("META-INF.linux.x64.org.lwjgl.assimp", "META-INF.linux.x64.$projectGroup.assimp") - if (jomlVersion != null) - relocate("org.joml", "$projectGroup.joml") - } + relocate("META-INF.macos.arm64.org.lwjgl.assimp", "META-INF.macos.arm64.$projectGroup.assimp") + relocate("META-INF.macos.x64.org.lwjgl.assimp", "META-INF.macos.x64.$projectGroup.assimp") - tasks.withType().configureEach { - val shadowJar = tasks.getByName("shadowJar") - inputFile.set(shadowJar.archiveFile) - } + if (jomlVersion != null) + relocate("org.joml", "$projectGroup.joml") } - tasks.withType().configureEach { + tasks.withType { options.encoding = "UTF-8" options.release.set(JavaLanguageVersion.of(projectJavaVersion).asInt()) options.compilerArgs.add("-Xplugin:Manifold") @@ -265,6 +269,14 @@ subprojects { } repositories { + maven { + name = "Github" + url = uri("https://maven.pkg.github.com/${properties["publishingGitHubRepo"]}") + credentials { + username = System.getenv("GITHUB_ACTOR") + password = System.getenv("GITHUB_TOKEN") + } + } } } } diff --git a/common/src/main/java/me/pandamods/pandalib/PandaLib.java b/common/src/main/java/me/pandamods/pandalib/PandaLib.java index afa5a61..c3527b4 100644 --- a/common/src/main/java/me/pandamods/pandalib/PandaLib.java +++ b/common/src/main/java/me/pandamods/pandalib/PandaLib.java @@ -15,8 +15,6 @@ public class PandaLib { public static final Logger LOGGER = LogUtils.getLogger(); public static void init() { - ReloadListenerRegistry.register(PackType.CLIENT_RESOURCES, new AssimpResources(), LOCATION("assimp_loader")); - ConfigNetworking.registerPackets(); EventHandler.Register(); } diff --git a/common/src/main/java/me/pandamods/pandalib/client/PandaLibClient.java b/common/src/main/java/me/pandamods/pandalib/client/PandaLibClient.java index 8a19368..33deb4c 100644 --- a/common/src/main/java/me/pandamods/pandalib/client/PandaLibClient.java +++ b/common/src/main/java/me/pandamods/pandalib/client/PandaLibClient.java @@ -1,11 +1,16 @@ package me.pandamods.pandalib.client; +import dev.architectury.registry.ReloadListenerRegistry; +import me.pandamods.pandalib.PandaLib; +import me.pandamods.pandalib.api.model.resource.AssimpResources; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.server.packs.PackType; @Environment(EnvType.CLIENT) public class PandaLibClient { public static void init() { + ReloadListenerRegistry.register(PackType.CLIENT_RESOURCES, new AssimpResources(), PandaLib.LOCATION("assimp_loader")); } } \ No newline at end of file diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index d064cd6..4a90032 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -1,7 +1,6 @@ // gradle.properties val modId: String by project -val projectGroup -: String by project +val projectGroup: String by project val forgeVersion: String by project @@ -18,7 +17,7 @@ loom { extraAccessWideners.add(loom.accessWidenerPath.get().asFile.name) // Fixes Mixin Patcher issue with Forge - useCustomMixin.set(false) + useCustomMixin.set(true) mixinConfig("${modId}-common.mixins.json") mixinConfig("${modId}.mixins.json") diff --git a/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java b/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java index 4a58f78..b9f499c 100644 --- a/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java +++ b/forge/src/main/java/me/pandamods/pandalib/forge/client/PandaLibClientForge.java @@ -5,7 +5,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.common.Mod; -@OnlyIn(Dist.CLIENT) public class PandaLibClientForge { public PandaLibClientForge() { PandaLibClient.init(); diff --git a/gradle.properties b/gradle.properties index 3005523..f9030c1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,14 +7,14 @@ projectGroup = me.pandamods # Mod Info modId = pandalib -modVersion = 0.4 +modVersion = 0.4.2 modName = PandaLib modDescription = A multipurpose library with a Config API and a bit of utility code. modAuthor = The Panda Oliver # Minecraft -minecraftVersion = 1.21 +minecraftVersion = 1.19.2 # Publishing Mods Config publishingDryRun = false