package net.minecraft.client.model.geom.builders; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.stream.Collectors; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; @Environment(EnvType.CLIENT) public class PartDefinition { private final List cubes; private final PartPose partPose; private final Map children = Maps.newHashMap(); PartDefinition(List cubes, PartPose partPose) { this.cubes = cubes; this.partPose = partPose; } public PartDefinition addOrReplaceChild(String name, CubeListBuilder cubes, PartPose partPose) { PartDefinition partDefinition = new PartDefinition(cubes.getCubes(), partPose); PartDefinition partDefinition2 = (PartDefinition)this.children.put(name, partDefinition); if (partDefinition2 != null) { partDefinition.children.putAll(partDefinition2.children); } return partDefinition; } public ModelPart bake(int texWidth, int texHeight) { Object2ObjectArrayMap object2ObjectArrayMap = (Object2ObjectArrayMap)this.children .entrySet() .stream() .collect( Collectors.toMap( Entry::getKey, entry -> ((PartDefinition)entry.getValue()).bake(texWidth, texHeight), (modelPartx, modelPart2) -> modelPartx, Object2ObjectArrayMap::new ) ); List list = (List)this.cubes .stream() .map(cubeDefinition -> cubeDefinition.bake(texWidth, texHeight)) .collect(ImmutableList.toImmutableList()); ModelPart modelPart = new ModelPart(list, object2ObjectArrayMap); modelPart.setInitialPose(this.partPose); modelPart.loadPose(this.partPose); return modelPart; } public PartDefinition getChild(String name) { return (PartDefinition)this.children.get(name); } }