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 0000000..e644113 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..b82aa23 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..1aa94a4 --- /dev/null +++ b/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# 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 0000000..1c64289 Binary files /dev/null and b/src/main/resources/assets/dfrevert/icon.png differ diff --git a/src/main/resources/assets/dfrevert/icon2.png b/src/main/resources/assets/dfrevert/icon2.png new file mode 100644 index 0000000..5d20848 Binary files /dev/null and b/src/main/resources/assets/dfrevert/icon2.png differ diff --git a/src/main/resources/dfrevert.mixins.json b/src/main/resources/dfrevert.mixins.json new file mode 100644 index 0000000..21688f7 --- /dev/null +++ b/src/main/resources/dfrevert.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "dev.fire.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "ExampleMixin", + "ChatHudMixin", + "PlayerListHudMixin", + "EntityRendererMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..28ee3fb --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,37 @@ +{ + "schemaVersion": 1, + "id": "dfrevert", + "version": "${version}", + "name": "DF Revert", + "description": "Reverts chattags to their old/custom colors.", + "authors": [ + "fire" + ], + "contact": { + "homepage": "https://github.com/firef1a/DF-Revert" + }, + "license": "MIT", + "icon": "assets/dfrevert/icon.png", + "environment": "client", + "entrypoints": { + "main": [ + "dev.fire.DFrevert" + ], + "modmenu": [ + "dev.fire.config.ModMenuIntegration" + ] + }, + "mixins": [ + "dfrevert.mixins.json" + ], + "depends": { + "fabricloader": ">=0.15.11", + "minecraft": "~1.20.4", + "java": ">=17", + "fabric-api": "*", + "yet_another_config_lib_v3": "*" + }, + "recommends": { + "modmenu": "*" + } +} \ No newline at end of file