diff --git a/.github/workflows/build_main.yml b/.github/workflows/build_main.yml new file mode 100644 index 0000000..79fd0b5 --- /dev/null +++ b/.github/workflows/build_main.yml @@ -0,0 +1,64 @@ +name: Java CI (Main) + +on: + push: + branches: + - 'main' + workflow_dispatch: + branches: + - 'main' + inputs: + release_type: + description: 'Release Type' + required: true + type: choice + default: 'release' + options: + - 'release' + - 'beta' + - 'alpha' + - 'none' + +jobs: + build: + runs-on: ubuntu-latest + if: | + !contains(github.event.head_commit.message, '[ci skip]') + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 30 + + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '21' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Build and Publish with Gradle + uses: gradle/gradle-build-action@v2 + env: + MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} + SAPS_TOKEN: ${{ secrets.SAPS_TOKEN }} + with: + arguments: build publish --stacktrace --no-daemon + + - name: Release to CurseForge + uses: gradle/gradle-build-action@v2 + if: ${{ github.event_name == 'workflow_dispatch' && inputs.release_type != 'none' }} + env: + GIT_COMMIT: ${{ github.event.after }} + GIT_PREVIOUS_COMMIT: ${{ github.event.before }} + CURSEFORGE_KEY: ${{ secrets.CURSEFORGE_KEY }} + MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} + RELEASE_TYPE: ${{ inputs.release_type }} + with: + arguments: curseforge modrinth --stacktrace --no-daemon \ No newline at end of file diff --git a/.gitignore b/.gitignore index a5b1113..ca672db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,24 @@ -.gradle -**/build/ -!src/**/build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project -# Avoid ignore Gradle wrappper properties -!gradle-wrapper.properties +# idea +out +*.ipr +*.iws +*.iml +.idea -# Cache of project -.gradletasknamecache +# gradle +build +.gradle +logs -# Eclipse Gradle plugin generated files -# Eclipse Core -.project -# JDT-specific (Eclipse Java Development Tools) -.classpath +# other +eclipse +run +.vscode \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..e095218 --- /dev/null +++ b/build.gradle @@ -0,0 +1,185 @@ +import java.time.Instant + +plugins { + id 'base' + id 'java' + id 'maven-publish' + id 'net.neoforged.moddev' version "1.0.14" + // https://maven.architectury.dev/me/shedaniel/unified-publishing/maven-metadata.xml + id "me.shedaniel.unified-publishing" version "0.1.13" +} + +ext.ENV = System.getenv() +def isLocal = !ENV.containsKey("GITHUB_RUN_NUMBER") + +version = "${mod_version}-${isLocal ? "local.${Instant.now().epochSecond}" : "build.${ENV.GITHUB_RUN_NUMBER}"}" +group = project.maven_group +base.archivesBaseName = project.archives_base_name + +neoForge { + version = project.neoforge_version + + runs { + configureEach { + logLevel = org.slf4j.event.Level.INFO + } + + client { + client() + + if (ENV.MC_CLIENT_ARGS) { + programArguments.addAll(ENV.MC_CLIENT_ARGS.split(' ')) + } + + jvmArguments.addAll("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition") + gameDirectory = file 'run' + } + + server { + server() + programArgument("--nogui") + gameDirectory = file 'run_server' + } + } + + mods { + worldadvancements { + sourceSet sourceSets.main + } + } + + parchment { + minecraftVersion = parchment_mc_version + mappingsVersion = parchment_mapping_version + } +} + +compileJava { + options.encoding = "UTF-8" + options.release.set(21) +} + +java { + sourceCompatibility = targetCompatibility = '21' + withSourcesJar() +} + +repositories { + mavenLocal() + mavenCentral() + + maven { + url "https://maven.neoforged.net/releases" + } + + maven { + name = 'ParchmentMC' + url = 'https://maven.parchmentmc.org' + content { + includeGroup "org.parchmentmc.data" + } + } + + maven { + url "https://cursemaven.com" + content { + includeGroup "curse.maven" + } + } +} + +dependencies { + // compileOnly("curse.maven:oculus-581495:5299671") + // compileOnly("curse.maven:rubidium-574856:4952685") +} + +processResources { + def toReplace = [ + "version": project.version, + ] + + println("[Process Resources] Replacing properties in resources: " + toReplace) + + inputs.properties toReplace + filesMatching("META-INF/neoforge.mods.toml") { + expand toReplace + } +} + +jar { + manifest { + attributes([ + "Specification-Title" : project.mod_id, + "Specification-Vendor" : project.mod_author, + "Specification-Version" : "1", + "Implementation-Title" : project.name, + "Implementation-Version" : version, + "Implementation-Vendor" : project.mod_author, + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} + +unifiedPublishing { + project { + releaseType = "${ENV.RELEASE_TYPE ?: 'release'}" + gameVersions = [ + rootProject.minecraft_version + ] + gameLoaders = ["neoforge"] + displayName = "$mod_name NeoForge $project.version" + mainPublication jar + + if (ENV.CURSEFORGE_KEY) { + curseforge { + token = ENV.CURSEFORGE_KEY + id = project.curseforge_id + } + } + + if (ENV.MODRINTH_TOKEN) { + modrinth { + token = ENV.MODRINTH_TOKEN + id = project.modrinth_id + version = "$project.version+$project.name" + } + } + } +} + +publishing { + publications { + mavenNeoForge(MavenPublication) { + artifactId = archives_base_name + from components.java + } + } + + repositories { + if (ENV.MAVEN_TOKEN) { + maven { + url "https://maven.latvian.dev/releases" + credentials { + username = "lat" + password = "${ENV.MAVEN_TOKEN}" + } + } + } + + if (ENV.SAPS_TOKEN) { + maven { + url "https://maven.saps.dev/releases" + credentials { + username = "latvian" + password = "${ENV.SAPS_TOKEN}" + } + } + } + } +} + +afterEvaluate { + tasks.withType(JavaCompile) { + options.compilerArgs << "-Xmaxerrs" << "1000" + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..5c20082 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,17 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false + +mod_id=worldadvancements +archives_base_name=world-advancements-neoforge +mod_name=World Advancements +maven_group=dev.latvian.mods +mod_author=latvian.dev +curseforge_id=0 +modrinth_id=0 + +minecraft_version=1.21.1 +mod_version=2101.0.1 + +neoforge_version=21.1.12 +parchment_mc_version=1.21 +parchment_mapping_version=2024.07.28 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..30d399d Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..09523c0 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..91a7e26 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +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" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100755 index 0000000..8a0b282 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@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 + +@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= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +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 init + +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 + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +: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 %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..3310373 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + maven { url "https://maven.creeperhost.net/" } + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} + +rootProject.name = 'world-advancements' \ No newline at end of file diff --git a/src/main/java/dev/latvian/mods/worldadvancements/WAModEventHandler.java b/src/main/java/dev/latvian/mods/worldadvancements/WAModEventHandler.java new file mode 100644 index 0000000..217eb46 --- /dev/null +++ b/src/main/java/dev/latvian/mods/worldadvancements/WAModEventHandler.java @@ -0,0 +1,5 @@ +package dev.latvian.mods.worldadvancements; + +// @EventBusSubscriber(modid = WorldAdvancements.MOD_ID, bus = EventBusSubscriber.Bus.MOD) +public class WAModEventHandler { +} diff --git a/src/main/java/dev/latvian/mods/worldadvancements/WorldAdvancements.java b/src/main/java/dev/latvian/mods/worldadvancements/WorldAdvancements.java new file mode 100644 index 0000000..4dd6f57 --- /dev/null +++ b/src/main/java/dev/latvian/mods/worldadvancements/WorldAdvancements.java @@ -0,0 +1,17 @@ +package dev.latvian.mods.worldadvancements; + +import net.minecraft.resources.ResourceLocation; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; + +@Mod(WorldAdvancements.MOD_ID) +public class WorldAdvancements { + public static final String MOD_ID = "worldadvancements"; + + public static ResourceLocation id(String path) { + return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); + } + + public WorldAdvancements(IEventBus bus) { + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..cb895e1 --- /dev/null +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,30 @@ +modLoader = "javafml" +loaderVersion = "[2,)" +issueTrackerURL = "https://github.com/latvian-dev/world-advancements/issues" +license = "MIT" + +[[mods]] +modId = "worldadvancements" +version = "${version}" +displayName = "World Advancements" +authors = "latvian.dev" +description = ''' +Makes advancements work per-world, not per-player +''' + +[[dependencies.worldadvancements]] +modId = "neoforge" +mandatory = true +versionRange = "[21.0.148,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.worldadvancements]] +modId = "minecraft" +mandatory = true +versionRange = "[1.21,)" +ordering = "NONE" +side = "BOTH" + +[[mixins]] +config = "worldadvancements.mixins.json" \ No newline at end of file diff --git a/src/main/resources/assets/worldadvancements/lang/en_us.json b/src/main/resources/assets/worldadvancements/lang/en_us.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/src/main/resources/assets/worldadvancements/lang/en_us.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/src/main/resources/worldadvancements.mixins.json b/src/main/resources/worldadvancements.mixins.json new file mode 100644 index 0000000..f413bbd --- /dev/null +++ b/src/main/resources/worldadvancements.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "dev.latvian.mods.worldadvancements.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1, + "maxShiftBy": 2 + } +} \ No newline at end of file