diff --git a/src/main/java/org/geysermc/packgenerator/accessor/SelectItemModelCaseAccessor.java b/src/main/java/org/geysermc/packgenerator/accessor/SelectItemModelCasesAccessor.java similarity index 89% rename from src/main/java/org/geysermc/packgenerator/accessor/SelectItemModelCaseAccessor.java rename to src/main/java/org/geysermc/packgenerator/accessor/SelectItemModelCasesAccessor.java index 5f9853a..596c470 100644 --- a/src/main/java/org/geysermc/packgenerator/accessor/SelectItemModelCaseAccessor.java +++ b/src/main/java/org/geysermc/packgenerator/accessor/SelectItemModelCasesAccessor.java @@ -4,7 +4,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import net.minecraft.client.renderer.item.ItemModel; // Implemented on BlockModelWrapper, since this class doesn't store the cases it has in a nice format, we have to store it manually -public interface SelectItemModelCaseAccessor { +public interface SelectItemModelCasesAccessor { Object2ObjectMap geyser_mappings_generator$getCases(); diff --git a/src/main/java/org/geysermc/packgenerator/mappings/GeyserItemMapper.java b/src/main/java/org/geysermc/packgenerator/mappings/GeyserItemMapper.java index 650e00d..51fced1 100644 --- a/src/main/java/org/geysermc/packgenerator/mappings/GeyserItemMapper.java +++ b/src/main/java/org/geysermc/packgenerator/mappings/GeyserItemMapper.java @@ -1,5 +1,6 @@ package org.geysermc.packgenerator.mappings; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.item.BlockModelWrapper; import net.minecraft.client.renderer.item.ConditionalItemModel; @@ -16,8 +17,13 @@ import net.minecraft.client.renderer.item.properties.select.ContextDimension; import net.minecraft.client.renderer.item.properties.select.SelectItemModelProperty; import net.minecraft.client.renderer.item.properties.select.TrimMaterialProperty; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CrossbowItem; +import net.minecraft.world.item.equipment.trim.TrimMaterial; +import net.minecraft.world.level.Level; import org.geysermc.packgenerator.accessor.BlockModelWrapperLocationAccessor; +import org.geysermc.packgenerator.accessor.SelectItemModelCasesAccessor; import org.geysermc.packgenerator.mappings.predicate.GeyserConditionPredicate; import org.geysermc.packgenerator.mappings.predicate.GeyserMatchPredicate; import org.geysermc.packgenerator.mappings.predicate.GeyserPredicate; @@ -47,7 +53,7 @@ public class GeyserItemMapper { return mapConditionalModel(conditional, context); } case SelectItemModel select -> { - return Stream.of(); + return mapSelectModel(select, context); } default -> {} } @@ -78,11 +84,21 @@ public class GeyserItemMapper { //noinspection unchecked SelectItemModelProperty property = ((SelectItemModelAccessor) model).getProperty(); Function dataConstructor = switch (property) { - case Charge ignored -> t -> new GeyserMatchPredicate.ChargeType(t); - case TrimMaterialProperty trimMaterial -> ; - case ContextDimension contextDimension -> ; - case net.minecraft.client.renderer.item.properties.select.CustomModelDataProperty customModelData -> ; // Why, Mojang? - } + case Charge ignored -> chargeType -> new GeyserMatchPredicate.ChargeType((CrossbowItem.ChargeType) chargeType); + case TrimMaterialProperty ignored -> material -> new GeyserMatchPredicate.TrimMaterialData((ResourceKey) material); + case ContextDimension ignored -> dimension -> new GeyserMatchPredicate.ContextDimension((ResourceKey) dimension); + // Why, Mojang? + case net.minecraft.client.renderer.item.properties.select.CustomModelDataProperty customModelData -> string -> new GeyserMatchPredicate.CustomModelData((String) string, customModelData.index()); + default -> throw new UnsupportedOperationException("Unsupported select model property " + property.getClass()); + }; + + //noinspection unchecked + Object2ObjectMap cases = ((SelectItemModelCasesAccessor) model).geyser_mappings_generator$getCases(); + return Stream.concat( + cases.entrySet().stream() + .flatMap(caze -> mapItem(caze.getValue(), context.with(new GeyserMatchPredicate(dataConstructor.apply(caze.getKey()))))), + mapItem(cases.defaultReturnValue(), context) + ); } private record MappingContext(List predicateStack, ResourceLocation model, String displayName, int protectionValue, DataComponentPatch componentPatch) { diff --git a/src/main/java/org/geysermc/packgenerator/mappings/predicate/GeyserMatchPredicate.java b/src/main/java/org/geysermc/packgenerator/mappings/predicate/GeyserMatchPredicate.java index fbbf2e4..ed61075 100644 --- a/src/main/java/org/geysermc/packgenerator/mappings/predicate/GeyserMatchPredicate.java +++ b/src/main/java/org/geysermc/packgenerator/mappings/predicate/GeyserMatchPredicate.java @@ -3,10 +3,13 @@ package org.geysermc.packgenerator.mappings.predicate; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.util.ExtraCodecs; import net.minecraft.util.StringRepresentable; import net.minecraft.world.item.CrossbowItem; +import net.minecraft.world.item.equipment.trim.TrimMaterial; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import java.util.function.Function; @@ -28,7 +31,7 @@ public record GeyserMatchPredicate(MatchPredicateData data) implements GeyserPre enum Type implements StringRepresentable { CHARGE_TYPE("charge_type", ChargeType.CODEC), - TRIM_MATERIAL("trim_material", TrimMaterial.CODEC), + TRIM_MATERIAL("trim_material", TrimMaterialData.CODEC), CONTEXT_DIMENSION("context_dimension", ContextDimension.CODEC), CUSTOM_MODEL_DATA("custom_model_data", CustomModelData.CODEC); @@ -62,9 +65,8 @@ public record GeyserMatchPredicate(MatchPredicateData data) implements GeyserPre } } - // TODO might change into ResourceKey? - public record TrimMaterial(ResourceLocation material) implements MatchPredicateData { - public static final MapCodec CODEC = simpleCodec(ResourceLocation.CODEC, TrimMaterial::material, TrimMaterial::new); + public record TrimMaterialData(ResourceKey material) implements MatchPredicateData { + public static final MapCodec CODEC = simpleCodec(ResourceKey.codec(Registries.TRIM_MATERIAL), TrimMaterialData::material, TrimMaterialData::new); @Override public Type type() { @@ -72,9 +74,8 @@ public record GeyserMatchPredicate(MatchPredicateData data) implements GeyserPre } } - // TODO might change into ResourceKey? - public record ContextDimension(ResourceLocation dimension) implements MatchPredicateData { - public static final MapCodec CODEC = simpleCodec(ResourceLocation.CODEC, ContextDimension::dimension, ContextDimension::new); + public record ContextDimension(ResourceKey level) implements MatchPredicateData { + public static final MapCodec CODEC = simpleCodec(ResourceKey.codec(Registries.DIMENSION), ContextDimension::level, ContextDimension::new); @Override public Type type() { diff --git a/src/main/java/org/geysermc/packgenerator/mixin/SelectItemModelMixin.java b/src/main/java/org/geysermc/packgenerator/mixin/SelectItemModelMixin.java index e326ae1..2e36ffc 100644 --- a/src/main/java/org/geysermc/packgenerator/mixin/SelectItemModelMixin.java +++ b/src/main/java/org/geysermc/packgenerator/mixin/SelectItemModelMixin.java @@ -5,7 +5,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import net.minecraft.client.renderer.item.ItemModel; import net.minecraft.client.renderer.item.SelectItemModel; import net.minecraft.client.renderer.item.properties.select.SelectItemModelProperty; -import org.geysermc.packgenerator.accessor.SelectItemModelCaseAccessor; +import org.geysermc.packgenerator.accessor.SelectItemModelCasesAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(SelectItemModel.class) -public abstract class SelectItemModelMixin implements ItemModel, SelectItemModelCaseAccessor { +public abstract class SelectItemModelMixin implements ItemModel, SelectItemModelCasesAccessor { @Unique private Object2ObjectMap cases; @@ -35,7 +35,7 @@ public abstract class SelectItemModelMixin implements ItemModel, SelectItemMo public void setCases(BakingContext bakingContext, ItemModel model, CallbackInfoReturnable callbackInfoReturnable, @Local Object2ObjectMap cases) { //noinspection unchecked - ((SelectItemModelCaseAccessor) callbackInfoReturnable.getReturnValue()).geyser_mappings_generator$setCases(cases); + ((SelectItemModelCasesAccessor) callbackInfoReturnable.getReturnValue()).geyser_mappings_generator$setCases(cases); } } }