From 1154a6ebed48a9031fbb91392e6410427dcff069 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 23 Aug 2025 15:30:17 +0000 Subject: [PATCH 1/6] Bump version to 1.1.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 45a1b3f44..781dcb07c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.2 +1.1.3 From edd5ef8c2104071938fb459f02d41727e01002ad Mon Sep 17 00:00:00 2001 From: Lucas Geitgey Date: Mon, 25 Aug 2025 13:22:26 +0100 Subject: [PATCH 2/6] Version 1.0.1 --- VERSION | 2 +- build.gradle | 1 + gradle.properties | 2 +- src/main/java/com/example/ExampleMod.java | 133 ++++++++++++++++------ src/main/resources/fabric.mod.json | 4 +- 5 files changed, 102 insertions(+), 40 deletions(-) diff --git a/VERSION b/VERSION index 66c4c2263..3eefcb9dd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.9 +1.0.0 diff --git a/build.gradle b/build.gradle index 33073d593..da3ff3ce5 100644 --- a/build.gradle +++ b/build.gradle @@ -67,6 +67,7 @@ jar { } } + publishing { publications { create("mavenJava", MavenPublication) { diff --git a/gradle.properties b/gradle.properties index 00abd77a6..93cf84b41 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ loader_version=0.16.14 loom_version=1.11-SNAPSHOT # Mod Properties -mod_version=1.0.0 +mod_version=1.0.1 maven_group=com.example archives_base_name=CMDMaker diff --git a/src/main/java/com/example/ExampleMod.java b/src/main/java/com/example/ExampleMod.java index b3441aad5..eaa045774 100644 --- a/src/main/java/com/example/ExampleMod.java +++ b/src/main/java/com/example/ExampleMod.java @@ -21,62 +21,101 @@ public class ExampleMod implements ModInitializer { private static final Path CONFIG_PATH = Paths.get("config", MOD_ID + "_aliases.json"); private static final Map aliases = new HashMap<>(); - + // Store per-player custom variables: player UUID -> (varName -> value) + private static final Map> playerVariables = new HashMap<>(); @Override public void onInitialize() { loadAliases(); CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { registerAddCommand(dispatcher); registerAliases(dispatcher); + registerSetCmdVariable(dispatcher); }); LOGGER.info("Alias mod initialized!"); } + // Register /addcommand (reload|add|del) ... private void registerAddCommand(CommandDispatcher dispatcher) { dispatcher.register( LiteralArgumentBuilder.literal("addcommand") - .then(net.minecraft.server.command.CommandManager.literal("reload") - .executes(ctx -> { - loadAliases(); - registerAliases(dispatcher); - ctx.getSource().sendFeedback(() -> net.minecraft.text.Text.literal("Aliases reloaded."), false); - return 1; - }) + .then( + net.minecraft.server.command.CommandManager.literal("reload") + .executes(ctx -> { + loadAliases(); + // Remove all old aliases from dispatcher before re-registering + for (String alias : new HashSet<>(aliases.keySet())) { + dispatcher.getRoot().getChildren().removeIf(node -> node.getName().equals(alias)); + } + registerAliases(dispatcher); + ctx.getSource().sendFeedback(() -> net.minecraft.text.Text.literal("Aliases reloaded."), false); + return 1; + }) ) - .then(net.minecraft.server.command.CommandManager.literal("add") - .then(net.minecraft.server.command.CommandManager.argument("alias", StringArgumentType.word()) - .then(net.minecraft.server.command.CommandManager.argument("target", StringArgumentType.greedyString()) - .executes(ctx -> { - String alias = StringArgumentType.getString(ctx, "alias"); - String target = StringArgumentType.getString(ctx, "target"); - aliases.put(alias, target); - saveAliases(); - registerAlias(dispatcher, alias, target); - ctx.getSource().sendFeedback(() -> net.minecraft.text.Text.literal("Alias /" + alias + " -> " + target + " added."), false); - return 1; - }) + .then( + net.minecraft.server.command.CommandManager.literal("add") + .then( + net.minecraft.server.command.CommandManager.argument("alias", StringArgumentType.word()) + .then( + net.minecraft.server.command.CommandManager.argument("target", StringArgumentType.greedyString()) + .executes(ctx -> { + String alias = StringArgumentType.getString(ctx, "alias"); + String target = StringArgumentType.getString(ctx, "target"); + aliases.put(alias, target); + saveAliases(); + registerAlias(dispatcher, alias, target); + ctx.getSource().sendFeedback(() -> net.minecraft.text.Text.literal("Alias /" + alias + " -> " + target + " added."), false); + return 1; + }) + ) ) - ) ) - .then(net.minecraft.server.command.CommandManager.literal("del") - .then(net.minecraft.server.command.CommandManager.argument("alias", StringArgumentType.word()) + .then( + net.minecraft.server.command.CommandManager.literal("del") + .then( + net.minecraft.server.command.CommandManager.argument("alias", StringArgumentType.word()) + .executes(ctx -> { + String alias = StringArgumentType.getString(ctx, "alias"); + if (aliases.remove(alias) != null) { + saveAliases(); + dispatcher.getRoot().getChildren().removeIf(node -> node.getName().equals(alias)); + ctx.getSource().sendFeedback(() -> net.minecraft.text.Text.literal("Alias /" + alias + " removed."), false); + } else { + ctx.getSource().sendFeedback(() -> net.minecraft.text.Text.literal("Alias /" + alias + " not found."), false); + } + return 1; + }) + ) + ) + ); + } + + // Register /setcmdvariable command + private void registerSetCmdVariable(CommandDispatcher dispatcher) { + dispatcher.register( + net.minecraft.server.command.CommandManager.literal("setcmdvariable") + .then(net.minecraft.server.command.CommandManager.argument("variable", StringArgumentType.word()) + .then(net.minecraft.server.command.CommandManager.argument("value", StringArgumentType.greedyString()) .executes(ctx -> { - String alias = StringArgumentType.getString(ctx, "alias"); - if (aliases.remove(alias) != null) { - saveAliases(); - // Remove the command node from dispatcher - dispatcher.getRoot().getChildren().removeIf(node -> node.getName().equals(alias)); - ctx.getSource().sendFeedback(() -> net.minecraft.text.Text.literal("Alias /" + alias + " removed."), false); - } else { - ctx.getSource().sendFeedback(() -> net.minecraft.text.Text.literal("Alias /" + alias + " not found."), false); + String var = StringArgumentType.getString(ctx, "variable"); + String value = StringArgumentType.getString(ctx, "value"); + ServerCommandSource source = ctx.getSource(); + UUID uuid = null; + try { + uuid = source.getPlayer().getUuid(); + } catch (Exception e) { + source.sendFeedback(() -> net.minecraft.text.Text.literal("Only players can set variables."), false); + return 0; } + playerVariables.computeIfAbsent(uuid, k -> new HashMap<>()).put(var, value); + source.sendFeedback(() -> net.minecraft.text.Text.literal("Set variable ${" + var + "} = " + value), false); return 1; - }) + }) ) ) ); } + private void registerAliases(CommandDispatcher dispatcher) { for (Map.Entry entry : aliases.entrySet()) { registerAlias(dispatcher, entry.getKey(), entry.getValue()); @@ -90,23 +129,46 @@ private void registerAlias(CommandDispatcher dispatcher, St net.minecraft.server.command.CommandManager.literal(alias) .executes(ctx -> { ServerCommandSource source = ctx.getSource(); + String command = substituteVariables(target, ctx); CommandDispatcher cmdDispatcher = source.getServer().getCommandManager().getDispatcher(); - ParseResults parsed = cmdDispatcher.parse(target, source); + ParseResults parsed = cmdDispatcher.parse(command, source); return cmdDispatcher.execute(parsed); }) .then(net.minecraft.server.command.CommandManager.argument("args", StringArgumentType.greedyString()) .executes(ctx -> { String args = StringArgumentType.getString(ctx, "args"); String full = target + " " + args; + String command = substituteVariables(full, ctx); ServerCommandSource source = ctx.getSource(); CommandDispatcher cmdDispatcher = source.getServer().getCommandManager().getDispatcher(); - ParseResults parsed = cmdDispatcher.parse(full, source); + ParseResults parsed = cmdDispatcher.parse(command, source); return cmdDispatcher.execute(parsed); }) ) ); } + // Substitute variables in the command string, e.g. ${player}, ${x}, etc. and custom variables + private String substituteVariables(String command, CommandContext ctx) { + ServerCommandSource source = ctx.getSource(); + Map vars = new HashMap<>(); + try { + vars.put("player", source.getName()); + vars.put("x", String.valueOf(source.getPosition().x)); + vars.put("y", String.valueOf(source.getPosition().y)); + vars.put("z", String.valueOf(source.getPosition().z)); + // Add custom variables for this player + UUID uuid = source.getPlayer() != null ? source.getPlayer().getUuid() : null; + if (uuid != null && playerVariables.containsKey(uuid)) { + vars.putAll(playerVariables.get(uuid)); + } + } catch (Exception ignored) {} + for (Map.Entry entry : vars.entrySet()) { + command = command.replace("${" + entry.getKey() + "}", entry.getValue()); + } + return command; + } + private void loadAliases() { aliases.clear(); try { @@ -133,5 +195,4 @@ private void saveAliases() { } catch (Exception e) { LOGGER.error("Failed to save aliases config", e); } - } -} \ No newline at end of file + }} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 77eeb6f4d..6f7d7a9ce 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,8 +30,8 @@ } ], "depends": { - "fabricloader": ">=0.16.14", - "minecraft": "1.21.7", + "fabricloader": ">=0.15.0", + "minecraft": ">=1.20 <=1.21.8", "java": ">=21", "fabric-api": "*" }, From a351f42aa917f51977a65b316504693042f0eb91 Mon Sep 17 00:00:00 2001 From: Lucas Geitgey Date: Mon, 25 Aug 2025 13:43:22 +0100 Subject: [PATCH 3/6] 1.0.2 --- gradle.properties | 2 +- src/main/java/com/example/ExampleMod.java | 57 +++++++++++++++++++---- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/gradle.properties b/gradle.properties index 93cf84b41..c6a23455f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ loader_version=0.16.14 loom_version=1.11-SNAPSHOT # Mod Properties -mod_version=1.0.1 +mod_version=1.0.2 maven_group=com.example archives_base_name=CMDMaker diff --git a/src/main/java/com/example/ExampleMod.java b/src/main/java/com/example/ExampleMod.java index eaa045774..7ddbe5ec0 100644 --- a/src/main/java/com/example/ExampleMod.java +++ b/src/main/java/com/example/ExampleMod.java @@ -19,12 +19,13 @@ public class ExampleMod implements ModInitializer { public static final String MOD_ID = "modid"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - private static final Path CONFIG_PATH = Paths.get("config", MOD_ID + "_aliases.json"); + private static final Path CONFIG_PATH = Paths.get("config", "CommandMaker", "aliases.json"); private static final Map aliases = new HashMap<>(); // Store per-player custom variables: player UUID -> (varName -> value) private static final Map> playerVariables = new HashMap<>(); @Override public void onInitialize() { + ensureConfigExists(); loadAliases(); CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { registerAddCommand(dispatcher); @@ -34,6 +35,30 @@ public void onInitialize() { LOGGER.info("Alias mod initialized!"); } + // Ensure config folder and aliases.json exist, create with example if not + private void ensureConfigExists() { + try { + Path folder = CONFIG_PATH.getParent(); + if (!Files.exists(folder)) { + Files.createDirectories(folder); + } + if (!Files.exists(CONFIG_PATH)) { + List lines = new ArrayList<>(); + lines.add("# CommandMaker Aliases Config"); + lines.add("# Each entry is an alias and its command target."); + lines.add("# You can use variables like ${player}, ${x}, ${y}, ${z} in the command."); + lines.add("# Example:"); + lines.add("# teleport=tp ${player} 0 100 0"); + lines.add("# greet=say Hello, ${player}!"); + lines.add("{"); + lines.add("}"); + Files.write(CONFIG_PATH, lines, StandardOpenOption.CREATE_NEW); + } + } catch (Exception e) { + LOGGER.error("Failed to create config folder or file", e); + } + } + // Register /addcommand (reload|add|del) ... private void registerAddCommand(CommandDispatcher dispatcher) { dispatcher.register( @@ -172,12 +197,20 @@ private String substituteVariables(String command, CommandContext entry : obj.entrySet()) { - aliases.put(entry.getKey(), entry.getValue().getAsString()); - } + if (!Files.exists(CONFIG_PATH)) { + ensureConfigExists(); + } + List lines = Files.readAllLines(CONFIG_PATH); + StringBuilder jsonBuilder = new StringBuilder(); + for (String line : lines) { + if (line.trim().startsWith("#")) continue; + jsonBuilder.append(line).append("\n"); + } + String json = jsonBuilder.toString().trim(); + if (json.isEmpty() || json.equals("{}")) return; + JsonObject obj = JsonParser.parseString(json).getAsJsonObject(); + for (Map.Entry entry : obj.entrySet()) { + aliases.put(entry.getKey(), entry.getValue().getAsString()); } } catch (Exception e) { LOGGER.error("Failed to load aliases config", e); @@ -187,11 +220,19 @@ private void loadAliases() { private void saveAliases() { try { Files.createDirectories(CONFIG_PATH.getParent()); + List lines = new ArrayList<>(); + lines.add("# CommandMaker Aliases Config"); + lines.add("# Each entry is an alias and its command target."); + lines.add("# You can use variables like ${player}, ${x}, ${y}, ${z} in the command."); + lines.add("# Example:"); + lines.add("# teleport=tp ${player} 0 100 0"); + lines.add("# greet=say Hello, ${player}!"); JsonObject obj = new JsonObject(); for (Map.Entry entry : aliases.entrySet()) { obj.addProperty(entry.getKey(), entry.getValue()); } - Files.writeString(CONFIG_PATH, obj.toString(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + lines.add(obj.toString()); + Files.write(CONFIG_PATH, lines, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); } catch (Exception e) { LOGGER.error("Failed to save aliases config", e); } From 212c942087e799fb9cb111a7ec548d32e1040b38 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 25 Aug 2025 12:44:27 +0000 Subject: [PATCH 4/6] Bump version to 1.1.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 66c4c2263..9084fa2f7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.9 +1.1.0 From c07321368c96fa1f39e6afc8a050017eeecdf87d Mon Sep 17 00:00:00 2001 From: Lucas Geitgey Date: Mon, 25 Aug 2025 13:53:42 +0100 Subject: [PATCH 5/6] now works with quilt --- build.gradle | 9 ++ src/main/java/com/example/ExampleMod.java | 100 +++++++++++++++++----- src/main/resources/quilt.mod.json | 29 +++++++ 3 files changed, 116 insertions(+), 22 deletions(-) create mode 100644 src/main/resources/quilt.mod.json diff --git a/build.gradle b/build.gradle index da3ff3ce5..60f9de9a1 100644 --- a/build.gradle +++ b/build.gradle @@ -40,15 +40,24 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + // Quilt Loader and Quilted Fabric API (for Quilt compatibility) + modImplementation("org.quiltmc:quilt-loader:0.22.0") // Use latest compatible version + modImplementation("org.quiltmc.quilted-fabric-api:quilted-fabric-api:${project.fabric_version}") + // Optional: JSON parsing implementation "com.google.code.gson:gson:2.10.1" } + processResources { inputs.property "version", project.version filesMatching("fabric.mod.json") { expand "version": inputs.properties["version"] } + // Copy quilt.mod.json to the output jar + from("src/main/resources/quilt.mod.json") { + into "" + } } tasks.withType(JavaCompile).configureEach { diff --git a/src/main/java/com/example/ExampleMod.java b/src/main/java/com/example/ExampleMod.java index 7ddbe5ec0..a5e46ea11 100644 --- a/src/main/java/com/example/ExampleMod.java +++ b/src/main/java/com/example/ExampleMod.java @@ -47,9 +47,13 @@ private void ensureConfigExists() { lines.add("# CommandMaker Aliases Config"); lines.add("# Each entry is an alias and its command target."); lines.add("# You can use variables like ${player}, ${x}, ${y}, ${z} in the command."); + lines.add("# You can use argument variables like ${1}, ${2}, ... for user-supplied arguments."); + lines.add("# To run multiple commands, use a JSON array as the value for the alias."); lines.add("# Example:"); - lines.add("# teleport=tp ${player} 0 100 0"); - lines.add("# greet=say Hello, ${player}!"); + lines.add("# teleport: 'tp ${player} 0 100 0'"); + lines.add("# greet: 'say Hello, ${player}!'"); + lines.add("# kit: ['give ${player} diamond_sword 1', 'give ${player} diamond_helmet 1']"); + lines.add("# giveme: 'give ${player} ${1} ${2}'"); lines.add("{"); lines.add("}"); Files.write(CONFIG_PATH, lines, StandardOpenOption.CREATE_NEW); @@ -152,27 +156,73 @@ private void registerAlias(CommandDispatcher dispatcher, St dispatcher.getRoot().getChildren().removeIf(node -> node.getName().equals(alias)); dispatcher.register( net.minecraft.server.command.CommandManager.literal(alias) - .executes(ctx -> { - ServerCommandSource source = ctx.getSource(); - String command = substituteVariables(target, ctx); - CommandDispatcher cmdDispatcher = source.getServer().getCommandManager().getDispatcher(); - ParseResults parsed = cmdDispatcher.parse(command, source); - return cmdDispatcher.execute(parsed); - }) .then(net.minecraft.server.command.CommandManager.argument("args", StringArgumentType.greedyString()) - .executes(ctx -> { - String args = StringArgumentType.getString(ctx, "args"); - String full = target + " " + args; - String command = substituteVariables(full, ctx); - ServerCommandSource source = ctx.getSource(); - CommandDispatcher cmdDispatcher = source.getServer().getCommandManager().getDispatcher(); - ParseResults parsed = cmdDispatcher.parse(command, source); - return cmdDispatcher.execute(parsed); - }) + .executes(ctx -> executeAlias(alias, ctx)) ) + .executes(ctx -> executeAlias(alias, ctx)) ); } + // Execute an alias, supporting multiple commands and argument substitution + private int executeAlias(String alias, CommandContext ctx) { + ServerCommandSource source = ctx.getSource(); + String raw = aliases.get(alias); + List commands = new ArrayList<>(); + try { + JsonElement el = JsonParser.parseString(raw); + if (el.isJsonArray()) { + for (JsonElement e : el.getAsJsonArray()) { + commands.add(e.getAsString()); + } + } else if (el.isJsonPrimitive()) { + commands.add(el.getAsString()); + } + } catch (Exception e) { + LOGGER.error("Failed to parse alias commands for " + alias, e); + return 0; + } + // Parse arguments + String args = ""; + try { args = StringArgumentType.getString(ctx, "args"); } catch (Exception ignored) {} + String[] splitArgs = args.isEmpty() ? new String[0] : args.split("\\s+"); + int result = 1; + for (String cmd : commands) { + String substituted = substituteVariablesWithArgs(cmd, ctx, splitArgs); + CommandDispatcher cmdDispatcher = source.getServer().getCommandManager().getDispatcher(); + ParseResults parsed = cmdDispatcher.parse(substituted, source); + try { + result = cmdDispatcher.execute(parsed); + } catch (com.mojang.brigadier.exceptions.CommandSyntaxException e) { + LOGGER.error("Command execution failed for alias: " + alias, e); + } + } + return result; + } + + // Substitute variables in the command string, including argument placeholders + private String substituteVariablesWithArgs(String command, CommandContext ctx, String[] splitArgs) { + ServerCommandSource source = ctx.getSource(); + Map vars = new HashMap<>(); + try { + vars.put("player", source.getName()); + vars.put("x", String.valueOf(source.getPosition().x)); + vars.put("y", String.valueOf(source.getPosition().y)); + vars.put("z", String.valueOf(source.getPosition().z)); + UUID uuid = source.getPlayer() != null ? source.getPlayer().getUuid() : null; + if (uuid != null && playerVariables.containsKey(uuid)) { + vars.putAll(playerVariables.get(uuid)); + } + } catch (Exception ignored) {} + // Add argument variables ${1}, ${2}, ... + for (int i = 0; i < splitArgs.length; i++) { + vars.put(String.valueOf(i + 1), splitArgs[i]); + } + for (Map.Entry entry : vars.entrySet()) { + command = command.replace("${" + entry.getKey() + "}", entry.getValue()); + } + return command; + } + // Substitute variables in the command string, e.g. ${player}, ${x}, etc. and custom variables private String substituteVariables(String command, CommandContext ctx) { ServerCommandSource source = ctx.getSource(); @@ -210,7 +260,8 @@ private void loadAliases() { if (json.isEmpty() || json.equals("{}")) return; JsonObject obj = JsonParser.parseString(json).getAsJsonObject(); for (Map.Entry entry : obj.entrySet()) { - aliases.put(entry.getKey(), entry.getValue().getAsString()); + // Store as stringified JSON for each alias (could be string or array) + aliases.put(entry.getKey(), entry.getValue().toString()); } } catch (Exception e) { LOGGER.error("Failed to load aliases config", e); @@ -224,12 +275,17 @@ private void saveAliases() { lines.add("# CommandMaker Aliases Config"); lines.add("# Each entry is an alias and its command target."); lines.add("# You can use variables like ${player}, ${x}, ${y}, ${z} in the command."); + lines.add("# You can use argument variables like ${1}, ${2}, ... for user-supplied arguments."); + lines.add("# To run multiple commands, use a JSON array as the value for the alias."); lines.add("# Example:"); - lines.add("# teleport=tp ${player} 0 100 0"); - lines.add("# greet=say Hello, ${player}!"); + lines.add("# teleport: 'tp ${player} 0 100 0'"); + lines.add("# greet: 'say Hello, ${player}!'"); + lines.add("# kit: ['give ${player} diamond_sword 1', 'give ${player} diamond_helmet 1']"); + lines.add("# giveme: 'give ${player} ${1} ${2}'"); JsonObject obj = new JsonObject(); for (Map.Entry entry : aliases.entrySet()) { - obj.addProperty(entry.getKey(), entry.getValue()); + JsonElement el = JsonParser.parseString(entry.getValue()); + obj.add(entry.getKey(), el); } lines.add(obj.toString()); Files.write(CONFIG_PATH, lines, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); diff --git a/src/main/resources/quilt.mod.json b/src/main/resources/quilt.mod.json new file mode 100644 index 000000000..f7035213f --- /dev/null +++ b/src/main/resources/quilt.mod.json @@ -0,0 +1,29 @@ +{ + "schema_version": "1.1.0", + "quilt_loader": { + "id": "modid", + "version": "${version}", + "metadata": { + "name": "Example mod", + "description": "This is an example description! Tell everyone what your mod is about!", + "contributors": ["Me!"], + "contact": { + "homepage": "https://fabricmc.net/", + "sources": "https://github.com/FabricMC/fabric-example-mod" + }, + "license": ["CC0-1.0"] + }, + "entrypoints": { + "init": ["com.example.ExampleMod"] + }, + "depends": { + "quilt_loader": ">=0.22.0", + "minecraft": ">=1.20 <=1.21.8", + "java": ">=21", + "quilted_fabric_api": "*" + }, + "suggests": { + "another-mod": "*" + } + } +} \ No newline at end of file From 922e703832fa10443ff9ac36da2435b2b2c8cb0c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 25 Aug 2025 12:54:03 +0000 Subject: [PATCH 6/6] Bump version to 1.1.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9084fa2f7..524cb5524 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.0 +1.1.1