diff --git a/src/main/java/org/geysermc/packgenerator/command/PackGeneratorCommand.java b/src/main/java/org/geysermc/packgenerator/command/PackGeneratorCommand.java index ffc511b..4af026a 100644 --- a/src/main/java/org/geysermc/packgenerator/command/PackGeneratorCommand.java +++ b/src/main/java/org/geysermc/packgenerator/command/PackGeneratorCommand.java @@ -11,6 +11,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; import org.geysermc.packgenerator.PackManager; +import org.geysermc.packgenerator.mapper.InventoryMapper; import org.geysermc.packgenerator.mapper.ItemSuggestionProvider; import org.geysermc.packgenerator.mapper.PackMapper; @@ -68,17 +69,33 @@ public class PackGeneratorCommand { }) ) .then(ClientCommandManager.literal("auto") - .then(ClientCommandManager.argument("suggestions", CommandSuggestionsArgumentType.TYPE) + .then(ClientCommandManager.literal("command") + .then(ClientCommandManager.argument("suggestions", CommandSuggestionsArgumentType.TYPE) + .executes(context -> { + Pair> suggestions = CommandSuggestionsArgumentType.getSuggestions(context, "suggestions"); + String baseCommand = suggestions.getFirst(); + suggestions.getSecond().thenAccept(completed -> { + ItemSuggestionProvider provider = new ItemSuggestionProvider(completed.getList().stream() + .map(suggestion -> baseCommand.substring(0, suggestion.getRange().getStart()) + suggestion.getText()) + .toList()); + packMapper.setItemProvider(provider); + context.getSource().sendFeedback(Component.literal("Running " + provider.queueSize() + " commands to obtain custom items to map")); + }); + return 0; + }) + ) + ) + .then(ClientCommandManager.literal("inventory") .executes(context -> { - Pair> suggestions = CommandSuggestionsArgumentType.getSuggestions(context, "suggestions"); - String baseCommand = suggestions.getFirst(); - suggestions.getSecond().thenAccept(completed -> { - ItemSuggestionProvider provider = new ItemSuggestionProvider(completed.getList().stream() - .map(suggestion -> baseCommand.substring(0, suggestion.getRange().getStart()) + suggestion.getText()) - .toList()); - packMapper.setItemProvider(provider); - context.getSource().sendFeedback(Component.literal("Running " + provider.queueSize() + " commands to obtain custom items to map")); - }); + packMapper.setItemProvider(InventoryMapper.INSTANCE); + context.getSource().sendFeedback(Component.literal("Now watching inventories for custom items to map")); + return 0; + }) + ) + .then(ClientCommandManager.literal("stop") + .executes(context -> { + packMapper.setItemProvider(null); + context.getSource().sendFeedback(Component.literal("Stopped automatic mapping of custom items")); return 0; }) ) diff --git a/src/main/java/org/geysermc/packgenerator/mapper/InventoryMapper.java b/src/main/java/org/geysermc/packgenerator/mapper/InventoryMapper.java index 63ceae9..80045e7 100644 --- a/src/main/java/org/geysermc/packgenerator/mapper/InventoryMapper.java +++ b/src/main/java/org/geysermc/packgenerator/mapper/InventoryMapper.java @@ -7,13 +7,13 @@ import net.minecraft.world.item.ItemStack; import java.util.stream.Stream; public class InventoryMapper implements CustomItemProvider { + public static final InventoryMapper INSTANCE = new InventoryMapper(); - public InventoryMapper() { - } + private InventoryMapper() {} @Override public Stream nextItems(LocalPlayer player, ClientPacketListener connection) { - return Stream.empty(); + return player.containerMenu.getItems().stream(); } @Override diff --git a/src/main/java/org/geysermc/packgenerator/mapper/PackMapper.java b/src/main/java/org/geysermc/packgenerator/mapper/PackMapper.java index b9b72d5..63e15cf 100644 --- a/src/main/java/org/geysermc/packgenerator/mapper/PackMapper.java +++ b/src/main/java/org/geysermc/packgenerator/mapper/PackMapper.java @@ -13,8 +13,8 @@ public class PackMapper { private final PackManager packManager; private CustomItemProvider itemProvider; - public PackMapper(PackManager manager) { - this.manager = manager; + public PackMapper(PackManager packManager) { + this.packManager = packManager; } public void setItemProvider(CustomItemProvider itemProvider) { diff --git a/src/main/java/org/geysermc/packgenerator/mapping/geyser/GeyserMappings.java b/src/main/java/org/geysermc/packgenerator/mapping/geyser/GeyserMappings.java index 54c8f4b..8543595 100644 --- a/src/main/java/org/geysermc/packgenerator/mapping/geyser/GeyserMappings.java +++ b/src/main/java/org/geysermc/packgenerator/mapping/geyser/GeyserMappings.java @@ -74,14 +74,7 @@ public class GeyserMappings { return mappings.size(); } - public void map(ItemStack stack, ProblemReporter reporter, Consumer mappingConsumer) { - Optional patchedModel = stack.getComponentsPatch().get(DataComponents.ITEM_MODEL); - //noinspection OptionalAssignedToNull - annoying Mojang - if (patchedModel == null || patchedModel.isEmpty()) { - return; - } - - ResourceLocation model = patchedModel.get(); + public void map(ItemStack stack, ResourceLocation model, ProblemReporter reporter, Consumer mappingConsumer) { String displayName = stack.getHoverName().getString(); int protectionValue = 0; // TODO check the attributes diff --git a/src/main/java/org/geysermc/packgenerator/pack/BedrockPack.java b/src/main/java/org/geysermc/packgenerator/pack/BedrockPack.java index bf98372..de59a20 100644 --- a/src/main/java/org/geysermc/packgenerator/pack/BedrockPack.java +++ b/src/main/java/org/geysermc/packgenerator/pack/BedrockPack.java @@ -72,9 +72,20 @@ public class BedrockPack { } public Optional map(ItemStack stack) { - if (stack.isEmpty() || !modelsMapped.add(stack.get(DataComponents.ITEM_MODEL))) { + if (stack.isEmpty()) { return Optional.empty(); } + + Optional patchedModel = stack.getComponentsPatch().get(DataComponents.ITEM_MODEL); + //noinspection OptionalAssignedToNull - annoying Mojang + if (patchedModel == null || patchedModel.isEmpty()) { + return Optional.empty(); + } + ResourceLocation model = patchedModel.get(); + if (!modelsMapped.add(model)) { + return Optional.empty(); + } + AtomicBoolean problems = new AtomicBoolean(); ProblemReporter mapReporter = new ProblemReporter() { @@ -90,7 +101,7 @@ public class BedrockPack { } }; - mappings.map(stack, mapReporter, mapping -> { + mappings.map(stack, model, mapReporter, mapping -> { // TODO a proper way to get texture from item model itemTextures.withItemTexture(mapping, mapping.bedrockIdentifier().getPath()); ResourceLocation texture = mapping.bedrockIdentifier();