From 560e943d283956d5801cee6818f49d3cb8f42428 Mon Sep 17 00:00:00 2001 From: firef1a Date: Thu, 23 May 2024 09:47:06 -0700 Subject: [PATCH] main --- .gitattributes | 9 + .github/workflows/build.yml | 37 + .gitignore | 40 + LICENSE | 121 ++ build.gradle | 88 ++ gradle.properties | 19 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 249 ++++ gradlew.bat | 92 ++ settings.gradle | 10 + src/main/java/dev/fire/DFrevert.java | 22 + src/main/java/dev/fire/FileManager.java | 79 ++ src/main/java/dev/fire/TextUtil.java | 341 +++++ src/main/java/dev/fire/config/ChatTag.java | 18 + src/main/java/dev/fire/config/Config.java | 1203 +++++++++++++++++ .../java/dev/fire/config/DefaultConfig.java | 37 + .../dev/fire/config/ModMenuIntegration.java | 12 + .../java/dev/fire/mixin/ChatHudMixin.java | 20 + .../dev/fire/mixin/EntityRendererMixin.java | 19 + .../java/dev/fire/mixin/ExampleMixin.java | 15 + .../dev/fire/mixin/PlayerListHudMixin.java | 20 + src/main/resources/assets/dfrevert/icon.png | Bin 0 -> 77364 bytes src/main/resources/assets/dfrevert/icon2.png | Bin 0 -> 2857 bytes src/main/resources/dfrevert.mixins.json | 14 + src/main/resources/fabric.mod.json | 37 + 26 files changed, 2509 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/dev/fire/DFrevert.java create mode 100644 src/main/java/dev/fire/FileManager.java create mode 100644 src/main/java/dev/fire/TextUtil.java create mode 100644 src/main/java/dev/fire/config/ChatTag.java create mode 100644 src/main/java/dev/fire/config/Config.java create mode 100644 src/main/java/dev/fire/config/DefaultConfig.java create mode 100644 src/main/java/dev/fire/config/ModMenuIntegration.java create mode 100644 src/main/java/dev/fire/mixin/ChatHudMixin.java create mode 100644 src/main/java/dev/fire/mixin/EntityRendererMixin.java create mode 100644 src/main/java/dev/fire/mixin/ExampleMixin.java create mode 100644 src/main/java/dev/fire/mixin/PlayerListHudMixin.java create mode 100644 src/main/resources/assets/dfrevert/icon.png create mode 100644 src/main/resources/assets/dfrevert/icon2.png create mode 100644 src/main/resources/dfrevert.mixins.json create mode 100644 src/main/resources/fabric.mod.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..097f9f9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..b01da52 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,37 @@ +# Automatically build the project and run any configured tests for every push +# and submitted pull request. This can help catch issues that only occur on +# certain platforms or Java versions, and provides a first line of defence +# against bad commits. + +name: build +on: [pull_request, push] + +jobs: + build: + strategy: + matrix: + # Use these Java versions + java: [ + 21, # Current Java LTS + ] + runs-on: ubuntu-22.04 + steps: + - name: checkout repository + uses: actions/checkout@v4 + - name: validate gradle wrapper + uses: gradle/wrapper-validation-action@v2 + - name: setup jdk ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.java }} + distribution: 'microsoft' + - name: make gradle wrapper executable + run: chmod +x ./gradlew + - name: build + run: ./gradlew build + - name: capture build artifacts + if: ${{ matrix.java == '21' }} # Only upload artifacts built from latest java + uses: actions/upload-artifact@v4 + with: + name: Artifacts + path: build/libs/ \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c476faf --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# gradle + +.gradle/ +build/ +out/ +classes/ + +# eclipse + +*.launch + +# idea + +.idea/ +*.iml +*.ipr +*.iws + +# vscode + +.settings/ +.vscode/ +bin/ +.classpath +.project + +# macos + +*.DS_Store + +# fabric + +run/ + +# java + +hs_err_*.log +replay_*.log +*.hprof +*.jfr diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1625c17 --- /dev/null +++ b/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..f2aa550 --- /dev/null +++ b/build.gradle @@ -0,0 +1,88 @@ +plugins { + id 'fabric-loom' version '1.6-SNAPSHOT' + id 'maven-publish' +} + +version = project.mod_version +group = project.maven_group + +base { + archivesName = project.archives_base_name +} + +repositories { + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories + maven { + name = "Terraformers" + url = "https://maven.terraformersmc.com/" + } + maven { + name 'Xander Maven' + url 'https://maven.isxander.dev/releases' + } +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + + modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}" + modImplementation "dev.isxander:yet-another-config-lib:${project.yacl_version}+${project.minecraft_version}-fabric" + + +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() + + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +jar { + from("LICENSE") { + rename { "${it}_${project.base.archivesName.get()}"} + } +} + +// configure the maven publication +publishing { + publications { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..e51673b --- /dev/null +++ b/gradle.properties @@ -0,0 +1,19 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.20.4 +yarn_mappings=1.20.4+build.3 +loader_version=0.15.11 + +# Mod Properties +mod_version=1.0.0 +maven_group=dev.fire +archives_base_name=dfrevert + +# Dependencies +fabric_version=0.97.0+1.20.4 +modmenu_version=9.0.0 +yacl_version=3.4.2 \ 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 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# 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 + if ! command -v java >/dev/null 2>&1 + then + 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 +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + 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 + + +# 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"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +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..25da30d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@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=. +@rem This is normally unused +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. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +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/settings.gradle b/settings.gradle new file mode 100644 index 0000000..75c4d72 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + mavenCentral() + gradlePluginPortal() + } +} \ No newline at end of file diff --git a/src/main/java/dev/fire/DFrevert.java b/src/main/java/dev/fire/DFrevert.java new file mode 100644 index 0000000..a6270dd --- /dev/null +++ b/src/main/java/dev/fire/DFrevert.java @@ -0,0 +1,22 @@ +package dev.fire; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import net.fabricmc.api.ModInitializer; + +import net.minecraft.client.MinecraftClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DFrevert implements ModInitializer { + public static final String MOD_NAME = "DF Revert"; + public static final String MOD_ID = "dfrevert"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_NAME); + public static final MinecraftClient MC = MinecraftClient.getInstance(); + public static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @Override + public void onInitialize() { + DFrevert.LOGGER.info("So long, and thanks for all the fish!"); + } +} \ No newline at end of file diff --git a/src/main/java/dev/fire/FileManager.java b/src/main/java/dev/fire/FileManager.java new file mode 100644 index 0000000..cb0ad48 --- /dev/null +++ b/src/main/java/dev/fire/FileManager.java @@ -0,0 +1,79 @@ +package dev.fire; + +import dev.fire.config.Config; +import net.fabricmc.loader.api.FabricLoader; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +public class FileManager { + /** + * Verify the existence and get the mod data folder. + * + * @return + */ + public static Path Path() { + Path path = DFrevert.MC.runDirectory.toPath().resolve(DFrevert.MOD_ID); + path.toFile().mkdir(); + return path; + } + + public static Path templatesPath() { + Path path = DFrevert.MC.runDirectory.toPath().resolve(DFrevert.MOD_ID).resolve("templates"); + path.toFile().mkdir(); + return path; + } + + public static Path writeFile(String fileName, String content) throws IOException { + return writeFile(fileName, content, true); + } + + public static File getConfigFile() { + return new File(FabricLoader.getInstance().getConfigDir().toFile(), DFrevert.MOD_ID + ".json"); + } + + public static void writeConfig(String content) throws IOException { + boolean ignore; + File file = getConfigFile(); + Files.deleteIfExists(file.toPath()); + Files.createFile(file.toPath()); + if (!file.exists()) ignore = file.createNewFile(); + Files.write(file.toPath(), content.getBytes(), StandardOpenOption.WRITE); + } + + public static String readConfig() throws IOException { + return Files.readString(getConfigFile().toPath()); + } + + public static Path writeFile(String fileName, String content, boolean doCharSet) throws IOException { + Path path = Path().resolve(fileName); + Files.deleteIfExists(path); + Files.createFile(path); + if (doCharSet) { + Files.write(path, content.getBytes(Config.getConfig().SaveCharSet.charSet), StandardOpenOption.WRITE); + } else { + Files.write(path, content.getBytes(), StandardOpenOption.WRITE); + } + return path; + } + + public static String readFile(String fileName, Charset charset) throws IOException { + return Files.readString(Path().resolve(fileName), charset); + } + + public static boolean exists(String fileName) { + return Files.exists(Path().resolve(fileName)); + } + + /** + * Reads a file with the configured charset. + * Will load the config if it isn't. + */ + public static String readFile(String fileName) throws IOException { + return readFile(fileName, Config.getConfig().FileCharSet.charSet); + } +} \ No newline at end of file diff --git a/src/main/java/dev/fire/TextUtil.java b/src/main/java/dev/fire/TextUtil.java new file mode 100644 index 0000000..0eadd91 --- /dev/null +++ b/src/main/java/dev/fire/TextUtil.java @@ -0,0 +1,341 @@ +package dev.fire; + +import dev.fire.config.ChatTag; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.HoverEvent; +import net.minecraft.text.MutableText; +import net.minecraft.text.PlainTextContent; +import net.minecraft.text.Text; +import dev.fire.config.Config; +import dev.fire.config.DefaultConfig; + +public class TextUtil { + public static final String MOD_NAME = "DFrevert"; + public static final String MOD_ID = "dfrevert"; + + private static final Text VIP_PREFIX = Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Vip.BracketColor)) + .append(Text.literal("⭐") + .styled(style -> style + .withColor(DefaultConfig.Vip.SymbolColor) + .withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/vip")) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("VIP").withColor(DefaultConfig.Vip.SymbolColor))) + )) + .append(Text.literal("]").withColor(DefaultConfig.Vip.BracketColor)); + private static final Text VIP_WHOIS = Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Vip.BracketColor)) + .append(Text.literal("VIP").withColor(DefaultConfig.Vip.SymbolColor)) + .append(Text.literal("]").withColor(DefaultConfig.Vip.BracketColor)); + private static final Text FOUNDING_BADGE = Text.literal("⭐ ").styled(style -> style.withColor(DefaultConfig.Vip.SymbolColor) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Founding VIP").withColor(DefaultConfig.Vip.SymbolColor)))); + + public static Text getProfileLine(int color, boolean custom_line) { + String txt = " "; + if (custom_line) { + txt = "\n "; + } + return (Text.literal(txt). + styled(style -> style + .withColor(color) + .withStrikethrough(true) + )); + } + public static Text getProfileArrow(int color) { + String txt = "→"; + + return Text.literal(txt).withColor(color); + } + + // the reason im doing it like this is cus some tags have weird text literal sibling structures + + public static Text getOldOverlord() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Overlord.BracketColor)) + .append(Text.empty().append(Text.literal(DefaultConfig.Overlord.Symbol).withColor(DefaultConfig.Overlord.SymbolColor)) + .append(Text.literal(DefaultConfig.Overlord.TextContent).withColor(DefaultConfig.Overlord.TextColor)) + .append(Text.literal(DefaultConfig.Overlord.Symbol).withColor(DefaultConfig.Overlord.SymbolColor))) + .append(Text.literal("]").withColor(DefaultConfig.Overlord.BracketColor)); + } + public static Text getOldMythic() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Mythic.BracketColor)) + .append(Text.literal(DefaultConfig.Mythic.TextContent).withColor(DefaultConfig.Mythic.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.Mythic.BracketColor)); + } + public static Text getOldEmperor() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Emperor.BracketColor)) + .append(Text.literal(DefaultConfig.Emperor.TextContent).withColor(DefaultConfig.Emperor.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.Emperor.BracketColor)); + } + + public static Text getOldNoble() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Noble.BracketColor)) + .append(Text.literal(DefaultConfig.Noble.TextContent).withColor(DefaultConfig.Noble.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.Noble.BracketColor)); + } + + // Old Staff Chat Tags + + public static Text getOldOwner() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Owner.BracketColor)) + .append(Text.literal(DefaultConfig.Owner.TextContent).withColor(DefaultConfig.Owner.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.Owner.BracketColor)); + } + public static Text getOldAdmin() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Admin.BracketColor)) + .append(Text.literal(DefaultConfig.Admin.TextContent).withColor(DefaultConfig.Admin.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.Admin.BracketColor)); + } + public static Text getOldDev() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Dev.BracketColor)) + .append(Text.literal(DefaultConfig.Dev.TextContent).withColor(DefaultConfig.Dev.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.Dev.BracketColor)); + } + public static Text getOldSrMod() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.SrMod.BracketColor)) + .append(Text.literal(DefaultConfig.SrMod.TextContent).withColor(DefaultConfig.SrMod.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.SrMod.BracketColor)); + } + public static Text getOldMod() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Mod.BracketColor)) + .append(Text.literal(DefaultConfig.Mod.TextContent).withColor(DefaultConfig.Mod.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.Mod.BracketColor)); + } + public static Text getOldJrMod() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.JrMod.BracketColor)) + .append(Text.literal(DefaultConfig.JrMod.TextContent).withColor(DefaultConfig.JrMod.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.JrMod.BracketColor)); + } + public static Text getOldSrHelper() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.SrHelper.BracketColor)) + .append(Text.literal(DefaultConfig.SrHelper.TextContent).withColor(DefaultConfig.SrHelper.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.SrHelper.BracketColor)); + } + public static Text getOldHelper() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.Helper.BracketColor)) + .append(Text.literal(DefaultConfig.Helper.TextContent).withColor(DefaultConfig.Helper.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.Helper.BracketColor)); + } + public static Text getOldJrHelper() { + return Text.empty() + .append(Text.literal("[").withColor(DefaultConfig.JrHelper.BracketColor)) + .append(Text.literal(DefaultConfig.JrHelper.TextContent).withColor(DefaultConfig.JrHelper.TextColor)) + .append(Text.literal("]").withColor(DefaultConfig.JrHelper.BracketColor)); + } + + + public static Text getCustomTag(ChatTag chattag, boolean add_space) { + int bracket_color = chattag.BracketColor; + int symbol_color = chattag.SymbolColor; + int text_color = chattag.TextColor; + String symbol = chattag.Symbol; + String main_text = chattag.TextContent; + if (symbol == "") { + if (add_space) { + return Text.empty() + .append(Text.literal("[").withColor(bracket_color)) + .append(Text.literal(main_text).withColor(text_color)) + .append(Text.literal("]").withColor(bracket_color)) + .append(Text.literal(" ")); + + } + return Text.empty() + .append(Text.literal("[").withColor(bracket_color)) + .append(Text.literal(main_text).withColor(text_color)) + .append(Text.literal("]").withColor(bracket_color)); + } + if (add_space) { + return Text.empty() + .append(Text.literal("[").withColor(bracket_color)) + .append(Text.literal(symbol).withColor(symbol_color)) + .append(Text.literal(main_text).withColor(text_color)) + .append(Text.literal(symbol).withColor(symbol_color)) + .append(Text.literal("]").withColor(bracket_color)) + .append(Text.literal(" ")); + + } + return Text.empty() + .append(Text.literal("[").withColor(bracket_color)) + .append(Text.literal(symbol).withColor(symbol_color)) + .append(Text.literal(main_text).withColor(text_color)) + .append(Text.literal(symbol).withColor(symbol_color)) + .append(Text.literal("]").withColor(bracket_color)); + } + + public static Text getShortCustomTag(ChatTag chattag, boolean add_space, boolean return_empty) { + if (return_empty) { + return Text.empty(); + } + int bracket_color = chattag.BracketColor; + int text_color = chattag.TextColor; + String main_text = chattag.TextContent; + if (add_space) { + return Text.empty() + .append(Text.literal("[").withColor(bracket_color)) + .append(Text.literal(main_text.substring(0,1)).withColor(text_color)) + .append(Text.literal("]").withColor(bracket_color)) + .append(Text.literal(" ")); + } + return Text.empty() + .append(Text.literal("[").withColor(bracket_color)) + .append(Text.literal(main_text.substring(0,1)).withColor(text_color)) + .append(Text.literal("]").withColor(bracket_color)); + } + + + public static Text replaceTags(Text text, boolean isTabList) { + Config c = Config.getConfig(); + if (c.DisableMod){ + return text; + } + + ChatTag custom_vip = new ChatTag(c.VipBracketColor, c.VipSymbolColor, c.VipTextColor, c.VipSymbol, c.VipTextContent); + + ChatTag custom_overlord = new ChatTag(c.OverlordBracketColor, c.OverlordSymbolColor, c.OverlordTextColor, c.OverlordSymbol, c.OverlordTextContent); + ChatTag custom_mythic = new ChatTag(c.MythicBracketColor, c.MythicSymbolColor, c.MythicTextColor, c.MythicSymbol, c.MythicTextContent); + ChatTag custom_emperor = new ChatTag(c.EmperorBracketColor, c.EmperorSymbolColor, c.EmperorTextColor, c.EmperorSymbol, c.EmperorTextContent); + ChatTag custom_noble = new ChatTag(c.NobleBracketColor, c.NobleSymbolColor, c.NobleTextColor, c.NobleSymbol, c.NobleTextContent); + + ChatTag custom_owner = new ChatTag(c.OwnerBracketColor, c.OwnerSymbolColor, c.OwnerTextColor, c.OwnerSymbol, c.OwnerTextContent); + ChatTag custom_admin = new ChatTag(c.AdminBracketColor, c.AdminSymbolColor, c.AdminTextColor, c.AdminSymbol, c.AdminTextContent); + ChatTag custom_dev = new ChatTag(c.DevBracketColor, c.DevSymbolColor, c.DevTextColor, c.DevSymbol, c.DevTextContent); + ChatTag custom_srmod = new ChatTag(c.SrModBracketColor, c.SrModSymbolColor, c.SrModTextColor, c.SrModSymbol, c.SrModTextContent); + ChatTag custom_mod = new ChatTag(c.ModBracketColor, c.ModSymbolColor, c.ModTextColor, c.ModSymbol, c.ModTextContent); + ChatTag custom_jrmod = new ChatTag(c.JrModBracketColor, c.JrModSymbolColor, c.JrModTextColor, c.JrModSymbol, c.JrModTextContent); + ChatTag custom_srhelper = new ChatTag(c.SrHelperBracketColor, c.SrHelperSymbolColor, c.SrHelperTextColor, c.SrHelperSymbol, c.SrHelperTextContent); + ChatTag custom_helper = new ChatTag(c.HelperBracketColor, c.HelperSymbolColor, c.HelperTextColor, c.HelperSymbol, c.HelperTextContent); + ChatTag custom_jrhelper = new ChatTag(c.JrHelperBracketColor, c.JrHelperSymbolColor, c.JrHelperTextColor, c.JrHelperSymbol, c.JrHelperTextContent); + + // replace old tags + text = replaceTextInternal(text, getOldOverlord(), getCustomTag(custom_overlord, false), false); + text = replaceTextInternal(text, getOldMythic(), getCustomTag(custom_mythic, false), false); + text = replaceTextInternal(text, getOldEmperor(), getCustomTag(custom_emperor, false), false); + text = replaceTextInternal(text, getOldNoble(), getCustomTag(custom_noble, false), false); + + text = replaceTextInternal(text, getOldOwner(), getCustomTag(custom_owner, false), false); + text = replaceTextInternal(text, getOldAdmin(), getCustomTag(custom_admin, false), false); + text = replaceTextInternal(text, getOldDev(), getCustomTag(custom_dev, false), false); + text = replaceTextInternal(text, getOldSrMod(), getCustomTag(custom_srmod, false), false); + text = replaceTextInternal(text, getOldMod(), getCustomTag(custom_mod, false), false); + text = replaceTextInternal(text, getOldJrMod(), getCustomTag(custom_jrmod, false), false); + text = replaceTextInternal(text, getOldSrHelper(), getCustomTag(custom_srhelper, false), false); + text = replaceTextInternal(text, getOldHelper(), getCustomTag(custom_helper, false), false); + text = replaceTextInternal(text, getOldJrHelper(), getCustomTag(custom_jrhelper, false), false); + + // replace old shortened tags + boolean return_empty = !c.ShortenedChatTags && !isTabList; + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Overlord, isTabList, false), getShortCustomTag(custom_overlord, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Mythic, isTabList, false), getShortCustomTag(custom_mythic, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Emperor, isTabList, false), getShortCustomTag(custom_emperor, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Noble, isTabList, false), getShortCustomTag(custom_noble, isTabList, return_empty), false); + + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Owner, isTabList, false), getShortCustomTag(custom_owner, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Admin, isTabList, false), getShortCustomTag(custom_admin, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Dev, isTabList, false), getShortCustomTag(custom_dev, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.SrMod, isTabList, false), getShortCustomTag(custom_srmod, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Mod, isTabList, false), getShortCustomTag(custom_mod, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.JrMod, isTabList, false), getShortCustomTag(custom_jrmod, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.SrHelper, isTabList, false), getShortCustomTag(custom_srhelper, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.Helper, isTabList, false), getShortCustomTag(custom_helper, isTabList, return_empty), false); + text = replaceTextInternal(text, getShortCustomTag(DefaultConfig.JrHelper, isTabList, false), getShortCustomTag(custom_jrhelper, isTabList, return_empty), false); + + if (isTabList) { + text = replaceTextInternal(text, getCustomTag(DefaultConfig.Owner, true), getCustomTag(custom_owner, true), false); + text = replaceTextInternal(text, getCustomTag(DefaultConfig.Admin, true), getCustomTag(custom_admin, true), false); + text = replaceTextInternal(text, getCustomTag(DefaultConfig.Dev, true), getCustomTag(custom_dev, true), false); + text = replaceTextInternal(text, getCustomTag(DefaultConfig.SrMod, true), getCustomTag(custom_srmod, true), false); + text = replaceTextInternal(text, getCustomTag(DefaultConfig.Mod, true), getCustomTag(custom_mod, true), false); + text = replaceTextInternal(text, getCustomTag(DefaultConfig.JrMod, true), getCustomTag(custom_jrmod, true), false); + text = replaceTextInternal(text, getCustomTag(DefaultConfig.SrHelper, true), getCustomTag(custom_srhelper, true), false); + text = replaceTextInternal(text, getCustomTag(DefaultConfig.Helper, true), getCustomTag(custom_helper, true), false); + text = replaceTextInternal(text, getCustomTag(DefaultConfig.JrHelper, true), getCustomTag(custom_jrhelper, true), false); + } + + // replace old profile lines + boolean set_newline = false; + for (int i = 0; i < 2; i++) { + text = replaceTextInternal(text, getProfileLine(0xAA0000,set_newline), getProfileLine(custom_overlord.TextColor,set_newline), false); + text = replaceTextInternal(text, getProfileLine(0xAA00AA,set_newline), getProfileLine(custom_mythic.TextColor,set_newline), false); + text = replaceTextInternal(text, getProfileLine(0x55FFFF,set_newline), getProfileLine(custom_emperor.TextColor,set_newline), false); + text = replaceTextInternal(text, getProfileLine(0xFFAA00,set_newline), getProfileLine(custom_noble.TextColor,set_newline), false); + set_newline = true; + } + + // replace old profile arrows + text = replaceTextInternal(text, getProfileArrow(0xAA0000), getProfileArrow(custom_overlord.TextColor), false); + text = replaceTextInternal(text, getProfileArrow(0xAA00AA), getProfileArrow(custom_mythic.TextColor), false); + text = replaceTextInternal(text, getProfileArrow(0x55FFFF), getProfileArrow(custom_emperor.TextColor), false); + text = replaceTextInternal(text, getProfileArrow(0xFFAA00), getProfileArrow(custom_noble.TextColor), false); + + // vipenabled/disabled logic + if (!c.VipEnabled) { + text = replaceTextInternal(text, VIP_PREFIX, Text.empty(), true); + text = replaceTextInternal(text, VIP_WHOIS, Text.empty(), false); + text = replaceTextInternal(text, FOUNDING_BADGE, Text.empty(), false); + } else { + text = replaceTextInternal(text, VIP_PREFIX, Text.empty() + .append(Text.literal("[").withColor(custom_vip.BracketColor)) + .append(Text.literal(custom_vip.Symbol).withColor(custom_vip.SymbolColor)) + .append(Text.literal("]").withColor(custom_vip.BracketColor)), + true); + text = replaceTextInternal(text, VIP_WHOIS, Text.empty() + .append(Text.literal("[").withColor(custom_vip.BracketColor)) + .append(Text.literal(custom_vip.TextContent).withColor(custom_vip.TextColor)) + .append(Text.literal("]").withColor(custom_vip.BracketColor)), + true); + text = replaceTextInternal(text, FOUNDING_BADGE, Text.literal(custom_vip.Symbol+" ") + .styled(style -> style.withColor(custom_vip.SymbolColor) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + Text.literal("Founding VIP") + .withColor(custom_vip.SymbolColor)))) + , false); + } + + return text; + } + + private static Text replaceTextInternal(Text text, Text find, Text replace, Boolean skip) { + MutableText newText = MutableText.of(text.getContent()).setStyle(text.getStyle()); + + boolean empty = getContent(text).isEmpty(); + boolean hideSpace = false; + for (Text sibling : text.getSiblings()) { + String content = getContent(sibling); + if (hideSpace) { + hideSpace = false; + if (content.equals(" ")) { + continue; + } + } + + if (sibling.equals(find)) { + newText.append(Text.empty().append(replace)); + if (skip) { + hideSpace = true; + } + continue; + } + + newText.append(replaceTextInternal(sibling, find, replace, skip)); + } + return newText; + } + + private static String getContent(Text text) { + if (text.getContent() instanceof PlainTextContent content) { + return content.string(); + } + return ""; + } + +} \ No newline at end of file diff --git a/src/main/java/dev/fire/config/ChatTag.java b/src/main/java/dev/fire/config/ChatTag.java new file mode 100644 index 0000000..d5331d6 --- /dev/null +++ b/src/main/java/dev/fire/config/ChatTag.java @@ -0,0 +1,18 @@ +package dev.fire.config; + +import net.minecraft.network.message.SentMessage; + +public class ChatTag { + public int BracketColor; + public int SymbolColor; + public int TextColor; + public String Symbol; + public String TextContent; + public ChatTag(int bracketcolor, int symbolcolor, int textcolor, String sym, String textcontent) { + BracketColor = bracketcolor; + SymbolColor = symbolcolor; + TextColor = textcolor; + Symbol = sym; + TextContent = textcontent; + } +} diff --git a/src/main/java/dev/fire/config/Config.java b/src/main/java/dev/fire/config/Config.java new file mode 100644 index 0000000..bcb71d3 --- /dev/null +++ b/src/main/java/dev/fire/config/Config.java @@ -0,0 +1,1203 @@ +package dev.fire.config; + +import com.google.gson.JsonObject; +import dev.fire.DFrevert; +import dev.fire.FileManager; +import dev.isxander.yacl3.api.*; +import dev.isxander.yacl3.api.controller.*; +import dev.isxander.yacl3.gui.controllers.cycling.EnumController; +import dev.isxander.yacl3.impl.controller.IntegerFieldControllerBuilderImpl; +import io.netty.handler.ssl.IdentityCipherSuiteFilter; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.HoverEvent; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import dev.fire.config.DefaultConfig; + +import dev.fire.config.ChatTag; +import java.awt.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; + +public class Config { + private static Config instance; + public CharSetOption SaveCharSet = DefaultConfig.SaveCharSet; + public CharSetOption FileCharSet = DefaultConfig.FileCharSet; + + public boolean ShortenedChatTags = DefaultConfig.ShortenedChatTags; + public boolean DisableMod = DefaultConfig.DisableMod; + public boolean VipEnabled = true; + + public int VipBracketColor = DefaultConfig.Vip.BracketColor; + public int VipSymbolColor = DefaultConfig.Vip.SymbolColor; + public int VipTextColor = DefaultConfig.Vip.TextColor; + public String VipSymbol = DefaultConfig.Vip.Symbol; + public String VipTextContent = DefaultConfig.Vip.TextContent; + + public int OverlordBracketColor = DefaultConfig.Overlord.BracketColor; + public int OverlordSymbolColor = DefaultConfig.Overlord.SymbolColor; + public int OverlordTextColor = DefaultConfig.Overlord.TextColor; + public String OverlordSymbol = DefaultConfig.Overlord.Symbol; + public String OverlordTextContent = DefaultConfig.Overlord.TextContent; + + public int MythicBracketColor = DefaultConfig.Mythic.BracketColor; + public int MythicSymbolColor = DefaultConfig.Mythic.SymbolColor; + public int MythicTextColor = DefaultConfig.Mythic.TextColor; + public String MythicSymbol = DefaultConfig.Mythic.Symbol; + public String MythicTextContent = DefaultConfig.Mythic.TextContent; + + public int EmperorBracketColor = DefaultConfig.Emperor.BracketColor; + public int EmperorSymbolColor = DefaultConfig.Emperor.SymbolColor; + public int EmperorTextColor = DefaultConfig.Emperor.TextColor; + public String EmperorSymbol = DefaultConfig.Emperor.Symbol; + public String EmperorTextContent = DefaultConfig.Emperor.TextContent; + + public int NobleBracketColor = DefaultConfig.Noble.BracketColor; + public int NobleSymbolColor = DefaultConfig.Noble.SymbolColor; + public int NobleTextColor = DefaultConfig.Noble.TextColor; + public String NobleSymbol = DefaultConfig.Noble.Symbol; + public String NobleTextContent = DefaultConfig.Noble.TextContent; + + + + public int OwnerBracketColor = DefaultConfig.Owner.BracketColor; + public int OwnerSymbolColor = DefaultConfig.Owner.SymbolColor; + public int OwnerTextColor = DefaultConfig.Owner.TextColor; + public String OwnerSymbol = DefaultConfig.Owner.Symbol; + public String OwnerTextContent = DefaultConfig.Owner.TextContent; + + public int AdminBracketColor = DefaultConfig.Admin.BracketColor; + public int AdminSymbolColor = DefaultConfig.Admin.SymbolColor; + public int AdminTextColor = DefaultConfig.Admin.TextColor; + public String AdminSymbol = DefaultConfig.Admin.Symbol; + public String AdminTextContent = DefaultConfig.Admin.TextContent; + + public int DevBracketColor = DefaultConfig.Dev.BracketColor; + public int DevSymbolColor = DefaultConfig.Dev.SymbolColor; + public int DevTextColor = DefaultConfig.Dev.TextColor; + public String DevSymbol = DefaultConfig.Dev.Symbol; + public String DevTextContent = DefaultConfig.Dev.TextContent; + + public int SrModBracketColor = DefaultConfig.SrMod.BracketColor; + public int SrModSymbolColor = DefaultConfig.SrMod.SymbolColor; + public int SrModTextColor = DefaultConfig.SrMod.TextColor; + public String SrModSymbol = DefaultConfig.SrMod.Symbol; + public String SrModTextContent = DefaultConfig.SrMod.TextContent; + + public int ModBracketColor = DefaultConfig.Mod.BracketColor; + public int ModSymbolColor = DefaultConfig.Mod.SymbolColor; + public int ModTextColor = DefaultConfig.Mod.TextColor; + public String ModSymbol = DefaultConfig.Mod.Symbol; + public String ModTextContent = DefaultConfig.Mod.TextContent; + + public int JrModBracketColor = DefaultConfig.JrMod.BracketColor; + public int JrModSymbolColor = DefaultConfig.JrMod.SymbolColor; + public int JrModTextColor = DefaultConfig.JrMod.TextColor; + public String JrModSymbol = DefaultConfig.JrMod.Symbol; + public String JrModTextContent = DefaultConfig.JrMod.TextContent; + + public int SrHelperBracketColor = DefaultConfig.SrHelper.BracketColor; + public int SrHelperSymbolColor = DefaultConfig.SrHelper.SymbolColor; + public int SrHelperTextColor = DefaultConfig.SrHelper.TextColor; + public String SrHelperSymbol = DefaultConfig.SrHelper.Symbol; + public String SrHelperTextContent = DefaultConfig.SrHelper.TextContent; + + public int HelperBracketColor = DefaultConfig.Helper.BracketColor; + public int HelperSymbolColor = DefaultConfig.Helper.SymbolColor; + public int HelperTextColor = DefaultConfig.Helper.TextColor; + public String HelperSymbol = DefaultConfig.Helper.Symbol; + public String HelperTextContent = DefaultConfig.Helper.TextContent; + + public int JrHelperBracketColor = DefaultConfig.JrHelper.BracketColor; + public int JrHelperSymbolColor = DefaultConfig.JrHelper.SymbolColor; + public int JrHelperTextColor = DefaultConfig.JrHelper.TextColor; + public String JrHelperSymbol = DefaultConfig.JrHelper.Symbol; + public String JrHelperTextContent = DefaultConfig.JrHelper.TextContent; + + + public Config() { } + + public static Config getConfig() { + if (instance == null) { + try { + instance = DFrevert.gson.fromJson(FileManager.readConfig(), Config.class); + } catch (Exception exception) { + DFrevert.LOGGER.info("Config didn't load: " + exception); + DFrevert.LOGGER.info("Making a new one."); + instance = new Config(); + instance.save(); + } + } + return instance; + } + + public static void clear() { + instance = null; + } + + private JsonObject addChatTag(JsonObject object, String name, int BracketColor, int SymbolColor, int TextColor, String Symbol, String TextContent) { + object.addProperty(name+"BracketColor", BracketColor); + object.addProperty(name+"SymbolColor", SymbolColor); + object.addProperty(name+"TextColor", TextColor); + object.addProperty(name+"Symbol", Symbol); + object.addProperty(name+"TextContent", TextContent); + return object; + } + + private void save() { + try { + JsonObject object = new JsonObject(); + String name = ""; + + object.addProperty("VipEnabled", VipEnabled); + + object = addChatTag(object, "Vip", VipBracketColor, VipSymbolColor, VipTextColor, VipSymbol, VipTextContent); + object = addChatTag(object, "Overlord", OverlordBracketColor, OverlordSymbolColor, OverlordTextColor, OverlordSymbol, OverlordTextContent); + object = addChatTag(object, "Mythic", MythicBracketColor, MythicSymbolColor, MythicTextColor, MythicSymbol, MythicTextContent); + object = addChatTag(object, "Emperor", EmperorBracketColor, EmperorSymbolColor, EmperorTextColor, EmperorSymbol, EmperorTextContent); + object = addChatTag(object, "Noble", NobleBracketColor, NobleSymbolColor, NobleTextColor, NobleSymbol, NobleTextContent); + + object = addChatTag(object, "Owner", OwnerBracketColor, OwnerSymbolColor, OwnerTextColor, OwnerSymbol, OwnerTextContent); + object = addChatTag(object, "Admin", AdminBracketColor, AdminSymbolColor, AdminTextColor, AdminSymbol, AdminTextContent); + object = addChatTag(object, "Dev", DevBracketColor, DevSymbolColor, DevTextColor, DevSymbol, DevTextContent); + object = addChatTag(object, "SrMod", SrModBracketColor, SrModSymbolColor, SrModTextColor, SrModSymbol, SrModTextContent); + object = addChatTag(object, "Mod", ModBracketColor, ModSymbolColor, ModTextColor, ModSymbol, ModTextContent); + object = addChatTag(object, "JrMod", JrModBracketColor, JrModSymbolColor, JrModTextColor, JrModSymbol, JrModTextContent); + object = addChatTag(object, "SrHelper", SrHelperBracketColor, SrHelperSymbolColor, SrHelperTextColor, SrHelperSymbol, SrHelperTextContent); + object = addChatTag(object, "Helper", HelperBracketColor, HelperSymbolColor, HelperTextColor, HelperSymbol, HelperTextContent); + object = addChatTag(object, "JrHelper", JrHelperBracketColor, JrHelperSymbolColor, JrHelperTextColor, JrHelperSymbol, JrHelperTextContent); + + + + + FileManager.writeConfig(object.toString()); + } catch (Exception e) { + DFrevert.LOGGER.info("Couldn't save config: " + e); + } + } + + public YetAnotherConfigLib getLibConfig() { + return YetAnotherConfigLib.createBuilder() + .title(Text.literal("Used for narration. Could be used to render a title in the future.")) + .category(ConfigCategory.createBuilder() + .name(Text.literal("Chat Tags")) + .tooltip(Text.literal("Modify the default chat tags.")) + + // VIP + .group(OptionGroup.createBuilder() + .name(Text.literal("⭐ VIP")) + .description(OptionDescription.of(Text.literal("VIP Chat Tag"))) + + .option(Option.createBuilder(boolean.class) + .name(Text.literal("Vip Enabled")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Toggles weather the VIP tag is shown.")) + .text(Text.literal("This also affects the VIP tag and VIP founding badge in player's profiles when you /whois them.")) + .text(Text.literal("")) + .build()) + .binding( + DefaultConfig.VipEnabled, + () -> VipEnabled, + opt -> VipEnabled = opt + ) + .controller(TickBoxControllerBuilder::create) + .build()) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Vip.BracketColor), + () -> new Color(VipBracketColor), + opt -> VipBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Vip.SymbolColor), + () -> new Color(VipSymbolColor), + opt -> VipSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Vip.TextColor), + () -> new Color(VipTextColor), + opt -> VipTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the chat tag, also affects the founding badge.")) + .build()) + .binding( + DefaultConfig.Vip.Symbol, + () -> VipSymbol, + opt -> VipSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text content, this only appears in the /whois")) + .build()) + .binding( + DefaultConfig.Vip.TextContent, + () -> VipTextContent, + opt -> VipTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + + //Overlord + .group(OptionGroup.createBuilder() + .name(Text.literal("Overlord")) + .description(OptionDescription.of(Text.literal("Overlord Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Overlord.BracketColor), + () -> new Color(OverlordBracketColor), + opt -> OverlordBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Overlord.SymbolColor), + () -> new Color(OverlordSymbolColor), + opt -> OverlordSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Overlord.TextColor), + () -> new Color(OverlordTextColor), + opt -> OverlordTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Overlord.Symbol, + () -> OverlordSymbol, + opt -> OverlordSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Overlord.TextContent, + () -> OverlordTextContent, + opt -> OverlordTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + + // Mythic + .group(OptionGroup.createBuilder() + .name(Text.literal("Mythic")) + .description(OptionDescription.of(Text.literal("Mythic Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Mythic.BracketColor), + () -> new Color(MythicBracketColor), + opt -> MythicBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Mythic.SymbolColor), + () -> new Color(MythicSymbolColor), + opt -> MythicSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Mythic.TextColor), + () -> new Color(MythicTextColor), + opt -> MythicTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Mythic.Symbol, + () -> MythicSymbol, + opt -> MythicSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Mythic.TextContent, + () -> MythicTextContent, + opt -> MythicTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // Emperor + .group(OptionGroup.createBuilder() + .name(Text.literal("Emperor")) + .description(OptionDescription.of(Text.literal("Emperor Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Emperor.BracketColor), + () -> new Color(EmperorBracketColor), + opt -> EmperorBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Emperor.SymbolColor), + () -> new Color(EmperorSymbolColor), + opt -> EmperorSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Emperor.TextColor), + () -> new Color(EmperorTextColor), + opt -> EmperorTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Emperor.Symbol, + () -> EmperorSymbol, + opt -> EmperorSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Emperor.TextContent, + () -> EmperorTextContent, + opt -> EmperorTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // Noble + .group(OptionGroup.createBuilder() + .name(Text.literal("Noble")) + .description(OptionDescription.of(Text.literal("Noble Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Noble.BracketColor), + () -> new Color(NobleBracketColor), + opt -> NobleBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Noble.SymbolColor), + () -> new Color(NobleSymbolColor), + opt -> NobleSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Noble.TextColor), + () -> new Color(NobleTextColor), + opt -> NobleTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Noble.Symbol, + () -> NobleSymbol, + opt -> NobleSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Noble.TextContent, + () -> NobleTextContent, + opt -> NobleTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + .build()) + + + + + + // Staff Chat Tags -------------------------------------------------------------------------------------------- + .category(ConfigCategory.createBuilder() + .name(Text.literal("Staff Chat Tags")) + .tooltip(Text.literal("Modify the Staff chat tags.")) + + // Owner + .group(OptionGroup.createBuilder() + .name(Text.literal("Owner")) + .description(OptionDescription.of(Text.literal("Owner Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Owner.BracketColor), + () -> new Color(OwnerBracketColor), + opt -> OwnerBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Owner.SymbolColor), + () -> new Color(OwnerSymbolColor), + opt -> OwnerSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Owner.TextColor), + () -> new Color(OwnerTextColor), + opt -> OwnerTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Owner.Symbol, + () -> OwnerSymbol, + opt -> OwnerSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Owner.TextContent, + () -> OwnerTextContent, + opt -> OwnerTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // Admin + .group(OptionGroup.createBuilder() + .name(Text.literal("Admin")) + .description(OptionDescription.of(Text.literal("Admin Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Admin.BracketColor), + () -> new Color(AdminBracketColor), + opt -> AdminBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Admin.SymbolColor), + () -> new Color(AdminSymbolColor), + opt -> AdminSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Admin.TextColor), + () -> new Color(AdminTextColor), + opt -> AdminTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Admin.Symbol, + () -> AdminSymbol, + opt -> AdminSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Admin.TextContent, + () -> AdminTextContent, + opt -> AdminTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // Dev + .group(OptionGroup.createBuilder() + .name(Text.literal("Dev")) + .description(OptionDescription.of(Text.literal("Dev Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Dev.BracketColor), + () -> new Color(DevBracketColor), + opt -> DevBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Dev.SymbolColor), + () -> new Color(DevSymbolColor), + opt -> DevSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Dev.TextColor), + () -> new Color(DevTextColor), + opt -> DevTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Dev.Symbol, + () -> DevSymbol, + opt -> DevSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Dev.TextContent, + () -> DevTextContent, + opt -> DevTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // SrMod + .group(OptionGroup.createBuilder() + .name(Text.literal("SrMod")) + .description(OptionDescription.of(Text.literal("SrMod Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.SrMod.BracketColor), + () -> new Color(SrModBracketColor), + opt -> SrModBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.SrMod.SymbolColor), + () -> new Color(SrModSymbolColor), + opt -> SrModSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.SrMod.TextColor), + () -> new Color(SrModTextColor), + opt -> SrModTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.SrMod.Symbol, + () -> SrModSymbol, + opt -> SrModSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.SrMod.TextContent, + () -> SrModTextContent, + opt -> SrModTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // Mod + .group(OptionGroup.createBuilder() + .name(Text.literal("Mod")) + .description(OptionDescription.of(Text.literal("Mod Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Mod.BracketColor), + () -> new Color(ModBracketColor), + opt -> ModBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Mod.SymbolColor), + () -> new Color(ModSymbolColor), + opt -> ModSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Mod.TextColor), + () -> new Color(ModTextColor), + opt -> ModTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Mod.Symbol, + () -> ModSymbol, + opt -> ModSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Mod.TextContent, + () -> ModTextContent, + opt -> ModTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // JrMod + .group(OptionGroup.createBuilder() + .name(Text.literal("JrMod")) + .description(OptionDescription.of(Text.literal("JrMod Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.JrMod.BracketColor), + () -> new Color(JrModBracketColor), + opt -> JrModBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.JrMod.SymbolColor), + () -> new Color(JrModSymbolColor), + opt -> JrModSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.JrMod.TextColor), + () -> new Color(JrModTextColor), + opt -> JrModTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.JrMod.Symbol, + () -> JrModSymbol, + opt -> JrModSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.JrMod.TextContent, + () -> JrModTextContent, + opt -> JrModTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // SrHelper + .group(OptionGroup.createBuilder() + .name(Text.literal("SrHelper")) + .description(OptionDescription.of(Text.literal("SrHelper Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.SrHelper.BracketColor), + () -> new Color(SrHelperBracketColor), + opt -> SrHelperBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.SrHelper.SymbolColor), + () -> new Color(SrHelperSymbolColor), + opt -> SrHelperSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.SrHelper.TextColor), + () -> new Color(SrHelperTextColor), + opt -> SrHelperTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.SrHelper.Symbol, + () -> SrHelperSymbol, + opt -> SrHelperSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.SrHelper.TextContent, + () -> SrHelperTextContent, + opt -> SrHelperTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // Helper + .group(OptionGroup.createBuilder() + .name(Text.literal("Helper")) + .description(OptionDescription.of(Text.literal("Helper Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.Helper.BracketColor), + () -> new Color(HelperBracketColor), + opt -> HelperBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.Helper.SymbolColor), + () -> new Color(HelperSymbolColor), + opt -> HelperSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.Helper.TextColor), + () -> new Color(HelperTextColor), + opt -> HelperTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.Helper.Symbol, + () -> HelperSymbol, + opt -> HelperSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.Helper.TextContent, + () -> HelperTextContent, + opt -> HelperTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + // JrHelper + .group(OptionGroup.createBuilder() + .name(Text.literal("JrHelper")) + .description(OptionDescription.of(Text.literal("JrHelper Chat Tag"))) + + .option(Option.createBuilder(Color.class) + .name(Text.literal("Bracket Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of brackets")) + .build()) + .binding( + new Color(DefaultConfig.JrHelper.BracketColor), + () -> new Color(JrHelperBracketColor), + opt -> JrHelperBracketColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Symbol Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of symbols")) + .build()) + .binding( + new Color(DefaultConfig.JrHelper.SymbolColor), + () -> new Color(JrHelperSymbolColor), + opt -> JrHelperSymbolColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(Color.class) + .name(Text.literal("Text Content Color")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Color of the main tag text")) + .build()) + .binding( + new Color(DefaultConfig.JrHelper.TextColor), + () -> new Color(JrHelperTextColor), + opt -> JrHelperTextColor = opt.getRGB() + ) + .controller(ColorControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Symbol")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Symbol(s) that go on the left and right side of the main text content")) + .build()) + .binding( + DefaultConfig.JrHelper.Symbol, + () -> JrHelperSymbol, + opt -> JrHelperSymbol = opt + ) + .controller(StringControllerBuilder::create) + .build()) + .option(Option.createBuilder(String.class) + .name(Text.literal("Text Content")) + .description(OptionDescription.createBuilder() + .text(Text.literal("The main text of the tag")) + .build()) + .binding( + DefaultConfig.JrHelper.TextContent, + () -> JrHelperTextContent, + opt -> JrHelperTextContent = opt + ) + .controller(StringControllerBuilder::create) + .build()) + + .build()) + + + .build()) + // MISC ------------------------------------------------------------ + + .category(ConfigCategory.createBuilder() + .name(Text.literal("Misc. Toggles")) + .tooltip(Text.literal("Toggle visibility of chat tags.")) + + .option(Option.createBuilder(boolean.class) + .name(Text.literal("Disable Mod")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Disables all changes this mod makes (idk why you would want this)")) + .build()) + .binding( + DefaultConfig.DisableMod, + () -> DisableMod, + opt -> DisableMod = opt + ) + .controller(TickBoxControllerBuilder::create) + .build()) + .option(Option.createBuilder(boolean.class) + .name(Text.literal("Enable Shortened Chat Tags")) + .description(OptionDescription.createBuilder() + .text(Text.literal("Toggles weather you can see shortened chat tags while on plots.")) + .build()) + .binding( + DefaultConfig.ShortenedChatTags, + () -> ShortenedChatTags, + opt -> ShortenedChatTags = opt + ) + .controller(TickBoxControllerBuilder::create) + .build()) + + .build()) + .save(this::save) + .build(); + } + + public enum CharSetOption { + ISO_8859_1(StandardCharsets.ISO_8859_1), + UTF_8(StandardCharsets.UTF_8); + + public final Charset charSet; + + CharSetOption(Charset charSet) { + this.charSet = charSet; + } + } +} diff --git a/src/main/java/dev/fire/config/DefaultConfig.java b/src/main/java/dev/fire/config/DefaultConfig.java new file mode 100644 index 0000000..fb93add --- /dev/null +++ b/src/main/java/dev/fire/config/DefaultConfig.java @@ -0,0 +1,37 @@ +package dev.fire.config; + + +import java.lang.reflect.Array; +import dev.fire.config.ChatTag; +import java.util.Arrays; +import java.util.List; + +public class DefaultConfig { + public static Config.CharSetOption SaveCharSet = Config.CharSetOption.UTF_8; + public static Config.CharSetOption FileCharSet = Config.CharSetOption.UTF_8; + + public static boolean VipEnabled = true; + + public static boolean DisableMod = false; + public static boolean ShortenedChatTags = true; + + public static ChatTag Vip = new ChatTag(0xFFAA00,0xFFD47F,0xFFD47F,"⭐","VIP"); + + public static ChatTag Overlord = new ChatTag(0x00AAAA, 0xAAAAAA, 0xAA0000, "◆", "Overlord"); + public static ChatTag Mythic = new ChatTag(0x555555, 0x555555, 0xAA00AA, "", "Mythic"); + public static ChatTag Emperor = new ChatTag(0x00AA00, 0x00AA00, 0x55FFFF, "", "Emperor"); + public static ChatTag Noble = new ChatTag(0xFFAA00, 0xFFAA00, 0x55FF55, "", "Noble"); + + public static ChatTag Owner = new ChatTag(0x000000, 0x000000, 0xFF0000, "", "Owner"); + public static ChatTag Admin = new ChatTag(0x555555, 0x555555, 0xFF0000, "", "Admin"); + public static ChatTag Dev = new ChatTag(0x555555, 0x555555, 0xFF7FAA, "", "Dev"); + public static ChatTag SrMod = new ChatTag(0x808080, 0x808080, 0xAAFF55, "", "SrMod"); + public static ChatTag Mod = new ChatTag(0xAAAAAA, 0xAAAAAA, 0x55FF55, "", "Mod"); + public static ChatTag JrMod = new ChatTag(0xAAAAAA, 0xAAAAAA, 0x2AD42A, "", "JrMod"); + public static ChatTag SrHelper = new ChatTag(0x808080, 0x808080, 0x2AFFAA, "", "SrHelper"); + public static ChatTag Helper = new ChatTag(0xAAAAAA, 0xAAAAAA, 0x55FFFF, "", "Helper"); + public static ChatTag JrHelper = new ChatTag(0xAAAAAA, 0xAAAAAA, 0x55AAFF, "", "JrHelper"); + + public static ChatTag Retired = new ChatTag(0xFFAA00, 0xFFAA00, 0x2AD4D4, "", "Retired"); + +} diff --git a/src/main/java/dev/fire/config/ModMenuIntegration.java b/src/main/java/dev/fire/config/ModMenuIntegration.java new file mode 100644 index 0000000..8c20142 --- /dev/null +++ b/src/main/java/dev/fire/config/ModMenuIntegration.java @@ -0,0 +1,12 @@ +package dev.fire.config; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; + +public class ModMenuIntegration implements ModMenuApi { + + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return parent -> Config.getConfig().getLibConfig().generateScreen(parent); + } +} \ No newline at end of file diff --git a/src/main/java/dev/fire/mixin/ChatHudMixin.java b/src/main/java/dev/fire/mixin/ChatHudMixin.java new file mode 100644 index 0000000..91397cf --- /dev/null +++ b/src/main/java/dev/fire/mixin/ChatHudMixin.java @@ -0,0 +1,20 @@ +package dev.fire.mixin; + +import dev.fire.DFrevert; +import dev.fire.TextUtil; +import net.minecraft.client.gui.hud.ChatHud; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + + +@Mixin(ChatHud.class) +public class ChatHudMixin { + + @ModifyVariable(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At("HEAD"), ordinal = 0, argsOnly = true) + public Text inject(Text message) { + //DFrevert.LOGGER.info(String.valueOf(message)); + return TextUtil.replaceTags(message, false); + } +} \ No newline at end of file diff --git a/src/main/java/dev/fire/mixin/EntityRendererMixin.java b/src/main/java/dev/fire/mixin/EntityRendererMixin.java new file mode 100644 index 0000000..c98cdfe --- /dev/null +++ b/src/main/java/dev/fire/mixin/EntityRendererMixin.java @@ -0,0 +1,19 @@ +package dev.fire.mixin; + +import dev.fire.TextUtil; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import net.minecraft.client.render.entity.EntityRenderer; + +@Mixin(EntityRenderer.class) +public class EntityRendererMixin { + + @ModifyVariable(method = "renderLabelIfPresent", at = @At("HEAD"), ordinal = 0, argsOnly = true) + public Text inject(Text text) { + Text c = TextUtil.replaceTags(text, true); + return c; + + } +} \ No newline at end of file diff --git a/src/main/java/dev/fire/mixin/ExampleMixin.java b/src/main/java/dev/fire/mixin/ExampleMixin.java new file mode 100644 index 0000000..3b2d3ba --- /dev/null +++ b/src/main/java/dev/fire/mixin/ExampleMixin.java @@ -0,0 +1,15 @@ +package dev.fire.mixin; + +import net.minecraft.server.MinecraftServer; +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; + +@Mixin(MinecraftServer.class) +public class ExampleMixin { + @Inject(at = @At("HEAD"), method = "loadWorld") + private void init(CallbackInfo info) { + // This code is injected into the start of MinecraftServer.loadWorld()V + } +} \ No newline at end of file diff --git a/src/main/java/dev/fire/mixin/PlayerListHudMixin.java b/src/main/java/dev/fire/mixin/PlayerListHudMixin.java new file mode 100644 index 0000000..ddb4bc0 --- /dev/null +++ b/src/main/java/dev/fire/mixin/PlayerListHudMixin.java @@ -0,0 +1,20 @@ +package dev.fire.mixin; + +import dev.fire.DFrevert; +import dev.fire.TextUtil; +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.text.Text; +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.CallbackInfoReturnable; + +@Mixin(PlayerListHud.class) +public class PlayerListHudMixin { + + @Inject(method = "getPlayerName", at = @At("RETURN"), cancellable = true) + protected void getPlayerName(CallbackInfoReturnable cir) { + Text new_tag_name = TextUtil.replaceTags(cir.getReturnValue(), true); + cir.setReturnValue(new_tag_name); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/dfrevert/icon.png b/src/main/resources/assets/dfrevert/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1c642895b5c92e4c399e07e3b459f720a723d13b GIT binary patch literal 77364 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�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.15.11", + "minecraft": "~1.20.4", + "java": ">=17", + "fabric-api": "*", + "yet_another_config_lib_v3": "*" + }, + "recommends": { + "modmenu": "*" + } +} \ No newline at end of file