diff --git a/gradle.properties b/gradle.properties index 6f8211de..03e65c14 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.jvmargs=-Xmx2048M # Fabric Properties # check these on https://fabricmc.net/develup -minecraft_version=1.21.6 -yarn_mappings=1.21.6+build.1 +minecraft_version=1.21.7 +yarn_mappings=1.21.7+build.6 loader_version=0.16.14 -loom_version=1.10-SNAPSHOT +loom_version=1.11-SNAPSHOT # Fabric API -fabric_version=0.127.0+1.21.6 +fabric_version=0.128.2+1.21.7 # Mod Properties mod_name = Essential Commands diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b95..1b33c55b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e18bc253..d4081da4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f3b75f3b..23d15a93 100644 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -205,7 +205,7 @@ fi 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, +# * 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. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9b42019c..5eed7ee8 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%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" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/com/fibermc/essentialcommands/commands/MotdCommand.java b/src/main/java/com/fibermc/essentialcommands/commands/MotdCommand.java index bdfc37d2..ccd56a0e 100644 --- a/src/main/java/com/fibermc/essentialcommands/commands/MotdCommand.java +++ b/src/main/java/com/fibermc/essentialcommands/commands/MotdCommand.java @@ -2,7 +2,9 @@ import eu.pb4.placeholders.api.PlaceholderContext; import eu.pb4.placeholders.api.Placeholders; -import eu.pb4.placeholders.api.TextParserUtils; +import eu.pb4.placeholders.api.parsers.NodeParser; +import eu.pb4.placeholders.api.parsers.ParserBuilder; +import eu.pb4.placeholders.api.parsers.TagParser; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -15,6 +17,11 @@ public final class MotdCommand { private MotdCommand() {} + private static final NodeParser NODE_PARSER = ParserBuilder.of() + .globalPlaceholders() + .add(TagParser.QUICK_TEXT_WITH_STF_SAFE) + .build(); + public static int run(CommandContext context) throws CommandSyntaxException { var player = context.getSource().getPlayerOrThrow(); exec(player); @@ -22,10 +29,12 @@ public static int run(CommandContext context) throws Comman } public static void exec(ServerPlayerEntity player) { - var message = Placeholders.parseText( - TextParserUtils.formatText(CONFIG.MOTD), - PlaceholderContext.of(player) + player.getCommandSource().sendFeedback( + () -> Placeholders.parseText( + NODE_PARSER.parseNode(CONFIG.MOTD), + PlaceholderContext.of(player) + ), + false ); - player.getCommandSource().sendFeedback(() -> message, false); } } diff --git a/src/main/java/com/fibermc/essentialcommands/text/ECTextImpl.java b/src/main/java/com/fibermc/essentialcommands/text/ECTextImpl.java index 5a1933af..cf2b4aad 100644 --- a/src/main/java/com/fibermc/essentialcommands/text/ECTextImpl.java +++ b/src/main/java/com/fibermc/essentialcommands/text/ECTextImpl.java @@ -1,19 +1,20 @@ package com.fibermc.essentialcommands.text; -import java.util.*; -import java.util.stream.Collectors; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; -import com.fibermc.essentialcommands.types.ECPlaceholderApiCompat; import com.fibermc.essentialcommands.types.IStyleProvider; -import eu.pb4.placeholders.api.*; -import eu.pb4.placeholders.api.node.TextNode; +import eu.pb4.placeholders.api.ParserContext; +import eu.pb4.placeholders.api.PlaceholderContext; +import eu.pb4.placeholders.api.parsers.NodeParser; +import eu.pb4.placeholders.api.parsers.TagLikeParser; import org.jetbrains.annotations.Nullable; import net.minecraft.server.MinecraftServer; import net.minecraft.text.*; -import dev.jpcode.eccore.util.TextUtil; - public class ECTextImpl extends ECText { private final ParserContext parserContext; @@ -67,50 +68,41 @@ public MutableText getText(String key, TextFormatType textFormatType, IStyleProv return getTextInternal(key, textFormatType, styleProvider, args); } - private Placeholders.PlaceholderGetter placeholderGetterForContext( + private NodeParser parserForContext( TextFormatType textFormatType, @Nullable IStyleProvider styleProvider, List args) { - return new Placeholders.PlaceholderGetter() { - @Override - public boolean isContextOptional() { - // In some situations (Notably, unit tests), the MinecraftServer from which to init - // the PlaceholderContext will be unavailable, so we set the context to Optional. - // (At time of writing, none of EC's PlaceholderGetter tech depends on the server - // context) - return true; - } - - @Override - public PlaceholderHandler getPlaceholder(String placeholderId) { - return (ctx, abc) -> { + return TagLikeParser.of( + TagLikeParser.PLACEHOLDER_USER, + TagLikeParser.Provider.placeholderText(placeholderId -> { + if (placeholderId.startsWith("l:")) { + // handling the ${l:lang.key.here} case for interpolating value from elsewhere in language files var idxAndFormattingCode = placeholderId.split(":"); - if (idxAndFormattingCode.length < 1) { - throw new IllegalArgumentException("lang string placeholder did not contain an index"); + if (idxAndFormattingCode.length < 2) { + throw new IllegalArgumentException( + "Specified lang interpolation prefix ('l'), but no lang key was provided. Expected the form: 'l:lang.key.here'. Received: " + + placeholderId); + } + if (idxAndFormattingCode.length > 3) { + throw new IllegalArgumentException("lang string placeholder had an unexpected second ':'. Received: " + placeholderId); } - var firstToken = idxAndFormattingCode[0]; - var text = switch (firstToken) { - case "l" -> { - if (idxAndFormattingCode.length < 2) { - throw new IllegalArgumentException( - "Specified lang interpolation prefix ('l'), but no lang key was provided. Expected the form: 'l:lang.key.here'. Received: " - + placeholderId); - } - yield getTextInternal(idxAndFormattingCode[1], textFormatType, styleProvider); - } - - default -> args.get(Integer.parseInt(idxAndFormattingCode[0])); - }; - return PlaceholderResult.value(text); - }; - } - }; - } + return getTextInternal(idxAndFormattingCode[1], textFormatType, styleProvider); + } + + if (placeholderId.matches("\\d+")) { + // handling the ${1} case for argument interpolation + int targetIndex = Integer.parseInt(placeholderId); + if (targetIndex > args.size()) { + throw new IllegalArgumentException("Invalid 'Argument' placeholder: targeted argument with (0-based) index '" + targetIndex + "' but only " + args.size() + " were present"); + } + return args.get(targetIndex); + } - private static int hashText(Text text) { - return Objects.hash(text.getContent(), text.getStyle()); + return null; + }) + ); } public MutableText getTextInternal( @@ -120,33 +112,19 @@ public MutableText getTextInternal( Text... args) { var argsList = Arrays.stream(args).map(Text::copy).toList(); - var argsHashes = argsList.stream() - .map(ECTextImpl::hashText) - .collect(Collectors.toCollection(HashSet::new)); - - var placeholderGetter = placeholderGetterForContext(textFormatType, styleProvider, argsList); - var nodes = Placeholders.parseNodes( - TextNode.convert(Text.literal(getString(key))), - Placeholders.PREDEFINED_PLACEHOLDER_PATTERN, - placeholderGetter); - var retVal = ECPlaceholderApiCompat.toText(nodes, parserContext); - var retValSiblings = retVal.getSiblings(); + var parser = parserForContext(textFormatType, styleProvider, argsList); + var parsedText = parser.parseText( + getString(key), + this.parserContext + ); var specifiedStyle = styleProvider == null ? textFormatType.getStyle() : styleProvider.getStyle(textFormatType); - - if (retValSiblings.size() == 0) { - return retVal.copy().setStyle(specifiedStyle); - } - - return retValSiblings - .stream() - .map(text -> argsHashes.contains(hashText(text)) - ? text - : text.copy().setStyle(specifiedStyle)) - .collect(TextUtil.collect()); + var ret = Text.empty(); + parsedText.getWithStyle(specifiedStyle).forEach(ret::append); + return ret; } public boolean hasTranslation(String key) {