diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..8df2321 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,29 @@ +on: + push: + branches: [ "fabric-1.19.3" ] + pull_request: + branches: [ "fabric-1.19.3" ] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew build --stacktrace --info + - name: Upload a Build Artifact + uses: actions/upload-artifact@v3 + with: + name: Blur-Artifact + path: build/libs/blur-*.*.jar + if-no-files-found: error diff --git a/build.gradle b/build.gradle old mode 100644 new mode 100755 index 04044cf..0319f55 --- a/build.gradle +++ b/build.gradle @@ -1,126 +1,75 @@ -buildscript { - repositories { - mavenCentral() - maven { url = "http://files.minecraftforge.net/maven" } - maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } - } - dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' } -} plugins { - id 'com.matthewprenger.cursegradle' version '1.0.9' + id 'fabric-loom' version '1.1-SNAPSHOT' + id 'maven-publish' } -apply plugin: 'net.minecraftforge.gradle.forge' +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 -boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equals('false'); -ext.buildnumber = System.getenv().BUILD_NUMBER ?: 'custom'; +archivesBaseName = project.archives_base_name +version = project.mod_version +group = project.maven_group -group = 'com.tterrag.blur' -archivesBaseName = "Blur" -version = "${mod_version}-${buildnumber}" +repositories { + maven { + name = 'Ladysnake Mods' + url = 'https://ladysnake.jfrog.io/artifactory/mods' + content { + includeGroup 'io.github.ladysnake' + includeGroupByRegex 'io\\.github\\.onyxstudios.*' + } + } + maven { + url = 'https://maven.terraformersmc.com/releases' + content { + includeGroup 'com.terraformersmc' + } + } + maven { + url = "https://api.modrinth.com/maven" + } +} -sourceCompatibility = '1.8' -targetCompatibility = '1.8' +dependencies { + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" -minecraft { - version = "${minecraft_version}-${forge_version}" - mappings = 'stable_29' - - runDir = 'run' + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modImplementation "io.github.ladysnake:satin:${satin_version}" + include "io.github.ladysnake:satin:${satin_version}" - clientJvmArgs += '-Dfml.coreMods.load=com.tterrag.blur.BlurPlugin' - - replace "@VERSION@", project.version + implementation 'com.google.code.findbugs:jsr305:3.0.2' + modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}" + include "maven.modrinth:midnightlib:${project.midnightlib_version}" } processResources { - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version - - // replace stuff in mcmod.info, nothing else - from(sourceSets.main.resources.srcDirs) { - include '**/*.info' - include '**/*.properties' - - // replace version and mcversion - expand 'version': project.version, 'mcversion': project.minecraft.version - } + inputs.property "version", project.version - // copy everything else, thats not the mcmod.info - from(sourceSets.main.resources.srcDirs) { - exclude '**/*.info' - exclude '**/*.properties' - } + filesMatching("fabric.mod.json") { + expand "version": project.version + } } -jar.manifest { - attributes 'FMLCorePlugin': 'com.tterrag.blur.BlurPlugin' - attributes 'FMLCorePluginContainsFMLMod': 'true' +tasks.withType(JavaCompile).configureEach { + // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. + it.options.release = 17 } -import org.apache.tools.ant.filters.ReplaceTokens -import groovy.json.JsonSlurper - -task createResourcePacks { - def inputFile = new File("resource_packs.json") - def json = new JsonSlurper().parseText(inputFile.text) - json.each { - def pack_id = it.key - def pack_name = it.value.name - def pack_desc = it.value.description - def pack_radius = it.value.radius - - def taskName = "createPack" + pack_id.capitalize(); - task "${taskName}" (type: Zip) { - from ('pack_template') { - filter(ReplaceTokens, tokens: [ - mod_version: project.version.toString(), - pack_version: '3', - description: pack_desc.toString(), - radius: pack_radius.toString() - ]) - - rename(/(.+)\.template/, '$1') - } - - from ('pack_icons') { - include "${pack_id}.png" - rename '.+', 'pack.png' - } - - baseName = "Blur " + pack_name - } - - createResourcePacks.finalizedBy taskName - } +java { + withSourcesJar() } -// Not necessary atm -// tasks.build.dependsOn createResourcePacks - -tasks.curseforge.enabled = !dev && project.hasProperty('curseforge_key') - -curseforge { - if (project.hasProperty('curseforge_key')) { - apiKey = project.curseforge_key - } - - project { - id = project.project_id - changelogType = 'html' - changelog = System.getenv('CHANGELOG') - if (changelog == null || 'none'.equals(changelog)) { - changelog = getChangelog() ?: '' - changelogType = 'text' - } - releaseType = project.release_type - addGameVersion '1.9.4' - addGameVersion '1.11.2' - addGameVersion '1.12' - addGameVersion '1.12.1' - mainArtifact(jar) { - displayName = "Blur ${mod_version}" - } - } +jar { + from "LICENSE" } +// configure the maven publication +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties old mode 100644 new mode 100755 index 40b3c2c..9ae7c37 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,19 @@ -minecraft_version=1.10.2 -forge_version=12.18.3.2297 -mod_version=1.0.4 +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G -project_id=268324 -release_type=release +# Fabric Properties + # check these on https://fabricmc.net/develop + minecraft_version=1.19.3 + yarn_mappings=1.19.3+build.3 + loader_version=0.14.11 + +# Mod Properties + mod_version = 2.7.0 + maven_group = com.tterrag.blur + archives_base_name = blur + +# Dependencies + # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api + fabric_version=0.69.0+1.19.3 + satin_version = 1.10.0 + midnightlib_version=1.2.1-fabric diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index b761216..7454180 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4c3583a..070cb70 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Wed Aug 20 15:17:58 CDT 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 91a7e26..1b6c787 --- a/gradlew +++ b/gradlew @@ -1,79 +1,129 @@ -#!/usr/bin/env bash +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + 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=`basename "$0"` +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" +MAX_FD=maximum -warn ( ) { +warn () { echo "$*" -} +} >&2 -die ( ) { +die () { echo echo "$*" echo exit 1 -} +} >&2 # 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 - ;; +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -82,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + 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 @@ -90,75 +140,95 @@ 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 +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 -# 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 +# 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" ) -# 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\"" + 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 - i=$((i+1)) + # 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 - 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 "$@" +# 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 \ + "$@" + +# 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 index 8a0b282..ac1b06f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,90 +1,89 @@ -@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 +@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%" == "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%"=="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/pack_icons/lite.png b/pack_icons/lite.png deleted file mode 100644 index ac7d032..0000000 Binary files a/pack_icons/lite.png and /dev/null differ diff --git a/pack_icons/strong.png b/pack_icons/strong.png deleted file mode 100644 index 58d336e..0000000 Binary files a/pack_icons/strong.png and /dev/null differ diff --git a/pack_icons/ultra_lite.png b/pack_icons/ultra_lite.png deleted file mode 100644 index b287e04..0000000 Binary files a/pack_icons/ultra_lite.png and /dev/null differ diff --git a/pack_icons/ultra_strong.png b/pack_icons/ultra_strong.png deleted file mode 100644 index dbe72de..0000000 Binary files a/pack_icons/ultra_strong.png and /dev/null differ diff --git a/pack_template/assets/minecraft/shaders/post/fade_in_blur.json.template b/pack_template/assets/minecraft/shaders/post/fade_in_blur.json.template deleted file mode 100644 index b0efb87..0000000 --- a/pack_template/assets/minecraft/shaders/post/fade_in_blur.json.template +++ /dev/null @@ -1,67 +0,0 @@ -{ - "targets": [ - "swap" - ], - "passes": [ - { - "name": "fade_in_blur", - "intarget": "minecraft:main", - "outtarget": "swap", - "uniforms": [ - { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] - }, - { - "name": "Radius", - "values": [ @radius@.0 ] - } - ] - }, - { - "name": "fade_in_blur", - "intarget": "swap", - "outtarget": "minecraft:main", - "uniforms": [ - { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] - }, - { - "name": "Radius", - "values": [ @radius@.0 ] - } - ] - }, - { - "name": "fade_in_blur", - "intarget": "minecraft:main", - "outtarget": "swap", - "uniforms": [ - { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] - }, - { - "name": "Radius", - "values": [ @radius@.0 ] - } - ] - }, - { - "name": "fade_in_blur", - "intarget": "swap", - "outtarget": "minecraft:main", - "uniforms": [ - { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] - }, - { - "name": "Radius", - "values": [ @radius@.0 ] - } - ] - } - ] -} diff --git a/pack_template/pack.mcmeta.template b/pack_template/pack.mcmeta.template deleted file mode 100644 index 37b216d..0000000 --- a/pack_template/pack.mcmeta.template +++ /dev/null @@ -1,7 +0,0 @@ -{ - "pack": { - "_comment": "This pack was made for Blur version @mod_version@", - "pack_format": @pack_version@, - "description": "@description@" - } -} diff --git a/resource_packs.json b/resource_packs.json deleted file mode 100644 index 5ac51fc..0000000 --- a/resource_packs.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "ultra_lite": { - "name": "Ultra Lite", - "radius": 2, - "description": "Least passes, weakest effect, greatest performance. It's like having a smudge on your glasses." - }, - "lite": { - "name": "Lite", - "radius": 8, - "description": "Less passes, weaker effect, greater performance." - }, - "strong": { - "name": "Strong", - "radius": 32, - "description" : "More passes, stronger effect, lesser performance." - }, - "ultra_strong": { - "name": "Ultra Strong", - "radius": 64, - "description": "Too many passes, strongest effect, worst performance. It's like having Vaseline in your eyes." - } -} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..92d3bb6 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + gradlePluginPortal() + } +} + +rootProject.name = "blur" \ No newline at end of file diff --git a/src/main/java/com/tterrag/blur/Blur.java b/src/main/java/com/tterrag/blur/Blur.java index ac046d9..e49d88c 100644 --- a/src/main/java/com/tterrag/blur/Blur.java +++ b/src/main/java/com/tterrag/blur/Blur.java @@ -1,164 +1,81 @@ package com.tterrag.blur; -import java.io.File; -import java.lang.reflect.Field; -import java.util.List; +import com.tterrag.blur.config.BlurConfig; +import eu.midnightdust.lib.util.MidnightColorUtil; +import ladysnake.satin.api.event.ShaderEffectRenderCallback; +import ladysnake.satin.api.managed.ManagedShaderEffect; +import ladysnake.satin.api.managed.ShaderEffectManager; +import ladysnake.satin.api.managed.uniform.Uniform1f; +import net.fabricmc.api.ClientModInitializer; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.util.Identifier; -import javax.annotation.Nonnull; +public class Blur implements ClientModInitializer { -import org.apache.commons.lang3.ArrayUtils; - -import com.google.common.base.Throwables; -import com.tterrag.blur.util.ShaderResourcePack; + public static final String MODID = "blur"; + public static long start; + public static long fadeOutProgress; -import static com.tterrag.blur.Blur.*; + private static final ManagedShaderEffect blur = ShaderEffectManager.getInstance().manage(new Identifier(MODID, "shaders/post/fade_in_blur.json"), + shader -> shader.setUniformValue("Radius", (float) BlurConfig.radius)); + private static final Uniform1f blurProgress = blur.findUniform1f("Progress"); -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiChat; -import net.minecraft.client.renderer.EntityRenderer; -import net.minecraft.client.resources.IResourcePack; -import net.minecraft.client.resources.SimpleReloadableResourceManager; -import net.minecraft.client.shader.Shader; -import net.minecraft.client.shader.ShaderGroup; -import net.minecraft.client.shader.ShaderUniform; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.GuiOpenEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.fml.client.event.ConfigChangedEvent.OnConfigChangedEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventHandler; -import net.minecraftforge.fml.common.Mod.Instance; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; -import net.minecraftforge.fml.common.gameevent.TickEvent.RenderTickEvent; -import net.minecraftforge.fml.relauncher.ReflectionHelper; + @Override + public void onInitializeClient() { + BlurConfig.init("blur", BlurConfig.class); -@Mod(modid = MODID, name = MOD_NAME, version = VERSION, acceptedMinecraftVersions = "[1.9, 1.13)", clientSideOnly = true, guiFactory = "com.tterrag.blur.config.BlurGuiFactory") -public class Blur { - - public static final String MODID = "blur"; - public static final String MOD_NAME = "Blur"; - public static final String VERSION = "@VERSION@"; - - @Instance - public static Blur instance; - - public Configuration config; - - private String[] blurExclusions; - - private Field _listShaders; - private long start; - private int fadeTime; - - public int radius; // Store default so we don't trigger an extra reload - private int colorFirst, colorSecond; - - @Nonnull - private ShaderResourcePack dummyPack = new ShaderResourcePack(); - - @SuppressWarnings("unchecked") - public Blur() { - ((List)ReflectionHelper.getPrivateValue(Minecraft.class, Minecraft.getMinecraft(), "field_110449_ao", "defaultResourcePacks")).add(dummyPack); - } - - @EventHandler - public void preInit(FMLPreInitializationEvent event) { - MinecraftForge.EVENT_BUS.register(this); - - // Add our dummy resourcepack - ((SimpleReloadableResourceManager)Minecraft.getMinecraft().getResourceManager()).registerReloadListener(dummyPack); - - config = new Configuration(new File(event.getModConfigurationDirectory(), "blur.cfg")); - saveConfig(); - } - - private void saveConfig() { - - blurExclusions = config.getStringList("guiExclusions", Configuration.CATEGORY_GENERAL, new String[] { - GuiChat.class.getName(), - }, "A list of classes to be excluded from the blur shader."); - - fadeTime = config.getInt("fadeTime", Configuration.CATEGORY_GENERAL, 200, 0, Integer.MAX_VALUE, "The time it takes for the blur to fade in, in ms."); - - int r = config.getInt("radius", Configuration.CATEGORY_GENERAL, 12, 1, 100, "The radius of the blur effect. This controls how \"strong\" the blur is."); - if (r != radius) { - radius = r; - dummyPack.onResourceManagerReload(Minecraft.getMinecraft().getResourceManager()); - if (Minecraft.getMinecraft().world != null) { - Minecraft.getMinecraft().entityRenderer.stopUseShader(); + ShaderEffectRenderCallback.EVENT.register((deltaTick) -> { + if (start > 0) { + blurProgress.set(getProgress(MinecraftClient.getInstance().currentScreen != null)); + blur.render(deltaTick); } - } - - colorFirst = Integer.parseUnsignedInt( - config.getString("gradientStartColor", Configuration.CATEGORY_GENERAL, "75000000", "The start color of the background gradient. Given in ARGB hex."), - 16 - ); - - colorSecond = Integer.parseUnsignedInt( - config.getString("gradientEndColor", Configuration.CATEGORY_GENERAL, "75000000", "The end color of the background gradient. Given in ARGB hex."), - 16 - ); - - config.save(); - } - - @SubscribeEvent - public void onConfigChanged(OnConfigChangedEvent event) { - if (event.getModID().equals(MODID)) { - saveConfig(); - } + }); } - - @SubscribeEvent - public void onGuiChange(GuiOpenEvent event) { - if (_listShaders == null) { - _listShaders = ReflectionHelper.findField(ShaderGroup.class, "field_148031_d", "listShaders"); - } - if (Minecraft.getMinecraft().world != null) { - EntityRenderer er = Minecraft.getMinecraft().entityRenderer; - boolean excluded = event.getGui() == null || ArrayUtils.contains(blurExclusions, event.getGui().getClass().getName()); - if (!er.isShaderActive() && !excluded) { - er.loadShader(new ResourceLocation("shaders/post/fade_in_blur.json")); + + private static boolean doFade = false; + + public static void onScreenChange(Screen newGui) { + if (MinecraftClient.getInstance().world != null) { + boolean excluded = newGui == null || BlurConfig.blurExclusions.stream().anyMatch(exclusion -> newGui.getClass().getName().contains(exclusion)); + if (!excluded) { + if (BlurConfig.showScreenTitle) System.out.println(newGui.getClass().getName()); + blur.setUniformValue("Radius", (float) BlurConfig.radius); + if (doFade) { + start = System.currentTimeMillis(); + doFade = false; + } + fadeOutProgress = BlurConfig.fadeOutTimeMillis; + } else if (newGui == null && fadeOutProgress > 0) { + blur.setUniformValue("Radius", (float) BlurConfig.radius); start = System.currentTimeMillis(); - } else if (er.isShaderActive() && excluded) { - er.stopUseShader(); + } else { + start = -1; + doFade = true; } } } - - private float getProgress() { - return Math.min((System.currentTimeMillis() - start) / (float) fadeTime, 1); - } - - @SubscribeEvent - public void onRenderTick(RenderTickEvent event) { - if (event.phase == Phase.END && Minecraft.getMinecraft().currentScreen != null && Minecraft.getMinecraft().entityRenderer.isShaderActive()) { - ShaderGroup sg = Minecraft.getMinecraft().entityRenderer.getShaderGroup(); - try { - @SuppressWarnings("unchecked") - List shaders = (List) _listShaders.get(sg); - for (Shader s : shaders) { - ShaderUniform su = s.getShaderManager().getShaderUniform("Progress"); - if (su != null) { - su.set(getProgress()); - } - } - } catch (IllegalArgumentException | IllegalAccessException e) { - Throwables.propagate(e); - } + + private static float getProgress(boolean fadeIn) { + if (fadeIn) { + float x = Math.min((System.currentTimeMillis() - start) / (float) BlurConfig.fadeTimeMillis, 1); + if (BlurConfig.ease) x *= (2 - x); // easeInCubic + return x; + } + else { + float x = Math.min((System.currentTimeMillis() - start) / (float) BlurConfig.fadeOutTimeMillis, 1); + if (BlurConfig.ease) x *= (2 - x); // easeOutCubic + return -x + BlurConfig.fadeOutTimeMillis; } } - - public static int getBackgroundColor(boolean second) { - int color = second ? instance.colorSecond : instance.colorFirst; - int a = color >>> 24; - int r = (color >> 16) & 0xFF; - int b = (color >> 8) & 0xFF; - int g = color & 0xFF; - float prog = instance.getProgress(); + + public static int getBackgroundColor(boolean second, Screen screen) { + int a = second ? BlurConfig.gradientEndAlpha : BlurConfig.gradientStartAlpha; + var col = MidnightColorUtil.hex2Rgb(second ? BlurConfig.gradientEnd : BlurConfig.gradientStart); + int r = (col.getRGB() >> 16) & 0xFF; + int b = (col.getRGB() >> 8) & 0xFF; + int g = col.getRGB() & 0xFF; + float prog = getProgress(screen != null); a *= prog; r *= prog; g *= prog; diff --git a/src/main/java/com/tterrag/blur/BlurPlugin.java b/src/main/java/com/tterrag/blur/BlurPlugin.java deleted file mode 100644 index 2134c72..0000000 --- a/src/main/java/com/tterrag/blur/BlurPlugin.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tterrag.blur; - -import java.util.Map; - -import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; - -@IFMLLoadingPlugin.SortingIndex(Integer.MAX_VALUE) -public class BlurPlugin implements IFMLLoadingPlugin { - - @Override - public String[] getASMTransformerClass() { - return new String[] { "com.tterrag.blur.BlurTransformer" }; - } - - @Override - public String getModContainerClass() { - return null; - } - - @Override - public String getSetupClass() { - return null; - } - - @Override - public void injectData(Map data) { - } - - @Override - public String getAccessTransformerClass() { - return null; - } -} diff --git a/src/main/java/com/tterrag/blur/BlurTransformer.java b/src/main/java/com/tterrag/blur/BlurTransformer.java deleted file mode 100644 index 31741ee..0000000 --- a/src/main/java/com/tterrag/blur/BlurTransformer.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.tterrag.blur; - -import java.util.Iterator; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.AbstractInsnNode; -import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.InsnNode; -import org.objectweb.asm.tree.MethodInsnNode; -import org.objectweb.asm.tree.MethodNode; - -import net.minecraft.launchwrapper.IClassTransformer; - -public class BlurTransformer implements IClassTransformer { - - private static final String GUI_SCREEN_CLASS_NAME = "net.minecraft.client.gui.GuiScreen"; - - private static final String DRAW_WORLD_BAGKGROUND_METHOD = "drawWorldBackground"; - private static final String DRAW_WORLD_BAGKGROUND_METHOD_OBF = "func_146270_b"; - - private static final String BLUR_MAIN_CLASS = "com/tterrag/blur/Blur"; - private static final String COLOR_HOOK_METHOD_NAME = "getBackgroundColor"; - private static final String COLOR_HOOK_METHOD_DESC = "(Z)I"; - - @Override - public byte[] transform(String name, String transformedName, byte[] basicClass) { - if (transformedName.equals(GUI_SCREEN_CLASS_NAME)) { - System.out.println("Transforming Class [" + transformedName + "], Method [" + DRAW_WORLD_BAGKGROUND_METHOD + "]"); - - ClassNode classNode = new ClassNode(); - ClassReader classReader = new ClassReader(basicClass); - classReader.accept(classNode, 0); - - Iterator methods = classNode.methods.iterator(); - - while (methods.hasNext()) { - MethodNode m = methods.next(); - if (m.name.equals(DRAW_WORLD_BAGKGROUND_METHOD) || m.name.equals(DRAW_WORLD_BAGKGROUND_METHOD_OBF)) { - for (int i = 0; i < m.instructions.size(); i++) { - AbstractInsnNode next = m.instructions.get(i); - -// if (next.getOpcode() == Opcodes.INVOKEVIRTUAL && ((MethodInsnNode)next).name.equals(DRAW_GRADIENT_RECT_METHOD_NAME)) { -// while (!(next instanceof LabelNode)) { -// m.instructions.remove(next); -// next = m.instructions.get(--i); -// } -// break; -// } - if (next.getOpcode() == Opcodes.LDC) { - System.out.println("Modifying GUI background darkness... "); - AbstractInsnNode colorHook = new MethodInsnNode(Opcodes.INVOKESTATIC, BLUR_MAIN_CLASS, COLOR_HOOK_METHOD_NAME, COLOR_HOOK_METHOD_DESC, false); - AbstractInsnNode colorHook2 = colorHook.clone(null); - - // Replace LDC with hooks - m.instructions.set(next, colorHook); - m.instructions.set(colorHook.getNext(), colorHook2); - - // Load boolean constants for method param - m.instructions.insertBefore(colorHook, new InsnNode(Opcodes.ICONST_1)); - m.instructions.insertBefore(colorHook2, new InsnNode(Opcodes.ICONST_0)); - break; - } - } - break; - } - } - - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); - classNode.accept(cw); - System.out.println("Transforming " + transformedName + " Finished."); - return cw.toByteArray(); - } - - return basicClass; - } - -} diff --git a/src/main/java/com/tterrag/blur/config/BlurConfig.java b/src/main/java/com/tterrag/blur/config/BlurConfig.java new file mode 100644 index 0000000..d8ec801 --- /dev/null +++ b/src/main/java/com/tterrag/blur/config/BlurConfig.java @@ -0,0 +1,39 @@ +package com.tterrag.blur.config; + +import com.google.common.collect.Lists; +import eu.midnightdust.lib.config.MidnightConfig; +import net.minecraft.client.gui.screen.ChatScreen; + +import java.util.List; + +public class BlurConfig extends MidnightConfig { + public static final String style = "style"; + public static final String misc = "misc"; + + + @Entry(category = misc) + public static List blurExclusions = Lists.newArrayList(ChatScreen.class.getName(), + "com.replaymod.lib.de.johni0702.minecraft.gui.container.AbstractGuiOverlay$UserInputGuiScreen", + "ai.arcblroth.projectInception.client.InceptionInterfaceScreen", + "net.optifine.gui.GuiChatOF", + "io.github.darkkronicle.advancedchatcore.chat.AdvancedChatScreen", + "net.coderbot.iris.gui.screen.ShaderPackScreen"); + @Entry(category = style, min = 0, max = 5000, width = 4) + public static int fadeTimeMillis = 200; + @Entry(category = style, min = 0, max = 5000, width = 4) + public static int fadeOutTimeMillis = 200; + @Entry(category = style) + public static boolean ease = true; + @Entry(category = style, isSlider = true, min = 0, max = 100) + public static int radius = 8; + @Entry(category = style, isColor = true, width = 7, min = 7) + public static String gradientStart = "#000000"; + @Entry(category = style, isSlider = true, min = 0, max = 255) + public static int gradientStartAlpha = 75; + @Entry(category = style, isColor = true, width = 7, min = 7) + public static String gradientEnd = "#000000"; + @Entry(category = style, isSlider = true, min = 0, max = 255) + public static int gradientEndAlpha = 75; + @Entry(category = misc) + public static boolean showScreenTitle = false; +} \ No newline at end of file diff --git a/src/main/java/com/tterrag/blur/config/BlurConfigGui.java b/src/main/java/com/tterrag/blur/config/BlurConfigGui.java deleted file mode 100644 index b71063c..0000000 --- a/src/main/java/com/tterrag/blur/config/BlurConfigGui.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.tterrag.blur.config; - -import javax.annotation.Nonnull; - -import com.tterrag.blur.Blur; - -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.resources.I18n; -import net.minecraftforge.common.config.ConfigElement; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.fml.client.config.GuiConfig; -import net.minecraftforge.fml.client.config.GuiConfigEntries; - -public class BlurConfigGui extends GuiConfig { - - public BlurConfigGui(GuiScreen parentScreen) { - super(parentScreen, new ConfigElement(Blur.instance.config.getCategory(Configuration.CATEGORY_GENERAL)).getChildElements(), Blur.MODID, false, false, I18n.format(Blur.MODID + ".config.title")); - } - - @Override - public void initGui() { - if (this.entryList == null || this.needsRefresh) - { - this.entryList = new GuiConfigEntries(this, mc) { - @SuppressWarnings({ "unused", "null" }) - @Override - protected void drawContainerBackground(@Nonnull Tessellator tessellator) { - if (mc.world == null) { - super.drawContainerBackground(tessellator); - } - } - }; - this.needsRefresh = false; - } - super.initGui(); - } - - @Override - public void drawDefaultBackground() { - drawWorldBackground(0); - } -} diff --git a/src/main/java/com/tterrag/blur/config/BlurGuiFactory.java b/src/main/java/com/tterrag/blur/config/BlurGuiFactory.java deleted file mode 100644 index f8bdf1f..0000000 --- a/src/main/java/com/tterrag/blur/config/BlurGuiFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tterrag.blur.config; - -import java.util.Set; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.fml.client.IModGuiFactory; - -public class BlurGuiFactory implements IModGuiFactory { - - @Override - public void initialize(Minecraft minecraftInstance) {} - - @Override - public Class mainConfigGuiClass() { - return BlurConfigGui.class; - } - - @Override - public Set runtimeGuiCategories() { - return null; - } - - @Override - @Deprecated - public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) { - return null; - } - -// 1.12 -// @Override - public boolean hasConfigGui() { - return true; - } - -// 1.12 -// @Override - public GuiScreen createConfigGui(GuiScreen parentScreen) { - return new BlurConfigGui(parentScreen); - } -} diff --git a/src/main/java/com/tterrag/blur/mixin/MixinInGameHud.java b/src/main/java/com/tterrag/blur/mixin/MixinInGameHud.java new file mode 100644 index 0000000..2dec110 --- /dev/null +++ b/src/main/java/com/tterrag/blur/mixin/MixinInGameHud.java @@ -0,0 +1,25 @@ +package com.tterrag.blur.mixin; + +import com.tterrag.blur.Blur; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.gui.hud.InGameHud; +import net.minecraft.client.util.math.MatrixStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(InGameHud.class) +public class MixinInGameHud extends DrawableHelper { + @Shadow private int scaledWidth; + @Shadow private int scaledHeight; + @Shadow private MinecraftClient client; + @Inject(at = @At("HEAD"), method = "render") + public void blur$onRender(MatrixStack matrices, float tickDelta, CallbackInfo ci) { + if (client.currentScreen == null && client.world != null && Blur.start > 0) { + this.fillGradient(matrices, 0, 0, this.scaledWidth, this.scaledHeight, Blur.getBackgroundColor(false, null), Blur.getBackgroundColor(true, null)); + } + } +} diff --git a/src/main/java/com/tterrag/blur/mixin/MixinMinecraftClient.java b/src/main/java/com/tterrag/blur/mixin/MixinMinecraftClient.java new file mode 100755 index 0000000..8704218 --- /dev/null +++ b/src/main/java/com/tterrag/blur/mixin/MixinMinecraftClient.java @@ -0,0 +1,24 @@ +package com.tterrag.blur.mixin; + +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.tterrag.blur.Blur; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; + +@Mixin(MinecraftClient.class) +public class MixinMinecraftClient { + + @Inject(method = "setScreen", + at = @At(value = "FIELD", + target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;", + opcode = Opcodes.PUTFIELD)) + private void onScreenOpen(Screen newScreen, CallbackInfo info) { + Blur.onScreenChange(newScreen); + } +} diff --git a/src/main/java/com/tterrag/blur/mixin/MixinScreen.java b/src/main/java/com/tterrag/blur/mixin/MixinScreen.java new file mode 100755 index 0000000..16ab017 --- /dev/null +++ b/src/main/java/com/tterrag/blur/mixin/MixinScreen.java @@ -0,0 +1,44 @@ +package com.tterrag.blur.mixin; + +import net.minecraft.client.MinecraftClient; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +import com.tterrag.blur.Blur; + +import net.minecraft.client.gui.screen.Screen; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Locale; + +@Mixin(Screen.class) +public abstract class MixinScreen { + + @Shadow @Nullable protected MinecraftClient client; + + @Inject(at = @At("HEAD"), method = "tick") + private void blur$reloadShader(CallbackInfo ci) { + if (this.getClass().toString().toLowerCase(Locale.ROOT).contains("midnightconfigscreen") && this.client != null) { + Blur.onScreenChange(this.client.currentScreen); + } + } + + @ModifyConstant( + method = "renderBackground(Lnet/minecraft/client/util/math/MatrixStack;I)V", + constant = @Constant(intValue = -1072689136)) + private int blur$getFirstBackgroundColor(int color) { + return Blur.getBackgroundColor(false, client.currentScreen); + } + + @ModifyConstant( + method = "renderBackground(Lnet/minecraft/client/util/math/MatrixStack;I)V", + constant = @Constant(intValue = -804253680)) + private int blur$getSecondBackgroundColor(int color) { + return Blur.getBackgroundColor(true, client.currentScreen); + } +} diff --git a/src/main/java/com/tterrag/blur/util/ShaderResourcePack.java b/src/main/java/com/tterrag/blur/util/ShaderResourcePack.java deleted file mode 100644 index 5232c3b..0000000 --- a/src/main/java/com/tterrag/blur/util/ShaderResourcePack.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.tterrag.blur.util; - -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Scanner; -import java.util.Set; - -import com.google.common.collect.ImmutableSet; -import com.tterrag.blur.Blur; - -import net.minecraft.client.resources.IResourceManager; -import net.minecraft.client.resources.IResourceManagerReloadListener; -import net.minecraft.client.resources.IResourcePack; -import net.minecraft.client.resources.data.IMetadataSection; -import net.minecraft.client.resources.data.MetadataSerializer; -import net.minecraft.client.resources.data.PackMetadataSection; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.TextComponentString; - -public class ShaderResourcePack implements IResourcePack, IResourceManagerReloadListener { - - protected boolean validPath(ResourceLocation location) { - return location.getResourceDomain().equals("minecraft") && location.getResourcePath().startsWith("shaders/"); - } - - private final Map loadedData = new HashMap<>(); - - @Override - public InputStream getInputStream(ResourceLocation location) throws IOException { - if (validPath(location)) { - String s = loadedData.computeIfAbsent(location, loc -> { - InputStream in = Blur.class.getResourceAsStream("/" + location.getResourcePath()); - StringBuilder data = new StringBuilder(); - Scanner scan = new Scanner(in); - try { - while (scan.hasNextLine()) { - data.append(scan.nextLine().replaceAll("@radius@", Integer.toString(Blur.instance.radius))).append('\n'); - } - } finally { - scan.close(); - } - return data.toString(); - }); - - return new ByteArrayInputStream(s.getBytes()); - } - throw new FileNotFoundException(location.toString()); - } - - @Override - public boolean resourceExists(ResourceLocation location) { - return validPath(location) && Blur.class.getResource("/" + location.getResourcePath()) != null; - } - - @Override - public Set getResourceDomains() { - return ImmutableSet.of("minecraft"); - } - - @SuppressWarnings({ "unchecked", "null" }) - @Override - public T getPackMetadata(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException { - if ("pack".equals(metadataSectionName)) { - return (T) new PackMetadataSection(new TextComponentString("Blur's default shaders"), 3); - } - return null; - } - - @Override - public BufferedImage getPackImage() throws IOException { - throw new FileNotFoundException("pack.png"); - } - - @Override - public String getPackName() { - return "Blur dummy resource pack"; - } - - @Override - public void onResourceManagerReload(IResourceManager resourceManager) { - loadedData.clear(); - } - -} diff --git a/src/main/resources/assets/blur/icon.png b/src/main/resources/assets/blur/icon.png new file mode 100644 index 0000000..4523cee Binary files /dev/null and b/src/main/resources/assets/blur/icon.png differ diff --git a/src/main/resources/assets/blur/lang/de_de.json b/src/main/resources/assets/blur/lang/de_de.json new file mode 100644 index 0000000..c9ccafb --- /dev/null +++ b/src/main/resources/assets/blur/lang/de_de.json @@ -0,0 +1,12 @@ +{ + "blur.midnightconfig.title": "Blur Konfiguration", + "blur.midnightconfig.blurExclusions": "Blur-Ausnahmen", + "blur.midnightconfig.fadeTimeMillis": "Überblendzeit (in Millisekunden)", + "blur.midnightconfig.ease": "Geschmeidige Animation", + "blur.midnightconfig.radius": "Radius", + "blur.midnightconfig.gradientStart": "Farbverlauf-Anfangsfarbe", + "blur.midnightconfig.gradientEnd": "Farbverlauf-Endfarbe", + "blur.midnightconfig.gradientStartAlpha": "Farbverlauf-Anfangstransparenz", + "blur.midnightconfig.gradientEndAlpha": "Farbverlauf-Endstransparenz", + "blur.midnightconfig.showScreenTitle": "Zeige Bildschirmtitel" +} \ No newline at end of file diff --git a/src/main/resources/assets/blur/lang/en_US.lang b/src/main/resources/assets/blur/lang/en_US.lang deleted file mode 100644 index b22ed4e..0000000 --- a/src/main/resources/assets/blur/lang/en_US.lang +++ /dev/null @@ -1 +0,0 @@ -blur.config.title=Blur Config \ No newline at end of file diff --git a/src/main/resources/assets/blur/lang/en_gb.json b/src/main/resources/assets/blur/lang/en_gb.json new file mode 100644 index 0000000..6c08c5e --- /dev/null +++ b/src/main/resources/assets/blur/lang/en_gb.json @@ -0,0 +1,4 @@ +{ + "blur.midnightconfig.gradientStart": "Gradient Start Colour", + "blur.midnightconfig.gradientEnd": "Gradient End Colour" +} \ No newline at end of file diff --git a/src/main/resources/assets/blur/lang/en_us.json b/src/main/resources/assets/blur/lang/en_us.json new file mode 100755 index 0000000..71ef601 --- /dev/null +++ b/src/main/resources/assets/blur/lang/en_us.json @@ -0,0 +1,15 @@ +{ + "blur.midnightconfig.title": "Blur Config", + "blur.midnightconfig.category.style": "Style", + "blur.midnightconfig.category.misc": "Miscellaneous", + "blur.midnightconfig.blurExclusions": "Blur Exclusions", + "blur.midnightconfig.fadeTimeMillis": "Fade Time (in milliseconds)", + "blur.midnightconfig.fadeOutTimeMillis": "Fade Out Time (in milliseconds)", + "blur.midnightconfig.ease": "Ease Animation", + "blur.midnightconfig.radius": "Radius", + "blur.midnightconfig.gradientStart": "Gradient Start Color", + "blur.midnightconfig.gradientEnd": "Gradient End Color", + "blur.midnightconfig.gradientStartAlpha": "Gradient Start Alpha", + "blur.midnightconfig.gradientEndAlpha": "Gradient End Alpha", + "blur.midnightconfig.showScreenTitle": "Show screen title" +} \ No newline at end of file diff --git a/src/main/resources/assets/blur/lang/ko_kr.json b/src/main/resources/assets/blur/lang/ko_kr.json new file mode 100644 index 0000000..ad37eb6 --- /dev/null +++ b/src/main/resources/assets/blur/lang/ko_kr.json @@ -0,0 +1,11 @@ +{ + "blur.midnightconfig.title": "Blur 설정", + "blur.midnightconfig.blurExclusions": "블러 제외", + "blur.midnightconfig.fadeTimeMillis": "페이드 시간 (밀리초 단위)", + "blur.midnightconfig.radius": "범위", + "blur.midnightconfig.gradientStart": "그라디언트 시작 색상", + "blur.midnightconfig.gradientEnd": "그라디언트 종료 색상", + "blur.midnightconfig.gradientStartAlpha": "그라디언트 시작 알파", + "blur.midnightconfig.gradientEndAlpha": "그라디언트 종료 알파", + "blur.midnightconfig.showScreenTitle": "화면 타이틀 보기" +} \ No newline at end of file diff --git a/src/main/resources/assets/blur/lang/pt_br.json b/src/main/resources/assets/blur/lang/pt_br.json new file mode 100644 index 0000000..12fb78f --- /dev/null +++ b/src/main/resources/assets/blur/lang/pt_br.json @@ -0,0 +1,12 @@ +{ + "blur.midnightconfig.title": "Configuração de desfoque", + "blur.midnightconfig.blurExclusions": "Desfocar exclusões", + "blur.midnightconfig.fadeTimeMillis": "Tempo de desvanecimento (em milissegundos)", + "blur.midnightconfig.ease": "Animação fácil", + "blur.midnightconfig.radius": "Raio", + "blur.midnightconfig.gradientStart": "Cor inicial do gradiente", + "blur.midnightconfig.gradientEnd": "Cor final do gradiente", + "blur.midnightconfig.gradientStartAlpha": "Alfa de início gradiente", + "blur.midnightconfig.gradientEndAlpha": "Alfa de Gradiente Final", + "blur.midnightconfig.showScreenTitle": "Mostrar título da tela" +} \ No newline at end of file diff --git a/src/main/resources/assets/blur/lang/ru_ru.json b/src/main/resources/assets/blur/lang/ru_ru.json new file mode 100644 index 0000000..e3cbd6d --- /dev/null +++ b/src/main/resources/assets/blur/lang/ru_ru.json @@ -0,0 +1,8 @@ +{ + "blur.midnightconfig.title": "Настройки Blur", + "blur.midnightconfig.blurExclusions": "Исключения размытия", + "blur.midnightconfig.fadeTimeMillis": "Время размытия (в милисекундах)", + "blur.midnightconfig.radius": "Радиус размытия", + "blur.midnightconfig.gradientStart": "Верхний цвет градиента", + "blur.midnightconfig.gradientEnd": "Нижний цвет градиента" +} diff --git a/src/main/resources/assets/blur/lang/sv_se.json b/src/main/resources/assets/blur/lang/sv_se.json new file mode 100644 index 0000000..03404c6 --- /dev/null +++ b/src/main/resources/assets/blur/lang/sv_se.json @@ -0,0 +1,9 @@ +{ + "blur.midnightconfig.title": "Blur Config", + "blur.midnightconfig.blurExclusions": "Undantag till Blur", + "blur.midnightconfig.fadeTimeMillis": "Toningstid (i millisekunder)", + "blur.midnightconfig.radius": "Radie", + "blur.midnightconfig.gradientStart": "Toningsfärg (start)", + "blur.midnightconfig.gradientEnd": "Toningsfärg (slut)", + "blur.midnightconfig.showScreenTitle": "Visa skärmtitel" +} \ No newline at end of file diff --git a/src/main/resources/assets/blur/lang/uk_ua.json b/src/main/resources/assets/blur/lang/uk_ua.json new file mode 100644 index 0000000..c52175a --- /dev/null +++ b/src/main/resources/assets/blur/lang/uk_ua.json @@ -0,0 +1,12 @@ +{ + "blur.midnightconfig.title": "Конфігурація Blur", + "blur.midnightconfig.blurExclusions": "Винятки розмиття", + "blur.midnightconfig.fadeTimeMillis": "Час появи розмиття (у мілісекундах)", + "blur.midnightconfig.ease": "Пом'якшення анімації", + "blur.midnightconfig.radius": "Радіус", + "blur.midnightconfig.gradientStart": "Початковий колір градієнта", + "blur.midnightconfig.gradientEnd": "Кінцевий колір градієнта", + "blur.midnightconfig.gradientStartAlpha": "Початкова прозорість градієнта", + "blur.midnightconfig.gradientEndAlpha": "Кінцева прозорість градієнтаa", + "blur.midnightconfig.showScreenTitle": "Показати назву екрана" +} diff --git a/src/main/resources/assets/blur/lang/zh_cn.json b/src/main/resources/assets/blur/lang/zh_cn.json new file mode 100644 index 0000000..0e4c81b --- /dev/null +++ b/src/main/resources/assets/blur/lang/zh_cn.json @@ -0,0 +1,12 @@ +{ + "blur.midnightconfig.title": "模糊配置", + "blur.midnightconfig.blurExclusions": "模糊排除", + "blur.midnightconfig.fadeTimeMillis": "淡入时间(毫秒)", + "blur.midnightconfig.ease": "简单动画", + "blur.midnightconfig.radius": "半径", + "blur.midnightconfig.gradientStart": "渐变起始色", + "blur.midnightconfig.gradientEnd": "渐变结束色", + "blur.midnightconfig.gradientStartAlpha": "渐变起始阿尔法通道", + "blur.midnightconfig.gradientEndAlpha": "渐变结束阿尔法通道", + "blur.midnightconfig.showScreenTitle": "显示屏幕标题" +} diff --git a/src/main/resources/shaders/post/fade_in_blur.json b/src/main/resources/assets/blur/shaders/post/fade_in_blur.json similarity index 80% rename from src/main/resources/shaders/post/fade_in_blur.json rename to src/main/resources/assets/blur/shaders/post/fade_in_blur.json index b0efb87..2d9074b 100644 --- a/src/main/resources/shaders/post/fade_in_blur.json +++ b/src/main/resources/assets/blur/shaders/post/fade_in_blur.json @@ -4,7 +4,7 @@ ], "passes": [ { - "name": "fade_in_blur", + "name": "blur:fade_in_blur", "intarget": "minecraft:main", "outtarget": "swap", "uniforms": [ @@ -14,12 +14,12 @@ }, { "name": "Radius", - "values": [ @radius@.0 ] + "values": [ 8.0 ] } ] }, { - "name": "fade_in_blur", + "name": "blur:fade_in_blur", "intarget": "swap", "outtarget": "minecraft:main", "uniforms": [ @@ -29,12 +29,12 @@ }, { "name": "Radius", - "values": [ @radius@.0 ] + "values": [ 8.0 ] } ] }, { - "name": "fade_in_blur", + "name": "blur:fade_in_blur", "intarget": "minecraft:main", "outtarget": "swap", "uniforms": [ @@ -44,12 +44,12 @@ }, { "name": "Radius", - "values": [ @radius@.0 ] + "values": [ 8.0 ] } ] }, { - "name": "fade_in_blur", + "name": "blur:fade_in_blur", "intarget": "swap", "outtarget": "minecraft:main", "uniforms": [ @@ -59,7 +59,7 @@ }, { "name": "Radius", - "values": [ @radius@.0 ] + "values": [ 8.0 ] } ] } diff --git a/src/main/resources/shaders/program/fade_in_blur.fsh b/src/main/resources/assets/blur/shaders/program/fade_in_blur.fsh similarity index 74% rename from src/main/resources/shaders/program/fade_in_blur.fsh rename to src/main/resources/assets/blur/shaders/program/fade_in_blur.fsh index 5539f39..a2e0fef 100644 --- a/src/main/resources/shaders/program/fade_in_blur.fsh +++ b/src/main/resources/assets/blur/shaders/program/fade_in_blur.fsh @@ -1,9 +1,9 @@ -#version 120 +#version 150 uniform sampler2D DiffuseSampler; -varying vec2 texCoord; -varying vec2 oneTexel; +in vec2 texCoord; +in vec2 oneTexel; uniform vec2 InSize; @@ -11,6 +11,8 @@ uniform vec2 BlurDir; uniform float Radius; uniform float Progress; +out vec4 fragColor; + void main() { vec4 blurred = vec4(0.0); float totalStrength = 0.0; @@ -18,7 +20,7 @@ void main() { float totalSamples = 0.0; float progRadius = floor(Radius * Progress); for(float r = -progRadius; r <= progRadius; r += 1.0) { - vec4 sample = texture2D(DiffuseSampler, texCoord + oneTexel * r * BlurDir); + vec4 sample = texture(DiffuseSampler, texCoord + oneTexel * r * BlurDir); // Accumulate average alpha totalAlpha = totalAlpha + sample.a; @@ -29,5 +31,5 @@ void main() { totalStrength = totalStrength + strength; blurred = blurred + sample; } - gl_FragColor = vec4(blurred.rgb / (progRadius * 2.0 + 1.0), totalAlpha); + fragColor = vec4(blurred.rgb / (progRadius * 2.0 + 1.0), totalAlpha); } diff --git a/src/main/resources/shaders/program/fade_in_blur.json b/src/main/resources/assets/blur/shaders/program/fade_in_blur.json similarity index 89% rename from src/main/resources/shaders/program/fade_in_blur.json rename to src/main/resources/assets/blur/shaders/program/fade_in_blur.json index 25425f3..77b59aa 100644 --- a/src/main/resources/shaders/program/fade_in_blur.json +++ b/src/main/resources/assets/blur/shaders/program/fade_in_blur.json @@ -1,11 +1,11 @@ { "blend": { "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" }, "vertex": "sobel", - "fragment": "fade_in_blur", + "fragment": "blur:fade_in_blur", "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100755 index 0000000..a16a204 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,30 @@ +{ + "schemaVersion": 1, + "id": "blur", + "name": "Blur (Fabric)", + "version": "$version", + "environment": "client", + "license": "MIT", + "icon": "assets/blur/icon.png", + "entrypoints": { + "client": [ + "com.tterrag.blur.Blur" + ] + }, + "contact": { + "homepage": "https://www.curseforge.com/minecraft/mc-mods/blur-fabric", + "sources": "https://github.com/Motschen/Blur", + "issues": "https://github.com/Motschen/Blur/issues" + }, + "authors": [ + "tterrag1098", + "Pyrofab", + "Motschen", + "backryun", + "byquanton" + ], + "description": "Modifies the background behind Minecraft GUIs to have a blur effect", + "mixins": [ + "mixins.blur.json" + ] +} diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info deleted file mode 100644 index 97fd4cd..0000000 --- a/src/main/resources/mcmod.info +++ /dev/null @@ -1,16 +0,0 @@ -[ -{ - "modid": "blur", - "name": "Blur", - "description": "Adds a blurry background when viewing GUIs", - "version": "${version}", - "mcversion": "${mcversion}", - "url": "http://tterrag.com", - "updateUrl": "http://ci.tterrag.com/job/BlurBG", - "authorList": ["tterrag"], - "credits": "", - "logoFile": "", - "screenshots": [], - "dependencies": [] -} -] \ No newline at end of file diff --git a/src/main/resources/mixins.blur.json b/src/main/resources/mixins.blur.json new file mode 100644 index 0000000..25d331c --- /dev/null +++ b/src/main/resources/mixins.blur.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.tterrag.blur.mixin", + "compatibilityLevel": "JAVA_17", + "client": [ + "MixinScreen", + "MixinMinecraftClient", + "MixinInGameHud" + ], + "injectors": { + "defaultRequire": 1 + } +}