diff --git a/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java b/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java index a8627cd..31ab1e1 100644 --- a/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java +++ b/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java @@ -24,6 +24,7 @@ import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; import net.minecraft.util.ProblemReporter; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -65,6 +66,9 @@ public class BedrockItemMapper { private static final List HANDHELD_MODELS = Stream.of("item/handheld", "item/handheld_rod", "item/handheld_mace") .map(ResourceLocation::withDefaultNamespace) .toList(); + private static final List TRIMMABLE_ARMOR_TAGS = Stream.of("is_armor", "trimmable_armors") + .map(ResourceLocation::withDefaultNamespace) + .toList(); public static void tryMapStack(ItemStack stack, ResourceLocation modelLocation, ProblemReporter reporter, PackContext context) { ItemModel model = Minecraft.getInstance().getModelManager().getItemModel(modelLocation); @@ -217,8 +221,16 @@ public class BedrockItemMapper { public void create(ResourceLocation bedrockIdentifier, ResourceLocation texture, boolean displayHandheld, Optional customModel) { + List tags; + if (stack.is(ItemTags.TRIMMABLE_ARMOR)) { + tags = TRIMMABLE_ARMOR_TAGS; + } else { + tags = List.of(); + } + GeyserBaseDefinition base = new GeyserBaseDefinition(bedrockIdentifier, Optional.of(stack.getHoverName().getString()), predicateStack, - new GeyserBaseDefinition.BedrockOptions(Optional.empty(), true, displayHandheld, calculateProtectionValue(stack)), stack.getComponentsPatch()); + new GeyserBaseDefinition.BedrockOptions(Optional.empty(), true, displayHandheld, calculateProtectionValue(stack), tags), + stack.getComponentsPatch()); try { packContext.mappings().map(stack.getItemHolder(), definitionCreator.apply(base)); } catch (Exception exception) { diff --git a/src/main/java/org/geysermc/rainbow/mapping/geyser/GeyserBaseDefinition.java b/src/main/java/org/geysermc/rainbow/mapping/geyser/GeyserBaseDefinition.java index b74cbe8..f00522c 100644 --- a/src/main/java/org/geysermc/rainbow/mapping/geyser/GeyserBaseDefinition.java +++ b/src/main/java/org/geysermc/rainbow/mapping/geyser/GeyserBaseDefinition.java @@ -64,15 +64,16 @@ public record GeyserBaseDefinition(ResourceLocation bedrockIdentifier, Optional< return bedrockOptions.icon.orElse(Rainbow.fileSafeResourceLocation(bedrockIdentifier)); } - public record BedrockOptions(Optional icon, boolean allowOffhand, boolean displayHandheld, int protectionValue) { + public record BedrockOptions(Optional icon, boolean allowOffhand, boolean displayHandheld, int protectionValue, List tags) { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.STRING.optionalFieldOf("icon").forGetter(BedrockOptions::icon), Codec.BOOL.optionalFieldOf("allow_offhand", true).forGetter(BedrockOptions::allowOffhand), Codec.BOOL.optionalFieldOf("display_handheld", false).forGetter(BedrockOptions::displayHandheld), - Codec.INT.optionalFieldOf("protection_value", 0).forGetter(BedrockOptions::protectionValue) + Codec.INT.optionalFieldOf("protection_value", 0).forGetter(BedrockOptions::protectionValue), + ResourceLocation.CODEC.listOf().optionalFieldOf("tags", List.of()).forGetter(BedrockOptions::tags) ).apply(instance, BedrockOptions::new) ); - public static final BedrockOptions DEFAULT = new BedrockOptions(Optional.empty(), true, false, 0); + public static final BedrockOptions DEFAULT = new BedrockOptions(Optional.empty(), true, false, 0, List.of()); } }