minecraft-src/net/minecraft/world/item/equipment/trim/MaterialAssetGroup.java
2025-07-04 03:45:38 +03:00

74 lines
3.8 KiB
Java

package net.minecraft.world.item.equipment.trim;
import com.google.common.collect.Maps;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import io.netty.buffer.ByteBuf;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import java.util.Map;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.ExtraCodecs;
import net.minecraft.world.item.equipment.EquipmentAsset;
import net.minecraft.world.item.equipment.EquipmentAssets;
public record MaterialAssetGroup(MaterialAssetGroup.AssetInfo base, Map<ResourceKey<EquipmentAsset>, MaterialAssetGroup.AssetInfo> overrides) {
public static final String SEPARATOR = "_";
public static final MapCodec<MaterialAssetGroup> MAP_CODEC = RecordCodecBuilder.mapCodec(
instance -> instance.group(
MaterialAssetGroup.AssetInfo.CODEC.fieldOf("asset_name").forGetter(MaterialAssetGroup::base),
Codec.unboundedMap(ResourceKey.codec(EquipmentAssets.ROOT_ID), MaterialAssetGroup.AssetInfo.CODEC)
.optionalFieldOf("override_armor_assets", Map.of())
.forGetter(MaterialAssetGroup::overrides)
)
.apply(instance, MaterialAssetGroup::new)
);
public static final StreamCodec<ByteBuf, MaterialAssetGroup> STREAM_CODEC = StreamCodec.composite(
MaterialAssetGroup.AssetInfo.STREAM_CODEC,
MaterialAssetGroup::base,
ByteBufCodecs.map(Object2ObjectOpenHashMap::new, ResourceKey.streamCodec(EquipmentAssets.ROOT_ID), MaterialAssetGroup.AssetInfo.STREAM_CODEC),
MaterialAssetGroup::overrides,
MaterialAssetGroup::new
);
public static final MaterialAssetGroup QUARTZ = create("quartz");
public static final MaterialAssetGroup IRON = create("iron", Map.of(EquipmentAssets.IRON, "iron_darker"));
public static final MaterialAssetGroup NETHERITE = create("netherite", Map.of(EquipmentAssets.NETHERITE, "netherite_darker"));
public static final MaterialAssetGroup REDSTONE = create("redstone");
public static final MaterialAssetGroup COPPER = create("copper");
public static final MaterialAssetGroup GOLD = create("gold", Map.of(EquipmentAssets.GOLD, "gold_darker"));
public static final MaterialAssetGroup EMERALD = create("emerald");
public static final MaterialAssetGroup DIAMOND = create("diamond", Map.of(EquipmentAssets.DIAMOND, "diamond_darker"));
public static final MaterialAssetGroup LAPIS = create("lapis");
public static final MaterialAssetGroup AMETHYST = create("amethyst");
public static final MaterialAssetGroup RESIN = create("resin");
public static MaterialAssetGroup create(String name) {
return new MaterialAssetGroup(new MaterialAssetGroup.AssetInfo(name), Map.of());
}
public static MaterialAssetGroup create(String name, Map<ResourceKey<EquipmentAsset>, String> overrides) {
return new MaterialAssetGroup(new MaterialAssetGroup.AssetInfo(name), Map.copyOf(Maps.transformValues(overrides, MaterialAssetGroup.AssetInfo::new)));
}
public MaterialAssetGroup.AssetInfo assetId(ResourceKey<EquipmentAsset> assetKey) {
return (MaterialAssetGroup.AssetInfo)this.overrides.getOrDefault(assetKey, this.base);
}
public record AssetInfo(String suffix) {
public static final Codec<MaterialAssetGroup.AssetInfo> CODEC = ExtraCodecs.RESOURCE_PATH_CODEC
.xmap(MaterialAssetGroup.AssetInfo::new, MaterialAssetGroup.AssetInfo::suffix);
public static final StreamCodec<ByteBuf, MaterialAssetGroup.AssetInfo> STREAM_CODEC = ByteBufCodecs.STRING_UTF8
.map(MaterialAssetGroup.AssetInfo::new, MaterialAssetGroup.AssetInfo::suffix);
public AssetInfo(String suffix) {
if (!ResourceLocation.isValidPath(suffix)) {
throw new IllegalArgumentException("Invalid string to use as a resource path element: " + suffix);
} else {
this.suffix = suffix;
}
}
}
}