From db3334c615a93c41b0c40b7ea59df27566f899b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nelson=20Gra=C3=A7a?= Date: Fri, 10 Jul 2026 15:40:32 +0100 Subject: [PATCH 1/3] 26.2 Support --- build-unobfuscated.gradle.kts | 123 ++++++++++++++++++ build.gradle.kts | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 10 +- .../alexdevs/solstice/api/ServerLocation.java | 4 + .../solstice/api/text/Components.java | 9 +- .../me/alexdevs/solstice/api/text/Format.java | 27 ++++ .../api/text/MapPlaceholderParser.java | 60 +++++++++ .../solstice/api/text/parser/CodeParser.java | 3 +- .../solstice/api/text/parser/LinkParser.java | 3 +- .../text/parser/MarkdownComponentParser.java | 18 ++- .../api/text/tag/PhaseGradientTag.java | 47 ++++++- .../solstice/api/utils/EntityUtils.java | 6 + .../solstice/api/utils/PlaceholderUtils.java | 34 +++++ .../commands/ServerStatCommand.java | 4 +- .../coreModule/commands/SolsticeCommand.java | 8 ++ .../solstice/modules/afk/AfkModule.java | 4 + .../modules/ban/commands/BanCommand.java | 5 +- .../ban/formatters/BanMessageFormatter.java | 4 +- .../broadcast/commands/BroadcastCommand.java | 4 +- .../commands/PlainBroadcastCommand.java | 4 +- .../modules/commandSpy/CommandSpyModule.java | 3 + .../commands/EnderChestCommand.java | 6 + .../modules/fly/commands/FlyCommand.java | 4 +- .../modules/god/commands/GodCommand.java | 4 +- .../modules/hat/commands/HatCommand.java | 7 + .../helpOp/commands/HelpOpCommand.java | 4 +- .../modules/info/commands/InfoCommand.java | 6 +- .../modules/info/commands/MotdCommand.java | 4 +- .../modules/info/commands/RulesCommand.java | 4 +- .../commands/InventorySeeCommand.java | 21 ++- .../solstice/modules/jail/JailModule.java | 4 + .../alexdevs/solstice/modules/kit/Utils.java | 3 + .../modules/kit/commands/KitCommand.java | 6 + .../modules/kit/commands/KitsCommand.java | 8 +- .../modules/mail/commands/MailCommand.java | 6 +- .../modules/miscellaneous/DummyExplosion.java | 2 +- .../commands/KittyCannonCommand.java | 3 + .../miscellaneous/commands/TopCommand.java | 3 + .../modules/powertool/PowerToolModule.java | 23 ++-- .../solstice/modules/rtp/core/Locator.java | 22 +++- .../modules/seen/commands/SeenCommand.java | 3 +- .../solstice/modules/sign/SignModule.java | 3 + .../modules/smite/commands/SmiteCommand.java | 3 + .../solstice/modules/spawn/SpawnModule.java | 5 +- .../modules/staffChat/StaffChatModule.java | 6 + .../modules/styling/StylingModule.java | 6 + .../modules/sudo/commands/SudoCommand.java | 9 +- .../solstice/modules/tell/TellModule.java | 9 +- .../modules/tell/commands/ReplyCommand.java | 4 +- .../solstice/modules/timeBar/TimeBar.java | 14 +- .../modules/warp/commands/WarpsCommand.java | 4 +- versions/26.2/gradle.properties | 16 +++ 53 files changed, 536 insertions(+), 78 deletions(-) create mode 100644 build-unobfuscated.gradle.kts create mode 100644 src/main/java/me/alexdevs/solstice/api/text/MapPlaceholderParser.java create mode 100644 src/main/java/me/alexdevs/solstice/api/utils/PlaceholderUtils.java create mode 100644 versions/26.2/gradle.properties diff --git a/build-unobfuscated.gradle.kts b/build-unobfuscated.gradle.kts new file mode 100644 index 00000000..15f12ced --- /dev/null +++ b/build-unobfuscated.gradle.kts @@ -0,0 +1,123 @@ +import com.modrinth.minotaur.dependencies.ModDependency +plugins { + id("net.fabricmc.fabric-loom") version "1.17-SNAPSHOT" + id("maven-publish") + id("com.modrinth.minotaur") version "2.+" + id("dev.kikugie.stonecutter") +} +version = "${property("mod_version")}+${property("minecraft_version")}" +group = property("maven_group") as String +base { + archivesName.set(property("archives_base_name") as String) +} +repositories { + mavenLocal() + maven { url = uri("https://maven.nucleoid.xyz") } + maven { + name = "TerraformersMC" + url = uri("https://maven.terraformersmc.com/") + } + maven { + name = "Ladysnake Libs" + url = uri("https://maven.ladysnake.org/releases") + } + maven { + name = "Modrinth" + url = uri("https://api.modrinth.com/maven") + } +} +// 26.1+ ships unobfuscated, so named mappings equal official ones; only the header differs. +val accessWidener = layout.buildDirectory.file("solstice-official.accesswidener").get().asFile.apply { + parentFile.mkdirs() + writeText( + rootProject.file("src/main/resources/solstice.accesswidener").readText() + .replaceFirst("accessWidener v2 named", "accessWidener v2 official") + ) +} +loom { + accessWidenerPath = accessWidener +} +dependencies { + minecraft("com.mojang:minecraft:${property("minecraft_version")}") + implementation("net.fabricmc:fabric-loader:${property("loader_version")}") + implementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_version")}") + include(implementation("org.spongepowered:configurate-core:${property("configurate_version")}")!!) + include(implementation("org.spongepowered:configurate-hocon:${property("configurate_version")}")!!) + include(implementation("org.spongepowered:configurate-gson:${property("configurate_version")}")!!) + include("com.typesafe:config:1.4.3") + include("io.leangen.geantyref:geantyref:1.3.16") + include(implementation("me.lucko:fabric-permissions-api:${property("permissions_api_version")}")!!) + include(implementation("eu.pb4:placeholder-api:${property("placeholderapi_version")}")!!) + include(implementation("eu.pb4:sgui:${property("sgui_version")}")!!) + implementation(include("eu.pb4:common-economy-api:${property("commoneconomy_version")}")!!) + compileOnly("maven.modrinth:trinkets-updated:${property("trinkets_version")}") + compileOnly("net.luckperms:api:5.4") + runtimeOnly("net.luckperms:api:5.4") + compileOnly("maven.modrinth:vanish:${project.property("vanish_version")}") +} +tasks.processResources { + val mcConstraint = project.property("minecraft_constraint") as String + val javaVer = project.property("java_version") as String + inputs.property("version", project.version) + inputs.property("minecraft_constraint", mcConstraint) + inputs.property("java_version", javaVer) + filesMatching("fabric.mod.json") { + expand(mapOf( + "version" to project.version, + "minecraft_constraint" to mcConstraint, + "java_version" to javaVer + )) + } +} +val javaVersion = (property("java_version") as String).toInt() +tasks.withType().configureEach { + options.release = javaVersion +} +java { + withSourcesJar() + sourceCompatibility = JavaVersion.toVersion(javaVersion) + targetCompatibility = JavaVersion.toVersion(javaVersion) +} +tasks.jar { + from(rootProject.file("LICENSE")) { + rename { "${it}_${base.archivesName.get()}" } + } +} +modrinth { + token = System.getenv("MODRINTH_TOKEN") + projectId = "uIvrDZas" + uploadFile = tasks["jar"] + gameVersions = listOf(property("minecraft_version") as String) + loaders = listOf("fabric") + dependencies = listOf(ModDependency("P7dR8mSH", "required")) +} +publishing { + publications { + create("mavenJava") { + artifactId = property("archives_base_name") as String + from(components["java"]) + } + } + repositories { + maven { + name = "AlexDevsRepo" + url = uri("https://maven.alexdevs.me/releases") + credentials { + username = System.getenv("MAVEN_USERNAME") + password = System.getenv("MAVEN_PASSWORD") + } + } + } +} + +stonecutter { + replacements.string(current.parsed >= "26.2") { + replace("Placeholders.register(", "Placeholders.registerCommon(") + replace("dev.emi.trinkets", "eu.pb4.trinkets") + } + replacements.string(current.parsed >= "1.21.11") { + replace("player.getServer()", "player.level().getServer()") + replace("sourcePlayer.getServer()", "sourcePlayer.level().getServer()") + replace("dimension().location()", "dimension().identifier()") + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 3f8b6fde..250ea1f8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.modrinth.minotaur.dependencies.ModDependency plugins { - id("fabric-loom") version "1.14-SNAPSHOT" + id("fabric-loom") version "1.17-SNAPSHOT" id("maven-publish") id("com.modrinth.minotaur") version "2.+" id("dev.kikugie.stonecutter") @@ -112,11 +112,15 @@ publishing { } stonecutter { + replacements.string(current.parsed >= "26.2") { + replace("Placeholders.register(", "Placeholders.registerCommon(") + replace("dev.emi.trinkets", "eu.pb4.trinkets") + + } replacements.string(current.parsed >= "1.21.11") { -// replace("player.level()", "player.serverLevel()") -// replace("sourcePlayer.serverLevel()", "sourcePlayer.level()") replace("player.getServer()", "player.level().getServer()") replace("sourcePlayer.getServer()", "sourcePlayer.level().getServer()") replace("dimension().location()", "dimension().identifier()") } + } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dbc3ce4a..5dd3c012 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-9.4.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle.kts b/settings.gradle.kts index 49e21044..be4d2f5f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,9 +19,13 @@ plugins { } stonecutter { - create(rootProject) { - versions("1.21.1", "1.21.4", "1.21.11") - vcsVersion = "1.21.1" + shared { + versions("1.21.1", "1.21.4", "1.21.11", "26.2") + mapBuilds { _, node -> + if (node.parsed >= "26.1") "build-unobfuscated.gradle.kts" else "build.gradle.kts" + } + vcsVersion.set("1.21.1") } + create(rootProject) } diff --git a/src/main/java/me/alexdevs/solstice/api/ServerLocation.java b/src/main/java/me/alexdevs/solstice/api/ServerLocation.java index 87bb39ba..34cc76a6 100644 --- a/src/main/java/me/alexdevs/solstice/api/ServerLocation.java +++ b/src/main/java/me/alexdevs/solstice/api/ServerLocation.java @@ -160,7 +160,11 @@ public boolean safeTeleport(ServerPlayer player, boolean setBackPosition, int ra // Integer zigzag pattern: 0, 1, -1, 2, -2, 3, -3, ... var y = (j % 2 == 0) ? -j / 2 : j / 2 + 1; + //? if >= 26.1 { + /*var safePos = DismountHelper.findSafeDismountLocation(net.minecraft.world.entity.EntityTypes.PLAYER, world, attemptPos.offset(0, y, 0), true); + *///? } elif >= 1.21.1 { var safePos = DismountHelper.findSafeDismountLocation(EntityType.PLAYER, world, attemptPos.offset(0, y, 0), true); + //? } if (safePos != null) { var safeLocation = new ServerLocation(safePos.x, safePos.y, safePos.z, this.getYaw(), this.getPitch(), this.getWorld()); safeLocation.teleport(player, setBackPosition); diff --git a/src/main/java/me/alexdevs/solstice/api/text/Components.java b/src/main/java/me/alexdevs/solstice/api/text/Components.java index f9773217..97bd5898 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/Components.java +++ b/src/main/java/me/alexdevs/solstice/api/text/Components.java @@ -1,6 +1,7 @@ package me.alexdevs.solstice.api.text; import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import eu.pb4.placeholders.api.Placeholders; import eu.pb4.placeholders.api.node.TextNode; import eu.pb4.placeholders.api.parsers.NodeParser; @@ -105,7 +106,7 @@ public static Component chat(String message, EnumSet capabilit var enableLegacy = capabilities.contains(TextCapabilities.LEGACY); var placeholders = new HashMap(); - var context = PlaceholderContext.of(source); + var context = PlaceholderUtils.of(source); if (ModuleProvider.STYLING.isEnabled()) { var config = Solstice.configManager.getData(StylingConfig.class); for (var repl : config.replacements.entrySet()) { @@ -120,6 +121,9 @@ public static Component chat(String message, EnumSet capabilit if (capabilities.isEmpty()) { + //? if >= 26.1 + //return new MapPlaceholderParser(Format.PLACEHOLDER_PATTERN, placeholders).parseNode(TextNode.of(message)).toComponent(); + //? if < 26.1 return Placeholders.parseText(TextNode.of(message), Format.PLACEHOLDER_PATTERN, placeholders); } @@ -139,6 +143,9 @@ public static Component chat(String message, EnumSet capabilit var parser = NodeParser.merge(parsers.toArray(NodeParser[]::new)); var node = parser.parseNode(message); + //? if >= 26.1 + //return new MapPlaceholderParser(Format.PLACEHOLDER_PATTERN, placeholders).parseNode(node).toComponent(); + //? if < 26.1 return Placeholders.parseText(node, Format.PLACEHOLDER_PATTERN, placeholders); } diff --git a/src/main/java/me/alexdevs/solstice/api/text/Format.java b/src/main/java/me/alexdevs/solstice/api/text/Format.java index 1552c1fa..754ee9ea 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/Format.java +++ b/src/main/java/me/alexdevs/solstice/api/text/Format.java @@ -11,23 +11,42 @@ import java.util.regex.Pattern; public class Format { + //? if >= 26.1 { + /*public static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("(?[^}]+)}"); + *///? } elif >= 1.21.1 { public static final Pattern PLACEHOLDER_PATTERN = PatternPlaceholderParser.PREDEFINED_PLACEHOLDER_PATTERN; + //? } public static final NodeParser LEGACY_PARSER = LegacyFormattingParser.ALL; public static final NodeParser PARSER; static { + //? if >= 26.1 { + /*var parser = eu.pb4.placeholders.api.parsers.TagParser.DEFAULT.copy(); + + *///? } elif >= 1.21.1 { var parser = TextParserV1.createDefault(); + //? } parser.register(PhaseGradientTag.createTag()); PARSER = parser; } public static Component parse(String text) { + //? if >= 26.1 { + /*return PARSER.parseNode(text).toComponent(); + *///? } elif >= 1.21.1 { return PARSER.parseNode(text).toText(); + //? } } public static Component parse(TextNode textNode, PlaceholderContext context, Map placeholders) { + //? if >= 26.1 { + /*var predefinedNode = new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(textNode); + return Placeholders.COMMON_PLACEHOLDER_PARSER.parseNode(predefinedNode) + .toComponent(ParserContext.of(PlaceholderContext.COMMON_KEY, context)); + *///? } elif >= 1.21.1 { var predefinedNode = Placeholders.parseNodes(textNode, PLACEHOLDER_PATTERN, placeholders); return Placeholders.parseText(predefinedNode, context); + //? } } public static Component parse(Component text, PlaceholderContext context, Map placeholders) { @@ -43,10 +62,18 @@ public static Component parse(String text, PlaceholderContext context) { } public static Component parse(String text, Map placeholders) { + //? if >= 26.1 { + /*return new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(TextNode.convert(parse(text))).toComponent(); + *///? } elif >= 1.21.1 { return Placeholders.parseText(parse(text), PLACEHOLDER_PATTERN, placeholders); + //? } } public static Component parse(Component text, Map placeholders) { + //? if >= 26.1 { + /*return new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(TextNode.convert(text)).toComponent(); + *///? } elif >= 1.21.1 { return Placeholders.parseText(TextNode.convert(text), PLACEHOLDER_PATTERN, placeholders); + //? } } } diff --git a/src/main/java/me/alexdevs/solstice/api/text/MapPlaceholderParser.java b/src/main/java/me/alexdevs/solstice/api/text/MapPlaceholderParser.java new file mode 100644 index 00000000..0dd58008 --- /dev/null +++ b/src/main/java/me/alexdevs/solstice/api/text/MapPlaceholderParser.java @@ -0,0 +1,60 @@ +package me.alexdevs.solstice.api.text; + +import eu.pb4.placeholders.api.node.LiteralNode; +import eu.pb4.placeholders.api.node.TextNode; +import eu.pb4.placeholders.api.node.TranslatedNode; +import eu.pb4.placeholders.api.node.parent.ParentTextNode; +import eu.pb4.placeholders.api.parsers.NodeParser; +import net.minecraft.network.chat.Component; + +import java.util.ArrayList; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public record MapPlaceholderParser(Pattern pattern, Map placeholders) implements NodeParser { + @Override + public TextNode[] parseNodes(TextNode text) { + if (text instanceof TranslatedNode translatedNode) { + return new TextNode[]{translatedNode.transform(this)}; + } else if (text instanceof LiteralNode literalNode) { + var out = new ArrayList(); + + String string = literalNode.value(); + Matcher matcher = pattern.matcher(string); + int previousEnd = 0; + + while (matcher.find()) { + var key = matcher.group("id"); + int start = matcher.start(); + int end = matcher.end(); + + var replacement = placeholders.get(key); + + if (replacement != null) { + if (start != 0) { + out.add(new LiteralNode(string.substring(previousEnd, start))); + } + out.add(TextNode.convert(replacement)); + previousEnd = end; + } else { + matcher.region(start + 1, string.length()); + } + } + + if (previousEnd != string.length()) { + out.add(new LiteralNode(string.substring(previousEnd))); + } + + return out.toArray(new TextNode[0]); + } else if (text instanceof ParentTextNode parentNode) { + var out = new ArrayList(); + for (var child : parentNode.getChildren()) { + out.add(TextNode.asSingle(this.parseNodes(child))); + } + return new TextNode[]{parentNode.copyWith(out.toArray(new TextNode[0]))}; + } + + return new TextNode[]{text}; + } +} diff --git a/src/main/java/me/alexdevs/solstice/api/text/parser/CodeParser.java b/src/main/java/me/alexdevs/solstice/api/text/parser/CodeParser.java index 5c047819..22d77da2 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/parser/CodeParser.java +++ b/src/main/java/me/alexdevs/solstice/api/text/parser/CodeParser.java @@ -1,6 +1,5 @@ package me.alexdevs.solstice.api.text.parser; -import eu.pb4.placeholders.api.node.DirectTextNode; import eu.pb4.placeholders.api.node.LiteralNode; import eu.pb4.placeholders.api.node.TextNode; import eu.pb4.placeholders.api.parsers.NodeParser; @@ -50,7 +49,7 @@ public TextNode[] parseNodes(TextNode node) { .withClickEvent(ComponentUtils.clickCopyToClipboardEvent(content)) ); - list.add(new DirectTextNode(text)); + list.add(TextNode.convert(text)); pos = matcher.end(); } diff --git a/src/main/java/me/alexdevs/solstice/api/text/parser/LinkParser.java b/src/main/java/me/alexdevs/solstice/api/text/parser/LinkParser.java index 13a9cb7d..2eb68b11 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/parser/LinkParser.java +++ b/src/main/java/me/alexdevs/solstice/api/text/parser/LinkParser.java @@ -1,6 +1,5 @@ package me.alexdevs.solstice.api.text.parser; -import eu.pb4.placeholders.api.node.DirectTextNode; import eu.pb4.placeholders.api.node.LiteralNode; import eu.pb4.placeholders.api.node.TextNode; import eu.pb4.placeholders.api.node.parent.ParentNode; @@ -69,7 +68,7 @@ public TextNode[] parseNodes(TextNode node) { .withClickEvent(ComponentUtils.openUrlClickEvent(link)) ); - list.add(new DirectTextNode(text)); + list.add(TextNode.convert(text)); pos = matcher.end(); } diff --git a/src/main/java/me/alexdevs/solstice/api/text/parser/MarkdownComponentParser.java b/src/main/java/me/alexdevs/solstice/api/text/parser/MarkdownComponentParser.java index f3061f91..134b4dbd 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/parser/MarkdownComponentParser.java +++ b/src/main/java/me/alexdevs/solstice/api/text/parser/MarkdownComponentParser.java @@ -13,9 +13,14 @@ public class MarkdownComponentParser { public static TextNode spoilerFormatting(TextNode[] textNodes) { var text = TextNode.asSingle(textNodes); + //? if >= 26.1 { + /*var textLength = text.toComponent().getString().length(); + *///? } elif >= 1.21.1 { + var textLength = text.toText().getString().length(); + //? } return new HoverNode<>( TextNode.array( - new FormattingNode(TextNode.array(TextNode.of("\u258C".repeat(text.toText().getString().length()))), ChatFormatting.DARK_GRAY) + new FormattingNode(TextNode.array(TextNode.of("\u258C".repeat(textLength))), ChatFormatting.DARK_GRAY) ), //? >= 1.21.11 //HoverNode.Action.TEXT_NODE, @@ -41,9 +46,16 @@ public static TextNode quoteFormatting(TextNode[] textNodes) { public static TextNode urlFormatting(TextNode[] textNodes, TextNode url) { var config = CoreModule.getConfig(); + //? if >= 26.1 { + /*var labelComponent = TextNode.wrap(textNodes).toComponent(); + var urlComponent = url.toComponent(); + *///? } elif >= 1.21.1 { + var labelComponent = TextNode.wrap(textNodes).toText(); + var urlComponent = url.toText(); + //? } var placeholders = Map.of( - "label", TextNode.wrap(textNodes).toText(), - "url", url.toText() + "label", labelComponent, + "url", urlComponent ); var text = Format.parse(config.link, placeholders); var hover = Format.parse(config.linkHover, placeholders); diff --git a/src/main/java/me/alexdevs/solstice/api/text/tag/PhaseGradientTag.java b/src/main/java/me/alexdevs/solstice/api/text/tag/PhaseGradientTag.java index 8ef50f28..9e598821 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/tag/PhaseGradientTag.java +++ b/src/main/java/me/alexdevs/solstice/api/text/tag/PhaseGradientTag.java @@ -2,7 +2,9 @@ import eu.pb4.placeholders.api.node.TextNode; import eu.pb4.placeholders.api.node.parent.GradientNode; +//? < 26.1 import eu.pb4.placeholders.api.parsers.TextParserV1; +//? < 26.1 import eu.pb4.placeholders.impl.textparser.TextParserImpl; import me.alexdevs.solstice.api.utils.MathUtils; import net.minecraft.network.chat.TextColor; @@ -23,6 +25,48 @@ */ public class PhaseGradientTag { + //? if >= 26.1 { + /*public static eu.pb4.placeholders.api.parsers.tag.TextTag createTag() { + return eu.pb4.placeholders.api.parsers.tag.TextTag.enclosing("phase_gradient", List.of("pgr", "sgr"), "gradient", true, + (children, args, parser) -> { + var rawArgs = args.input().split(":"); + + double phase = 0; + final List textColors; + + var argIt = Arrays.stream(rawArgs).iterator(); + + if (argIt.hasNext()) { + textColors = new ArrayList<>(); + while (argIt.hasNext()) { + var arg = argIt.next(); + if (!argIt.hasNext()) { + final var possiblePhase = MathUtils.parseDouble(arg); + if (possiblePhase.isPresent()) { + phase = MathUtils.clamp(possiblePhase.get(), -1d, 1d); + break; + } + } + + var parsedColor = TextColor.parseColor(arg); + if (parsedColor.isError()) { + textColors.add(TextColor.fromRgb(0)); + } else { + textColors.add(parsedColor.getOrThrow()); + } + } + + if (textColors.size() == 1) { + return GradientNode.colors(textColors, children); + } + } else { + textColors = List.of(); + } + + return PhaseGradientTag.smoother(textColors, phase, children); + }); + } + *///? } elif >= 1.21.1 { public static TextParserV1.TextTag createTag() { return TextParserV1.TextTag.of("phase_gradient", List.of("pgr", "sgr"), "gradient", true, (tag, data, input, handlers, endAt) -> { @@ -47,11 +91,9 @@ public static TextParserV1.TextTag createTag() { } var parsedColor = TextColor.parseColor(arg); - //? >= 1.21.1 if (parsedColor.isError()) { textColors.add(TextColor.fromRgb(0)); } else { - //? >= 1.21.1 textColors.add(parsedColor.getOrThrow()); } } @@ -66,6 +108,7 @@ public static TextParserV1.TextTag createTag() { return out.value(PhaseGradientTag.smoother(textColors, phase, out.nodes())); }); } + //? } public static GradientNode smoother(List colors, double phase, TextNode... nodes) { if (colors.isEmpty()) { diff --git a/src/main/java/me/alexdevs/solstice/api/utils/EntityUtils.java b/src/main/java/me/alexdevs/solstice/api/utils/EntityUtils.java index 9f60a83f..517d62ee 100644 --- a/src/main/java/me/alexdevs/solstice/api/utils/EntityUtils.java +++ b/src/main/java/me/alexdevs/solstice/api/utils/EntityUtils.java @@ -13,9 +13,15 @@ public class EntityUtils { + //? if >= 26.1 { + /*public static @Nullable T createWithCommand( + EntityType type, ServerLevel world, @Nullable net.minecraft.world.entity.PostSpawnProcessor consumer, + BlockPos pos, boolean particleEffects, boolean limitedLifespan) { + *///? } elif >= 1.21.1 { public static @Nullable T createWithCommand( EntityType type, ServerLevel world, @Nullable Consumer consumer, BlockPos pos, boolean particleEffects, boolean limitedLifespan) { + //? } final var spawnReason = //? >= 1.21.4 diff --git a/src/main/java/me/alexdevs/solstice/api/utils/PlaceholderUtils.java b/src/main/java/me/alexdevs/solstice/api/utils/PlaceholderUtils.java new file mode 100644 index 00000000..35547d76 --- /dev/null +++ b/src/main/java/me/alexdevs/solstice/api/utils/PlaceholderUtils.java @@ -0,0 +1,34 @@ +package me.alexdevs.solstice.api.utils; + +import com.mojang.authlib.GameProfile; +import eu.pb4.placeholders.api.PlaceholderContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.MinecraftServer; + +public final class PlaceholderUtils { + private PlaceholderUtils() { + } + + public static PlaceholderContext of(CommandSourceStack source) { + //? if >= 26.1 { + /*var entity = source.getEntity(); + return entity != null ? PlaceholderContext.of(entity) : PlaceholderContext.of(source.getLevel()); + *///? } elif >= 1.21.1 { + return PlaceholderContext.of(source); + //? } + } + + public static PlaceholderContext of(MinecraftServer server) { + //? if >= 26.1 + //return PlaceholderContext.of(); + //? if < 26.1 + return PlaceholderContext.of(server); + } + + public static PlaceholderContext of(GameProfile profile, MinecraftServer server) { + //? if >= 26.1 + //return PlaceholderContext.of(); + //? if < 26.1 + return PlaceholderContext.of(profile, server); + } +} diff --git a/src/main/java/me/alexdevs/solstice/core/coreModule/commands/ServerStatCommand.java b/src/main/java/me/alexdevs/solstice/core/coreModule/commands/ServerStatCommand.java index 0305d72a..ab375250 100644 --- a/src/main/java/me/alexdevs/solstice/core/coreModule/commands/ServerStatCommand.java +++ b/src/main/java/me/alexdevs/solstice/core/coreModule/commands/ServerStatCommand.java @@ -1,7 +1,7 @@ package me.alexdevs.solstice.core.coreModule.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.command.TimeSpan; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.core.coreModule.CoreModule; @@ -30,7 +30,7 @@ public LiteralArgumentBuilder command(String name) { .requires(require("serverstat", 3)) .executes(context -> { var locale = module.locale(); - var placeholderContext = PlaceholderContext.of(context.getSource()); + var placeholderContext = PlaceholderUtils.of(context.getSource()); var messages = new ArrayList(); diff --git a/src/main/java/me/alexdevs/solstice/core/coreModule/commands/SolsticeCommand.java b/src/main/java/me/alexdevs/solstice/core/coreModule/commands/SolsticeCommand.java index b55a9f91..7fe8fe4e 100644 --- a/src/main/java/me/alexdevs/solstice/core/coreModule/commands/SolsticeCommand.java +++ b/src/main/java/me/alexdevs/solstice/core/coreModule/commands/SolsticeCommand.java @@ -133,12 +133,20 @@ public LiteralArgumentBuilder command(String name) { var hand = player.getUsedItemHand(); var itemStack = player.getItemInHand(hand); + //? if >= 26.1 { + /*var entry = itemStack.typeHolder().unwrapKey().get(); + *///? } elif >= 1.21.1 { var entry = itemStack.getItemHolder().unwrapKey().get(); + //? } var entryString = String.format("Tags for [%s / %s]:", entry.registry(), ResourceUtils.identifier(entry)); var text = Component.empty(); text.append(Component.nullToEmpty(entryString)); + //? if >= 26.1 { + /*var tags = itemStack.typeHolder().tags().iterator(); + *///? } elif >= 1.21.1 { var tags = itemStack.getTags().iterator(); + //? } while (tags.hasNext()) { var tag = tags.next(); text.append(Component.nullToEmpty("\n")); diff --git a/src/main/java/me/alexdevs/solstice/modules/afk/AfkModule.java b/src/main/java/me/alexdevs/solstice/modules/afk/AfkModule.java index 1ae889d8..ce8ea9d5 100644 --- a/src/main/java/me/alexdevs/solstice/modules/afk/AfkModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/afk/AfkModule.java @@ -75,7 +75,11 @@ public void init() { if (!context.hasPlayer()) return PlaceholderResult.invalid("No player!"); + //? if >= 26.1 { + /*var player = (net.minecraft.server.level.ServerPlayer) context.player(); + *///? } elif >= 1.21.1 { var player = context.player(); + //? } if (isPlayerAfk(player)) return PlaceholderResult.value(Format.parse(getConfig().tag)); diff --git a/src/main/java/me/alexdevs/solstice/modules/ban/commands/BanCommand.java b/src/main/java/me/alexdevs/solstice/modules/ban/commands/BanCommand.java index a2ec6be0..af526495 100644 --- a/src/main/java/me/alexdevs/solstice/modules/ban/commands/BanCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/ban/commands/BanCommand.java @@ -1,13 +1,12 @@ package me.alexdevs.solstice.modules.ban.commands; -import com.mojang.authlib.GameProfile; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.api.module.Utils; import me.alexdevs.solstice.api.text.Format; @@ -53,7 +52,7 @@ static int execute(CommandContext context, Collection Component.translatable("commands.ban.success", Component.nullToEmpty(PlayerUtils.getName(profile.getProfile())), Format.parse(banEntry.getReason(), playerContext)), true); diff --git a/src/main/java/me/alexdevs/solstice/modules/ban/formatters/BanMessageFormatter.java b/src/main/java/me/alexdevs/solstice/modules/ban/formatters/BanMessageFormatter.java index 11473a40..8f0b7f2e 100644 --- a/src/main/java/me/alexdevs/solstice/modules/ban/formatters/BanMessageFormatter.java +++ b/src/main/java/me/alexdevs/solstice/modules/ban/formatters/BanMessageFormatter.java @@ -1,6 +1,6 @@ package me.alexdevs.solstice.modules.ban.formatters; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.Solstice; import me.alexdevs.solstice.api.text.Format; import me.alexdevs.solstice.api.utils.ProfileOrNameAndId; @@ -17,7 +17,7 @@ public static Component format(ProfileOrNameAndId profile, UserBanListEntry entr var locale = ModuleProvider.BAN.locale(); var coreConfig = CoreModule.getConfig(); var df = new SimpleDateFormat(coreConfig.dateTimeFormat); - var context = PlaceholderContext.of(profile.getProfile(), Solstice.server); + var context = PlaceholderUtils.of(profile.getProfile(), Solstice.server); var expiryDate = Component.nullToEmpty(entry.getExpires() != null ? df.format(entry.getExpires()) : "never"); Map placeholders = Map.of( "reason", Format.parse(entry.getReason(), context), diff --git a/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/BroadcastCommand.java b/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/BroadcastCommand.java index f8d63198..0f63a5e9 100644 --- a/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/BroadcastCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/BroadcastCommand.java @@ -2,7 +2,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.Solstice; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.api.text.Format; @@ -36,7 +36,7 @@ public LiteralArgumentBuilder command(String name) { var config = Solstice.configManager.getData(BroadcastConfig.class); var message = StringArgumentType.getString(context, "message"); - var serverContext = PlaceholderContext.of(context.getSource().getServer()); + var serverContext = PlaceholderUtils.of(context.getSource().getServer()); var placeholders = Map.of( "message", Format.parse(message, serverContext) diff --git a/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/PlainBroadcastCommand.java b/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/PlainBroadcastCommand.java index a4fa9614..bf9255fe 100644 --- a/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/PlainBroadcastCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/PlainBroadcastCommand.java @@ -2,7 +2,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.Solstice; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.api.text.Format; @@ -32,7 +32,7 @@ public LiteralArgumentBuilder command(String name) { .then(argument("message", StringArgumentType.greedyString()) .executes(context -> { var message = StringArgumentType.getString(context, "message"); - var serverContext = PlaceholderContext.of(context.getSource().getServer()); + var serverContext = PlaceholderUtils.of(context.getSource().getServer()); Solstice.getInstance().broadcast(Format.parse(message, serverContext)); diff --git a/src/main/java/me/alexdevs/solstice/modules/commandSpy/CommandSpyModule.java b/src/main/java/me/alexdevs/solstice/modules/commandSpy/CommandSpyModule.java index 1f3571d8..a88e5735 100644 --- a/src/main/java/me/alexdevs/solstice/modules/commandSpy/CommandSpyModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/commandSpy/CommandSpyModule.java @@ -47,6 +47,9 @@ public void init() { var commandSpyEnabled = Permissions.check(pl, this.getPermissionNode("base")); if (commandSpyEnabled && !pl.getUUID().equals(player.getUUID())) { + //? if >= 26.1 + //pl.sendSystemMessage(message, false); + //? if < 26.1 pl.displayClientMessage(message, false); } } diff --git a/src/main/java/me/alexdevs/solstice/modules/enderchest/commands/EnderChestCommand.java b/src/main/java/me/alexdevs/solstice/modules/enderchest/commands/EnderChestCommand.java index 6f872937..50be88ab 100644 --- a/src/main/java/me/alexdevs/solstice/modules/enderchest/commands/EnderChestCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/enderchest/commands/EnderChestCommand.java @@ -100,6 +100,9 @@ public LiteralArgumentBuilder command(String name) { private void open(ServerPlayer player, PlayerEnderChestContainer inventory, Component title, boolean canEdit, Runnable onClose) { var container = new SimpleGui(MenuType.GENERIC_9x3, player, false) { @Override + //? if >= 1.21.11 + //public void onPlayerClose(boolean wasManual) { + //? if < 1.21.11 public void onClose() { onClose.run(); } @@ -112,6 +115,9 @@ public void onClose() { } else { slot = new ImmutableSlot(inventory, i, 0, 0); } + //? if >= 26.1 + //container.setSlot(i, slot); + //? if < 26.1 container.setSlotRedirect(i, slot); } diff --git a/src/main/java/me/alexdevs/solstice/modules/fly/commands/FlyCommand.java b/src/main/java/me/alexdevs/solstice/modules/fly/commands/FlyCommand.java index c33bdfc3..78aa6f06 100644 --- a/src/main/java/me/alexdevs/solstice/modules/fly/commands/FlyCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/fly/commands/FlyCommand.java @@ -3,7 +3,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.Solstice; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.modules.fly.FlyModule; @@ -60,7 +60,7 @@ private int execute(CommandContext context, @Nullable Server player.onUpdateAbilities(); Component text; - var sourceContext = PlaceholderContext.of(context.getSource()); + var sourceContext = PlaceholderUtils.of(context.getSource()); if (forOther) { var placeholders = Map.of( "player", player.getDisplayName() diff --git a/src/main/java/me/alexdevs/solstice/modules/god/commands/GodCommand.java b/src/main/java/me/alexdevs/solstice/modules/god/commands/GodCommand.java index d26540fc..4c0f587e 100644 --- a/src/main/java/me/alexdevs/solstice/modules/god/commands/GodCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/god/commands/GodCommand.java @@ -3,7 +3,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.Solstice; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.modules.god.GodModule; @@ -55,7 +55,7 @@ private int execute(CommandContext context, @Nullable Server data.invulnerabilityEnabled = abilities.invulnerable; Component text; - var sourceContext = PlaceholderContext.of(context.getSource()); + var sourceContext = PlaceholderUtils.of(context.getSource()); if (forOther) { var placeholders = Map.of( "player", player.getDisplayName() diff --git a/src/main/java/me/alexdevs/solstice/modules/hat/commands/HatCommand.java b/src/main/java/me/alexdevs/solstice/modules/hat/commands/HatCommand.java index 9b718daa..45712ea7 100644 --- a/src/main/java/me/alexdevs/solstice/modules/hat/commands/HatCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/hat/commands/HatCommand.java @@ -39,8 +39,15 @@ public LiteralArgumentBuilder command(String name) { var config = module.getConfig(); + //? if >= 26.1 { + /*var itemId = ResourceUtils.identifier(handStack.typeHolder().unwrapKey().get()).toString(); + var tags = handStack.typeHolder().tags(); + *///? } else { var itemId = ResourceUtils.identifier(handStack.getItemHolder().unwrapKey().get()).toString(); var tags = handStack.getTags(); + //? } + + if (config.whitelistFilter) { if(!module.isInFilter(itemId) && !module.isInFilter(tags)) { context.getSource().sendSuccess(() -> module.locale().get("notAllowed"), false); diff --git a/src/main/java/me/alexdevs/solstice/modules/helpOp/commands/HelpOpCommand.java b/src/main/java/me/alexdevs/solstice/modules/helpOp/commands/HelpOpCommand.java index 93646877..56cf929d 100644 --- a/src/main/java/me/alexdevs/solstice/modules/helpOp/commands/HelpOpCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/helpOp/commands/HelpOpCommand.java @@ -2,7 +2,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.events.HelpOpCallback; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.modules.helpOp.HelpOpModule; @@ -35,7 +35,7 @@ public LiteralArgumentBuilder command(String name) { .executes(context -> { var source = context.getSource(); source.getPlayerOrException(); // Ensure the command is run by a player - var sourceContext = PlaceholderContext.of(source); + var sourceContext = PlaceholderUtils.of(source); var message = StringArgumentType.getString(context, "message"); var placeholders = Map.of( diff --git a/src/main/java/me/alexdevs/solstice/modules/info/commands/InfoCommand.java b/src/main/java/me/alexdevs/solstice/modules/info/commands/InfoCommand.java index 84b6ee7a..a75f1fdf 100644 --- a/src/main/java/me/alexdevs/solstice/modules/info/commands/InfoCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/info/commands/InfoCommand.java @@ -3,7 +3,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.api.module.Utils; import me.alexdevs.solstice.modules.info.InfoModule; @@ -44,7 +44,7 @@ public LiteralArgumentBuilder command(String name) { var source = context.getSource(); var pageList = module.enumerate(); - var sourceContext = PlaceholderContext.of(source); + var sourceContext = PlaceholderUtils.of(source); if (pageList.isEmpty()) { context.getSource().sendSuccess(() -> module.locale().get( @@ -86,7 +86,7 @@ public LiteralArgumentBuilder command(String name) { .then(argument("page", StringArgumentType.word()) .suggests((context, builder) -> SharedSuggestionProvider.suggest(module.enumerate(), builder)) .executes(context -> { - var sourceContext = PlaceholderContext.of(context.getSource()); + var sourceContext = PlaceholderUtils.of(context.getSource()); var page = module.getPage(StringArgumentType.getString(context, "page"), sourceContext); context.getSource().sendSuccess(() -> page, false); return 1; diff --git a/src/main/java/me/alexdevs/solstice/modules/info/commands/MotdCommand.java b/src/main/java/me/alexdevs/solstice/modules/info/commands/MotdCommand.java index b28c8d34..4f83bed7 100644 --- a/src/main/java/me/alexdevs/solstice/modules/info/commands/MotdCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/info/commands/MotdCommand.java @@ -1,7 +1,7 @@ package me.alexdevs.solstice.modules.info.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.modules.info.InfoModule; import net.minecraft.commands.CommandSourceStack; @@ -25,7 +25,7 @@ public LiteralArgumentBuilder command(String name) { return literal(name) .requires(require("motd", true)) .executes(context -> { - var sourceContext = PlaceholderContext.of(context.getSource()); + var sourceContext = PlaceholderUtils.of(context.getSource()); context.getSource().sendSystemMessage(module.buildMotd(sourceContext)); diff --git a/src/main/java/me/alexdevs/solstice/modules/info/commands/RulesCommand.java b/src/main/java/me/alexdevs/solstice/modules/info/commands/RulesCommand.java index 45d39923..5ba7e94a 100644 --- a/src/main/java/me/alexdevs/solstice/modules/info/commands/RulesCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/info/commands/RulesCommand.java @@ -1,7 +1,7 @@ package me.alexdevs.solstice.modules.info.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.modules.info.InfoModule; import net.minecraft.commands.CommandSourceStack; @@ -25,7 +25,7 @@ public LiteralArgumentBuilder command(String name) { return literal(name) .requires(require("rules", true)) .executes(context -> { - var sourceContext = PlaceholderContext.of(context.getSource()); + var sourceContext = PlaceholderUtils.of(context.getSource()); var rules = module.getPage("rules", sourceContext); context.getSource().sendSuccess(() -> rules, false); return 1; diff --git a/src/main/java/me/alexdevs/solstice/modules/inventorySee/commands/InventorySeeCommand.java b/src/main/java/me/alexdevs/solstice/modules/inventorySee/commands/InventorySeeCommand.java index ad008f82..19ef0601 100644 --- a/src/main/java/me/alexdevs/solstice/modules/inventorySee/commands/InventorySeeCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/inventorySee/commands/InventorySeeCommand.java @@ -51,6 +51,9 @@ public List getNames() { } private static ItemStack createBarrierItem() { + //? if >= 26.1 + //var barrier = new ItemStack(Items.STAINED_GLASS_PANE.black()); + //? if < 26.1 var barrier = new ItemStack(Items.BLACK_STAINED_GLASS_PANE); ItemUtils.setCustomName(barrier, Component.literal("")); return barrier; @@ -94,6 +97,9 @@ public LiteralArgumentBuilder command(String name) { var container = new SimpleGui(MenuType.GENERIC_9x5, player, false) { @Override + //? if >= 1.21.11 + //public void onPlayerClose(boolean wasManual) { + //? if < 1.21.11 public void onClose() { if (!targetOnline) { PlayerUtils.saveOfflinePlayer(target); @@ -108,6 +114,9 @@ public void onClose() { } else { slot = new ImmutableSlot(targetInventory, i, 0, 0); } + //? if >= 26.1 + //container.setSlot(i, slot); + //? if < 26.1 container.setSlotRedirect(i, slot); } @@ -161,8 +170,11 @@ public void onClose() { var canEdit = Permissions.check(player, getPermissionNode("edit"), 3); - var trinkets = TrinketsApi.getTrinketComponent(target).orElse(null); var slots = new ArrayList(); + //? if >= 26.1 + //var trinkets = TrinketsApi.getAttachment(target); + //? if < 26.1 + var trinkets = TrinketsApi.getTrinketComponent(target).orElse(null); for (var group : trinkets.getInventory().values()) { for (var inventory : group.values()) { for (var i = 0; i < inventory.getContainerSize(); i++) { @@ -177,6 +189,7 @@ public void onClose() { } } + var size = slots.size(); MenuType handlerType = null; for (var entry : invSizes.entrySet()) { @@ -188,6 +201,9 @@ public void onClose() { var container = new SimpleGui(handlerType, player, false) { @Override + //? if >= 1.21.11 + //public void onPlayerClose(boolean wasManual) { + //? if < 1.21.11 public void onClose() { if (!targetOnline) { PlayerUtils.saveOfflinePlayer(target); @@ -197,6 +213,9 @@ public void onClose() { for (var i = 0; i < slots.size(); i++) { var slot = slots.get(i); + //? if >= 26.1 + //container.setSlot(i, slot); + //? if < 26.1 container.setSlotRedirect(i, slot); } diff --git a/src/main/java/me/alexdevs/solstice/modules/jail/JailModule.java b/src/main/java/me/alexdevs/solstice/modules/jail/JailModule.java index 700c491b..ee80257e 100644 --- a/src/main/java/me/alexdevs/solstice/modules/jail/JailModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/jail/JailModule.java @@ -223,6 +223,10 @@ public void sendToJail(ServerPlayer player) { } else { text = locale().get("playerJailed", map); } + + //? if >= 26.1 + //player.sendSystemMessage(text, false); + //? if < 26.1 player.displayClientMessage(text, false); } }); diff --git a/src/main/java/me/alexdevs/solstice/modules/kit/Utils.java b/src/main/java/me/alexdevs/solstice/modules/kit/Utils.java index b5df7551..cdc5203d 100644 --- a/src/main/java/me/alexdevs/solstice/modules/kit/Utils.java +++ b/src/main/java/me/alexdevs/solstice/modules/kit/Utils.java @@ -57,6 +57,9 @@ public static List getItemStacks(KitInventory inventory) { public static void redirect(SimpleGui container, KitInventory inventory) { for (var i = 0; i < container.getSize(); i++) { + //? if >= 26.1 + //container.setSlot(i, new Slot(inventory, i, 0, 0)); + //? if < 26.1 container.setSlotRedirect(i, new Slot(inventory, i, 0, 0)); } } diff --git a/src/main/java/me/alexdevs/solstice/modules/kit/commands/KitCommand.java b/src/main/java/me/alexdevs/solstice/modules/kit/commands/KitCommand.java index 2aef7d41..e98b6f9a 100644 --- a/src/main/java/me/alexdevs/solstice/modules/kit/commands/KitCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/kit/commands/KitCommand.java @@ -189,6 +189,9 @@ private int createKit(CommandContext context) throws Command var kitInventory = new KitInventory(); var container = new SimpleGui(MenuType.GENERIC_9x3, player, false) { @Override + //? if >= 1.21.11 + //public void onPlayerClose(boolean wasManual) { + //? if < 1.21.11 public void onClose() { if (module.createKit(name, Utils.getItemStacks(kitInventory))) { source.sendSuccess(() -> module.locale().get("created", Map.of("kit", Component.nullToEmpty(name))), true); @@ -232,6 +235,9 @@ private int editKit(CommandContext context) throws CommandSy var container = new SimpleGui(MenuType.GENERIC_9x3, player, false) { @Override + //? if >= 1.21.11 + //public void onPlayerClose(boolean wasManual) { + //? if < 1.21.11 public void onClose() { var items = Utils.getItemStacks(kitInventory); kit.itemStacks = items.stream().map(Utils::serializeItemStack).toList(); diff --git a/src/main/java/me/alexdevs/solstice/modules/kit/commands/KitsCommand.java b/src/main/java/me/alexdevs/solstice/modules/kit/commands/KitsCommand.java index 6ef44549..1236bea6 100644 --- a/src/main/java/me/alexdevs/solstice/modules/kit/commands/KitsCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/kit/commands/KitsCommand.java @@ -98,6 +98,9 @@ private void refreshGui(CommandContext context, SimpleGui gu } ItemUtils.setCustomName(icon, kitNameComponent); ItemUtils.setLore(icon, List.of(kitLoreComponent)); + //? if >= 26.1 + //gui.setSlot(i, new eu.pb4.sgui.api.elements.GuiElementBuilder(icon).setCallback((syncId, clickType, input, slotGui) -> { + //? if < 26.1 gui.setSlot(i, new GuiElement(icon, (syncId, clickType, slotActionType) -> { try { dispatcher.execute("kit claim " + kitName, context.getSource()); @@ -105,7 +108,10 @@ private void refreshGui(CommandContext context, SimpleGui gu } catch (CommandSyntaxException e) { context.getSource().sendFailure(Component.nullToEmpty(e.getLocalizedMessage())); } - })); + }) + //? if >= 26.1 + //.build() + ); } } } diff --git a/src/main/java/me/alexdevs/solstice/modules/mail/commands/MailCommand.java b/src/main/java/me/alexdevs/solstice/modules/mail/commands/MailCommand.java index f27d6aaf..303db669 100644 --- a/src/main/java/me/alexdevs/solstice/modules/mail/commands/MailCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/mail/commands/MailCommand.java @@ -130,10 +130,14 @@ private int readMail(CommandContext context) throws CommandS var senderName = CoreModule.getUsername(mail.sender); var dateFormatter = new SimpleDateFormat(CoreModule.getConfig().dateTimeFormat); var message = MarkdownParser.defaultParser.parseNode(mail.message); + //? if >= 26.1 + //var messageComponent = message.toComponent(); + //? if < 26.1 + var messageComponent = message.toText(); var placeholders = Map.of( "sender", Component.nullToEmpty(senderName), "date", Component.nullToEmpty(dateFormatter.format(mail.date)), - "message", message.toText(), + "message", messageComponent, "replyButton", replyButton, "deleteButton", deleteButton ); diff --git a/src/main/java/me/alexdevs/solstice/modules/miscellaneous/DummyExplosion.java b/src/main/java/me/alexdevs/solstice/modules/miscellaneous/DummyExplosion.java index bc595f9b..4ddf1325 100644 --- a/src/main/java/me/alexdevs/solstice/modules/miscellaneous/DummyExplosion.java +++ b/src/main/java/me/alexdevs/solstice/modules/miscellaneous/DummyExplosion.java @@ -9,7 +9,7 @@ public class DummyExplosion { public static void spawn(ServerLevel world, Vec3 pos, float power) { - world.playSound(null, pos.x, pos.y, pos.z, SoundEvents.GENERIC_EXPLODE, SoundSource.BLOCKS, 4.0F, (1.0F + (world.random.nextFloat() - world.random.nextFloat()) * 0.2F) * 0.7F); + world.playSound(null, pos.x, pos.y, pos.z, SoundEvents.GENERIC_EXPLODE, SoundSource.BLOCKS, 4.0F, (1.0F + (world.getRandom().nextFloat() - world.getRandom().nextFloat()) * 0.2F) * 0.7F); SimpleParticleType particle; if(power >= 2.0) { particle = ParticleTypes.EXPLOSION_EMITTER; diff --git a/src/main/java/me/alexdevs/solstice/modules/miscellaneous/commands/KittyCannonCommand.java b/src/main/java/me/alexdevs/solstice/modules/miscellaneous/commands/KittyCannonCommand.java index cc16d972..9189c81b 100644 --- a/src/main/java/me/alexdevs/solstice/modules/miscellaneous/commands/KittyCannonCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/miscellaneous/commands/KittyCannonCommand.java @@ -20,6 +20,9 @@ public KittyCannonCommand(MiscellaneousModule module) { super(module); } + //? if >= 26.1 + //public static final EntityType BALL = net.minecraft.world.entity.EntityTypes.CAT; + //? if < 26.1 public static final EntityType BALL = EntityType.CAT; @Override diff --git a/src/main/java/me/alexdevs/solstice/modules/miscellaneous/commands/TopCommand.java b/src/main/java/me/alexdevs/solstice/modules/miscellaneous/commands/TopCommand.java index fa9a9bdc..f0653d01 100644 --- a/src/main/java/me/alexdevs/solstice/modules/miscellaneous/commands/TopCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/miscellaneous/commands/TopCommand.java @@ -28,6 +28,9 @@ public LiteralArgumentBuilder command(String name) { var world = player.level(); var top = world.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, player.blockPosition()); + //? if >= 26.1 + //var pos = net.minecraft.world.phys.Vec3.atCenterOf(top); + //? if < 26.1 var pos = top.getCenter(); player.teleportTo(pos.x(), pos.y(), pos.z()); diff --git a/src/main/java/me/alexdevs/solstice/modules/powertool/PowerToolModule.java b/src/main/java/me/alexdevs/solstice/modules/powertool/PowerToolModule.java index 80d2fb75..6b152046 100644 --- a/src/main/java/me/alexdevs/solstice/modules/powertool/PowerToolModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/powertool/PowerToolModule.java @@ -58,19 +58,17 @@ public void init() { var source = getSource(player); execute(source, powertool.get(Action.USE), PlaceholderContext.of(player)); - //? if >= 1.21.4 { - /*return InteractionResult.CONSUME; - *///? } else { + //? if >= 1.21.4 + //return InteractionResult.CONSUME; + //? if < 1.21.4 return InteractionResultHolder.consume(stack); - //? } } } } - //? if >= 1.21.4 { - /*return InteractionResult.PASS; - *///? } else { + //? if >= 1.21.4 + //return InteractionResult.PASS; + //? if < 1.21.4 return InteractionResultHolder.pass(stack); - //? } }); // ATTACK_BLOCK @@ -166,11 +164,20 @@ public void execute(CommandSourceStack source, String command, PlaceholderContex } private String resolveCommand(String command, PlaceholderContext context) { + //? if >= 26.1 { + /*return Placeholders.COMMON_PLACEHOLDER_PARSER.parseNode(eu.pb4.placeholders.api.node.TextNode.convert(Component.nullToEmpty(command))) + .toComponent(eu.pb4.placeholders.api.ParserContext.of(PlaceholderContext.COMMON_KEY, context)).getString(); + *///? } else { return Placeholders.parseText(Component.nullToEmpty(command), context).getString(); + //? } } public String getStackId(ItemStack stack) { + //? if >= 26.1 { + /*return ResourceUtils.identifier(stack.typeHolder().unwrapKey().get()).toString(); + *///? } elif >= 1.21.1 { return ResourceUtils.identifier(stack.getItemHolder().unwrapKey().get()).toString(); + //? } } public PowerToolPlayerData getData(UUID uuid) { diff --git a/src/main/java/me/alexdevs/solstice/modules/rtp/core/Locator.java b/src/main/java/me/alexdevs/solstice/modules/rtp/core/Locator.java index 2af0ba4b..3640e1d5 100644 --- a/src/main/java/me/alexdevs/solstice/modules/rtp/core/Locator.java +++ b/src/main/java/me/alexdevs/solstice/modules/rtp/core/Locator.java @@ -30,10 +30,11 @@ import java.util.function.Consumer; public class Locator { - //? < 1.21.11 - public static final TicketType RTP_TICKET = TicketType.create("rtp", Comparator.comparingLong(ChunkPos::asLong), 300); //? >= 1.21.11 //public static final TicketType RTP_TICKET = Registry.register(BuiltInRegistries.TICKET_TYPE, "RTP", new TicketType(300, TicketType.FLAG_LOADING)); + //? < 1.21.11 + public static final TicketType RTP_TICKET = TicketType.create("rtp", Comparator.comparingLong(ChunkPos::asLong), 300); + public final ServerPlayer player; @@ -115,6 +116,9 @@ public boolean tick() { return false; } + //? if >= 26.1 + //var chunk = getChunk(ChunkPos.containing(attemptPos)); + //? if < 26.1 var chunk = getChunk(new ChunkPos(attemptPos)); if (chunk.isPresent()) { this.chunk = chunk.get(); @@ -174,6 +178,9 @@ private void findValidPlacement() { return; } + //? if >= 26.1 + //var vec = net.minecraft.world.phys.Vec3.atCenterOf(pos); + //? if < 26.1 var vec = pos.getCenter(); callback.accept(new Result(Result.Type.SUCCESS, Optional.of(new ServerLocation( @@ -182,18 +189,23 @@ private void findValidPlacement() { } private void load() { - //? >= 1.21.11 + //? if >= 26.1 { + /*world.getChunkSource().addTicketWithRadius(RTP_TICKET, ChunkPos.containing(attemptPos), 0); + *///? } elif >= 1.21.11 { //world.getChunkSource().addTicketWithRadius(RTP_TICKET, new ChunkPos(attemptPos),0); - //? < 1.21.11 + //? } else { world.getChunkSource().addRegionTicket(RTP_TICKET, new ChunkPos(attemptPos), 0, attemptPos); + //? } } private Optional getChunk(ChunkPos pos) { + //? if >= 26.1 + //var holder = world.getChunkSource().getVisibleChunkIfPresent(pos.pack()); + //? if < 26.1 var holder = world.getChunkSource().getVisibleChunkIfPresent(pos.toLong()); if (holder == null) { return Optional.empty(); } else { - //? >= 1.21.1 var chunk = holder.getFullChunkFuture().getNow(ChunkHolder.UNLOADED_LEVEL_CHUNK).orElse(null); if (chunk == null) { return Optional.empty(); diff --git a/src/main/java/me/alexdevs/solstice/modules/seen/commands/SeenCommand.java b/src/main/java/me/alexdevs/solstice/modules/seen/commands/SeenCommand.java index 67cde2c6..9155ef23 100644 --- a/src/main/java/me/alexdevs/solstice/modules/seen/commands/SeenCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/seen/commands/SeenCommand.java @@ -3,6 +3,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.ServerLocation; import me.alexdevs.solstice.api.command.LocalGameProfile; import me.alexdevs.solstice.api.module.ModCommand; @@ -98,7 +99,7 @@ public LiteralArgumentBuilder command(String name) { if (player != null) { source.sendSuccess(() -> Format.parse(finalOutput, PlaceholderContext.of(player), map), false); } else { - source.sendSuccess(() -> Format.parse(finalOutput, PlaceholderContext.of(source.getServer()), map), false); + source.sendSuccess(() -> Format.parse(finalOutput, PlaceholderUtils.of(source.getServer()), map), false); } return 1; diff --git a/src/main/java/me/alexdevs/solstice/modules/sign/SignModule.java b/src/main/java/me/alexdevs/solstice/modules/sign/SignModule.java index 0575a58b..6eeefc13 100644 --- a/src/main/java/me/alexdevs/solstice/modules/sign/SignModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/sign/SignModule.java @@ -23,6 +23,9 @@ public static SignText formatSign(List messages, SignText text) { for (var i = 0; i < messages.size(); i++) { var message = messages.get(i); var line = message.raw(); + //? if >= 26.1 + //text = text.setMessage(i, LegacyFormattingParser.ALL.parseNode(line).toComponent()); + //? if < 26.1 text = text.setMessage(i, LegacyFormattingParser.ALL.parseNode(line).toText()); } return text; diff --git a/src/main/java/me/alexdevs/solstice/modules/smite/commands/SmiteCommand.java b/src/main/java/me/alexdevs/solstice/modules/smite/commands/SmiteCommand.java index 34184a25..da320eac 100644 --- a/src/main/java/me/alexdevs/solstice/modules/smite/commands/SmiteCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/smite/commands/SmiteCommand.java @@ -22,6 +22,9 @@ import static net.minecraft.commands.Commands.literal; public class SmiteCommand extends ModCommand { + //? if >= 26.1 + //public static final EntityType entityType = net.minecraft.world.entity.EntityTypes.LIGHTNING_BOLT; + //? if < 26.1 public static final EntityType entityType = EntityType.LIGHTNING_BOLT; public static final int maxTimes = 1024; public static final int maxDistance = 512; diff --git a/src/main/java/me/alexdevs/solstice/modules/spawn/SpawnModule.java b/src/main/java/me/alexdevs/solstice/modules/spawn/SpawnModule.java index 8891b42b..3398eb7e 100644 --- a/src/main/java/me/alexdevs/solstice/modules/spawn/SpawnModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/spawn/SpawnModule.java @@ -91,7 +91,10 @@ public ServerLocation getGlobalSpawnPosition() { public ServerLocation getWorldSpawn(ServerLevel world) { - //? if >= 1.21.11 { + //? if >= 26.1 { + /*var worldSpawnPosition = net.minecraft.world.phys.Vec3.atCenterOf(world.getRespawnData().pos()); + var worldSpawnYaw = world.getRespawnData().yaw(); + *///? } elif >= 1.21.11 { /*var worldSpawnPosition = world.getRespawnData().pos().getCenter(); var worldSpawnYaw = world.getRespawnData().yaw(); *///? } else { diff --git a/src/main/java/me/alexdevs/solstice/modules/staffChat/StaffChatModule.java b/src/main/java/me/alexdevs/solstice/modules/staffChat/StaffChatModule.java index 71abf752..b2d2456b 100644 --- a/src/main/java/me/alexdevs/solstice/modules/staffChat/StaffChatModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/staffChat/StaffChatModule.java @@ -46,6 +46,9 @@ public boolean canUseStaffChat(ServerPlayer player) { } public void sendStaffChatMessage(Component sourceName, final Component message) { + //? if >= 26.1 + //var formattedMessage = MarkdownParser.defaultParser.parseNode(TextNode.convert(message)).toComponent(); + //? if < 26.1 var formattedMessage = MarkdownParser.defaultParser.parseNode(TextNode.convert(message)).toText(); @@ -57,6 +60,9 @@ public void sendStaffChatMessage(Component sourceName, final Component message) Solstice.server.sendSystemMessage(text); Solstice.server.getPlayerList().getPlayers().forEach(player -> { if (canUseStaffChat(player)) { + //? if >= 26.1 + //player.sendSystemMessage(text, false); + //? if < 26.1 player.displayClientMessage(text, false); } }); diff --git a/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java b/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java index fac9270f..87e4a6ed 100644 --- a/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java @@ -69,6 +69,9 @@ public void init() { var username = PlayerUtils.getName(player.getGameProfile()); PlayerTeam team = scoreboard.addPlayerTeam("sol_" + username); team.setDisplayName(player.getDisplayName()); + //? if >= 26.1 + //team.setColor(java.util.Optional.ofNullable(this.getNameplateColor(player)).map(c -> net.minecraft.world.scores.TeamColor.valueOf(c.name()))); + //? if < 26.1 team.setColor(this.getNameplateColor(player)); team.setPlayerPrefix(this.getNameplatePrefix(player)); team.setPlayerSuffix(this.getNameplateSuffix(player)); @@ -129,6 +132,9 @@ public ChatFormatting getNameplateColor(ServerPlayer player) { color = config.nameplateFormats.getOrDefault("default", DEFAULT_NAMEPLATE).color(); } + //? if >= 26.1 + //return ChatFormatting.valueOf(color); + //? if < 26.1 return ChatFormatting.getByName(color); } diff --git a/src/main/java/me/alexdevs/solstice/modules/sudo/commands/SudoCommand.java b/src/main/java/me/alexdevs/solstice/modules/sudo/commands/SudoCommand.java index 6664fa15..135c49c8 100644 --- a/src/main/java/me/alexdevs/solstice/modules/sudo/commands/SudoCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/sudo/commands/SudoCommand.java @@ -65,10 +65,13 @@ public LiteralArgumentBuilder command(String name) { public CommandSourceStack buildServerSource(CommandSource commandOutput, MinecraftServer server) { return new CommandSourceStack( commandOutput, - //? >= 1.21.11 - //server.overworld().getRespawnData().pos().getCenter(), - //? < 1.21.11 + //? if >= 26.1 { + /*net.minecraft.world.phys.Vec3.atCenterOf(server.overworld().getRespawnData().pos()), + *///? } elif >= 1.21.11 { + /*server.overworld().getRespawnData().pos().getCenter(), + *///? } else { server.overworld().getSharedSpawnPos().getCenter(), + //? } Vec2.ZERO, server.overworld(), //? >= 1.21.11 diff --git a/src/main/java/me/alexdevs/solstice/modules/tell/TellModule.java b/src/main/java/me/alexdevs/solstice/modules/tell/TellModule.java index 817ad8bc..2dcc1585 100644 --- a/src/main/java/me/alexdevs/solstice/modules/tell/TellModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/tell/TellModule.java @@ -1,12 +1,11 @@ package me.alexdevs.solstice.modules.tell; import eu.pb4.placeholders.api.PlaceholderContext; -import me.alexdevs.solstice.Solstice; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.module.ModuleBase; import me.alexdevs.solstice.api.text.Components; import me.alexdevs.solstice.api.utils.PlayerUtils; import me.alexdevs.solstice.modules.ModuleProvider; -import me.alexdevs.solstice.modules.ignore.IgnoreModule; import me.alexdevs.solstice.modules.notifications.NotificationsModule; import me.alexdevs.solstice.modules.tell.commands.ReplyCommand; import me.alexdevs.solstice.modules.tell.commands.TellCommand; @@ -47,7 +46,7 @@ public void sendDirectMessage(String targetName, CommandSourceStack source, Stri var placeholders = Map.of( "targetPlayer", Component.nullToEmpty(targetName) ); - var sourceContext = PlaceholderContext.of(source); + var sourceContext = PlaceholderUtils.of(source); source.sendSuccess(() -> locale().get( "playerNotFound", @@ -61,8 +60,8 @@ public void sendDirectMessage(String targetName, CommandSourceStack source, Stri var parsedMessage = Components.chat(message, source); - var serverContext = PlaceholderContext.of(source.getServer()); - var sourceContext = PlaceholderContext.of(source); + var serverContext = PlaceholderUtils.of(source.getServer()); + var sourceContext = PlaceholderUtils.of(source); PlaceholderContext targetContext; if (targetPlayer == null) { targetContext = serverContext; diff --git a/src/main/java/me/alexdevs/solstice/modules/tell/commands/ReplyCommand.java b/src/main/java/me/alexdevs/solstice/modules/tell/commands/ReplyCommand.java index 16b31f9f..c73cdd9d 100644 --- a/src/main/java/me/alexdevs/solstice/modules/tell/commands/ReplyCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/tell/commands/ReplyCommand.java @@ -3,7 +3,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.modules.tell.TellModule; import net.minecraft.commands.CommandSourceStack; @@ -38,7 +38,7 @@ private int execute(CommandContext context) { var message = StringArgumentType.getString(context, "message"); if (!module.lastSender.containsKey(senderName)) { - var playerContext = PlaceholderContext.of(context.getSource()); + var playerContext = PlaceholderUtils.of(context.getSource()); source.sendSuccess(() -> module.locale().get( "noLastSenderReply", playerContext diff --git a/src/main/java/me/alexdevs/solstice/modules/timeBar/TimeBar.java b/src/main/java/me/alexdevs/solstice/modules/timeBar/TimeBar.java index 3ed2f747..04e6cade 100644 --- a/src/main/java/me/alexdevs/solstice/modules/timeBar/TimeBar.java +++ b/src/main/java/me/alexdevs/solstice/modules/timeBar/TimeBar.java @@ -1,6 +1,6 @@ package me.alexdevs.solstice.modules.timeBar; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.Solstice; import me.alexdevs.solstice.api.command.TimeSpan; import me.alexdevs.solstice.api.text.Format; @@ -21,6 +21,9 @@ public class TimeBar { private int elapsedSeconds = 0; public TimeBar(String label, int time, boolean countdown, BossEvent.BossBarColor color, BossEvent.BossBarOverlay style) { + //? if >= 26.1 + //this.bossBar = new CustomBossEvent(uuid, SolsticeIdentifier.of(Solstice.MOD_ID, uuid.toString()).get(), Component.nullToEmpty(label), () -> {}); + //? if < 26.1 this.bossBar = new CustomBossEvent(SolsticeIdentifier.of(Solstice.MOD_ID, uuid.toString()).get(), Component.nullToEmpty(label)); this.bossBar.setColor(color); this.bossBar.setOverlay(style); @@ -49,7 +52,7 @@ public Component parseLabel(String labelString) { "remaining_time", Component.nullToEmpty(remainingTime) ); - var serverContext = PlaceholderContext.of(Solstice.server); + var serverContext = PlaceholderUtils.of(Solstice.server); return Format.parse(labelString, serverContext, placeholders); } @@ -97,10 +100,9 @@ private void updateProgress() { progress = 1f - progress; } - bossBar.setProgress(Math.min( - Math.max( - progress, - 0f), + bossBar.setProgress(Math.clamp( + progress, + 0f, 1f)); } } diff --git a/src/main/java/me/alexdevs/solstice/modules/warp/commands/WarpsCommand.java b/src/main/java/me/alexdevs/solstice/modules/warp/commands/WarpsCommand.java index dae265cd..b0ce4c3d 100644 --- a/src/main/java/me/alexdevs/solstice/modules/warp/commands/WarpsCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/warp/commands/WarpsCommand.java @@ -1,7 +1,7 @@ package me.alexdevs.solstice.modules.warp.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import eu.pb4.placeholders.api.PlaceholderContext; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.Solstice; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.modules.warp.WarpModule; @@ -32,7 +32,7 @@ public LiteralArgumentBuilder command(String name) { var source = context.getSource(); var serverDate = Solstice.serverData.getData(WarpServerData.class); var warpList = serverDate.warps.keySet().stream().sorted().toList(); - var sourceContext = PlaceholderContext.of(source); + var sourceContext = PlaceholderUtils.of(source); if(source.isPlayer()) { var player = source.getPlayer(); diff --git a/versions/26.2/gradle.properties b/versions/26.2/gradle.properties new file mode 100644 index 00000000..41ada785 --- /dev/null +++ b/versions/26.2/gradle.properties @@ -0,0 +1,16 @@ +org.gradle.jvmargs=-Xmx3G + +minecraft_version=26.2 +loader_version=0.19.3 +java_version=25 +minecraft_constraint=~26.2 + +fabric_version=0.154.0+26.2 +configurate_version=4.1.2 +permissions_api_version=0.7.0 +placeholderapi_version=3.1.0-beta.1+26.2 +sgui_version=2.1.0+26.2 +commoneconomy_version=2.0.0 +trinkets_version=4.1.0-beta.2+26.2 + +vanish_version=1.6.15+26.2 From 9b0dd4d16e92cbd4df6efc0c8d5c3f9a4b44b7c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nelson=20Gra=C3=A7a?= Date: Sun, 12 Jul 2026 18:19:31 +0100 Subject: [PATCH 2/3] Update build actions Improve stonecutter build Fix and cleanup publish action --- .github/workflows/build.yml | 50 ++--- .github/workflows/publish.yml | 114 +++++++--- build-unobfuscated.gradle.kts | 123 ----------- build.gradle.kts | 271 +++++++++++++++++------- gradle.properties | 27 +-- settings.gradle.kts | 16 +- src/main/resources/fabric.mod.json | 10 +- src/main/resources/solstice.mixins.json | 2 +- stonecutter.gradle.kts | 15 ++ stonecutter.properties.toml | 75 +++++++ versions/1.21.1/gradle.properties | 17 -- versions/1.21.11/gradle.properties | 17 -- versions/1.21.4/gradle.properties | 17 -- versions/26.2/gradle.properties | 16 -- 14 files changed, 400 insertions(+), 370 deletions(-) delete mode 100644 build-unobfuscated.gradle.kts create mode 100644 stonecutter.properties.toml delete mode 100644 versions/1.21.1/gradle.properties delete mode 100644 versions/1.21.11/gradle.properties delete mode 100644 versions/1.21.4/gradle.properties delete mode 100644 versions/26.2/gradle.properties diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c42c2a6c..8f6fd15b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,43 +3,45 @@ # certain platforms or Java versions, and provides a first line of defence # against bad commits. -name: build -on: [pull_request, push] +name: Build +on: + push: + branches: + - main + pull_request: jobs: build: - strategy: - matrix: - # Use these Java versions - java: [ - 21, # Current Java LTS - ] - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest 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 + - name: Checkout + uses: actions/checkout@v6 + + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v6 + + - name: Setup JDK 25 + uses: actions/setup-java@v5 with: - java-version: ${{ matrix.java }} - distribution: 'microsoft' - - name: make gradle wrapper executable - run: chmod +x ./gradlew - - uses: actions/cache@v4 + java-version: 25 + distribution: 'temurin' + + - name: Setup cache + uses: actions/cache@v6 with: path: | ~/.gradle/caches ~/.gradle/wrapper + .gradle key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- - - name: build + + - 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 + + - name: Capture build artifacts + uses: actions/upload-artifact@v7 with: name: Artifacts path: versions/**/build/libs/ diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4b9af12e..489226d5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,12 +1,8 @@ -name: Publish on GitHub, CurseForge & Modrinth +name: Publish (Modrinth, Curseforge, GH, Maven) on: [ workflow_dispatch ] env: - MINECRAFT_VERSION: 1.21.1 - JAVA_VERSION: 21 - VERSION: 1.9.2+1.21.1 - RELEASE_NAME: Solstice 1.9.2 for Minecraft 1.21.1 MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} @@ -19,47 +15,97 @@ jobs: build: runs-on: ubuntu-latest steps: - - name: Check Environment Variables - run: env - - - name: Checkout Repository - uses: actions/checkout@v3 - with: - submodules: true + - name: Checkout repository + uses: actions/checkout@v6 - name: Setup Java - uses: actions/setup-java@v2 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 21 + java-version: 25 - - name: Make Gradle Wrapper Executable - if: ${{ runner.os != 'Windows' }} - run: chmod +x ./gradlew + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 + with: + validate-wrappers: 'true' - name: Build run: ./gradlew clean build - - name: Publish to Maven - run: ./gradlew publish + - name: Upload built jars + uses: actions/upload-artifact@v7 + with: + name: mod-jars + path: | + **/build/libs/*.jar + !**/build/libs/*-sources.jar + !**/build/libs/*-javadoc.jar + !**/build/libs/*-plain.jar + retention-days: 1 + + publish: + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + target: [ maven, modrinth, curseforge ] + steps: + - uses: actions/checkout@v6 + + - name: Download built jars + uses: actions/download-artifact@v8 + with: + name: mod-jars + path: . + + - name: Setup Java + uses: actions/setup-java@v5 + with: + distribution: "temurin" + java-version: 25 - - name: Publish - uses: Kir-Antipov/mc-publish@v3.3 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 with: - curseforge-id: 1149875 - curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + cache-read-only: true - modrinth-id: uIvrDZas - modrinth-token: ${{ secrets.MODRINTH_TOKEN }} + - name: Publish to ${{ matrix.target }} + run: ./gradlew ${{ matrix.target }} -PprebuiltJar - github-tag: "v${{env.VERSION}}" - github-token: ${{ secrets.GITHUB_TOKEN }} + github: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Download built jars + uses: actions/download-artifact@v8 + with: + name: mod-jars + path: . - name: "${{env.RELEASE_NAME}}" - version: "${{env.VERSION}}" - version-type: release - changelog-file: CHANGELOG.md + - name: Get Version + id: get-version + run: | + VERSION=$(awk -F'[ ="]+' '$1 == "mod.version" {print $2}' stonecutter.properties.toml) + echo "version=$VERSION" >> $GITHUB_OUTPUT + if [[ "$VERSION" =~ -(alpha|SNAPSHOT) ]]; then + echo "prerelease=true" >> $GITHUB_OUTPUT + else + echo "prerelease=false" >> $GITHUB_OUTPUT + fi - loaders: fabric - game-versions: "${{env.MINECRAFT_VERSION}}" - java: "${{env.JAVA_VERSION}}" \ No newline at end of file + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: Solstice ${{ steps.get-version.outputs.version }} + prerelease: ${{ steps.get-version.outputs.prerelease == 'true' }} + draft: ${{ steps.get-version.outputs.prerelease == 'true' }} + generate_release_notes: true + files: | + **/build/libs/*.jar + !**/build/libs/*-sources.jar + !**/build/libs/*-javadoc.jar + !**/build/libs/*-plain.jar \ No newline at end of file diff --git a/build-unobfuscated.gradle.kts b/build-unobfuscated.gradle.kts deleted file mode 100644 index 15f12ced..00000000 --- a/build-unobfuscated.gradle.kts +++ /dev/null @@ -1,123 +0,0 @@ -import com.modrinth.minotaur.dependencies.ModDependency -plugins { - id("net.fabricmc.fabric-loom") version "1.17-SNAPSHOT" - id("maven-publish") - id("com.modrinth.minotaur") version "2.+" - id("dev.kikugie.stonecutter") -} -version = "${property("mod_version")}+${property("minecraft_version")}" -group = property("maven_group") as String -base { - archivesName.set(property("archives_base_name") as String) -} -repositories { - mavenLocal() - maven { url = uri("https://maven.nucleoid.xyz") } - maven { - name = "TerraformersMC" - url = uri("https://maven.terraformersmc.com/") - } - maven { - name = "Ladysnake Libs" - url = uri("https://maven.ladysnake.org/releases") - } - maven { - name = "Modrinth" - url = uri("https://api.modrinth.com/maven") - } -} -// 26.1+ ships unobfuscated, so named mappings equal official ones; only the header differs. -val accessWidener = layout.buildDirectory.file("solstice-official.accesswidener").get().asFile.apply { - parentFile.mkdirs() - writeText( - rootProject.file("src/main/resources/solstice.accesswidener").readText() - .replaceFirst("accessWidener v2 named", "accessWidener v2 official") - ) -} -loom { - accessWidenerPath = accessWidener -} -dependencies { - minecraft("com.mojang:minecraft:${property("minecraft_version")}") - implementation("net.fabricmc:fabric-loader:${property("loader_version")}") - implementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_version")}") - include(implementation("org.spongepowered:configurate-core:${property("configurate_version")}")!!) - include(implementation("org.spongepowered:configurate-hocon:${property("configurate_version")}")!!) - include(implementation("org.spongepowered:configurate-gson:${property("configurate_version")}")!!) - include("com.typesafe:config:1.4.3") - include("io.leangen.geantyref:geantyref:1.3.16") - include(implementation("me.lucko:fabric-permissions-api:${property("permissions_api_version")}")!!) - include(implementation("eu.pb4:placeholder-api:${property("placeholderapi_version")}")!!) - include(implementation("eu.pb4:sgui:${property("sgui_version")}")!!) - implementation(include("eu.pb4:common-economy-api:${property("commoneconomy_version")}")!!) - compileOnly("maven.modrinth:trinkets-updated:${property("trinkets_version")}") - compileOnly("net.luckperms:api:5.4") - runtimeOnly("net.luckperms:api:5.4") - compileOnly("maven.modrinth:vanish:${project.property("vanish_version")}") -} -tasks.processResources { - val mcConstraint = project.property("minecraft_constraint") as String - val javaVer = project.property("java_version") as String - inputs.property("version", project.version) - inputs.property("minecraft_constraint", mcConstraint) - inputs.property("java_version", javaVer) - filesMatching("fabric.mod.json") { - expand(mapOf( - "version" to project.version, - "minecraft_constraint" to mcConstraint, - "java_version" to javaVer - )) - } -} -val javaVersion = (property("java_version") as String).toInt() -tasks.withType().configureEach { - options.release = javaVersion -} -java { - withSourcesJar() - sourceCompatibility = JavaVersion.toVersion(javaVersion) - targetCompatibility = JavaVersion.toVersion(javaVersion) -} -tasks.jar { - from(rootProject.file("LICENSE")) { - rename { "${it}_${base.archivesName.get()}" } - } -} -modrinth { - token = System.getenv("MODRINTH_TOKEN") - projectId = "uIvrDZas" - uploadFile = tasks["jar"] - gameVersions = listOf(property("minecraft_version") as String) - loaders = listOf("fabric") - dependencies = listOf(ModDependency("P7dR8mSH", "required")) -} -publishing { - publications { - create("mavenJava") { - artifactId = property("archives_base_name") as String - from(components["java"]) - } - } - repositories { - maven { - name = "AlexDevsRepo" - url = uri("https://maven.alexdevs.me/releases") - credentials { - username = System.getenv("MAVEN_USERNAME") - password = System.getenv("MAVEN_PASSWORD") - } - } - } -} - -stonecutter { - replacements.string(current.parsed >= "26.2") { - replace("Placeholders.register(", "Placeholders.registerCommon(") - replace("dev.emi.trinkets", "eu.pb4.trinkets") - } - replacements.string(current.parsed >= "1.21.11") { - replace("player.getServer()", "player.level().getServer()") - replace("sourcePlayer.getServer()", "sourcePlayer.level().getServer()") - replace("dimension().location()", "dimension().identifier()") - } -} diff --git a/build.gradle.kts b/build.gradle.kts index 250ea1f8..dda86561 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,126 +1,233 @@ import com.modrinth.minotaur.dependencies.ModDependency +import net.darkhax.curseforgegradle.TaskPublishCurseForge + plugins { - id("fabric-loom") version "1.17-SNAPSHOT" + id("dev.kikugie.loom-back-compat") id("maven-publish") id("com.modrinth.minotaur") version "2.+" - id("dev.kikugie.stonecutter") + id("net.darkhax.curseforgegradle") version "1.2.30" } -version = "${property("mod_version")}+${property("minecraft_version")}" -group = property("maven_group") as String -base { - archivesName.set(property("archives_base_name") as String) + +// DO NOT set group = ...! Loom/Stonecutter manage it per-subproject; set groupId on the publication instead. +version = "${property("mod.version")}+${sc.current.version}" +base.archivesName = property("mod.id") as String + +// Snapshot/alpha versions are marked with a `-alpha` or `-SNAPSHOT` pre-release tag in `mod.version` +// (e.g. "1.10.0-alpha.1"). Presence of that tag drives Modrinth's versionType and the Maven repo used. +val isAlpha: Boolean = (property("mod.version") as String).let { + it.contains("-alpha") || it.contains("-SNAPSHOT") +} + +val mvnVersion = if (isAlpha) { + version.toString() + .replaceFirst("-alpha", "") + "-SNAPSHOT" +} +else { + version as String +} + + +val requiredJava: JavaVersion = when { + sc.current.parsed >= "26.1" -> JavaVersion.VERSION_25 + else -> JavaVersion.VERSION_21 } + +// This can be used for publishing on Modrinth and Curseforge +val compatibleVersions = sc.properties.rawOrNull("mod", "mc_releases") + ?.asList() + .orEmpty() + .map { it.toString() } + .toSet() + repositories { mavenLocal() - maven { - name = "ParchmentMC" - url = uri("https://maven.parchmentmc.org") - } + maven { url = uri("https://maven.parchmentmc.org") } maven { url = uri("https://maven.nucleoid.xyz") } - maven { - name = "TerraformersMC" - url = uri("https://maven.terraformersmc.com/") + maven { url = uri("https://maven.terraformersmc.com/") } + maven { url = uri("https://maven.ladysnake.org/releases") } + maven { url = uri("https://api.modrinth.com/maven") } +} + +dependencies { + + minecraft("com.mojang:minecraft:${sc.current.version}") + if (sc.current.parsed >= "26.1") { + loomx.applyMojangMappings() } - maven { - name = "Ladysnake Libs" - url = uri("https://maven.ladysnake.org/releases") + else { + mappings(loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-${sc.current.version}:${property("parchment")}@zip") + }) } - maven { - name = "Modrinth" - url = uri("https://api.modrinth.com/maven") + + modImplementation("net.fabricmc:fabric-loader:${property("deps.fabric_loader")}") + modImplementation("net.fabricmc.fabric-api:fabric-api:${property("deps.fabric_api")}") + + modImplementation(include("org.spongepowered:configurate-core:${property("deps.configurate")}")!!) + modImplementation(include("org.spongepowered:configurate-hocon:${property("deps.configurate")}")!!) + modImplementation(include("org.spongepowered:configurate-gson:${property("deps.configurate")}")!!) + include("com.typesafe:config:1.4.3") + include("io.leangen.geantyref:geantyref:1.3.16") + + modImplementation(include("me.lucko:fabric-permissions-api:${property("deps.permissions_api")}")!!) + modImplementation(include("eu.pb4:placeholder-api:${property("deps.placeholderapi")}")!!) + modImplementation(include("eu.pb4:sgui:${property("deps.sgui")}")!!) + modImplementation(include("eu.pb4:common-economy-api:${property("deps.commoneconomy")}")!!) + + if (sc.current.parsed >= "26.2") { + modCompileOnly("maven.modrinth:trinkets-updated:${property("deps.trinkets")}") + } + else { + modCompileOnly("dev.emi:trinkets:${property("deps.trinkets")}") } + modCompileOnly("net.luckperms:api:${project.property("deps.luckperms")}") + modRuntimeOnly("net.luckperms:api:${project.property("deps.luckperms")}") + modCompileOnly("maven.modrinth:vanish:${project.property("deps.vanish")}") +} + +val accessWidener = if (sc.current.parsed >= "26.1") { + layout.buildDirectory.file("solstice-official.accesswidener") + .get().asFile.apply { + parentFile.mkdirs() + writeText( + rootProject.file("src/main/resources/solstice.accesswidener") + .readText() + .replaceFirst("accessWidener v2 named", "accessWidener v2 official") + ) + } } -val accessWidener = rootProject.file("src/main/resources/solstice.accesswidener") +else rootProject.file("src/main/resources/solstice.accesswidener") + loom { + fabricModJsonPath = rootProject.file("src/main/resources/fabric.mod.json") // Useful for interface injection accessWidenerPath = accessWidener -} -dependencies { - minecraft("com.mojang:minecraft:${property("minecraft_version")}") - mappings(loom.layered { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-${property("minecraft_version")}:${property("parchment_mappings")}@zip") - }) - modImplementation("net.fabricmc:fabric-loader:${property("loader_version")}") - modImplementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_version")}") - include(implementation("org.spongepowered:configurate-core:${property("configurate_version")}")!!) - include(implementation("org.spongepowered:configurate-hocon:${property("configurate_version")}")!!) - include(implementation("org.spongepowered:configurate-gson:${property("configurate_version")}")!!) - include("com.typesafe:config:1.4.3") - include("io.leangen.geantyref:geantyref:1.3.16") - include(modImplementation("me.lucko:fabric-permissions-api:${property("permissions_api_version")}")!!) - include(modImplementation("eu.pb4:placeholder-api:${property("placeholderapi_version")}")!!) - include(modImplementation("eu.pb4:sgui:${property("sgui_version")}")!!) - modImplementation(include("eu.pb4:common-economy-api:${property("commoneconomy_version")}")!!) - modCompileOnly("dev.emi:trinkets:${property("trinkets_version")}") - modCompileOnly("net.luckperms:api:5.4") - modRuntimeOnly("net.luckperms:api:5.4") - modCompileOnly("maven.modrinth:vanish:${project.property("vanish_version")}") -} -tasks.processResources { - val mcConstraint = project.property("minecraft_constraint") as String - val javaVer = project.property("java_version") as String - inputs.property("version", project.version) - inputs.property("minecraft_constraint", mcConstraint) - inputs.property("java_version", javaVer) - filesMatching("fabric.mod.json") { - expand(mapOf( - "version" to project.version, - "minecraft_constraint" to mcConstraint, - "java_version" to javaVer - )) + decompilerOptions.named("vineflower") { + options.put("mark-corresponding-synthetics", "1") // Adds names to lambdas - useful for mixins + } + + runConfigs.all { + preferGradleTask = true + generateRunConfig = true + runDirectory = rootProject.file("run") // Shares the run directory between versions + jvmArguments.add("-Dmixin.debug.export=true") // Exports transformed classes for debugging } } -val javaVersion = (property("java_version") as String).toInt() -tasks.withType().configureEach { - options.release = javaVersion -} + java { withSourcesJar() - sourceCompatibility = JavaVersion.toVersion(javaVersion) - targetCompatibility = JavaVersion.toVersion(javaVersion) + targetCompatibility = requiredJava + sourceCompatibility = requiredJava +} + + +tasks { + processResources { + fun MutableMap.register(key: String, property: String) { + val value: String = sc.properties[property] + inputs.property(key, value) + set(key, value) + } + + val props = buildMap { + register("id", "mod.id") + register("name", "mod.name") + register("version", "mod.version") + register("minecraft", "mod.mc_compat") + } + + filesMatching("fabric.mod.json") { expand(props) } + + val mixinJava = "JAVA_${requiredJava.majorVersion}" + filesMatching("*.mixins.json") { expand("java" to mixinJava) } + } + + register("buildAndCollect") { + group = "build" + description = "Builds mod jars and copies results to `build/libs/{mod version}/`" + + inputs.property("version", project.property("mod.version")) + // loomx.mod(Sources)Jar returns the jar task for the applied loom variant + from(loomx.modJar.flatMap { it.archiveFile }, loomx.modSourcesJar.flatMap { it.archiveFile }) + into(rootProject.layout.buildDirectory.file("libs/${project.property("mod.version")}")) + } + } + + tasks.jar { + val archivesName = base.archivesName.get() from(rootProject.file("LICENSE")) { - rename { "${it}_${base.archivesName.get()}" } + rename { "${it}_${archivesName}" } } } + +// if -PprebuiltJar is set then directly point to the jars so we don't run tasks, this is useful for parallel deploys +val prebuiltJar = providers.gradleProperty("prebuiltJar").isPresent +val modJarFile: Any = if (prebuiltJar) { + layout.buildDirectory.file("libs/${base.archivesName.get()}-${version}.jar").get().asFile +} +else { + loomx.modJar.flatMap { it.archiveFile } +} + modrinth { - token = System.getenv("MODRINTH_TOKEN") + token.set(providers.environmentVariable("MODRINTH_TOKEN")) projectId = "uIvrDZas" - uploadFile = tasks["remapJar"] - gameVersions = listOf(property("minecraft_version") as String) + uploadFile.set(modJarFile) + changelog.set(providers.fileContents(rootProject.layout.projectDirectory.file("CHANGELOG.md")).asText) + versionType.set(if (isAlpha) "alpha" else "release") + gameVersions = compatibleVersions loaders = listOf("fabric") dependencies = listOf(ModDependency("P7dR8mSH", "required")) + // P7dR8mSH - fabric-api +} + +tasks.register("curseforge") { + description = "Curseforge upload" + group = "publishing" + apiToken = providers.environmentVariable("CURSEFORGE_TOKEN").orNull + + disableVersionDetection() + + val mainFile = upload("1149875", modJarFile) + mainFile.changelog = providers.fileContents(rootProject.layout.projectDirectory.file("CHANGELOG.md")).asText.orElse("") + mainFile.changelogType = "markdown" + mainFile.releaseType = if (isAlpha) "alpha" else "release" + mainFile.addModLoader("Fabric") + mainFile.addEnvironment("Server") + mainFile.addRequirement("fabric-api") + mainFile.gameVersions = compatibleVersions } + publishing { publications { create("mavenJava") { - artifactId = property("archives_base_name") as String - from(components["java"]) + groupId = property("mod.group") as String + artifactId = property("mod.id") as String + version = mvnVersion + if (prebuiltJar) { + artifact(modJarFile) + } + else { + from(components["java"]) + } } } repositories { maven { name = "AlexDevsRepo" - url = uri("https://maven.alexdevs.me/releases") + url = uri(if (isAlpha) "https://maven.alexdevs.me/snapshots" else "https://maven.alexdevs.me/releases") credentials { - username = System.getenv("MAVEN_USERNAME") - password = System.getenv("MAVEN_PASSWORD") + username = providers.environmentVariable("MAVEN_USERNAME").orNull + password = providers.environmentVariable("MAVEN_PASSWORD").orNull } } } } -stonecutter { - replacements.string(current.parsed >= "26.2") { - replace("Placeholders.register(", "Placeholders.registerCommon(") - replace("dev.emi.trinkets", "eu.pb4.trinkets") - - } - replacements.string(current.parsed >= "1.21.11") { - replace("player.getServer()", "player.level().getServer()") - replace("sourcePlayer.getServer()", "sourcePlayer.level().getServer()") - replace("dimension().location()", "dimension().identifier()") - } - +tasks.register("maven") { + group = "publishing" + description = "Alias for publish" + dependsOn(tasks.named("publish")) } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 43ef4978..b4a090d8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,28 +1,5 @@ # Done to increase the memory available to gradle. org.gradle.jvmargs=-Xmx3G org.gradle.parallel=true - -# Fabric Properties -# check these on https://fabricmc.net/develop -minecraft_version=1.21.1 -loader_version=0.16.14 -java_version=21 -minecraft_constraint=~1.21.1 - -parchment_mappings=2024.11.17 - -# Mod Properties -mod_version=1.9.4 -maven_group=me.alexdevs -archives_base_name=solstice - -# Dependencies -fabric_version=0.116.4+1.21.1 - -configurate_version=4.1.2 -permissions_api_version=0.2-SNAPSHOT -placeholderapi_version=2.4.2+1.21 -sgui_version=1.6.1+1.21.1 -commoneconomy_version=1.1.1 - -trinkets_version=3.10.0 \ No newline at end of file +org.gradle.configuration-cache=true +org.gradle.caching=true \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index be4d2f5f..0f0835fa 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,9 +5,8 @@ pluginManagement { url = uri("https://maven.fabricmc.net/") } maven { - name = "Stonecutter" - url = uri("https://maven.kikugie.dev/snapshots") - content { includeGroup("dev.kikugie") } + name = "KikuGie Releases" + url = uri("https://maven.kikugie.dev/releases") } mavenCentral() gradlePluginPortal() @@ -15,17 +14,14 @@ pluginManagement { } plugins { - id("dev.kikugie.stonecutter") version "0.9" + id("dev.kikugie.stonecutter") version "0.9.6" + id("dev.kikugie.loom-back-compat") version "0.4" } stonecutter { - shared { + create(rootProject) { versions("1.21.1", "1.21.4", "1.21.11", "26.2") - mapBuilds { _, node -> - if (node.parsed >= "26.1") "build-unobfuscated.gradle.kts" else "build.gradle.kts" - } - vcsVersion.set("1.21.1") + vcsVersion = "1.21.1" } - create(rootProject) } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 8d0190f9..092123b6 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "id": "solstice", + "id": "${id}", "version": "${version}", - "name": "Solstice Essentials", + "name": "${name}", "description": "Server commands, custom chat formats and more", "authors": [ { @@ -34,12 +34,14 @@ ], "depends": { "fabricloader": ">=0.16.0", - "minecraft": "${minecraft_constraint}", - "java": ">=${java_version}", + "minecraft": "${minecraft}", "fabric-api": "*" }, "recommends": { "luckperms": "*" }, + "suggests" : { + "vanish": "*" + }, "accessWidener": "solstice.accesswidener" } \ No newline at end of file diff --git a/src/main/resources/solstice.mixins.json b/src/main/resources/solstice.mixins.json index 8e6f39df..955a643b 100644 --- a/src/main/resources/solstice.mixins.json +++ b/src/main/resources/solstice.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "me.alexdevs.solstice.mixin", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "${java}", "plugin": "me.alexdevs.solstice.mixin.SolsticeMixinConfigPlugin", "client": [], "server": [], diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index 80056fe4..00a255de 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -2,3 +2,18 @@ plugins { id("dev.kikugie.stonecutter") } stonecutter active "1.21.1" + +stonecutter parameters { + replacements { + string(current.parsed >= "1.21.11") { + replace("player.getServer()", "player.level().getServer()") + replace("sourcePlayer.getServer()", "sourcePlayer.level().getServer()") + replace("dimension().location()", "dimension().identifier()") + } + + string(current.parsed >= "26.2") { + replace("Placeholders.register(", "Placeholders.registerCommon(") + replace("dev.emi.trinkets", "eu.pb4.trinkets") + } + } +} diff --git a/stonecutter.properties.toml b/stonecutter.properties.toml new file mode 100644 index 00000000..cbc776ed --- /dev/null +++ b/stonecutter.properties.toml @@ -0,0 +1,75 @@ +# See https://stonecutter.kikugie.dev/wiki/config/properties#centralized-properties +mod.id = "solstice" +mod.name = "Solstice Essentials" +mod.group = "me.alexdevs" +mod.version = "1.9.5-alpha" + +loomx.loom_version = "1.17-SNAPSHOT" + +deps.luckperms = "5.4" + +["1.21.1"] +mod.mc_releases = ["1.21.1"] +mod.mc_compat = "~1.21.1" + +parchment = "2024.11.17" + +deps.fabric_loader = "0.16.14" +deps.fabric_api = "0.116.4+1.21.1" + +deps.configurate = "4.1.2" +deps.permissions_api = "0.2-SNAPSHOT" +deps.placeholderapi = "2.4.2+1.21" +deps.sgui = "1.6.1+1.21.1" +deps.commoneconomy = "1.1.1" +deps.trinkets = "3.10.0" +deps.vanish = "1.6.6+1.21.1" + +["1.21.4"] +mod.mc_releases = ["1.21.4"] +mod.mc_compat = "~1.21.4" + +parchment = "2025.03.23" + +deps.fabric_loader = "0.17.2" +deps.fabric_api = "0.119.4+1.21.4" + +deps.configurate = "4.1.2" +deps.permissions_api = "0.3.3" +deps.placeholderapi = "2.5.2+1.21.3" +deps.sgui = "1.8.2+1.21.4" +deps.commoneconomy = "1.2.0" +deps.trinkets = "3.10.0" +deps.vanish = "1.6.6+1.21.4" + +["1.21.11"] +mod.mc_releases = ["1.21.11"] +mod.mc_compat = "~1.21.11" + +parchment = "2025.12.20" + +deps.fabric_loader = "0.18.4" +deps.fabric_api = "0.141.3+1.21.11" + +deps.configurate = "4.1.2" +deps.permissions_api = "0.6.1" +deps.placeholderapi = "2.8.2+1.21.10" +deps.sgui = "1.12.0+1.21.11" +deps.commoneconomy = "2.0.0" +deps.trinkets = "3.10.0" +deps.vanish = "1.6.6+1.21.11" + +["26.2"] +mod.mc_releases = ["26.2"] +mod.mc_compat = "~26.2" + +deps.fabric_loader = "0.19.3" +deps.fabric_api = "0.154.0+26.2" + +deps.configurate = "4.1.2" +deps.permissions_api = "0.7.0" +deps.placeholderapi = "3.1.0-beta.1+26.2" +deps.sgui = "2.1.0+26.2" +deps.commoneconomy = "2.0.0" +deps.trinkets = "4.1.0-beta.2+26.2" +deps.vanish = "1.6.15+26.2" diff --git a/versions/1.21.1/gradle.properties b/versions/1.21.1/gradle.properties deleted file mode 100644 index 1841297c..00000000 --- a/versions/1.21.1/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -org.gradle.jvmargs=-Xmx3G - -minecraft_version=1.21.1 -loader_version=0.16.14 -java_version=21 -minecraft_constraint=~1.21.1 -parchment_mappings=2024.11.17 - -fabric_version=0.116.4+1.21.1 -configurate_version=4.1.2 -permissions_api_version=0.2-SNAPSHOT -placeholderapi_version=2.4.2+1.21 -sgui_version=1.6.1+1.21.1 -commoneconomy_version=1.1.1 -trinkets_version=3.10.0 - -vanish_version=1.6.6+1.21.1 \ No newline at end of file diff --git a/versions/1.21.11/gradle.properties b/versions/1.21.11/gradle.properties deleted file mode 100644 index 9dacca63..00000000 --- a/versions/1.21.11/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -org.gradle.jvmargs=-Xmx3G - -minecraft_version=1.21.11 -loader_version=0.18.4 -java_version=21 -minecraft_constraint=~1.21.11 -parchment_mappings=2025.12.20 - -fabric_version=0.141.3+1.21.11 -configurate_version=4.1.2 -permissions_api_version=0.6.1 -placeholderapi_version=2.8.2+1.21.10 -sgui_version=1.12.0+1.21.11 -commoneconomy_version=2.0.0 -trinkets_version=3.10.0 - -vanish_version=1.6.6+1.21.11 \ No newline at end of file diff --git a/versions/1.21.4/gradle.properties b/versions/1.21.4/gradle.properties deleted file mode 100644 index 4420bdd8..00000000 --- a/versions/1.21.4/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -org.gradle.jvmargs=-Xmx3G - -minecraft_version=1.21.4 -loader_version=0.17.2 -java_version=21 -minecraft_constraint=~1.21.4 -parchment_mappings=2025.03.23 - -fabric_version=0.119.4+1.21.4 -configurate_version=4.1.2 -permissions_api_version=0.3.3 -placeholderapi_version=2.5.2+1.21.3 -sgui_version=1.8.2+1.21.4 -commoneconomy_version=1.2.0 -trinkets_version=3.10.0 - -vanish_version=1.6.6+1.21.4 \ No newline at end of file diff --git a/versions/26.2/gradle.properties b/versions/26.2/gradle.properties deleted file mode 100644 index 41ada785..00000000 --- a/versions/26.2/gradle.properties +++ /dev/null @@ -1,16 +0,0 @@ -org.gradle.jvmargs=-Xmx3G - -minecraft_version=26.2 -loader_version=0.19.3 -java_version=25 -minecraft_constraint=~26.2 - -fabric_version=0.154.0+26.2 -configurate_version=4.1.2 -permissions_api_version=0.7.0 -placeholderapi_version=3.1.0-beta.1+26.2 -sgui_version=2.1.0+26.2 -commoneconomy_version=2.0.0 -trinkets_version=4.1.0-beta.2+26.2 - -vanish_version=1.6.15+26.2 From d98265fafb95c6a5c96f6fb3c4db4b12cc41926f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nelson=20Gra=C3=A7a?= Date: Sun, 19 Jul 2026 14:28:48 +0100 Subject: [PATCH 3/3] Stonecutter build code cleanup. Fix 26.2 placeholders while removing deprecated usage on older versions --- build.gradle.kts | 31 ++------ .../me/alexdevs/solstice/api/text/Format.java | 74 +++++++++---------- .../api/text/MapPlaceholderParser.java | 2 +- .../api/text/tag/PhaseGradientTag.java | 50 +------------ .../solstice/api/utils/PlaceholderUtils.java | 30 ++++++-- .../solstice/modules/afk/AfkModule.java | 3 +- .../broadcast/commands/BroadcastCommand.java | 2 +- .../commands/PlainBroadcastCommand.java | 2 +- .../modules/info/commands/MotdCommand.java | 1 + .../modules/note/commands/NotesCommand.java | 5 +- .../solstice/modules/rtp/core/Locator.java | 4 +- .../modules/seen/commands/SeenCommand.java | 2 +- .../modules/styling/StylingModule.java | 4 +- .../solstice/modules/tell/TellModule.java | 7 +- src/main/resources/fabric.mod.json | 2 +- .../{solstice.accesswidener => solstice.ct} | 0 stonecutter.gradle.kts | 3 + 17 files changed, 89 insertions(+), 133 deletions(-) rename src/main/resources/{solstice.accesswidener => solstice.ct} (100%) diff --git a/build.gradle.kts b/build.gradle.kts index dda86561..e42c4d32 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -86,22 +86,14 @@ dependencies { modCompileOnly("maven.modrinth:vanish:${project.property("deps.vanish")}") } -val accessWidener = if (sc.current.parsed >= "26.1") { - layout.buildDirectory.file("solstice-official.accesswidener") - .get().asFile.apply { - parentFile.mkdirs() - writeText( - rootProject.file("src/main/resources/solstice.accesswidener") - .readText() - .replaceFirst("accessWidener v2 named", "accessWidener v2 official") - ) - } -} -else rootProject.file("src/main/resources/solstice.accesswidener") - loom { fabricModJsonPath = rootProject.file("src/main/resources/fabric.mod.json") // Useful for interface injection - accessWidenerPath = accessWidener + + accessWidenerPath = sc.process( + rootProject.file("src/main/resources/solstice.ct"), + ".gradle/processed.ct" + ) + decompilerOptions.named("vineflower") { options.put("mark-corresponding-synthetics", "1") // Adds names to lambdas - useful for mixins } @@ -141,17 +133,6 @@ tasks { val mixinJava = "JAVA_${requiredJava.majorVersion}" filesMatching("*.mixins.json") { expand("java" to mixinJava) } } - - register("buildAndCollect") { - group = "build" - description = "Builds mod jars and copies results to `build/libs/{mod version}/`" - - inputs.property("version", project.property("mod.version")) - // loomx.mod(Sources)Jar returns the jar task for the applied loom variant - from(loomx.modJar.flatMap { it.archiveFile }, loomx.modSourcesJar.flatMap { it.archiveFile }) - into(rootProject.layout.buildDirectory.file("libs/${project.property("mod.version")}")) - } - } diff --git a/src/main/java/me/alexdevs/solstice/api/text/Format.java b/src/main/java/me/alexdevs/solstice/api/text/Format.java index 754ee9ea..66f8f811 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/Format.java +++ b/src/main/java/me/alexdevs/solstice/api/text/Format.java @@ -6,47 +6,47 @@ import eu.pb4.placeholders.api.node.TextNode; import eu.pb4.placeholders.api.parsers.*; import me.alexdevs.solstice.api.text.tag.PhaseGradientTag; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import net.minecraft.network.chat.Component; import java.util.Map; import java.util.regex.Pattern; public class Format { - //? if >= 26.1 { - /*public static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("(?[^}]+)}"); - *///? } elif >= 1.21.1 { + //? if >= 26.1 + //public static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("(?[^}]+)}"); + //? if < 26.1 public static final Pattern PLACEHOLDER_PATTERN = PatternPlaceholderParser.PREDEFINED_PLACEHOLDER_PATTERN; - //? } public static final NodeParser LEGACY_PARSER = LegacyFormattingParser.ALL; public static final NodeParser PARSER; static { - //? if >= 26.1 { - /*var parser = eu.pb4.placeholders.api.parsers.TagParser.DEFAULT.copy(); - - *///? } elif >= 1.21.1 { - var parser = TextParserV1.createDefault(); - //? } - parser.register(PhaseGradientTag.createTag()); - PARSER = parser; + var gradientParser = eu.pb4.placeholders.api.parsers.TagParser.DEFAULT.copy(); + gradientParser.register(PhaseGradientTag.createTag()); + PARSER = NodeParser.builder() + .simplifiedTextFormat() + //? if >= 26.1 + //.serverPlaceholders() + //? if < 26.1 + .globalPlaceholders() + .quickText() + .add(gradientParser) + .build(); } public static Component parse(String text) { - //? if >= 26.1 { - /*return PARSER.parseNode(text).toComponent(); - *///? } elif >= 1.21.1 { - return PARSER.parseNode(text).toText(); - //? } + return PARSER.parseNode(text) + //? if >= 26.1 + //.toComponent(); + //? if < 26.1 + .toText(); } public static Component parse(TextNode textNode, PlaceholderContext context, Map placeholders) { - //? if >= 26.1 { - /*var predefinedNode = new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(textNode); - return Placeholders.COMMON_PLACEHOLDER_PARSER.parseNode(predefinedNode) - .toComponent(ParserContext.of(PlaceholderContext.COMMON_KEY, context)); - *///? } elif >= 1.21.1 { - var predefinedNode = Placeholders.parseNodes(textNode, PLACEHOLDER_PATTERN, placeholders); - return Placeholders.parseText(predefinedNode, context); - //? } + return PARSER.parseNode(new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(textNode)) + //? if < 26.1 + .toText(context); + //? if >= 26.1 + //.toComponent(context); } public static Component parse(Component text, PlaceholderContext context, Map placeholders) { @@ -54,26 +54,26 @@ public static Component parse(Component text, PlaceholderContext context, Map placeholders) { - return parse(parse(text), context, placeholders); + return parse(PARSER.parseNode(text), context, placeholders); } public static Component parse(String text, PlaceholderContext context) { - return parse(parse(text), context, Map.of()); + return parse(PARSER.parseNode(text), context, Map.of()); } public static Component parse(String text, Map placeholders) { - //? if >= 26.1 { - /*return new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(TextNode.convert(parse(text))).toComponent(); - *///? } elif >= 1.21.1 { - return Placeholders.parseText(parse(text), PLACEHOLDER_PATTERN, placeholders); - //? } + return new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(PARSER.parseNode(text)) + //? if < 26.1 + .toText(); + //? if >= 26.1 + //.toComponent(); } public static Component parse(Component text, Map placeholders) { - //? if >= 26.1 { - /*return new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(TextNode.convert(text)).toComponent(); - *///? } elif >= 1.21.1 { - return Placeholders.parseText(TextNode.convert(text), PLACEHOLDER_PATTERN, placeholders); - //? } + return new MapPlaceholderParser(PLACEHOLDER_PATTERN, placeholders).parseNode(PARSER.parseNode(TextNode.convert(text))) + //? if < 26.1 + .toText(); + //? if >= 26.1 + //.toComponent(); } } diff --git a/src/main/java/me/alexdevs/solstice/api/text/MapPlaceholderParser.java b/src/main/java/me/alexdevs/solstice/api/text/MapPlaceholderParser.java index 0dd58008..59d8361c 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/MapPlaceholderParser.java +++ b/src/main/java/me/alexdevs/solstice/api/text/MapPlaceholderParser.java @@ -52,7 +52,7 @@ public TextNode[] parseNodes(TextNode text) { for (var child : parentNode.getChildren()) { out.add(TextNode.asSingle(this.parseNodes(child))); } - return new TextNode[]{parentNode.copyWith(out.toArray(new TextNode[0]))}; + return new TextNode[]{parentNode.copyWith(out.toArray(new TextNode[0]), this)}; } return new TextNode[]{text}; diff --git a/src/main/java/me/alexdevs/solstice/api/text/tag/PhaseGradientTag.java b/src/main/java/me/alexdevs/solstice/api/text/tag/PhaseGradientTag.java index 9e598821..33b2a4c9 100644 --- a/src/main/java/me/alexdevs/solstice/api/text/tag/PhaseGradientTag.java +++ b/src/main/java/me/alexdevs/solstice/api/text/tag/PhaseGradientTag.java @@ -2,10 +2,6 @@ import eu.pb4.placeholders.api.node.TextNode; import eu.pb4.placeholders.api.node.parent.GradientNode; -//? < 26.1 -import eu.pb4.placeholders.api.parsers.TextParserV1; -//? < 26.1 -import eu.pb4.placeholders.impl.textparser.TextParserImpl; import me.alexdevs.solstice.api.utils.MathUtils; import net.minecraft.network.chat.TextColor; import me.alexdevs.solstice.api.color.Gradient; @@ -25,8 +21,7 @@ */ public class PhaseGradientTag { - //? if >= 26.1 { - /*public static eu.pb4.placeholders.api.parsers.tag.TextTag createTag() { + public static eu.pb4.placeholders.api.parsers.tag.TextTag createTag() { return eu.pb4.placeholders.api.parsers.tag.TextTag.enclosing("phase_gradient", List.of("pgr", "sgr"), "gradient", true, (children, args, parser) -> { var rawArgs = args.input().split(":"); @@ -66,49 +61,6 @@ public class PhaseGradientTag { return PhaseGradientTag.smoother(textColors, phase, children); }); } - *///? } elif >= 1.21.1 { - public static TextParserV1.TextTag createTag() { - return TextParserV1.TextTag.of("phase_gradient", List.of("pgr", "sgr"), "gradient", true, - (tag, data, input, handlers, endAt) -> { - var rawArgs = data.split(":"); - var out = TextParserImpl.recursiveParsing(input, handlers, endAt); - - double phase = 0; - final List textColors; - - var args = Arrays.stream(rawArgs).iterator(); - - if (args.hasNext()) { - textColors = new ArrayList<>(); - while (args.hasNext()) { - var arg = args.next(); - if (!args.hasNext()) { - final var possiblePhase = MathUtils.parseDouble(arg); - if (possiblePhase.isPresent()) { - phase = MathUtils.clamp(possiblePhase.get(), -1d, 1d); - break; - } - } - - var parsedColor = TextColor.parseColor(arg); - if (parsedColor.isError()) { - textColors.add(TextColor.fromRgb(0)); - } else { - textColors.add(parsedColor.getOrThrow()); - } - } - - if (textColors.size() == 1) { - return out.value(GradientNode.colors(textColors, out.nodes())); - } - } else { - textColors = List.of(); - } - - return out.value(PhaseGradientTag.smoother(textColors, phase, out.nodes())); - }); - } - //? } public static GradientNode smoother(List colors, double phase, TextNode... nodes) { if (colors.isEmpty()) { diff --git a/src/main/java/me/alexdevs/solstice/api/utils/PlaceholderUtils.java b/src/main/java/me/alexdevs/solstice/api/utils/PlaceholderUtils.java index 35547d76..f2ecae79 100644 --- a/src/main/java/me/alexdevs/solstice/api/utils/PlaceholderUtils.java +++ b/src/main/java/me/alexdevs/solstice/api/utils/PlaceholderUtils.java @@ -4,6 +4,8 @@ import eu.pb4.placeholders.api.PlaceholderContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; public final class PlaceholderUtils { private PlaceholderUtils() { @@ -19,16 +21,30 @@ public static PlaceholderContext of(CommandSourceStack source) { } public static PlaceholderContext of(MinecraftServer server) { - //? if >= 26.1 - //return PlaceholderContext.of(); - //? if < 26.1 + //? if >= 26.1 { + /*// fallback to a serverlevel since latest versions don't have PlaceholderContext.of(MinecraftServer) + return PlaceholderContext.of(server.overworld()); //hopefully this works fine + *///? } elif < 26.1 { return PlaceholderContext.of(server); - } + //? } + } public static PlaceholderContext of(GameProfile profile, MinecraftServer server) { - //? if >= 26.1 - //return PlaceholderContext.of(); - //? if < 26.1 + //? if >= 26.1 { + /*// fallback to a serverlevel since latest versions don't have PlaceholderContext.of(GameProfile,MinecraftServer) + var player = server.getPlayerList().getPlayer(PlayerUtils.getId(profile)); + if (player != null) { + return PlaceholderContext.of(player); // if we have an online player + } + else { + return of(server); // otherwise fallback to server + } + *///? } elif < 26.1 { return PlaceholderContext.of(profile, server); + //? } + } + + public static PlaceholderContext of(Player player) { + return PlaceholderContext.of(player); } } diff --git a/src/main/java/me/alexdevs/solstice/modules/afk/AfkModule.java b/src/main/java/me/alexdevs/solstice/modules/afk/AfkModule.java index ce8ea9d5..a0cea56d 100644 --- a/src/main/java/me/alexdevs/solstice/modules/afk/AfkModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/afk/AfkModule.java @@ -10,6 +10,7 @@ import me.alexdevs.solstice.api.events.SolsticeEvents; import me.alexdevs.solstice.api.module.ModuleBase; import me.alexdevs.solstice.api.text.Format; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.utils.PlayerUtils; import me.alexdevs.solstice.modules.afk.commands.ActiveTimeCommand; import me.alexdevs.solstice.modules.afk.commands.AfkCommand; @@ -82,7 +83,7 @@ public void init() { //? } if (isPlayerAfk(player)) - return PlaceholderResult.value(Format.parse(getConfig().tag)); + return PlaceholderResult.value(Format.parse(getConfig().tag, PlaceholderUtils.of(player))); else return PlaceholderResult.value(""); }); diff --git a/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/BroadcastCommand.java b/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/BroadcastCommand.java index 0f63a5e9..e40094e2 100644 --- a/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/BroadcastCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/BroadcastCommand.java @@ -36,7 +36,7 @@ public LiteralArgumentBuilder command(String name) { var config = Solstice.configManager.getData(BroadcastConfig.class); var message = StringArgumentType.getString(context, "message"); - var serverContext = PlaceholderUtils.of(context.getSource().getServer()); + var serverContext = PlaceholderUtils.of(context.getSource()); var placeholders = Map.of( "message", Format.parse(message, serverContext) diff --git a/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/PlainBroadcastCommand.java b/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/PlainBroadcastCommand.java index bf9255fe..d3f7fadc 100644 --- a/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/PlainBroadcastCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/broadcast/commands/PlainBroadcastCommand.java @@ -32,7 +32,7 @@ public LiteralArgumentBuilder command(String name) { .then(argument("message", StringArgumentType.greedyString()) .executes(context -> { var message = StringArgumentType.getString(context, "message"); - var serverContext = PlaceholderUtils.of(context.getSource().getServer()); + var serverContext = PlaceholderUtils.of(context.getSource()); Solstice.getInstance().broadcast(Format.parse(message, serverContext)); diff --git a/src/main/java/me/alexdevs/solstice/modules/info/commands/MotdCommand.java b/src/main/java/me/alexdevs/solstice/modules/info/commands/MotdCommand.java index 4f83bed7..d43d23cc 100644 --- a/src/main/java/me/alexdevs/solstice/modules/info/commands/MotdCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/info/commands/MotdCommand.java @@ -1,6 +1,7 @@ package me.alexdevs.solstice.modules.info.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import eu.pb4.placeholders.api.PlaceholderContext; import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.modules.info.InfoModule; diff --git a/src/main/java/me/alexdevs/solstice/modules/note/commands/NotesCommand.java b/src/main/java/me/alexdevs/solstice/modules/note/commands/NotesCommand.java index 002969f6..2a7f15e8 100644 --- a/src/main/java/me/alexdevs/solstice/modules/note/commands/NotesCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/note/commands/NotesCommand.java @@ -9,6 +9,7 @@ import me.alexdevs.solstice.api.module.ModCommand; import me.alexdevs.solstice.api.text.Components; import me.alexdevs.solstice.api.text.Format; +import me.alexdevs.solstice.api.utils.PlaceholderUtils; import me.alexdevs.solstice.api.utils.PlayerUtils; import me.alexdevs.solstice.core.coreModule.CoreModule; import me.alexdevs.solstice.modules.note.NoteModule; @@ -94,7 +95,7 @@ private int listNotes(CommandContext context) throws Command "index", Component.nullToEmpty(String.valueOf(i)), "operator", Component.nullToEmpty(senderName), "date", Component.nullToEmpty(dateFormatter.format(note.creationDate)), - "message", Format.parse(note.note), + "message", Format.parse(note.note,PlaceholderUtils.of(context.getSource())), "checkButton", checkButton ); output = output.append(module.locale().get("noteListEntry", placeholders)); @@ -130,7 +131,7 @@ private int checkNote(CommandContext context) throws Command var placeholders = Map.of( "operator", Component.nullToEmpty(operator), "date", Component.nullToEmpty(dateFormatter.format(note.creationDate)), - "message", Format.parse(note.note), + "message", Format.parse(note.note, PlaceholderUtils.of(context.getSource())), "deleteButton", deleteButton ); diff --git a/src/main/java/me/alexdevs/solstice/modules/rtp/core/Locator.java b/src/main/java/me/alexdevs/solstice/modules/rtp/core/Locator.java index 3640e1d5..5e0a3a10 100644 --- a/src/main/java/me/alexdevs/solstice/modules/rtp/core/Locator.java +++ b/src/main/java/me/alexdevs/solstice/modules/rtp/core/Locator.java @@ -192,8 +192,8 @@ private void load() { //? if >= 26.1 { /*world.getChunkSource().addTicketWithRadius(RTP_TICKET, ChunkPos.containing(attemptPos), 0); *///? } elif >= 1.21.11 { - //world.getChunkSource().addTicketWithRadius(RTP_TICKET, new ChunkPos(attemptPos),0); - //? } else { + /*world.getChunkSource().addTicketWithRadius(RTP_TICKET, new ChunkPos(attemptPos),0); + *///? } else { world.getChunkSource().addRegionTicket(RTP_TICKET, new ChunkPos(attemptPos), 0, attemptPos); //? } } diff --git a/src/main/java/me/alexdevs/solstice/modules/seen/commands/SeenCommand.java b/src/main/java/me/alexdevs/solstice/modules/seen/commands/SeenCommand.java index 9155ef23..104e463c 100644 --- a/src/main/java/me/alexdevs/solstice/modules/seen/commands/SeenCommand.java +++ b/src/main/java/me/alexdevs/solstice/modules/seen/commands/SeenCommand.java @@ -99,7 +99,7 @@ public LiteralArgumentBuilder command(String name) { if (player != null) { source.sendSuccess(() -> Format.parse(finalOutput, PlaceholderContext.of(player), map), false); } else { - source.sendSuccess(() -> Format.parse(finalOutput, PlaceholderUtils.of(source.getServer()), map), false); + source.sendSuccess(() -> Format.parse(finalOutput, PlaceholderUtils.of(source), map), false); } return 1; diff --git a/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java b/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java index 87e4a6ed..2ce6f950 100644 --- a/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/styling/StylingModule.java @@ -19,6 +19,8 @@ import net.minecraft.server.players.PlayerList; import net.minecraft.world.scores.PlayerTeam; +import java.util.Locale; + public class StylingModule extends ModuleBase.Toggleable { public static final String ADVANCED_CHAT_FORMATTING_PERMISSION = "solstice.chat.advanced"; public static final String LEGACY_CHAT_FORMATTING_PERMISSION = "solstice.chat.legacy"; @@ -133,7 +135,7 @@ public ChatFormatting getNameplateColor(ServerPlayer player) { } //? if >= 26.1 - //return ChatFormatting.valueOf(color); + //return ChatFormatting.valueOf(color.toUpperCase(Locale.ROOT)); //? if < 26.1 return ChatFormatting.getByName(color); } diff --git a/src/main/java/me/alexdevs/solstice/modules/tell/TellModule.java b/src/main/java/me/alexdevs/solstice/modules/tell/TellModule.java index 2dcc1585..9d303d77 100644 --- a/src/main/java/me/alexdevs/solstice/modules/tell/TellModule.java +++ b/src/main/java/me/alexdevs/solstice/modules/tell/TellModule.java @@ -60,11 +60,10 @@ public void sendDirectMessage(String targetName, CommandSourceStack source, Stri var parsedMessage = Components.chat(message, source); - var serverContext = PlaceholderUtils.of(source.getServer()); var sourceContext = PlaceholderUtils.of(source); PlaceholderContext targetContext; if (targetPlayer == null) { - targetContext = serverContext; + targetContext = sourceContext; } else { targetContext = PlaceholderContext.of(targetPlayer); } @@ -101,12 +100,12 @@ public void sendDirectMessage(String targetName, CommandSourceStack source, Stri ); var genericText = locale().get( "message", - serverContext, + sourceContext, placeholders ); var spyText = locale().get( "messageSpy", - serverContext, + sourceContext, placeholders ); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 092123b6..9b306ae9 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -43,5 +43,5 @@ "suggests" : { "vanish": "*" }, - "accessWidener": "solstice.accesswidener" + "accessWidener": "solstice.ct" } \ No newline at end of file diff --git a/src/main/resources/solstice.accesswidener b/src/main/resources/solstice.ct similarity index 100% rename from src/main/resources/solstice.accesswidener rename to src/main/resources/solstice.ct diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index 00a255de..964644a3 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -5,6 +5,9 @@ stonecutter active "1.21.1" stonecutter parameters { replacements { + string(current.parsed >= "26.1") { + replace("accessWidener v2 named", "classTweaker v2 official") + } string(current.parsed >= "1.21.11") { replace("player.getServer()", "player.level().getServer()") replace("sourcePlayer.getServer()", "sourcePlayer.level().getServer()")