From 338d949bd4d8ab1729f16bbb34c36e45da826f50 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 2 Jul 2025 09:59:50 +0000 Subject: [PATCH] Command cleanup --- .../GeyserMappingsGenerator.java | 82 +------------- .../packgenerator/PackGeneratorCommand.java | 105 ++++++++++++++++++ .../geysermc/packgenerator/PackManager.java | 7 +- .../packgenerator/pack/BedrockPack.java | 8 +- 4 files changed, 114 insertions(+), 88 deletions(-) create mode 100644 src/main/java/org/geysermc/packgenerator/PackGeneratorCommand.java diff --git a/src/main/java/org/geysermc/packgenerator/GeyserMappingsGenerator.java b/src/main/java/org/geysermc/packgenerator/GeyserMappingsGenerator.java index 1be947e..b001b1d 100644 --- a/src/main/java/org/geysermc/packgenerator/GeyserMappingsGenerator.java +++ b/src/main/java/org/geysermc/packgenerator/GeyserMappingsGenerator.java @@ -1,13 +1,8 @@ package org.geysermc.packgenerator; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; -import com.mojang.brigadier.suggestion.Suggestion; import com.mojang.logging.LogUtils; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.network.chat.Component; @@ -15,7 +10,6 @@ import net.minecraft.network.protocol.game.ServerboundChatCommandPacket; import net.minecraft.world.item.ItemStack; import org.slf4j.Logger; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -31,81 +25,7 @@ public class GeyserMappingsGenerator implements ClientModInitializer { @Override public void onInitializeClient() { - // TODO do the exceptions properly - ClientCommandRegistrationCallback.EVENT.register((dispatcher, buildContext) -> { - dispatcher.register(ClientCommandManager.literal("packgenerator") - .then(ClientCommandManager.literal("create") - .then(ClientCommandManager.argument("name", StringArgumentType.word()) - .executes(context -> { - String name = StringArgumentType.getString(context, "name"); - try { - PackManager.getInstance().startPack(name); - } catch (IOException exception) { - throw new SimpleCommandExceptionType(Component.literal(exception.getMessage())).create(); - } - context.getSource().sendFeedback(Component.literal("Created pack with name " + name)); - return 0; - }) - ) - ) - .then(ClientCommandManager.literal("map") - .executes(context -> { - ItemStack heldItem = context.getSource().getPlayer().getMainHandItem(); - PackManager.getInstance().map(heldItem); - context.getSource().sendFeedback(Component.literal("Added held item to Geyser mappings")); - return 0; - }) - ) - .then(ClientCommandManager.literal("mapinventory") - .executes(context -> { - int mapped = 0; - for (ItemStack stack : context.getSource().getPlayer().getInventory()) { - if (PackManager.getInstance().map(stack)) { - mapped++; - } - } - context.getSource().sendFeedback(Component.literal("Mapped " + mapped + " items from your inventory")); - return 0; - }) - ) - .then(ClientCommandManager.literal("finish") - .executes(context -> { - if (!PackManager.getInstance().finish()) { - throw new SimpleCommandExceptionType(Component.literal("Errors occurred whilst trying to write the pack to disk!")).create(); - } - context.getSource().sendFeedback(Component.literal("Wrote pack to disk")); - return 0; - }) - ) - .then(ClientCommandManager.literal("auto") - .then(ClientCommandManager.argument("namespace", StringArgumentType.word()) - .then(ClientCommandManager.argument("path", StringArgumentType.string()) - .executes(context -> { - String namespace = StringArgumentType.getString(context, "namespace"); - String path = StringArgumentType.getString(context, "path"); - - // Duplicated code, this is just to try this out - try { - PackManager.getInstance().startPack(namespace); - } catch (IOException exception) { - throw new SimpleCommandExceptionType(Component.literal(exception.getMessage())).create(); - } - context.getSource().sendFeedback(Component.literal("Created pack with name " + namespace)); - - // hack - CommandContext suggestionsContext = new CommandContext<>(null, - "loot give @s loot " + namespace + ":" + path, - null, null, null, null, null, null, null, false); - context.getSource().getClient().getConnection().getSuggestionsProvider() - .customSuggestion(suggestionsContext) - .whenComplete((suggestions, throwable) -> pendingPackCommands.addAll(suggestions.getList().stream().map(Suggestion::getText).toList())); - return 0; - }) - ) - ) - ) - ); - }); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, buildContext) -> PackGeneratorCommand.register(dispatcher)); ClientTickEvents.START_CLIENT_TICK.register(client -> { if (!pendingPackCommands.isEmpty() || waitingOnItem || waitingOnClear) { diff --git a/src/main/java/org/geysermc/packgenerator/PackGeneratorCommand.java b/src/main/java/org/geysermc/packgenerator/PackGeneratorCommand.java new file mode 100644 index 0000000..8e2356d --- /dev/null +++ b/src/main/java/org/geysermc/packgenerator/PackGeneratorCommand.java @@ -0,0 +1,105 @@ +package org.geysermc.packgenerator; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestion; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +import java.io.IOException; +import java.util.Optional; + +public class PackGeneratorCommand { + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(ClientCommandManager.literal("packgenerator") + .then(ClientCommandManager.literal("create") + .then(ClientCommandManager.argument("name", StringArgumentType.word()) + .executes(context -> { + String name = StringArgumentType.getString(context, "name"); + try { + PackManager.getInstance().startPack(name); + } catch (Exception exception) { + context.getSource().sendError(Component.literal("Failed to create new pack: " + exception.getMessage())); + return -1; + } + context.getSource().sendFeedback(Component.literal("Created pack with name " + name)); + return 0; + }) + ) + ) + .then(ClientCommandManager.literal("map") + .executes(context -> { + ItemStack heldItem = context.getSource().getPlayer().getMainHandItem(); + Optional problems = PackManager.getInstance().map(heldItem); + if (problems.isEmpty()) { + context.getSource().sendError(Component.literal("No item found to map!")); + } else if (problems.get()) { + context.getSource().sendError(Component.literal("Problems occurred whilst mapping the item!")); + } + context.getSource().sendFeedback(Component.literal("Added held item to Geyser mappings")); + return 0; + }) + ) + .then(ClientCommandManager.literal("mapinventory") + .executes(context -> { + int mapped = 0; + boolean errors = false; + for (ItemStack stack : context.getSource().getPlayer().getInventory()) { + Optional problems = PackManager.getInstance().map(stack); + if (problems.isPresent()) { + mapped++; + errors |= problems.get(); + } + } + if (errors) { + context.getSource().sendError(Component.literal("Problems occurred whilst mapping items!")); + } + context.getSource().sendFeedback(Component.literal("Mapped " + mapped + " items from your inventory")); + return 0; + }) + ) + .then(ClientCommandManager.literal("finish") + .executes(context -> { + if (!PackManager.getInstance().finish()) { + context.getSource().sendError(Component.literal("Errors occurred whilst trying to write the pack to disk!")); + return -1; + } + context.getSource().sendFeedback(Component.literal("Wrote pack to disk")); + return 0; + }) + ) + .then(ClientCommandManager.literal("auto") + .then(ClientCommandManager.argument("namespace", StringArgumentType.word()) + .then(ClientCommandManager.argument("path", StringArgumentType.string()) + .executes(context -> { + String namespace = StringArgumentType.getString(context, "namespace"); + String path = StringArgumentType.getString(context, "path"); + + // Duplicated code, this is just to try this out + try { + PackManager.getInstance().startPack(namespace); + } catch (IOException exception) { + throw new SimpleCommandExceptionType(Component.literal(exception.getMessage())).create(); + } + context.getSource().sendFeedback(Component.literal("Created pack with name " + namespace)); + + // hack + CommandContext suggestionsContext = new CommandContext<>(null, + "loot give @s loot " + namespace + ":" + path, + null, null, null, null, null, null, null, false); + context.getSource().getClient().getConnection().getSuggestionsProvider() + .customSuggestion(suggestionsContext) + .whenComplete((suggestions, throwable) -> pendingPackCommands.addAll(suggestions.getList().stream().map(Suggestion::getText).toList())); + return 0; + }) + ) + ) + ) + ); + } +} diff --git a/src/main/java/org/geysermc/packgenerator/PackManager.java b/src/main/java/org/geysermc/packgenerator/PackManager.java index aca6f3b..a5c3aeb 100644 --- a/src/main/java/org/geysermc/packgenerator/PackManager.java +++ b/src/main/java/org/geysermc/packgenerator/PackManager.java @@ -7,6 +7,7 @@ import net.minecraft.world.item.ItemStack; import org.geysermc.packgenerator.pack.BedrockPack; import java.io.IOException; +import java.util.Optional; public final class PackManager { @@ -16,15 +17,15 @@ public final class PackManager { private PackManager() {} - public void startPack(String name) throws CommandSyntaxException, IOException { + public void startPack(String name) throws IOException { if (currentPack != null) { - throw new SimpleCommandExceptionType(Component.literal("Already started a pack (" + currentPack.name() + ")")).create(); + throw new IllegalStateException("Already started a pack (" + currentPack.name() + ")"); } currentPack = new BedrockPack(name); } - public boolean map(ItemStack stack) throws CommandSyntaxException { + public Optional map(ItemStack stack) throws CommandSyntaxException { ensurePackIsCreated(); return currentPack.map(stack); diff --git a/src/main/java/org/geysermc/packgenerator/pack/BedrockPack.java b/src/main/java/org/geysermc/packgenerator/pack/BedrockPack.java index 02041ea..0764811 100644 --- a/src/main/java/org/geysermc/packgenerator/pack/BedrockPack.java +++ b/src/main/java/org/geysermc/packgenerator/pack/BedrockPack.java @@ -13,7 +13,6 @@ import org.geysermc.packgenerator.mapping.geyser.GeyserMappings; import org.geysermc.packgenerator.pack.attachable.BedrockAttachable; import org.jetbrains.annotations.NotNull; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -22,6 +21,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -64,9 +64,9 @@ public class BedrockPack { return name; } - public boolean map(ItemStack stack) { + public Optional map(ItemStack stack) { if (stack.isEmpty()) { - return false; + return Optional.empty(); } AtomicBoolean problems = new AtomicBoolean(); ProblemReporter mapReporter = new ProblemReporter() { @@ -93,7 +93,7 @@ public class BedrockPack { texturesToExport.add(texture); AttachableMapper.mapItem(stack, mapping.bedrockIdentifier(), texturesToExport::add).ifPresent(attachables::add); }); - return problems.get(); + return Optional.of(problems.get()); } public boolean save() {