diff --git a/build.gradle b/build.gradle index ba352c7..bc9db2d 100644 --- a/build.gradle +++ b/build.gradle @@ -14,18 +14,8 @@ base { repositories { mavenLocal() - maven { - name = "DevAuth" - url = "https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1" - } - maven { - name = "Terraformers" - url = "https://maven.terraformersmc.com/" - } - maven { - name "oth3rMavenSnapshots" - url "https://maven.oth3r.one/snapshots" - } + maven { url = "https://maven.terraformersmc.com/releases/" } + maven { url = "https://maven.isxander.dev/releases" } } loom { @@ -37,13 +27,11 @@ dependencies { mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - // required dependencies modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation "one.oth3r:otterlib:${project.otterlib_version}" - // optional dependencies modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}" - modRuntimeOnly "me.djtheredstoner:DevAuth-fabric:${project.devauth_version}" + + modImplementation "one.oth3r:otterlib:${project.otterlib_version}" } processResources { diff --git a/changelog.md b/changelog.md index 1601ba7..2b7e70c 100644 --- a/changelog.md +++ b/changelog.md @@ -1,17 +1,9 @@ -# v1.2.4.5 -* bumped OtterLib version to `0.2.1.0` - * fixed default languages files not being able to be loaded - -# v1.2.4.4 -* bumped OtterLib version to `0.2.0.0` - * now relies on OtterLib Language Reader - # v1.2.4.3 * added a max OtterLib version as the beta will have breaking changes between major versions # v1.2.4.2 * fixed language file not loading (reverted uppercase locales) -* fixed block checking having a hardcoded player reach - now uses player reach (1.20.6+) +* fixed block checking having a hardcoded player reach - now uses player reach * fixed block and item tag check logic for cases with only not(!) tags # v1.2.4.1 diff --git a/gradle.properties b/gradle.properties index 8bbba0b..a6218ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,17 +10,15 @@ minecraft_versions=1.20.4 minecraft_version=1.20.4 yarn_mappings=1.20.4+build.3 -loader_version=0.16.14 +loader_version=0.16.13 # Mod Properties -mod_version=1.2.4.5+1.20.4 +mod_version=1.2.4.3+1.20.4 maven_group=one.oth3r file_name=sit! # Dependencies -fabric_version=0.97.3+1.20.4 -otterlib_version=0.2.1.0+1.20.4-fabric -otterlib_max_version=0.3.0.0+1.20.4-fabric - +fabric_version=0.97.1+1.20.4 modmenu_version=9.0.0 -devauth_version=1.2.1 \ No newline at end of file +otterlib_version=0.1.2.1+1.20.4-fabric +otterlib_max_version=0.2.0.0+1.20.4-fabric \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 1b33c55..0000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index ca025c8..0000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 23d15a9..fcb6fca 100644 --- a/gradlew +++ b/gradlew @@ -15,8 +15,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# SPDX-License-Identifier: Apache-2.0 -# ############################################################################## # @@ -57,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# 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/. @@ -85,8 +83,7 @@ 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 -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +111,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -147,7 +144,7 @@ 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 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -155,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -204,16 +201,16 @@ 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, 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. +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + org.gradle.wrapper.GradleWrapperMain \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index db3a6ac..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,8 +13,6 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -45,11 +43,11 @@ 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 +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. goto fail @@ -59,22 +57,22 @@ 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 +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. goto fail :execute @rem Setup the command line -set CLASSPATH= +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%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%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 diff --git a/src/main/java/one/oth3r/sit/SitClient.java b/src/main/java/one/oth3r/sit/SitClient.java index c125588..7bd19c1 100644 --- a/src/main/java/one/oth3r/sit/SitClient.java +++ b/src/main/java/one/oth3r/sit/SitClient.java @@ -7,9 +7,9 @@ import one.oth3r.otterlib.client.screen.ConfigScreen; import one.oth3r.otterlib.client.screen.utl.CustomImage; import one.oth3r.otterlib.client.screen.utl.SimpleButton; import one.oth3r.sit.file.FileData; -import one.oth3r.sit.utl.Chat; import one.oth3r.sit.utl.Data; import one.oth3r.sit.utl.Events; +import one.oth3r.sit.utl.Utl; import java.net.URI; import java.util.List; @@ -23,17 +23,17 @@ public class SitClient implements ClientModInitializer { } public static Screen getConfigScreen(Screen parent) { - return new ConfigScreen(parent, Chat.lang("sit!.screen.config"), + return new ConfigScreen(parent, Utl.lang("sit!.screen.config"), new CustomImage(Identifier.of(Data.MOD_ID, "textures/gui/banner.png"),128, 72), List.of( - SimpleButton.Templates.fileEditor(Chat.lang("config.server"), FileData.getServerConfig(), new CustomImage(Identifier.of(Data.MOD_ID, "textures/gui/sprites/server_button.png"),246,26)).build(), - SimpleButton.Templates.fileEditor(Chat.lang("config.sitting"), FileData.getSittingConfig(), new CustomImage(Identifier.of(Data.MOD_ID, "textures/gui/sprites/sitting_button.png"), 246, 26)).build() + SimpleButton.Templates.fileEditor(Utl.lang("config.server"), FileData.getServerConfig(), new CustomImage(Identifier.of(Data.MOD_ID, "textures/gui/sprites/server_button.png"),246,26)).build(), + SimpleButton.Templates.fileEditor(Utl.lang("config.sitting"), FileData.getSittingConfig(), new CustomImage(Identifier.of(Data.MOD_ID, "textures/gui/sprites/sitting_button.png"), 246, 26)).build() ), List.of( - SimpleButton.Templates.warning(Chat.lang("sit!.gui.button.issues")).openLink("https://github.com/Oth3r/Sit/issues").build(), - new SimpleButton.Builder(Chat.lang("sit!.gui.button.website")).openLink("https://modrinth.com/mod/sit!").build(), - SimpleButton.Templates.done(Chat.lang("gui.done")).build(), - SimpleButton.Templates.donate(Chat.lang("sit!.gui.button.donate")).openLink(URI.create("https://ko-fi.com/oth3r")).build() + SimpleButton.Templates.warning(Utl.lang("sit!.gui.button.issues")).openLink("https://github.com/Oth3r/Sit/issues").build(), + new SimpleButton.Builder(Utl.lang("sit!.gui.button.website")).openLink("https://modrinth.com/mod/sit!").build(), + SimpleButton.Templates.done(Utl.lang("gui.done")).build(), + SimpleButton.Templates.donate(Utl.lang("sit!.gui.button.donate")).openLink(URI.create("https://ko-fi.com/oth3r")).build() )); } } diff --git a/src/main/java/one/oth3r/sit/command/SitCommand.java b/src/main/java/one/oth3r/sit/command/SitCommand.java index ad928ed..7abd2f3 100644 --- a/src/main/java/one/oth3r/sit/command/SitCommand.java +++ b/src/main/java/one/oth3r/sit/command/SitCommand.java @@ -8,8 +8,8 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; -import one.oth3r.sit.utl.Chat; import one.oth3r.sit.utl.Data; import one.oth3r.sit.utl.Logic; import one.oth3r.sit.utl.Utl; @@ -50,7 +50,7 @@ public class SitCommand { if (player == null) { if (args[0].equalsIgnoreCase("reload")) { Logic.reload(); - Data.LOGGER.info(Chat.lang("sit!.chat.reloaded").toString()); + Data.LOGGER.info(Utl.lang("sit!.chat.reloaded").toString()); } return 1; } @@ -76,7 +76,7 @@ public class SitCommand { if (args[0].equalsIgnoreCase("reload")) { Logic.reload(); - player.sendMessage(Chat.tag().append(Chat.lang("sit!.chat.reloaded").color(Color.GREEN)).b()); + player.sendMessage(Utl.messageTag().append(Utl.lang("sit!.chat.reloaded").color(Color.GREEN)).b()); } if (args[0].equalsIgnoreCase("purgeChairEntities")) Utl.Entity.purge(player,true); diff --git a/src/main/java/one/oth3r/sit/file/FileData.java b/src/main/java/one/oth3r/sit/file/FileData.java index 0eb0baa..4e95a66 100644 --- a/src/main/java/one/oth3r/sit/file/FileData.java +++ b/src/main/java/one/oth3r/sit/file/FileData.java @@ -1,9 +1,6 @@ package one.oth3r.sit.file; import net.minecraft.server.network.ServerPlayerEntity; -import one.oth3r.otterlib.file.LanguageReader; -import one.oth3r.otterlib.file.ResourceReader; -import one.oth3r.sit.Sit; import one.oth3r.sit.utl.Data; import one.oth3r.sit.utl.Utl; @@ -59,22 +56,11 @@ public class FileData { return playerSettings.getOrDefault(player, sittingConfig); } - /// the language / text system for the mod - private static final LanguageReader langReader = new LanguageReader( - new ResourceReader("assets/sit-oth3r/lang/",Sit.class.getClassLoader()), - new ResourceReader(Data.CONFIG_DIR),"en_us","en_us"); - - public static LanguageReader getLangReader() { - return langReader; - } - /** * loads all config files to memory */ public static void loadFiles() { getServerConfig().load(); - // load the language reader - langReader.updateLanguage(getServerConfig().getLang()); getSittingConfig().load(); // if loading file and is on supported server on client, send the new settings over diff --git a/src/main/java/one/oth3r/sit/file/LangReader.java b/src/main/java/one/oth3r/sit/file/LangReader.java new file mode 100644 index 0000000..d9fdaff --- /dev/null +++ b/src/main/java/one/oth3r/sit/file/LangReader.java @@ -0,0 +1,124 @@ +package one.oth3r.sit.file; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import one.oth3r.otterlib.chat.CTxT; +import one.oth3r.sit.Sit; +import one.oth3r.sit.utl.Data; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class LangReader { + private static final Map defaultLangMap = new HashMap<>(); + private static final Map languageMap = new HashMap<>(); + + private final String translationKey; + + private final Object[] placeholders; + + public LangReader(String translationKey, Object... placeholders) { + this.translationKey = translationKey; + this.placeholders = placeholders; + } + + public CTxT getTxT() { + String translated = getLanguageValue(translationKey); + if (placeholders != null && placeholders.length > 0) { + //removed all double \\ and replaces with \ + translated = translated.replaceAll("\\\\\\\\", "\\\\"); + String regex = "%\\d*\\$?[dfs]"; + Matcher anyMatch = Pattern.compile(regex).matcher(translated); + Matcher endMatch = Pattern.compile(regex+"$").matcher(translated); + + // Arraylist with all the %(#$)[dfs] + ArrayList matches = new ArrayList<>(); + while (anyMatch.find()) { + String match = anyMatch.group(); + matches.add(match); + } + //SPLITS the text at each regex and remove the regex + String[] parts = translated.split(regex); + //if the last element of the array ends with regex, remove it and add an empty string to the end of the array + if (endMatch.find()) { + String[] newParts = Arrays.copyOf(parts, parts.length + 1); + newParts[parts.length] = ""; + parts = newParts; + } + //if there are placeholders specified, and the split is more than 1, it will replace %(dfs) with the placeholder objects + if (parts.length > 1) { + CTxT txt = new CTxT(""); + int i = 0; + for (String match : matches) { + int get = i; + //if the match is numbered, change GET to the number it wants + if (match.contains("$")) { + match = match.substring(1,match.indexOf('$')); + get = Integer.parseInt(match)-1; + } + if (parts.length != i) txt.append(parts[i]); + //convert the obj into txt + txt.append(getTxTFromObj(placeholders[get])); + i++; + } + if (parts.length != i) txt.append(parts[i]); + return new CTxT(txt); + } + } + return new CTxT(translated); + } + + private CTxT getTxTFromObj(Object obj) { + if (obj instanceof CTxT) return (((CTxT) obj)); + else if (obj instanceof Text) return new CTxT((MutableText) obj); + else return new CTxT(String.valueOf(obj)); + } + + public static LangReader of(String translationKey, Object... placeholders) { + return new LangReader(translationKey, placeholders); + } + + public static void loadLanguageFile() { + Type tToken = new TypeToken>(){}.getType(); + try { + // load the config language + Reader selectionReader = new InputStreamReader(getInputStream(false), StandardCharsets.UTF_8); + languageMap.putAll(new Gson().fromJson(selectionReader, tToken)); + // load the default language as well (fallback) + Reader defaultReader = new InputStreamReader(getInputStream(true), StandardCharsets.UTF_8); + defaultLangMap.putAll(new Gson().fromJson(defaultReader, tToken)); + } catch (Exception e) { + Data.LOGGER.info("ERROR WITH LANGUAGE FILE - PLEASE REPORT WITH THE ERROR LOG"); + Data.LOGGER.info(e.getMessage()); + } + } + + private static InputStream getInputStream(boolean english) { + ClassLoader classLoader = Sit.class.getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream("assets/sit-oth3r/lang/"+FileData.getServerConfig().getLang()+".json"); + // make null if english + if (english) inputStream = null; + + // if it cant read (null), try again, but with the english file + if (inputStream == null) inputStream = classLoader.getResourceAsStream("assets/sit-oth3r/lang/"+new ServerConfig().getLang()+".json"); + + // if null after that, throw an exception + if (inputStream == null) throw new IllegalArgumentException("CANT LOAD THE LANGUAGE FILE. SIT! WILL BREAK."); + return inputStream; + } + + public static String getLanguageValue(String key) { + return languageMap.getOrDefault(key, defaultLangMap.getOrDefault(key, key)); + } +} \ No newline at end of file diff --git a/src/main/java/one/oth3r/sit/file/ServerConfig.java b/src/main/java/one/oth3r/sit/file/ServerConfig.java index 8a36ad3..f4cd25e 100644 --- a/src/main/java/one/oth3r/sit/file/ServerConfig.java +++ b/src/main/java/one/oth3r/sit/file/ServerConfig.java @@ -1,14 +1,15 @@ package one.oth3r.sit.file; import com.google.gson.Gson; +import com.google.gson.JsonElement; import com.google.gson.JsonSyntaxException; import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; import net.minecraft.util.Hand; -import one.oth3r.otterlib.base.Num; import one.oth3r.otterlib.file.CustomFile; import one.oth3r.otterlib.file.FileSettings; import one.oth3r.sit.utl.Data; +import one.oth3r.sit.utl.Utl; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -263,8 +264,13 @@ public class ServerConfig implements CustomFile { this.interactionBlocks = newFile.interactionBlocks.stream().map(CustomBlock::new).collect(Collectors.toCollection(ArrayList::new)); } + /** + * updates the file based on the version number of the current instance + * + * @param json + */ @Override - public void updateInstance() { + public void update(JsonElement json) { /// update to 2.1, just a new list, nothing to change /// update to 2.2, new settings, no changes if (version >= 2.0 && version <= 2.1) { @@ -335,7 +341,7 @@ public class ServerConfig implements CustomFile { loadVersion(properties,Double.parseDouble(ver)); } catch (Exception e) { - Data.LOGGER.error("Error loading legacy config file: %s", e.getMessage()); + Data.LOGGER.error("Error loading legacy config file: {}", e.getMessage()); } // delete the old file @@ -370,7 +376,7 @@ public class ServerConfig implements CustomFile { // skip if not the right size if (split.length < 3 || split.length > 4) continue; // if the other entries aren't correct, skip - if (!Num.isNum(split[2])) continue; + if (!Utl.Num.isNum(split[2])) continue; // make the block states list if possible ArrayList blockstates = new ArrayList<>(); @@ -497,7 +503,7 @@ public class ServerConfig implements CustomFile { serverConfig.save(); sittingConfig.save(); } catch (Exception e) { - Data.LOGGER.error("Error loading legacy config: %s", e.getMessage()); + Data.LOGGER.error("Error loading legacy config: {}", e.getMessage()); } } } diff --git a/src/main/java/one/oth3r/sit/file/SittingConfig.java b/src/main/java/one/oth3r/sit/file/SittingConfig.java index 2e7337b..38564ce 100644 --- a/src/main/java/one/oth3r/sit/file/SittingConfig.java +++ b/src/main/java/one/oth3r/sit/file/SittingConfig.java @@ -101,7 +101,7 @@ public class SittingConfig implements CustomFile { } @Override - public void updateInstance() { + public void update(JsonElement jsonElement) { } diff --git a/src/main/java/one/oth3r/sit/mixin/ReloadCommandMixin.java b/src/main/java/one/oth3r/sit/mixin/ReloadCommandMixin.java index 6edd652..81d15fb 100644 --- a/src/main/java/one/oth3r/sit/mixin/ReloadCommandMixin.java +++ b/src/main/java/one/oth3r/sit/mixin/ReloadCommandMixin.java @@ -5,9 +5,10 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ReloadCommand; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; -import one.oth3r.sit.utl.Chat; +import net.minecraft.util.Formatting; import one.oth3r.sit.utl.Data; import one.oth3r.sit.utl.Logic; +import one.oth3r.sit.utl.Utl; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -28,7 +29,7 @@ public class ReloadCommandMixin { // send a reloaded message to all players with permissions for (ServerPlayerEntity player : server.getPlayerManager().getPlayerList()) { if (player.isCreativeLevelTwoOp()) { - player.sendMessage(Chat.tag().append(Chat.lang("sit!.chat.reloaded").color(Color.GREEN)).b()); + player.sendMessage(Utl.messageTag().append(Utl.lang("sit!.chat.reloaded").color(Color.GREEN)).b()); } } } diff --git a/src/main/java/one/oth3r/sit/utl/Chat.java b/src/main/java/one/oth3r/sit/utl/Chat.java deleted file mode 100644 index 6dc2867..0000000 --- a/src/main/java/one/oth3r/sit/utl/Chat.java +++ /dev/null @@ -1,16 +0,0 @@ -package one.oth3r.sit.utl; - -import one.oth3r.otterlib.chat.CTxT; -import one.oth3r.sit.file.FileData; - -import java.awt.*; - -public class Chat { - public static CTxT tag() { - return new CTxT("Sit!").btn(true).color(Color.decode("#c400ff")).append(" "); - } - - public static CTxT lang(String key, Object... args) { - return FileData.getLangReader().dynamicTranslatable(key, args); - } -} diff --git a/src/main/java/one/oth3r/sit/utl/Data.java b/src/main/java/one/oth3r/sit/utl/Data.java index 5074908..8c67fde 100644 --- a/src/main/java/one/oth3r/sit/utl/Data.java +++ b/src/main/java/one/oth3r/sit/utl/Data.java @@ -4,13 +4,14 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.decoration.DisplayEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; -import one.oth3r.otterlib.base.OtterLogger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.HashMap; public class Data { public static final String MOD_ID = "sit-oth3r"; - public static final OtterLogger LOGGER = new OtterLogger(MOD_ID); + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static final String CONFIG_DIR = FabricLoader.getInstance().getConfigDir().toFile()+"/sit!/"; diff --git a/src/main/java/one/oth3r/sit/utl/Events.java b/src/main/java/one/oth3r/sit/utl/Events.java index 851ade2..190a49b 100644 --- a/src/main/java/one/oth3r/sit/utl/Events.java +++ b/src/main/java/one/oth3r/sit/utl/Events.java @@ -23,6 +23,7 @@ import net.minecraft.util.Formatting; import one.oth3r.sit.SitClient; import one.oth3r.sit.command.SitCommand; import one.oth3r.sit.file.FileData; +import one.oth3r.sit.file.LangReader; import one.oth3r.sit.file.SittingConfig; import one.oth3r.sit.packet.PacketSender; import one.oth3r.sit.packet.PacketType; @@ -78,7 +79,7 @@ public class Events { player.networkHandler.sendCommand("sit"); } else { // unsupported server message if not in a Sit! server - player.sendMessage(Chat.lang("sit!.chat.unsupported") + player.sendMessage(Utl.lang("sit!.chat.unsupported") .color(Color.RED).b(), true); } } @@ -102,7 +103,7 @@ public class Events { new PacketSender(PacketType.RESPONSE,PacketType.RESPONSE.getId()).sendToPlayer(player); // log the receiving of the packet from the player - Data.LOGGER.info(Chat.lang("sit!.console.player_settings",player.getName().getString()).toString()); + Data.LOGGER.info(Utl.lang("sit!.console.player_settings",player.getName().getString()).toString()); }); })); } @@ -115,7 +116,7 @@ public class Events { client.execute(() -> { if (!Data.isSupportedServer()) { Data.setSupportedServer(true); - Data.LOGGER.info(Chat.lang("sit!.console.connected",packetData).toString()); + Data.LOGGER.info(Utl.lang("sit!.console.connected",packetData).toString()); } }); })); @@ -174,6 +175,7 @@ public class Events { private static void serverLifecycle() { ServerLifecycleEvents.SERVER_STARTED.register(s -> { Data.setServer(s); + LangReader.loadLanguageFile(); // right click on block event UseBlockCallback.EVENT.register((pl, world, hand, hitResult) -> { @@ -193,7 +195,7 @@ public class Events { ParseResults parse = dispatcher.parse("sit", player.getCommandSource()); dispatcher.execute(parse); } catch (CommandSyntaxException e) { - Data.LOGGER.error("Error executing sit command for player %s", player.getName().getString()); + Data.LOGGER.error("Error executing sit command for player {}", player.getName().getString()); } } diff --git a/src/main/java/one/oth3r/sit/utl/Logic.java b/src/main/java/one/oth3r/sit/utl/Logic.java index 0433259..b128b94 100644 --- a/src/main/java/one/oth3r/sit/utl/Logic.java +++ b/src/main/java/one/oth3r/sit/utl/Logic.java @@ -201,6 +201,7 @@ public class Logic { public static void reload() { FileData.loadFiles(); FileData.saveFiles(); + LangReader.loadLanguageFile(); } /** @@ -227,11 +228,11 @@ public class Logic { Formatting messageColor = config.getEnabled()?Formatting.GREEN:Formatting.RED; // send the player the actionbar message - return Chat.lang("sit!.chat.toggle_sit", - Chat.lang(messageKey).color(config.getEnabled()? Color.GREEN : Color.RED)).b(); + return Utl.lang("sit!.chat.toggle_sit", + Utl.lang(messageKey).color(config.getEnabled()? Color.GREEN : Color.RED)).b(); } else { // unsupported server message if not in a Sit! server - return Chat.lang("sit!.chat.unsupported") + return Utl.lang("sit!.chat.unsupported") .color(Color.RED).b(); } } diff --git a/src/main/java/one/oth3r/sit/utl/Utl.java b/src/main/java/one/oth3r/sit/utl/Utl.java index e5a28c9..1b89c99 100644 --- a/src/main/java/one/oth3r/sit/utl/Utl.java +++ b/src/main/java/one/oth3r/sit/utl/Utl.java @@ -60,6 +60,46 @@ public class Utl { return Data.getSitEntities().values().stream().noneMatch(entity -> entity.getBlockPos().equals(pos)); } + public static class Num { + + public static boolean isInt(String string) { + try { + Integer.parseInt(string); + } catch (NumberFormatException nfe) { + return false; + } + return true; + } + + public static Integer toInt(String s) { + // return an int no matter what + try { + return Integer.parseInt(s); + } catch (NumberFormatException e) { + try { + return (int) Double.parseDouble(s); + } catch (NumberFormatException e2) { + return 0; + } + } + } + + public static boolean isNum(String s) { + // checks if int or a double + try { + Integer.parseInt(s); + return true; + } catch (NumberFormatException e1) { + try { + Double.parseDouble(s); + return true; + } catch (NumberFormatException e2) { + return false; + } + } + } + } + public static final double HALF_BLOCK = 0.5; public static final double CARPET = 0.062; @@ -281,14 +321,58 @@ public class Utl { // send a message if needed if (message) { - player.sendMessage(Chat.tag() - .append(Chat.lang("sit!.chat.purged", - Chat.lang("sit!.chat.purged.total",count).color(Color.gray).b() - ).color(Color.GREEN)).b()); + player.sendMessage(messageTag() + .append(lang("sit!.chat.purged",lang("sit!.chat.purged.total",count).color(Color.gray).b()).color(Color.GREEN)).b()); } } } + public static CTxT messageTag() { + return new CTxT("Sit!").btn(true).color(Color.decode("#c400ff")).append(" "); + } + + /** + * gets a MutableText using the language key, if on server, using the custom lang reader + */ + public static CTxT lang(String key, Object... args) { + if (Data.isClient()) { + // we have to first convert all the CTxT's to the built version because minecraft lang reader doesn't know how to process it + // make a array with the same size of the args + Object[] fixedArgs = new Object[args.length]; + // for every arg, build & add if CTxT or just add if not + for (var i = 0; i < args.length; i++) { + if (args[i] instanceof CTxT) fixedArgs[i] = ((CTxT) args[i]).b(); + else fixedArgs[i] = args[i]; + } + // return the translated text + return new CTxT(Text.translatable(key,fixedArgs)); + } + else return LangReader.of(key, args).getTxT(); + } + + public static class Enum { + + public static > T get(Object enumString, Class enumType) { + return get(enumString,enumType,enumType.getEnumConstants()[0]); + } + /** + * gets an enum from a string without returning null + * @param enumString the string of the enum + * @param enumType the class of enums + * @param defaultEnum the enum to return if a match isn't found + * @return an enum, if there isn't a match, it returns the first enum + */ + public static > T get(Object enumString, Class enumType, T defaultEnum) { + T[] values = enumType.getEnumConstants(); + for (T all : values) { + // check if there is a match for any of the enum names + if (enumString.toString().equals(all.name())) return all; + } + // if there's no match return the first entry + return defaultEnum; + } + } + /** * sends the settings packets to the server, if client & in game */