From 187f6f13ac8620971149604dd82a4310e9f49603 Mon Sep 17 00:00:00 2001 From: Jamalam Date: Sun, 17 Mar 2024 13:29:15 +0000 Subject: [PATCH] Initial commit --- .gitattributes | 15 ++ .github/workflows/build.yml.disabled | 60 +++++ .github/workflows/test-server | 20 ++ .github/workflows/test-template.yml | 69 +++++ .gitignore | 24 ++ .idea/scopes/Fabric_sources.xml | 3 + .idea/scopes/Forge_sources.xml | 3 + CHANGELOG.md | 0 LICENSE | 7 + README.md | 26 ++ build.gradle.easytemplate | 107 ++++++++ common/build.gradle | 9 + .../{{main_class}}.java" | 15 ++ .../{{main_class}}Platform.java" | 5 + .../resources/assets/{{ mod_id }}/icon.png | Bin 0 -> 14033 bytes .../main/resources/{{ mod_id }}.mixins.json | 16 ++ easytemplate.json | 77 ++++++ fabric/build.gradle.easytemplate | 119 +++++++++ .../fabric/{{main_class}}Fabric.java" | 12 + .../fabric/{{main_class}}PlatformImpl.java" | 7 + fabric/src/main/resources/fabric.mod.json | 32 +++ forge/build.gradle.easytemplate | 118 +++++++++ forge/gradle.properties | 1 + .../forge/{{main_class}}Forge.java" | 14 + .../forge/{{main_class}}PlatformImpl.java" | 7 + forge/src/main/resources/META-INF/mods.toml | 43 ++++ forge/src/main/resources/pack.mcmeta | 6 + gradle.properties | 11 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 240 ++++++++++++++++++ gradlew.bat | 91 +++++++ libs.versions.toml | 47 ++++ neoforge/build.gradle.easytemplate | 118 +++++++++ neoforge/gradle.properties | 1 + .../neoforge/{{main_class}}NeoForge.java" | 11 + .../neoforge/{{main_class}}PlatformImpl.java" | 7 + .../src/main/resources/META-INF/mods.toml | 46 ++++ neoforge/src/main/resources/pack.mcmeta | 6 + quilt/build.gradle.easytemplate | 135 ++++++++++ quilt/gradle.properties | 1 + .../fabric/{{main_class}}PlatformImpl.java" | 7 + .../quilt/{{main_class}}Quilt.java" | 12 + quilt/src/main/resources/quilt.mod.json | 47 ++++ settings.gradle | 35 +++ 45 files changed, 1635 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/build.yml.disabled create mode 100755 .github/workflows/test-server create mode 100644 .github/workflows/test-template.yml create mode 100644 .gitignore create mode 100644 .idea/scopes/Fabric_sources.xml create mode 100644 .idea/scopes/Forge_sources.xml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle.easytemplate create mode 100644 common/build.gradle create mode 100644 "common/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/{{main_class}}.java" create mode 100644 "common/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/{{main_class}}Platform.java" create mode 100644 common/src/main/resources/assets/{{ mod_id }}/icon.png create mode 100644 common/src/main/resources/{{ mod_id }}.mixins.json create mode 100644 easytemplate.json create mode 100644 fabric/build.gradle.easytemplate create mode 100644 "fabric/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}Fabric.java" create mode 100644 "fabric/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}PlatformImpl.java" create mode 100644 fabric/src/main/resources/fabric.mod.json create mode 100644 forge/build.gradle.easytemplate create mode 100644 forge/gradle.properties create mode 100644 "forge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/forge/{{main_class}}Forge.java" create mode 100644 "forge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/forge/{{main_class}}PlatformImpl.java" create mode 100644 forge/src/main/resources/META-INF/mods.toml create mode 100644 forge/src/main/resources/pack.mcmeta create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 libs.versions.toml create mode 100644 neoforge/build.gradle.easytemplate create mode 100644 neoforge/gradle.properties create mode 100644 "neoforge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/neoforge/{{main_class}}NeoForge.java" create mode 100644 "neoforge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/neoforge/{{main_class}}PlatformImpl.java" create mode 100644 neoforge/src/main/resources/META-INF/mods.toml create mode 100644 neoforge/src/main/resources/pack.mcmeta create mode 100644 quilt/build.gradle.easytemplate create mode 100644 quilt/gradle.properties create mode 100644 "quilt/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}PlatformImpl.java" create mode 100644 "quilt/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/quilt/{{main_class}}Quilt.java" create mode 100644 quilt/src/main/resources/quilt.mod.json create mode 100644 settings.gradle diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..20fc528 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +* text eol=lf +*.bat text eol=crlf +*.patch text eol=lf +*.java text eol=lf +*.gradle text eol=crlf +*.png binary +*.gif binary +*.exe binary +*.dll binary +*.jar binary +*.lzma binary +*.zip binary +*.pyd binary +*.cfg text eol=lf +*.jks binary \ No newline at end of file diff --git a/.github/workflows/build.yml.disabled b/.github/workflows/build.yml.disabled new file mode 100644 index 0000000..06748c9 --- /dev/null +++ b/.github/workflows/build.yml.disabled @@ -0,0 +1,60 @@ +name: build + +on: + - push + - pull_request + +jobs: + build: + runs-on: ubuntu-20.04 + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + with: + persist-credentials: false + fetch-depth: 0 + + - name: Enable Caching + uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/loom-cache + ~/.gradle/wrapper + key: gradle-${{ hashFiles('**/gradle-wrapper.properties') }}-${{ hashFiles('./gradle.properties') }} + restore-keys: gradle + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Setup JDK 17 + uses: actions/setup-java@v1 + with: + java-version: 17 + + - name: Build + run: ./gradlew clean forge:build neoforge:build fabric:build quilt:build + + - name: Capture Fabric Build Artifacts + uses: actions/upload-artifact@v2 + with: + name: Fabric Artifacts + path: fabric/build/libs/ + + - name: Capture Quilt Build Artifacts + uses: actions/upload-artifact@v2 + with: + name: Quilt Artifacts + path: quilt/build/libs/ + + - name: Capture Forge Build Artifacts + uses: actions/upload-artifact@v2 + with: + name: Forge Artifacts + path: forge/build/libs/ + + - name: Capture NeoForge Build Artifacts + uses: actions/upload-artifact@v2 + with: + name: NeoForge Artifacts + path: neoforge/build/libs/ diff --git a/.github/workflows/test-server b/.github/workflows/test-server new file mode 100755 index 0000000..d43b460 --- /dev/null +++ b/.github/workflows/test-server @@ -0,0 +1,20 @@ +#!/bin/bash + +platform=$1 +output_file=$(mktemp) +./gradlew $platform:runServer > "$output_file" 2>&1 & +command_pid=$! +sleep 60 + +if ps -p $command_pid > /dev/null; then + echo "Command still running, assuming it was a success and killing it..." + kill -9 $command_pid + cat "$output_file" + rm "$output_file" + exit 0 +else + echo "Command finished within time limit, considering it to be a failure..." + cat "$output_file" + rm "$output_file" + exit 1 +fi diff --git a/.github/workflows/test-template.yml b/.github/workflows/test-template.yml new file mode 100644 index 0000000..bff5a2d --- /dev/null +++ b/.github/workflows/test-template.yml @@ -0,0 +1,69 @@ +name: Test Template Mod Compiles + +on: + push: + pull_request: + +jobs: + test: + runs-on: "ubuntu-20.04" + + steps: + - name: Clone repository + uses: actions/checkout@v4 + + - name: Set up Deno + uses: denoland/setup-deno@v1.1.4 + with: + deno-version: "canary" + + - name: Initialize template + run: deno run --allow-read --allow-write --allow-env https://raw.githubusercontent.com/Jamalam360/easytemplate/main/easytemplate.ts --disable-interactive-mode --input name="Template Mod Test Mod" --input mod_id=template_mod_test --input description="This is a mod to test the template mod." --input author=Jamalam360 --input group="io.github.jamalam360" --input main_class="TemplateModTest" --input github_owner="JamCoreModding" --input github_repo="multi-loader-template-mod" --input github_publish=true --input unified_publishing=true + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v2 + + - name: Setup JDK 17 + uses: actions/setup-java@v2 + with: + distribution: temurin + java-version: 17 + + - name: Build + run: ./gradlew clean forge:build neoforge:build fabric:build quilt:build + + - name: Capture Fabric Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: Fabric Artifacts + path: fabric/build/libs/ + + - name: Capture Quilt Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: Quilt Artifacts + path: quilt/build/libs/ + + - name: Capture Forge Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: Forge Artifacts + path: forge/build/libs/ + + - name: Capture NeoForge Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: NeoForge Artifacts + path: neoforge/build/libs/ + + - name: Agree to EULAs + run: mkdir fabric/run && touch fabric/run/eula.txt && mkdir neoforge/run && touch neoforge/run/eula.txt && echo "eula=true" > fabric/run/eula.txt && echo "eula=true" > neoforge/run/eula.txt + + - name: Copy Test Server Script + run: cp backup/.github/workflows/test-server ./.github/workflows/test-server + + - name: Run Test Server (Fabric) + run: chmod +x .github/workflows/test-server && ./.github/workflows/test-server fabric + + - name: Run Test Server (NeoForge) + run: chmod +x .github/workflows/test-server && ./.github/workflows/test-server neoforge diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc3f195 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project + +# idea +out +*.ipr +*.iws +*.iml +.idea/* +!.idea/scopes + +# gradle +build +.gradle + +# other +eclipse +run +.architectury-transformer diff --git a/.idea/scopes/Fabric_sources.xml b/.idea/scopes/Fabric_sources.xml new file mode 100644 index 0000000..0448412 --- /dev/null +++ b/.idea/scopes/Fabric_sources.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/scopes/Forge_sources.xml b/.idea/scopes/Forge_sources.xml new file mode 100644 index 0000000..7b5f24d --- /dev/null +++ b/.idea/scopes/Forge_sources.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d9646de --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright 2023 {{ author }} + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..be0340d --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# JamCore Multi-loader Template Mod + +

+ forge + fabric + quilt +

+ +This repository uses a system I created called +[easytemplate](https://github.com/Jamalam360/easytemplate) to initialize the +template automatically. After following the easytemplate prompt, you shouldn't +have to make any changes before starting programming. + +1. Install [Deno](https://deno.land/) +2. Click `Use This Template` +3. Clone the repository. +4. Run + `deno run --allow-read --allow-write https://raw.githubusercontent.com/Jamalam360/easytemplate/main/easytemplate.ts` + in the repository directory. +5. Follow the instructions. +6. See [the docs](https://docs.jamalam.tech) for more information. + +## License + +This repository contains the MIT license for ease of use, but you can change it +to whatever you want. diff --git a/build.gradle.easytemplate b/build.gradle.easytemplate new file mode 100644 index 0000000..6bf73d1 --- /dev/null +++ b/build.gradle.easytemplate @@ -0,0 +1,107 @@ +plugins { + id "architectury-plugin" version "3.4-SNAPSHOT" + id "dev.architectury.loom" version "1.5-SNAPSHOT" apply false + {{#if unified_publishing}} + id "me.shedaniel.unified-publishing" version "0.1.+" apply false + {{/if}} + {{#if github_publish}} + id "com.github.breadmoirai.github-release" version "2.4.1" + {{/if}} +} +{{#if github_publish}} + +if (System.getenv("GITHUB_TOKEN") != null) { + githubRelease { + token(System.getenv("GITHUB_TOKEN")) + owner("{{ github_owner }}") + repo("{{ github_repo }}") + tagName("${project.version}") + releaseName("V${project.version}") + body(project.rootProject.file("CHANGELOG.md").text) + draft(false) + + if (project.branch != null) { + targetCommitish(project.branch) + } + } +} +{{/if}} + +subprojects { + apply plugin: "dev.architectury.loom" + + loom { + silentMojangMappingsLicense() + } + + base { + archivesName = "{{mod_id}}" + } + + jar { + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Version' : project.jar.archiveVersion, + 'Implementation-Title' : project.name, + 'Implementation-Version' : project.jar.archiveVersion, + 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", + 'Built-On-Minecraft' : minecraft_version, + 'JamLib-File-Name' : "jamlib-${project.base.archivesName.get()}-${rootProject.version}.jar", + ]) + } + } + + dependencies { + minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" + mappings loom.officialMojangMappings() + } +} + +allprojects { + apply plugin: "java" + apply plugin: "architectury-plugin" + apply plugin: "maven-publish" + + version = rootProject.version + group = rootProject.group + + repositories { + mavenCentral() + + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + + maven { + name = "Jamalam's Maven" + url = "https://maven.jamalam.tech/releases" + } + } + + tasks.withType(JavaCompile) { + options.encoding = "UTF-8" + options.release = 17 + } + + tasks.create("prepareWorkspace") {} + + java { + withSourcesJar() + } + {{#ifCond github_publish '||' unified_publishing}} + + tasks.publish { + {{#if github_publish}} + dependsOn(":githubRelease") + {{/if}} + {{#if unified_publishing}} + dependsOn("fabric:publishUnified") + dependsOn("quilt:publishUnified") + dependsOn("forge:publishUnified") + dependsOn("neoforge:publishUnified") + {{/if}} + } + {{/ifCond}} +} diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 0000000..053ae82 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,9 @@ +architectury { + common(rootProject.enabled_platforms.split(",")) +} + +dependencies { + modImplementation libs.fabric.loader + modApi libs.architectury.common + modImplementation libs.jamlib.common +} diff --git "a/common/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/{{main_class}}.java" "b/common/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/{{main_class}}.java" new file mode 100644 index 0000000..62aa589 --- /dev/null +++ "b/common/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/{{main_class}}.java" @@ -0,0 +1,15 @@ +package {{group}}.{{mod_id}}; + +import io.github.jamalam360.jamlib.JamLib; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class {{ main_class }} { + public static final String MOD_ID = "{{ mod_id }}"; + public static final String MOD_NAME = "{{ name }}"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_NAME); + + public static void init() { + JamLib.checkForJarRenaming({{ main_class }}.class); + } +} diff --git "a/common/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/{{main_class}}Platform.java" "b/common/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/{{main_class}}Platform.java" new file mode 100644 index 0000000..4341e57 --- /dev/null +++ "b/common/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/{{main_class}}Platform.java" @@ -0,0 +1,5 @@ +package {{group}}.{{mod_id}}; + +public class {{main_class}}Platform { + +} diff --git a/common/src/main/resources/assets/{{ mod_id }}/icon.png b/common/src/main/resources/assets/{{ mod_id }}/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..667be6cb18e40402321172958556082c2a583b38 GIT binary patch literal 14033 zcmZ{rWmr^Sw8n>Sq`OOy4oT?->29REyJJ97KtQ@hx*H^=lrE7j>FyNn{@-u+!#zGS z&kP>toW1v2d%eH)o@iBNSqxMXR0sruAulJT4qi?F`-=<+En_%T2rAy5e90elp)2Z4BUKp+RE5Qtzp1VZSN-LCcy`~uNTQC14_ z^538Q&XQyZ6NI1=)V)O3uj1&q>S($f3w zrH!6?W_r5qwPE>e1Cja6?Z~K6c%%dP!-z&0SojihA&FRWZPdaodEA%JoP4j-@I1VO zPj_#-CU&1)PqGELC*EC-f*+R1&v`Hs!!Nw3FQkmm!5l|IVS~4?cE1nUH!QHot2;U# z2QS1gIACI6SjLsnr>GC=`uesl9q(l0O6cD{zrfn)6K1^sR$5v*I5;>xJ&i;ez`@Ud z7tgnPmmq`{p2zRHxj7KaRNS>~)b5cX190^~F?aEiMMjhiz_dmY0_kv^LRUL5imM10SxspRa39 zyB<#prDKWAp@~sZ$W__~hKAowd&6WY1FtYwqUdMZpZ2DT?B}cLp;FS)p8M0%aj)6g zPk&b#*le<^X}o(y@$T+wf2Od1ZLK@_F8R2xlhcWc=)c(#l{_#Gn!3!3w23k8d3kI79~oj$ zqCb67R#Dl_rWE$`xII}hTWB`j0u$F>UjD14wyWzoNtOZziiqoN zdo8eK&wenD*nH@dBlYPsw<^LWbIo^kZSCJ?1kPLe%gcsq&leXL_4W0i0s{Xwz~z-i zfB_mG8DVB(vUP5I_;PzVe|p>fA`FpMQ`h+KFnDGA@8NpB+GwfMzh%tI-nk?pKA!xo zouXe%Jep?U&DDkjPh*tDXM0e5*d@;H2W>V%A9aB^(VCJUqNg-8!?= z)lS%~tE;P&6g+7)7J`v#qYiK}C+{#oX4vf6%=a8kC^0w9(zy}+=IhIcQ-eYhdo;H zAzo}d^DKv^4mh8yDcR)DpBam1N>ma)ebP3mGVWa5aQXglP_gN3Vexl_z5AW{AiBgb zh&Yj#C-?FDpUJNiC`GGz<(LA&xgB1|4|&*of9lMwCvvqo10MEEx}Po-O&DnGRNf$w z3%LCSVT2nIj`Yg7#c8GX!;h|~i;+}jom>#%qFIH!p;%n*JEOzH!`69$+FJGRC?+au zy7V=<{2{LSkDim0laG&3%+>Wg6b=cQI<77y zC8e>kv8L-mL3Q_KI&>Wj^D7h--~HmW_YBF5Wi?=R2mJ#BaMaNYBd4MgeAbJELjB|8 ztJC=!%8*y0PiG~0L9n&{w@wvvi^ha%YHG<0N_O!t{n5BHGczdEA74?jv9JVe#q)s) zg~7we#~|WZ2l-(P?>beyiyw@Q#X`MhnD_H(PC7gvF*;(W@yo+u4II|{tBVnK_wmQu zQ&H~|!$Dnj_33=^aFNHOhOMCl?m@<4*#wGCuj9oWY7uB8?Jd&Oxy5LD>U;gk-@sRY@p@i%`v!9J|c7o3jta;dDqMH<3~!rR**97{^>PX#gojblNXPP zUe~pK_hdy?aHiDr^Lqdbh{(LbdV*kh`5R+-iR1WvwDU_+9mm$w!18anWQZ^pL^tFy zOtQTrTOLsosYhPE^lPW(>`zlmOzSUW#%Qe&zFp;>u??6-q1yjK3hWSIwzOY$hSl#* z@I`S?#uTSxY!a9XqCRB^2bS1n9w=IWTPVcN#bAso?>Ccsu2)gHVN;VzOHOj zp1qbQfxUw7gOL=vLye^5cgg>;p^Ckpy}P?xfkxH?LY9l0d%jW+mz+GldE8ZmY<85d z#Wl*C6M5B^Fd3}y!T$cnb3uA~>Gj*=mNl@ihCx#9aO99YAbzmHsF;hyL_R+!)~aVl zG=GTkGnVKp(_#Li`bpwgq^+~Ln>I)7W9>4z^NE~t-mU|N90Etx)MN!i_xg3kW=(A^ z2Q{^L%76O_NH_nb7O&%&xVS5F6@U0?SOzNOJ%|S+EHelu1ZA>0yr<)|D=R1G*oEKB z-27B39}Wp~S>&y8(r*|dNF_H(*Q>havs>rMeG3KRg6xoRH&sLzSmhpMi+GE9J11gK zzR_>YRxhLZiG(2?AueKTUC1iR$^`tS26p=T`ttH9<_;6N!W$bKRc$f|(LOIR(Qz;j z5GIlCATgRrVvc*P*)(r6GqdqL(Fp-Ucp7NqyGqp9q2)GrXW1~0aXKnU>)Hg*vgw|k zJ-U|wy$feJYN#x88_KzAIRamsFiC`bj2YyL3waqT*GnQzNHjfjbbDU)%b_H^i8i6y zu#JXdb89O$CWgrT`S}?nIgm|l0s{k;l$2s0%2|>iq9-c`@nWw{-3$Xlj;5Ho`WH7f zsb{Nt2g=KXd3d#9uR~^JDO|^6V`F9GN$8J|3jgxLqVT%%lNrY=#^r`{enZ{iPg{=Q z|A(It8OH4bfmg<;`fYmi>0^jtu{Gr3R4Icj48CeN4;qgdjor@ zqFm&<_1H8lT6d;d)!6vt+y{EGjEHn!X@`o5#qQY@f=NWSSVySq5?GbXWVitp`{p8l z^<_%c^y;N_SszIXwm~S;+s+2vqr)=>eTp;x!|0J4qR{no-2Ngq%$WcUa_0$H4y1fe z*(2K*o3meU(eU3R?Fo29@D@MzuDOy#h5he|khh62wF%;H{D*Y!zwGG}YA}Jw?^0FyXwye=$CT3=scVZ%@ zRgA%0TwKM~t7ggaGwA;QbgDf|f6SeS#CsMRtY@aDGhd^dW}|%JbdiE34^=e{5OZ-3 z4sICv;NajgJ@_WMu0P+z(C`4BCUi~OlSEac=#~-c5*pTDVEJA>sXfq1lLW=j_Kdlw zpTsiE3L1`PNW4px;=@=qb>N+rnhKeRfn0~62Y6jtP4wh@RX!cf3tks44c2esnc`r< z$DyH;{idc{-bZ(=^{lMq_{qgz!9^V7>0$lh-ZCGC5#cU=`V3P%D8?+svI-W~hJS`> z^wpWhTN*dgCTNn_WQDLYAy3i(E;ST}H$Udw4^!_m9_LJU2Z}Ano;^fm#+ogkq7>;} zOBo5e>FQg>AlwL4R8*OGl43u0&3g47cq!OujQD7+RM)0CY~?KRBow5Aui6zWc2xqe zcp#Yhn8Qdnn)9ny+-*Gi(`LiDf@IAA`A!RPB(^kqRyC-D9;JlmRGFTKh@&&M%^sE5I6 zyj?79N31$Z;)lCcj+7|Huz`Q4)Ub_s6!OuI=rtZ5lmk}A=7Y2^r&vD)#%8R}hYtlT zBQ~sG5gKi`w?lAkAa?XhMKWB&lbjOB+#~O*tAm_|l$-F2(Mu6ndVEY3O6gncu)m^s zhQgJgcej@=53FHz)I%|fjY6k#we%;0yHX{zNO&6yK_U z#NZ$bL|cvjoSbPBRXO|m`cB#pt0{xuZT%25cEQzzuzmW+l}t*4jYYQMW+yPuT;E*@ z@Aod-{g*gDozJc2wL!+TU;K?(;E%UG2v0*+e3-2vGF9KEZFu~bW%Pb?F>tDmLx?iW z8ika&9*tB>Ws5jFvUeg8MH380h#-1!Nc4Po0wzf#(E11an{M7w@}EC{f^99A$5wr$ z={KD#X$XyJ%aWsK8!d6eu$zRcscg&41g(2tBRXQn{=1kYE)E2xW~vMu63;<9o?-8l znUrSkoYhc{1l@g#dq!`J$qYXmz0#2nsur8)g|f)pj3+L#!i-Z)?`hqmxm}cz4YPkA zU=SXV2E#gp#R?$&AwRQ~RD;LD#pQPRQ=9x+r8$&7R6=!R10Iui79K9N=S+raberoJ zg>wEDGUBF?ZrpoL#`;`;N{h8ssleR;S0AZ)PsNvhbVLCq({Vz=WHG*&DG4H$c&PR|l1bLR0=M`!+{5C=aoV z9g~+8QG{tyR@U?le)l6j5Xct8|062k*G8T+>FvQE2_FgN)H8dp4o8EWkJT4tRKoi8 zSKGrwUU~pxsaDyf2p4Q}vp|&kVu$ys>(*f4{dU^%C-_-}or`^WbTKrdkf%iwVJ!H5 zxGAkUdSz=0D$GfAXkxQBrrwE6mS8)rid0|O(XMp(=9@$dGw<60Ma52&oc{+`Be z@_apSQlv+q>bc)MklmQ!K0xub)Xc0k=`v1AN~%+B$mC(uX>4L(@Hj4X+PFDuB`G^% z?JSHM($o+Vpx<^(+~YnW++sEm)6>%fsweDzct~$=um8;v_TV}wk&)vf9=AbF0xEcC z0)l?PG(k1{_cIAg%i`L5UfJ1EG)1jc1AO3 z72Mq1z+Nn30y}ks{B^oCwXFMXP#36>zF+?~2;+e!f&+t;7fS-@(}(LrAa}alcdK)R zyp{5JHL&C!-oo~#iLtJJwyF$RmeOssNt(0MGC~9e`^>(_6p%Dbq58#c{wQf;9KJUN7 zNiVdn6Rac)U4b1dPS$ZKun35Vx%{qS?zuTR7*sqw9@htRuvK}icZzYJr$|)+2jE+{8m-_+2 z^m38bUHWKmXlN)U)&KWrvWB|4h2HbT@D&(X-j1aJ)b8hl!(RreKt6o>^y$Xu-D{Ox z0BEQ}+;_*L(<>$?C*$JcEJwaLF4WW0(!z;3I2?r`paI@sfEC4g(*yTv_V@4Rj|GB- z|0#-G;Vk!{y~%1(TibP#PCoovnKtC9HG~J-w^&B-vCsi6Tk&jJhqQW@N)ou27A|C zSWB2m(EavkjkuTBO*|>zYQW_f(8Gy|SX1ky&fljdCpm!No1L8nAA)0cRx_$c3H!4J z2N4b~E`pK3?%TI-@9*z@eSLv^S3@EoC(p^qC{w856%VWs3HVPbqo5QN6dc@mtoOi- z-vbeG?bm73R$s54lLh_Xqrbl&2tD0BGC&>(tF*MWQAw~R`hNU~h_ZPVdb9rHmFWBT z?;CYl4%~2Ov9TFia*)hHm2YOI>0SH=Z_bIx99#hqCNv^gAp>S={ww-#P%UYj|32}v9(nf@8Zg)_inp)C|lMbHca3Xaf2Q%|X%O}FDuV3jZ=JX8=nB^`v zK2kd+XSfb6$VC=E{j!z-oO7;zIKHc|2k#xlWUIh z>tBH7kmKVc^fs1M*>CdK2g^8yO%kIS_xED|c&(f|x-WSv9!kdoe`KG0tDTd2+Qz|$(c#W~_*DnPFW-Ql; z!cTPaUcvl%nwqLzaox6?i<_4&44SyP zX=Vaj{Pk<8&^mx2DAdHn#Mzgghri3-Y=glyZPGVloA10`1z+)o&Ipa+Y+E6`7Yn=@ z_ft$`L#PdW^cuha@k;nei04||9YDhJ@;3!eQH6j$eInwdVPSDNS#ATDfv>;wnO<>c zJcpSVFLprP#N^aNFhUM@_kHruuY=}yh~hAJcUuW*EP927qxWf-@dc;IT$fjUnmX(!( ze-s@ZZ6@k8uY3RpLc8$dzcs<71A-)~0Pj#@8!a__cJ&pd2pI(hn}VK)QC7KzbEcIai@$(&6O@sLE!_%YUGjld}$lj$n=xh)3lTjaGYKp?h2vk^8T5imCU6X6^)L**V+IiHqq2w zV)&a1{}jMGfodT`Bp>r{1fj92Y@O{4L+C0Xi3aSBcbSGt3>toZ zeqaYGRV(6kUj6R0BDkttjT!=kwh%je4M5~|Lli|RK{pH5W)6OxL4RsLREeH%OTmB| z%B&cjgvSOD6mlUihcQ2J#|kPcDoRR$fO86Z9$bMvh+~j|Ro?>yIv9Y@pK&~Eu+0#9 za8=$>bFqG+5C$|B)WaOBU(QYD8hn!Ng#-i^He8}~Xqcnb{f_={o*ujjX3Xy=;Gdt?7BS3ZCI#xEdY-~ys54*PTxatS)OnkRfDTD4{ z{uAobXN=Sq4_Eu3>~vDngY56`0|b7s*8S4%d8l2f+e-urn^my&W!-Kq(I0-5PsWoj z5c#4nfnxpS_tW#O09;R{UIUPElUD72@6NX(=J5SGMQCY@zJ0SA%Y4f^MlaG#kMfy= z1?5=T^7Q_4cOsqB{NnG=;{p2?l)@d*$&t>^SzH7g{1j#!2u>lPN5BLn>Omnjk=G6O za`5#RLb=_uI_0kQZxdQ_XIs{S9;099Qt4ND^@bsUmegv!5#onYOt!5=EoTV_k?RLD}rlE%CnLPIMC-%;gaIY zl3Df0Cu}RL+Reb?3VOQJs?fHyu(&!}XlSxSGW`*W0dC#N95gOLp9qtTKi}!nkt;=k zs!srf06H3)y_$S6<|UJ_$8=F(@}p9YpcYw9t4iU1x4pzxb^FK+8c|Ds!Qc6!ss&iiJ$_sub4v}+!IlEbMo}Zg5V-`zq*&WT;S{ev} zfn!k4_Sx)@236F*Lz9>GAI6Pt+X|ar9iVn(!3;f{GMxIWrU92J&7GYHg80Av*zVJ9 zFgj=q3Hx2y9J(d{Y_yvzmyRWXVPs;`>k7DEdwISk__GEIcJ}TkH?&xqT|;^-ThuO8 zOiU+@69~WO!7Qkmh6L7HobxgdCUJl;@poV_`?OUkIr#N9I{peb1!t)bEJ6UDpcfZQ zXV4!p5ajDxyrYEy&pq@dlkY9{Tl(mvW1v>?4G#~zW=*f0{J88xM?2L z*-P(?5fKo^GPrk}=8bW~Z!KxW%Rr_5{H5Ap_PmMhXsx?jNo$Far`%SC!yOiZ;%F^;0 z%zt~ke(7l!zMZ{&i}M-<0l}B#WJxC0H*aV}R&}W7PbWogqjwyY{(-LA$zl`p>({b$ zdaKc5pst8^E&|&>5xueRHvX?(0puyUM8++(57gA5-=^J=HdHgAv(Nt?kG)EMTHIaD zbV3%fPaH#3H-H4Z0lVA4&=6YD3g~W0jkdnwuhKpQt8|g9d(w1?R5w;9+gF6bzOwDAUh=yq5)%2N1B)%Jkm1t=gk!~ie`Yy3MP0*yfXXH9=aH2c25 z*=>#B7+HWB2FJEr=QQAA*kp| z4Ue8(G+0hQGjn+1JsuWDK2qe$T$Q^8hi&pakOTvgK#MpzRWG)WF8p>}5`%$Nz}lwV4MM8E?PL)+i%eV1l6%jpSR{^>xguGPsw z+Li9Q+Yce$@~<>Xzqx3Dd-=?1G0<1Hv9rY8jSSCBPe(Tz=*Roggs*C7n4OkZ;&jtD zJR;!Tv0@T%E{!(*KKI={a0lSy$LqQ9(R*SZVZ|&R&PV_kZE!iIvYx@O)k&gh2 zt{yT)Wfn`(#ph=^m<~M=4--=oYE2U(k*6(-4g~lf-&>iEfdLj79o?|YgNbPE?7-e^ ziv~I}$!UX(H!e_&Q;?WhxQ7xt3e&Ugw!OQXhDSm%5Ifctt;y%lsVM+HO!9~wut zak_lfWGm)k+$){8LqbB<*VkKC{p{z;wIoQFzxy^I3)xP&f%wbjeZ0=%`~K7;&eZNP z9Zwv{9_7LGviP$SEkq)e+I#5rRTK=PHIzFfJiO)ovg&bMOd**_Ksr|8{Nb*TdjtN* zs`G^iVx_X&v-!es7&`61rD73wP2w4LXJq*ZC*&h|Bq9!FF_k}mb?uyo0_3ot+qCbyNB8l==XNCIBXHs%}@agO6+F+QDv(wi8 zQqwSOzXqBneYsz9bJ;Kx4L>+{-S4^3Y(^>g zGda2L+6Fnm7~0Mbo5+3Jmwzp{{IfUw>3ZU2gW}c9TI282l|0K!AC>PdW#;hf>4Kh! z0m{1q0-~}~GO&rr1%}e{AC%~xL61MrcZV3O+G#yRnf`ph32W zxVX5kuCAY7yWIPhrDH8Et)&)c!ue0glm;>~gKN(>z$!B6n>>lY^LaEQIra!`lg^M= z)yP5ixCl4-RZx<~q0P6r3Dy{>%f|7A!rk9zc`6(tBzi2pZ+Ie&km7a26%4v@J@*g> zq*lIA+DS^km^ERMQ1|EFk0#nns#@U*H#q@&1t{~*DHH<6!^r3)@acx$*Rihr*(D9^ zitwnnJEq790wEyXfBpIuICqxVc=0X;01gDUn%lKtQ5u>sPHio%;?;9dMt|cpmx->F zWKV-hox{x7$0x!oq)w5OqOMGGGe}d0F_*dd3=xIv3zHwhf+xu@$tT+s6c=y&HbNoB zPus6ZZgM75P;bTA+qT&;g*?FiCoT%}Ze`YgXRLk5#O`c{XFQXWiw+s`tD^S0lO2;% zpu~lUhiJ0=$oLbn+$Ku>D=M6fMmzW1e1FzJe0}-c*uO}7)$?aNB{M;wZr?%@GcyO5!xqmt zj3f*bF`J`mC%=lUJlyR6Y}5F_woo+8Mbq~r3D+e4jEp&n_+U>$iofapt4OJhqjA3- z9s}!d!WqX4RYNFe!qN}=^@8)VB!bRJe)?8=wpcor2>U9ncyaPRG_(-}uz=yw6^=Ko zXSWR*ALcV~lC&jJ7<&OC!&PJ6{K8sbjZZ+}XPNlZf&}<}0t5d6n+Mema@~I(F@T9{ z4BOoHr|CC7eik$K-`48e2Q|Kdi3z)iw>u-3*NG^pX z#F`DAoTs*Mabt((SW><9bIPpj@_vs%9w39)hx1y*oAikTX26g$4CEFPI+3cLUPew1 ztM(R9neOiHfPi;7E;R!%3S2Fj>Jt3Hpxy-S2jH$#iSu!~|%j(*GjT|15EbJe}iW;>tgPiPH8NoUXcnhse)-Rgx97+)^FZ#B{&rT? z@dpklU;-Kwcma$qCN@@pFuI8dbfg!KN}T5GgedasDg3*~g#$LzMvCL(LPFmdnnAge zGUbsGl89zt*H!VfmZ)*8akBM!?4}r#WP~03PG(&)xUe><`l~~ev0i_mK+V7!Pgj&A zrXPMND6H51QlMqps;ZirtP^-92Lp#r^7ZQYZV!&>mC~N5gDGX7ny#6U_w%=MIjlZF zDTzpzw4Ox0j&wae--dhy5*SonQ+7?$vFu%YF8|q_TmioZMjL=XSONBRp1j?gl7wdm zc0XF6IQaO$+oJ31Yk7Hjkg1`G*t9bIIpaX2wi#Ait)ZDtlA4(nm6zK)Vj8Py4?%Jw zLq<^7PbnE4(6iMr1D&3m%Jqpb6j}#NY7ox98NPus!q@j_L^5XEzp+nMyf5A;*js(8 zK*Of+jw(h+5Vvzh{@0uGYzp9j>%6jB7^^>URwgiJDNRIvxI#T$T;LCoqr^Bs(Q%q< zW#36d#ZXSYg(d>6CVVw1x#ZNLwP76MuzQCKSRG|WKO>vskC0v-Vt9guzZz@YZ; z>2l(<`{fx}ArTsc@7BWsM1KctU!TZ@h|DXrt8kq1fGWk7;C1-3?!up`ArZA)W}Z*a z5y?2dm>KzG_IN!VnPrK=nWJRXA$736k26O-iqn^GKFKlsBB+tM%uLfGCmYZL4M0~=w6YJZP&!>PpAKK&)>ukww*jKI6SbUzxTTQ zu4T|pxu`7wQ~?kV7dPN+y%*RUAU;p$L%^+AF=r>RJDr#Iq-Q7$P~Zdb%0g=Ot3U-@ zk^&4mcg9Fe?=eJybNNf9Z<7X|ye+c(Yka@gEY?l)@eE7f!sln(5P76}Dy$Y~ zeNpYMJ~tAl!<66ASB^uCL(utkQImqVQflW>SowYN7zW{Ua^Yqn`Yrl#5j`&|Uu)k7 z#_nwquZ#L!FQX5D4gwo1Igd?Z;;RYa+hvd*U;@Csp%Jnz0~`bTF2%))X+VVWGBVl> z#NY!K2$mf%!vH6&nzVETaB=>-U1MK70GL%%a~6=bk&zKFvAbYvhJizb2YoxxQsE|v zheN^;OwB-1#XNB->eIL4*rR{5ZNwIje5trkN-)3hYE(~W;*GuTRD7g8{k30mUGIr& z`*OAbEscl$#Ad9cKLKTdudu<=5HW9+HR^4VQ(aE!9RfUFzy4K1Bt!U)gs1 zn$QrMyj~OKQ@3^m`y}W}KJ=Ujn}vDKDiwsd%3L>j?LQucO&ch~7UI}|DP`}x`bjG6Tivn&;9$;V6BpLaJ%BY1}bS)jBH|%O=ODh zFY{iW{)43e$b8ubZIsA}2yBVm;AdaGFP?%cG58gbX!qjg(7fk)l@A5v5U5_*%!%^m z=#)TtbLICzxJ>W;^0}CiG-p2u>Qg`g&QrE{k(|^ys(&BEWw7hEBJuMKoT5fCF|Mah|uiP%eHM?7PO!snq?vcf!bs0h(brAK}_&lWp z`4&r}he-^dG5gole}=`i`uXrM>}r>BVi@Yrqu1BUD@n=LY{t!;uo?bY#VMc21k~|I zff-F7SOfj)l83Y4Y5~E@(SFTp(Ch#(6R4{I?e+BZq>&wU;9YWP2INFrQ`7Lf4<{Fw zIx?+<9FWhz{tdcbfSS0uyI)>jc7vV^=ylt^C6O=MUlXNgoO~MNTT_KCmKVNkB?WyS z0UZgU^d`-3{p4h(d$XMUES2WHsrBuC6Hx`ixc*WervwC)lmu&Y0QLRuwAXE^{$RAl za=s#nfQYcdQguM$NWxp{tT`0o5-U(>?ox7=AN46Trw>*r0%`Ah5sfhRkTfOoVfxSb zlpqEzJZhs?!pY^vT-rRL+l2sFhnEY#4_3mXvKfZtbCRvLnN1vW?iT`)Kd$@`$w zdBaBx=%xzOKj3$ScUBiHKk!j9lGO8sqaDmOqP?1x-`FvUfcvzI2;2jZJQBe_s5$F$i z0gwZjoh?r$=+wrb(pWRTd-qiEk)mF|3N%~4(8(|Vu;R@EkZ=YhDKN`yCSBPO)O?8L zTmEaKlY6u@_2hQ%<7qWXL)0`e4?GGKWfZ4r#85^t`jao;Tc$WrW%?uN$nfH@L)1_% zh8t6U$WCa^Z~pQe7`RGN{kY^(9ObJ&N$Sual@$E6MTtTUTKRfyZpHj5zy^I8A0Pi; zYhNe$KZuAJ{sFWenwpxXLD+P79)1D7V$gg6?HFJ_2Ma5D5Ed2|;FiO~!~fDEX!(HR z80_J+Y;4LH*}&vX!D-eH=#1#|oq58LhN|irSbpF;Ux4Vd3kV1R#mt!1Wwf&j4psqz z;BsmCRx$n@f{xPz5;PsQFQ`j(`p@3`V?s+_`TT4MR1OD*zVEx7z?}A+FPqUDv=*E8 zp&vAT-~eYc5*y?PQqb>;JJE#NYKojm#H)vSgJ3JHpGoqiP% z!ThM$HjH!G&+j>>5zp=YZNKPII*dD9#_pg#JNb$xRYHFB+ zeBUoFK(`qlAtl7E<~Jn{)qZ2P8|ZBKgnzTehRL7BSV=9+ltgO4@rTBB@)^lm!V=>^ z29ZlA==D)&bbd4Xi~OtaJxLXU|2$2XqoIyS_H-ns>G5~hBtQf#z?c|Rx5rc`kowv{ ztIyor+7aFo4U=4s;l%?l0_fqz$K%gWF~_Lu>h2v1 z@n*a)?2EP6X3pjw1f&-jUBLkrRU8u{82_v)3eCcvxb4#jpidfFw%OZnEK2-E<2Y%w})fu%%MDh$xm(4B!AU0-| zCE#xL{(W5SFF1bh6Ebu3E(-hwT1t@s-GH+BL+LPQw9<--2K}mVL=1Iu7ARKi01cTs zK`cE#e=9KJYgc%Jn(<)Vj)#PmU<9yrtuo!pSJgP?Gl>haVCS@NAp(Rk8(%$#6C)vEXg`n+i9N!3qR?8KgoAEG&S| zW~n?<1+(4nFmpK>{QrW&H2O4xTXBs41|f;WreR?gkAKa!Am!ol(f@K=j{Dc=ua~!I zcS~!}g919OeFE-_S-hTX1=drJz{F6@pa}6IWGqd7XQ?#%r%C75HgOIv6 zxZo);dJkz`4~q{TmV)MPmf!`##lgkJ%E8ad$*;-DFUZ9!_?C~EgF}#mqi2IP?*E+N d=xkwY<@^7iQ1?9*Ja-0x$V)3rRZEzL{SO#rE$9FM literal 0 HcmV?d00001 diff --git a/common/src/main/resources/{{ mod_id }}.mixins.json b/common/src/main/resources/{{ mod_id }}.mixins.json new file mode 100644 index 0000000..df037b7 --- /dev/null +++ b/common/src/main/resources/{{ mod_id }}.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "{{ group }}.{{ mod_id }}.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} + diff --git a/easytemplate.json b/easytemplate.json new file mode 100644 index 0000000..1076a80 --- /dev/null +++ b/easytemplate.json @@ -0,0 +1,77 @@ +{ + "inputs": [ + { + "type": "string", + "id": "name", + "label": "Enter Mod Name:" + }, + { + "type": "string", + "id": "mod_id", + "label": "Enter Mod ID:", + "regex": "^[a-zA-Z0-9_]{2,64}$" + }, + { + "type": "string", + "id": "description", + "label": "Enter Mod Description:" + }, + { + "type": "string", + "id": "author", + "label": "Enter Author Name:", + "default": "Jamalam" + }, + { + "type": "string", + "id": "group", + "label": "Enter Maven Group:", + "default": "io.github.jamalam360" + }, + { + "type": "string", + "id": "main_class", + "label": "Enter Main Class Name:", + "regex": "^[A-Z][A-Za-z0-9_]*$" + }, + { + "type": "string", + "id": "github_owner", + "label": "Enter GitHub Repo Owner:", + "default": "JamCoreModding" + }, + { + "type": "string", + "id": "github_repo", + "label": "Enter GitHub Repo Name:" + }, + { + "type": "boolean", + "id": "github_publish", + "label": "Publish to GitHub?" + }, + { + "type": "boolean", + "id": "unified_publishing", + "label": "Enable Unified Publishing (Modrinth + Curseforge)?" + } + ], + "move": [ + { + "from": ".github/workflows/build.yml.disabled", + "to": ".github/workflows/build.yml" + } + ], + "exclude": [ + ".git", + ".idea", + "**/build.yml.disabled", + "**/build", + "**/run", + ".gradle" + ], + "ignore": [ + "**/test-template.yml", + "**/test-server" + ] +} diff --git a/fabric/build.gradle.easytemplate b/fabric/build.gradle.easytemplate new file mode 100644 index 0000000..f9f0340 --- /dev/null +++ b/fabric/build.gradle.easytemplate @@ -0,0 +1,119 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" + {{#if unified_publishing}} + id "me.shedaniel.unified-publishing" + {{/if}} +} + +architectury { + platformSetupLoomIde() + fabric() +} + +base { + archivesName = "{{mod_id}}-fabric" +} + +configurations { + common + shadowCommon + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentFabric.extendsFrom common +} + +dependencies { + modImplementation libs.fabric.loader + modApi libs.fabric.api + modApi libs.architectury.fabric + modRuntimeOnly libs.modmenu + modImplementation libs.jamlib.fabric + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } +} +{{#if unified_publishing}} + +if (System.getenv("CURSEFORGE_API_KEY") != null && System.getenv("MODRINTH_API_KEY") != null) { +// Uncomment these lines and fill in the IDs when ready to publish :) +// unifiedPublishing { +// project { +// displayName = "V${project.version} (Fabric ${project.minecraft_version})" +// changelog = rootProject.file("CHANGELOG.md").text +// releaseType = project.version.contains("beta") ? "beta" : "release" +// gameVersions = [project.minecraft_version] +// gameLoaders = ["fabric"] +// +// mainPublication tasks.remapJar +// +// relations { +// depends { +// curseforge = "fabric-api" +// modrinth = "fabric-api" +// } +// +// depends { +// curseforge = "architectury-api" +// modrinth = "architectury-api" +// } +// +// depends { +// curseforge = "jamlib" +// modrinth = "jamlib" +// } +// } +// +// curseforge { +// token = System.getenv("CURSEFORGE_API_KEY") +// id = "" +// } +// +// modrinth { +// token = System.getenv("MODRINTH_API_KEY") +// id = "" +// } +// } +// } +} +{{/if}} + +processResources { + filesMatching("fabric.mod.json") { + expand "version": project.version, + "minecraft_version": project.minecraft_version, + "fabric_api_version": libs.versions.fabric.api.get(), + "architectury_version": libs.versions.architectury.get(), + "jamlib_version": libs.versions.jamlib.get() + } + + inputs.property "version", project.version + inputs.property "minecraft_version", project.minecraft_version + inputs.property "fabric_api_version", libs.versions.fabric.api.get() + inputs.property "architectury_version", libs.versions.architectury.get() + inputs.property "jamlib_version", libs.versions.jamlib.get() +} + +shadowJar { + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" +} + +remapJar { + injectAccessWidener = true + input.set shadowJar.archiveFile + dependsOn shadowJar +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} diff --git "a/fabric/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}Fabric.java" "b/fabric/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}Fabric.java" new file mode 100644 index 0000000..ff171e1 --- /dev/null +++ "b/fabric/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}Fabric.java" @@ -0,0 +1,12 @@ +package {{group}}.{{mod_id}}.fabric; + +import {{group}}.{{mod_id}}.{{main_class}}; +import net.fabricmc.api.ModInitializer; + +public class {{main_class}}Fabric implements ModInitializer { + + @Override + public void onInitialize() { + {{main_class}}.init(); + } +} diff --git "a/fabric/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}PlatformImpl.java" "b/fabric/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}PlatformImpl.java" new file mode 100644 index 0000000..7bbf657 --- /dev/null +++ "b/fabric/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}PlatformImpl.java" @@ -0,0 +1,7 @@ +package {{group}}.{{mod_id}}.fabric; + +import {{group}}.{{mod_id}}.{{main_class}}Platform; + +public class {{main_class}}PlatformImpl { + +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..65e3fb7 --- /dev/null +++ b/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,32 @@ +{ + "schemaVersion": 1, + "id": "{{ mod_id }}", + "version": "${version}", + "name": "{{ name }}", + "description": "{{ description }}", + "authors": [ + "{{ author }}" + ], + "contact": { + "homepage": "https://github.com/{{github_owner}}/{{github_repo}}", + "sources": "https://github.com/{{github_owner}}/{{github_repo}}", + "issues": "https://github.com/{{github_owner}}/{{github_repo}}/issues" + }, + "license": "MIT", + "icon": "assets/{{mod_id}}/icon.png", + "environment": "*", + "entrypoints": { + "main": [ + "{{group}}.{{mod_id}}.fabric.{{main_class}}Fabric" + ] + }, + "mixins": [ + "{{mod_id}}.mixins.json" + ], + "depends": { + "fabric": ">=${fabric_api_version}", + "minecraft": ">=${minecraft_version}", + "architectury": ">=${architectury_version}", + "jamlib": ">=${jamlib_version}" + } +} diff --git a/forge/build.gradle.easytemplate b/forge/build.gradle.easytemplate new file mode 100644 index 0000000..cbe09c9 --- /dev/null +++ b/forge/build.gradle.easytemplate @@ -0,0 +1,118 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" + {{#if unified_publishing}} + id "me.shedaniel.unified-publishing" + {{/if}} +} + +architectury { + platformSetupLoomIde() + forge() +} + +base { + archivesName = "{{mod_id}}-forge" +} + +loom { + forge { + convertAccessWideners = true + mixinConfig "{{ mod_id }}.mixins.json" + } +} + +configurations { + common + shadowCommon + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentForge.extendsFrom common +} + +dependencies { + forge libs.forge + modApi libs.architectury.forge + modImplementation libs.jamlib.forge + + // Dependency of JamLib + forgeRuntimeLibrary "blue.endless:jankson:1.2.3" + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } +} +{{#if unified_publishing}} + +if (System.getenv("CURSEFORGE_API_KEY") != null && System.getenv("MODRINTH_API_KEY") != null) { +// Uncomment these lines and fill in the IDs when ready to publish :) +// unifiedPublishing { +// project { +// displayName = "V${project.version} (Forge ${project.minecraft_version})" +// changelog = rootProject.file("CHANGELOG.md").text +// releaseType = project.version.contains("beta") ? "beta" : "release" +// gameVersions = [project.minecraft_version] +// gameLoaders = ["forge"] +// +// mainPublication tasks.remapJar +// +// relations { +// depends { +// curseforge = "architectury-api" +// modrinth = "architectury-api" +// } +// +// depends { +// curseforge = "jamlib" +// modrinth = "jamlib" +// } +// } +// +// curseforge { +// token = System.getenv("CURSEFORGE_API_KEY") +// id = "" +// } +// +// modrinth { +// token = System.getenv("MODRINTH_API_KEY") +// id = "" +// } +// } +// } +} +{{/if}} + +processResources { + filesMatching("mods.toml") { + expand "minecraft_version": project.minecraft_version, + "architectury_version": libs.versions.architectury.get(), + "jamlib_version": libs.versions.jamlib.get() + } + + inputs.property "minecraft_version", project.minecraft_version + inputs.property "architectury_version", libs.versions.architectury.get() + inputs.property "jamlib_version", libs.versions.jamlib.get() +} + +shadowJar { + exclude "fabric.mod.json" + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} diff --git a/forge/gradle.properties b/forge/gradle.properties new file mode 100644 index 0000000..8242585 --- /dev/null +++ b/forge/gradle.properties @@ -0,0 +1 @@ +loom.platform=forge diff --git "a/forge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/forge/{{main_class}}Forge.java" "b/forge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/forge/{{main_class}}Forge.java" new file mode 100644 index 0000000..2df2bc4 --- /dev/null +++ "b/forge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/forge/{{main_class}}Forge.java" @@ -0,0 +1,14 @@ +package {{group}}.{{mod_id}}.forge; + +import {{group}}.{{mod_id}}.{{main_class}}; +import dev.architectury.platform.forge.EventBuses; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +@Mod({{main_class}}.MOD_ID) +public class {{main_class}}Forge { + public {{main_class}}Forge() { + EventBuses.registerModEventBus({{ main_class }}.MOD_ID, FMLJavaModLoadingContext.get().getModEventBus()); + {{main_class}}.init(); + } +} diff --git "a/forge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/forge/{{main_class}}PlatformImpl.java" "b/forge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/forge/{{main_class}}PlatformImpl.java" new file mode 100644 index 0000000..56abd39 --- /dev/null +++ "b/forge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/forge/{{main_class}}PlatformImpl.java" @@ -0,0 +1,7 @@ +package {{group}}.{{mod_id}}.forge; + +import {{group}}.{{mod_id}}.{{main_class}}Platform; + +public class {{main_class}}PlatformImpl { + +} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..b197830 --- /dev/null +++ b/forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,43 @@ +modLoader = "javafml" +loaderVersion = "[47,)" +license = "MIT" +issueTrackerURL="https://github.com/{{github_owner}}/{{github_repo}}/issues" + +[[mods]] +modId = "{{mod_id}}" +version = "${file.jarVersion}" +displayName = "{{name}}" +displayURL="https://github.com/{{github_owner}}/{{github_repo}}" +logoFile = "icon.png" +authors = "{{author}}" +description = ''' +{{description}} +''' + +[[dependencies.{{mod_id}}]] +modId = "forge" +mandatory = true +versionRange = "[49,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.{{mod_id}}]] +modId = "minecraft" +mandatory = true +versionRange = "[${minecraft_version},)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.{{mod_id}}]] +modId = "architectury" +mandatory = true +versionRange = "[${architectury_version},)" +ordering = "AFTER" +side = "BOTH" + +[[dependencies.{{mod_id}}]] +modId = "jamlib" +mandatory = true +versionRange = "[${jamlib_version},)" +ordering = "AFTER" +side = "BOTH" diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..5b2c2de --- /dev/null +++ b/forge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "{{ name }}", + "pack_format": 15 + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..e4941c1 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,11 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false +org.gradle.parallel=true + +version=1.0.0 +minecraft_version=1.20.4 +branch=main +group={{ group }} +mod_name={{ name }} +mod_id={{ mod_id }} +enabled_platforms=fabric,quilt,forge,neoforge diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f127cfd --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,91 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs.versions.toml b/libs.versions.toml new file mode 100644 index 0000000..7cf8b8d --- /dev/null +++ b/libs.versions.toml @@ -0,0 +1,47 @@ +[versions] +# https://modrinth.com/mod/architectury-api/versions +architectury = "11.1.17" + +# https://files.minecraftforge.net/net/minecraftforge/forge/ +forge = "1.20.4-49.0.31" + +# https://projects.neoforged.net/neoforged/neoforge +neoforge = "20.4.198" + +# https://fabricmc.net/develop +fabric-loader = "0.15.7" +fabric-api = "0.96.4+1.20.4" + +# https://lambdaurora.dev/tools/import_quilt.html +quilt-loader = "0.24.0" +quilted-fabric-api = "7.4.0+0.90.0-1.20.1" + +# https://maven.jamalam.tech/#/releases +jamlib = "1.0.4+1.20.4" + +# https://modrinth.com/mod/modmenu/versions +modmenu = "9.0.0" + +[libraries] +architectury-common = { module = "dev.architectury:architectury", version.ref = "architectury" } +architectury-fabric = { module = "dev.architectury:architectury-fabric", version.ref = "architectury" } +architectury-forge = { module = "dev.architectury:architectury-forge", version.ref = "architectury" } +architectury-neoforge = { module = "dev.architectury:architectury-neoforge", version.ref = "architectury" } + +forge = { module = "net.minecraftforge:forge", version.ref = "forge" } + +neoforge = { module = "net.neoforged:neoforge", version.ref = "neoforge" } + +fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabric-loader" } +fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric-api" } + +quilt-loader = { module = "org.quiltmc:quilt-loader", version.ref = "quilt-loader" } +quilted-fabric-api = { module = "org.quiltmc.quilted-fabric-api:quilted-fabric-api", version.ref = "quilted-fabric-api" } + +jamlib-common = { module = "io.github.jamalam360:jamlib", version.ref = "jamlib" } +jamlib-fabric = { module = "io.github.jamalam360:jamlib-fabric", version.ref = "jamlib" } +jamlib-quilt = { module = "io.github.jamalam360:jamlib-quilt", version.ref = "jamlib" } +jamlib-forge = { module = "io.github.jamalam360:jamlib-forge", version.ref = "jamlib" } +jamlib-neoforge = { module = "io.github.jamalam360:jamlib-neoforge", version.ref = "jamlib" } + +modmenu = { module = "maven.modrinth:modmenu", version.ref = "modmenu" } diff --git a/neoforge/build.gradle.easytemplate b/neoforge/build.gradle.easytemplate new file mode 100644 index 0000000..c6f0f72 --- /dev/null +++ b/neoforge/build.gradle.easytemplate @@ -0,0 +1,118 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" + {{#if unified_publishing}} + id "me.shedaniel.unified-publishing" + {{/if}} +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +base { + archivesName = "{{mod_id}}-neoforge" +} + +configurations { + common + shadowCommon + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentNeoForge.extendsFrom common +} + +repositories { + maven { + name = "NeoForge" + url = "https://maven.neoforged.net" + } +} + +dependencies { + neoForge libs.neoforge + modApi libs.architectury.neoforge + modImplementation libs.jamlib.neoforge + + // Dependency of JamLib + forgeRuntimeLibrary "blue.endless:jankson:1.2.3" + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } +} +{{#if unified_publishing}} + +if (System.getenv("CURSEFORGE_API_KEY") != null && System.getenv("MODRINTH_API_KEY") != null) { +// Uncomment these lines and fill in the IDs when ready to publish :) +// unifiedPublishing { +// project { +// displayName = "V${project.version} (NeoForge ${project.minecraft_version})" +// changelog = rootProject.file("CHANGELOG.md").text +// releaseType = project.version.contains("beta") ? "beta" : "release" +// gameVersions = [project.minecraft_version] +// gameLoaders = ["neoforge"] +// +// mainPublication tasks.remapJar +// +// relations { +// depends { +// curseforge = "architectury-api" +// modrinth = "architectury-api" +// } +// +// depends { +// curseforge = "jamlib" +// modrinth = "jamlib" +// } +// } +// +// curseforge { +// token = System.getenv("CURSEFORGE_API_KEY") +// id = "" +// } +// +// modrinth { +// token = System.getenv("MODRINTH_API_KEY") +// id = "" +// } +// } +// } +} +{{/if}} + +processResources { + filesMatching("mods.toml") { + expand "minecraft_version": project.minecraft_version, + "architectury_version": libs.versions.architectury.get(), + "jamlib_version": libs.versions.jamlib.get() + } + + inputs.property "minecraft_version", project.minecraft_version + inputs.property "architectury_version", libs.versions.architectury.get() + inputs.property "jamlib_version", libs.versions.jamlib.get() +} + +shadowJar { + exclude "fabric.mod.json" + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties new file mode 100644 index 0000000..7da18ea --- /dev/null +++ b/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge diff --git "a/neoforge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/neoforge/{{main_class}}NeoForge.java" "b/neoforge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/neoforge/{{main_class}}NeoForge.java" new file mode 100644 index 0000000..4f41174 --- /dev/null +++ "b/neoforge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/neoforge/{{main_class}}NeoForge.java" @@ -0,0 +1,11 @@ +package {{group}}.{{mod_id}}.neoforge; + +import {{group}}.{{mod_id}}.{{main_class}}; +import net.neoforged.fml.common.Mod; + +@Mod({{main_class}}.MOD_ID) +public class {{main_class}}NeoForge { + public {{main_class}}NeoForge() { + {{main_class}}.init(); + } +} diff --git "a/neoforge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/neoforge/{{main_class}}PlatformImpl.java" "b/neoforge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/neoforge/{{main_class}}PlatformImpl.java" new file mode 100644 index 0000000..56abd39 --- /dev/null +++ "b/neoforge/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/neoforge/{{main_class}}PlatformImpl.java" @@ -0,0 +1,7 @@ +package {{group}}.{{mod_id}}.forge; + +import {{group}}.{{mod_id}}.{{main_class}}Platform; + +public class {{main_class}}PlatformImpl { + +} diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..b917195 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,46 @@ +modLoader = "javafml" +loaderVersion = "[1,)" +license = "MIT" +issueTrackerURL="https://github.com/{{github_owner}}/{{github_repo}}/issues" + +[[mods]] +modId = "{{mod_id}}" +version = "${file.jarVersion}" +displayName = "{{name}}" +displayURL="https://github.com/{{github_owner}}/{{github_repo}}" +logoFile = "icon.png" +authors = "{{author}}" +description = ''' +{{description}} +''' + +[[dependencies.{{mod_id}}]] +modId = "neoforge" +type = "required" +versionRange = "[20.4,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.{{mod_id}}]] +modId = "minecraft" +type = "required" +versionRange = "[${minecraft_version},)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.{{mod_id}}]] +modId = "architectury" +type = "required" +versionRange = "[${architectury_version},)" +ordering = "AFTER" +side = "BOTH" + +[[dependencies.{{mod_id}}]] +modId = "jamlib" +type = "required" +versionRange = "[${jamlib_version},)" +ordering = "AFTER" +side = "BOTH" + +[[mixins]] +config = "{{mod_id}}.mixins.json" diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..5b2c2de --- /dev/null +++ b/neoforge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "{{ name }}", + "pack_format": 15 + } +} diff --git a/quilt/build.gradle.easytemplate b/quilt/build.gradle.easytemplate new file mode 100644 index 0000000..b75ea7a --- /dev/null +++ b/quilt/build.gradle.easytemplate @@ -0,0 +1,135 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" + {{#if unified_publishing}} + id "me.shedaniel.unified-publishing" + {{/if}} +} + +architectury { + platformSetupLoomIde() + loader("quilt") +} + +base { + archivesName = "{{mod_id}}-quilt" +} + +configurations { + common + shadowCommon + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentFabric.extendsFrom common +} + +repositories { + maven { + name = "Quilt" + url = "https://maven.quiltmc.org/repository/release/" + } +} + +dependencies { + modImplementation libs.quilt.loader + modApi libs.quilted.fabric.api + modApi(libs.architectury.fabric) { + exclude group: "net.fabricmc" + exclude group: "net.fabricmc.fabric-api" + } + modRuntimeOnly libs.modmenu + modImplementation libs.jamlib.quilt + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionQuilt")) { transitive false } +} +{{#if unified_publishing}} + +if (System.getenv("CURSEFORGE_API_KEY") != null && System.getenv("MODRINTH_API_KEY") != null) { +// Uncomment these lines and fill in the IDs when ready to publish :) +// unifiedPublishing { +// project { +// displayName = "V${project.version} (Quilt ${project.minecraft_version})" +// changelog = rootProject.file("CHANGELOG.md").text +// releaseType = project.version.contains("beta") ? "beta" : "release" +// gameVersions = [project.minecraft_version] +// gameLoaders = ["quilt"] +// +// mainPublication tasks.remapJar +// +// relations { +// depends { +// curseforge = "qsl" +// modrinth = "qsl" +// } +// +// depends { +// curseforge = "architectury-api" +// modrinth = "architectury-api" +// } +// +// depends { +// curseforge = "jamlib" +// modrinth = "jamlib" +// } +// } +// +// curseforge { +// token = System.getenv("CURSEFORGE_API_KEY") +// id = "" +// } +// +// modrinth { +// token = System.getenv("MODRINTH_API_KEY") +// id = "" +// } +// } +// } +} +{{/if}} + +processResources { + filesMatching("quilt.mod.json") { + expand "version": project.version, + "minecraft_version": project.minecraft_version, + "architectury_version": libs.versions.architectury.get(), + "jamlib_version": libs.versions.jamlib.get() + } + + inputs.property "version", project.version + inputs.property "minecraft_version", project.minecraft_version + inputs.property "architectury_version", libs.versions.architectury.get() + inputs.property "jamlib_version", libs.versions.jamlib.get() +} + +processResources { + filesMatching("quilt.mod.json") { + expand "version": project.version + } + + inputs.property "version", project.version +} + +shadowJar { + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" +} + +remapJar { + injectAccessWidener = true + input.set shadowJar.archiveFile + dependsOn shadowJar +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} diff --git a/quilt/gradle.properties b/quilt/gradle.properties new file mode 100644 index 0000000..4fb20b8 --- /dev/null +++ b/quilt/gradle.properties @@ -0,0 +1 @@ +loom.platform=quilt diff --git "a/quilt/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}PlatformImpl.java" "b/quilt/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}PlatformImpl.java" new file mode 100644 index 0000000..7bbf657 --- /dev/null +++ "b/quilt/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/fabric/{{main_class}}PlatformImpl.java" @@ -0,0 +1,7 @@ +package {{group}}.{{mod_id}}.fabric; + +import {{group}}.{{mod_id}}.{{main_class}}Platform; + +public class {{main_class}}PlatformImpl { + +} diff --git "a/quilt/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/quilt/{{main_class}}Quilt.java" "b/quilt/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/quilt/{{main_class}}Quilt.java" new file mode 100644 index 0000000..c2d7e13 --- /dev/null +++ "b/quilt/src/main/java/{{#replace \"\\.\" \"%%\"}}{{group}}.{{mod_id}}{{%%replace}}/quilt/{{main_class}}Quilt.java" @@ -0,0 +1,12 @@ +package {{group}}.{{mod_id}}.quilt; + +import {{group}}.{{mod_id}}.{{main_class}}; +import org.quiltmc.loader.api.ModContainer; +import org.quiltmc.qsl.base.api.entrypoint.ModInitializer; + +public class {{main_class}}Quilt implements ModInitializer { + @Override + public void onInitialize(ModContainer mod) { + {{ main_class }}.init(); + } +} diff --git a/quilt/src/main/resources/quilt.mod.json b/quilt/src/main/resources/quilt.mod.json new file mode 100644 index 0000000..2096a75 --- /dev/null +++ b/quilt/src/main/resources/quilt.mod.json @@ -0,0 +1,47 @@ +{ + "schema_version": 1, + "mixin": [ + "{{mod_id}}.mixins.json" + ], + "quilt_loader": { + "group": "{{ group }}", + "id": "{{ mod_id }}", + "version": "${version}", + "metadata": { + "name": "{{ name }}", + "description": "{{ description }}", + "contributors": { + "{{ author }}": "Owner" + }, + "contact": { + "sources": "https://github.com/{{github_owner}}/{{github_repo}}" + }, + "icon": "assets/{{ mod_id }}/icon.png" + }, + "intermediate_mappings": "net.fabricmc:intermediary", + "entrypoints": { + "init": ["{{group}}.{{mod_id}}.quilt.{{main_class}}Quilt"] + }, + "depends": [ + { + "id": "quilt_base", + "version": "*" + }, + { + "id": "minecraft", + "version": ">=${minecraft_version}" + }, + { + "id": "architectury", + "version": ">=${architectury_version}" + }, + { + "id": "jamlib", + "version": ">=${jamlib_version}" + } + ] + }, + "minecraft": { + "environment": "*" + } +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..6ce98cf --- /dev/null +++ b/settings.gradle @@ -0,0 +1,35 @@ +pluginManagement { + repositories { + gradlePluginPortal() + + maven { + name = "Forge" + url = "https://maven.minecraftforge.net/" + } + + maven { + name = "Fabric" + url = "https://maven.fabricmc.net/" + } + + maven { + name = "Architectury" + url = "https://maven.architectury.dev/" + } + } +} + +dependencyResolutionManagement { + versionCatalogs { + create("libs") { + from(files("libs.versions.toml")) + } + } +} + +rootProject.name = "{{ mod_id }}" +include("common") +include("fabric") +include("quilt") +include("neoforge") +include("forge")