Minorly improved armour rendering

This commit is contained in:
Sollace 2019-11-30 18:49:55 +02:00
parent c02a46aa7d
commit c51fea4a87
5 changed files with 71 additions and 7 deletions

View file

@ -51,6 +51,9 @@ public final class MobRenderers {
public static final MobRenderers ENDERMAN = register("endermen", (state, pony) -> { public static final MobRenderers ENDERMAN = register("endermen", (state, pony) -> {
pony.switchRenderer(state, EntityType.ENDERMAN, EnderStallionRenderer::new); pony.switchRenderer(state, EntityType.ENDERMAN, EnderStallionRenderer::new);
}); });
public static final MobRenderers INANIMATE = register("inanimates", (state, pony) -> {
pony.switchRenderer(state, EntityType.ARMOR_STAND, PonyStandRenderer::new);
});
private final BiConsumer<Boolean, PonyRenderDispatcher> changer; private final BiConsumer<Boolean, PonyRenderDispatcher> changer;

View file

@ -4,8 +4,8 @@ import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import com.minelittlepony.client.model.PonySkullModel; import com.minelittlepony.client.model.PonySkullModel;
import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.client.render.blockentity.skull.PonySkullRenderer.ISkull; import com.minelittlepony.client.render.blockentity.skull.PonySkullRenderer.ISkull;
import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.pony.IPony; import com.minelittlepony.pony.IPony;
public abstract class AbstractPonySkull implements ISkull { public abstract class AbstractPonySkull implements ISkull {

View file

@ -0,0 +1,62 @@
package com.minelittlepony.client.render.entity;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.ArmorStandEntityRenderer;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.feature.ArmorBipedFeatureRenderer;
import net.minecraft.client.render.entity.feature.ElytraFeatureRenderer;
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
import net.minecraft.client.render.entity.feature.HeadFeatureRenderer;
import net.minecraft.client.render.entity.feature.HeldItemFeatureRenderer;
import net.minecraft.client.render.entity.model.ArmorStandArmorEntityModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.decoration.ArmorStandEntity;
import com.minelittlepony.client.model.ModelType;
import com.minelittlepony.client.model.ModelWrapper;
import com.minelittlepony.client.model.entity.race.EarthPonyModel;
import com.minelittlepony.client.pony.PonyData;
import com.minelittlepony.client.render.entity.feature.ArmourFeature;
import com.minelittlepony.model.armour.ArmourLayer;
import com.minelittlepony.pony.meta.Race;
public class PonyStandRenderer extends ArmorStandEntityRenderer {
public PonyStandRenderer(EntityRenderDispatcher entityRenderDispatcher) {
super(entityRenderDispatcher);
features.clear();
addFeature(new Armour(this));
addFeature(new HeldItemFeatureRenderer<>(this));
addFeature(new ElytraFeatureRenderer<>(this));
addFeature(new HeadFeatureRenderer<>(this));
}
class Armour extends ArmorBipedFeatureRenderer<ArmorStandEntity, ArmorStandArmorEntityModel, ArmorStandArmorEntityModel> {
private final ModelWrapper<ArmorStandEntity, EarthPonyModel<ArmorStandEntity>> pony = new ModelWrapper<>(ModelType.EARTH_PONY.getKey(false));
public Armour(FeatureRendererContext<ArmorStandEntity, ArmorStandArmorEntityModel> context) {
super(context, new ArmorStandArmorEntityModel(0.5F), new ArmorStandArmorEntityModel(1));
pony.apply(new PonyData(Race.EARTH));
}
@Override
public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, ArmorStandEntity entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) {
if (entity.hasCustomName() && "Ponita".equals(entity.getCustomName().asString())) {
pony.getBody().setAngles(entity, limbDistance, limbAngle, tickDelta, headYaw, headPitch);
for (EquipmentSlot i : EquipmentSlot.values()) {
if (i.getType() == EquipmentSlot.Type.ARMOR) {
ArmourFeature.renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.INNER);
ArmourFeature.renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.OUTER);
}
}
} else {
super.render(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch);
}
}
}
}

View file

@ -31,26 +31,24 @@ public class ArmourFeature<T extends LivingEntity, M extends EntityModel<T> & IP
private static final IArmourTextureResolver<LivingEntity> textures = new DefaultArmourTextureResolver<>(); private static final IArmourTextureResolver<LivingEntity> textures = new DefaultArmourTextureResolver<>();
private ModelWrapper<T, M> pony;
public ArmourFeature(IPonyRenderContext<T, M> renderer) { public ArmourFeature(IPonyRenderContext<T, M> renderer) {
super(renderer); super(renderer);
} }
@Override @Override
public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) {
pony = getContext().getModelWrapper(); ModelWrapper<T, M> pony = getContext().getModelWrapper();
for (EquipmentSlot i : EquipmentSlot.values()) { for (EquipmentSlot i : EquipmentSlot.values()) {
if (i.getType() == EquipmentSlot.Type.ARMOR) { if (i.getType() == EquipmentSlot.Type.ARMOR) {
renderArmor(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.INNER); renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.INNER);
renderArmor(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.OUTER); renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.OUTER);
} }
} }
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <V extends BipedEntityModel<T> & IArmour> void renderArmor(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch, EquipmentSlot armorSlot, ArmourLayer layer) { public static <T extends LivingEntity, V extends BipedEntityModel<T> & IArmour> void renderArmor(ModelWrapper<T, ? extends IPonyModel<T>> pony, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch, EquipmentSlot armorSlot, ArmourLayer layer) {
ItemStack itemstack = entity.getEquippedStack(armorSlot); ItemStack itemstack = entity.getEquippedStack(armorSlot);
if (!itemstack.isEmpty() && itemstack.getItem() instanceof ArmorItem) { if (!itemstack.isEmpty() && itemstack.getItem() instanceof ArmorItem) {

View file

@ -22,6 +22,7 @@
"minelp.mobs.illagers": "Ponify Illagers", "minelp.mobs.illagers": "Ponify Illagers",
"minelp.mobs.guardians": "Ponify Guardians", "minelp.mobs.guardians": "Ponify Guardians",
"minelp.mobs.endermen": "Ponify Endermen", "minelp.mobs.endermen": "Ponify Endermen",
"minelp.mobs.inanimates": "Ponify Objects",
"minelp.mode.dry": "Land pony", "minelp.mode.dry": "Land pony",
"minelp.mode.wet": "Sea pony", "minelp.mode.wet": "Sea pony",
"minelp.debug.reload_models.message": "Reloading pony models...", "minelp.debug.reload_models.message": "Reloading pony models...",