Decouple armour from the rest of the models system

This commit is contained in:
Sollace 2018-10-12 18:01:23 +02:00
parent 4aaadd1716
commit da5c985148
8 changed files with 28 additions and 22 deletions

View file

@ -1,8 +1,8 @@
package com.minelittlepony.ducks;
import com.minelittlepony.model.AbstractPonyModel;
import com.minelittlepony.model.BodyPart;
import com.minelittlepony.model.ModelWrapper;
import com.minelittlepony.model.capabilities.IModel;
import com.minelittlepony.pony.data.IPony;
import com.minelittlepony.render.RenderPony;
import com.minelittlepony.util.math.MathUtil;
@ -31,7 +31,7 @@ public interface IRenderPony<T extends EntityLivingBase> {
float yaw = MathUtil.interpolateDegress(entity.prevRenderYawOffset, entity.renderYawOffset, ticks);
getModelWrapper().apply(entityPony.getMetadata());
AbstractPonyModel model = getModelWrapper().getBody();
IModel model = getModelWrapper().getBody();
model.transform(BodyPart.BACK);

View file

@ -2,7 +2,6 @@ package com.minelittlepony.model;
import com.minelittlepony.MineLittlePony;
import com.minelittlepony.model.armour.IEquestrianArmor;
import com.minelittlepony.model.armour.PonyArmor;
import com.minelittlepony.model.capabilities.IModelWrapper;
import com.minelittlepony.pony.data.IPonyData;
@ -12,7 +11,8 @@ import com.minelittlepony.pony.data.IPonyData;
public class ModelWrapper implements IModelWrapper {
private final AbstractPonyModel body;
private final PonyArmor armor;
private final IEquestrianArmor<?> armor;
private int lastModelUpdate = 0;
@ -38,7 +38,7 @@ public class ModelWrapper implements IModelWrapper {
/**
* Returns the contained armour model.
*/
public IEquestrianArmor getArmor() {
public IEquestrianArmor<?> getArmor() {
return armor;
}

View file

@ -1,7 +1,12 @@
package com.minelittlepony.model.armour;
public interface IEquestrianArmor {
ModelPonyArmor getArmorForLayer(ArmorLayer layer);
import net.minecraft.client.model.ModelBiped;
import com.minelittlepony.model.capabilities.IModelArmor;
import com.minelittlepony.model.capabilities.IModelWrapper;
public interface IEquestrianArmor<V extends ModelBiped & IModelArmor> extends IModelWrapper {
V getArmorForLayer(ArmorLayer layer);
enum ArmorLayer {
INNER,

View file

@ -1,12 +1,11 @@
package com.minelittlepony.model.armour;
import com.minelittlepony.model.capabilities.IModelWrapper;
import com.minelittlepony.pony.data.IPonyData;
public class PonyArmor implements IModelWrapper, IEquestrianArmor {
public class PonyArmor implements IEquestrianArmor<ModelPonyArmor> {
public ModelPonyArmor outerLayer;
public ModelPonyArmor innerLayer;
private final ModelPonyArmor outerLayer;
private final ModelPonyArmor innerLayer;
public PonyArmor(ModelPonyArmor outer, ModelPonyArmor inner) {
outerLayer = outer;

View file

@ -1,7 +1,7 @@
package com.minelittlepony.model.capabilities;
import com.minelittlepony.model.BodyPart;
import com.minelittlepony.model.armour.PonyArmor;
import com.minelittlepony.model.armour.IEquestrianArmor;
import com.minelittlepony.pony.data.IPonyData;
import com.minelittlepony.pony.data.PonySize;
import com.minelittlepony.pony.data.PonyWearable;
@ -25,7 +25,7 @@ public interface IModel extends ICapitated {
/**
* Returns a new pony armour to go with this model. Called on startup by a model wrapper.
*/
PonyArmor createArmour();
IEquestrianArmor<?> createArmour();
IPonyData getMetadata();

View file

@ -5,7 +5,7 @@ import net.minecraft.inventory.EntityEquipmentSlot;
import com.minelittlepony.model.armour.IEquestrianArmor.ArmorLayer;
public interface IModelArmor extends IModel {
public interface IModelArmor {
/**
* Called to synchronise this model's legs with that of another.
*

View file

@ -5,7 +5,6 @@ import com.minelittlepony.model.ModelWrapper;
import com.minelittlepony.model.armour.IEquestrianArmor;
import com.minelittlepony.model.armour.IEquestrianArmor.ArmorLayer;
import com.minelittlepony.model.armour.IArmorTextureResolver;
import com.minelittlepony.model.armour.ModelPonyArmor;
import com.minelittlepony.model.armour.DefaultPonyArmorTextureResolver;
import com.minelittlepony.model.capabilities.IModelArmor;
import com.minelittlepony.util.render.Color;
@ -50,7 +49,8 @@ public class LayerPonyArmor<T extends EntityLivingBase> extends AbstractPonyLaye
if (!itemstack.isEmpty() && itemstack.getItem() instanceof ItemArmor) {
ModelPonyArmor armour = getArmorModel(entity, itemstack, armorSlot, layer, pony.getArmor().getArmorForLayer(layer));
@SuppressWarnings("unchecked")
V armour = getArmorModel(entity, itemstack, armorSlot, layer, (V)pony.getArmor().getArmorForLayer(layer));
if (armour.prepareToRender(armorSlot, layer)) {
@ -84,15 +84,16 @@ public class LayerPonyArmor<T extends EntityLivingBase> extends AbstractPonyLaye
}
}
private static ModelPonyArmor getArmorModel(EntityLivingBase entity, ItemStack itemstack, EntityEquipmentSlot slot, ArmorLayer layer, ModelPonyArmor def) {
@SuppressWarnings("unchecked")
private static <V extends ModelBiped & IModelArmor> V getArmorModel(EntityLivingBase entity, ItemStack itemstack, EntityEquipmentSlot slot, ArmorLayer layer, V def) {
ModelBase model = ForgeProxy.getArmorModel(entity, itemstack, slot, def);
if (model instanceof ModelPonyArmor) {
return (ModelPonyArmor)model;
if (model instanceof IModelArmor) {
return (V)model;
}
if (model instanceof IEquestrianArmor) {
return ((IEquestrianArmor) model).getArmorForLayer(layer);
return ((IEquestrianArmor<V>) model).getArmorForLayer(layer);
}
return def;

View file

@ -11,6 +11,7 @@ import com.minelittlepony.ducks.IRenderPony;
import com.minelittlepony.model.AbstractPonyModel;
import com.minelittlepony.model.BodyPart;
import com.minelittlepony.model.ModelWrapper;
import com.minelittlepony.model.capabilities.IModel;
import com.minelittlepony.render.skull.PonySkullRenderer;
import com.mojang.authlib.GameProfile;
import net.minecraft.client.Minecraft;
@ -42,13 +43,13 @@ public class LayerPonyCustomHead<T extends EntityLivingBase> implements LayerRen
public void doRenderLayer(T entity, float move, float swing, float partialTicks, float ticks, float headYaw, float headPitch, float scale) {
ItemStack itemstack = entity.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
if (!itemstack.isEmpty()) {
AbstractPonyModel model = getModel().getBody();
IModel model = getModel().getBody();
Item item = itemstack.getItem();
pushMatrix();
model.transform(BodyPart.HEAD);
model.bipedHead.postRender(0.0625f);
model.getHead().postRender(0.0625f);
if (model instanceof AbstractPonyModel) {
translate(0, 0.2F, 0);