diff --git a/src/main/java/com/minelittlepony/ducks/IRenderPony.java b/src/main/java/com/minelittlepony/ducks/IRenderPony.java index 64e55055..37e23ffd 100644 --- a/src/main/java/com/minelittlepony/ducks/IRenderPony.java +++ b/src/main/java/com/minelittlepony/ducks/IRenderPony.java @@ -10,7 +10,7 @@ public interface IRenderPony { /** * Gets the wrapped pony model for this renderer. */ - ModelWrapper getPlayerModel(); + ModelWrapper getModelWrapper(); /** * Gets the current shadow size for rendering. diff --git a/src/main/java/com/minelittlepony/hdskins/gui/RenderPonyModel.java b/src/main/java/com/minelittlepony/hdskins/gui/RenderPonyModel.java index 38e8fed9..07f90a64 100644 --- a/src/main/java/com/minelittlepony/hdskins/gui/RenderPonyModel.java +++ b/src/main/java/com/minelittlepony/hdskins/gui/RenderPonyModel.java @@ -53,7 +53,7 @@ public class RenderPonyModel extends RenderPlayerModel { renderingAsHuman = false; - return pm.getModel(); + return pm.getBody(); } @Override diff --git a/src/main/java/com/minelittlepony/model/ModelWrapper.java b/src/main/java/com/minelittlepony/model/ModelWrapper.java index eceaa90a..24993704 100644 --- a/src/main/java/com/minelittlepony/model/ModelWrapper.java +++ b/src/main/java/com/minelittlepony/model/ModelWrapper.java @@ -9,20 +9,20 @@ import com.minelittlepony.pony.data.IPonyData; */ public class ModelWrapper implements IModelWrapper { - private final AbstractPonyModel model; + private final AbstractPonyModel body; private final PonyArmor armor; /** * Created a new model wrapper to contain the given pony. */ public ModelWrapper(AbstractPonyModel model) { - this.model = model; + this.body = model; armor = model.createArmour(); armor.apply(model.metadata); } - public AbstractPonyModel getModel() { - return model; + public AbstractPonyModel getBody() { + return body; } /** @@ -34,12 +34,12 @@ public class ModelWrapper implements IModelWrapper { } public void apply(IPonyData meta) { - model.metadata = meta; + body.metadata = meta; armor.apply(meta); } public void init() { - model.init(0, 0); + body.init(0, 0); armor.init(); } } diff --git a/src/main/java/com/minelittlepony/model/components/PonySnout.java b/src/main/java/com/minelittlepony/model/components/PonySnout.java index 785eb33d..e77110f0 100644 --- a/src/main/java/com/minelittlepony/model/components/PonySnout.java +++ b/src/main/java/com/minelittlepony/model/components/PonySnout.java @@ -3,10 +3,12 @@ package com.minelittlepony.model.components; import com.minelittlepony.pony.data.PonyGender; import com.minelittlepony.render.plane.PlaneRenderer; +import net.minecraft.client.model.ModelBase; + import static com.minelittlepony.model.PonyModelConstants.*; import com.minelittlepony.MineLittlePony; -import com.minelittlepony.model.AbstractPonyModel; +import com.minelittlepony.model.capabilities.ICapitated; public class PonySnout { @@ -15,12 +17,12 @@ public class PonySnout { private PlaneRenderer mare; private PlaneRenderer stallion; - public PonySnout(AbstractPonyModel pony) { + public PonySnout(T pony) { mare = new PlaneRenderer(pony); stallion = new PlaneRenderer(pony); - pony.bipedHead.addChild(stallion); - pony.bipedHead.addChild(mare); + pony.getHead().addChild(stallion); + pony.getHead().addChild(mare); } public void rotate(float x, float y, float z) { diff --git a/src/main/java/com/minelittlepony/model/components/UnicornHorn.java b/src/main/java/com/minelittlepony/model/components/UnicornHorn.java index 4211beb7..9d105800 100644 --- a/src/main/java/com/minelittlepony/model/components/UnicornHorn.java +++ b/src/main/java/com/minelittlepony/model/components/UnicornHorn.java @@ -1,9 +1,11 @@ package com.minelittlepony.model.components; -import com.minelittlepony.model.AbstractPonyModel; +import com.minelittlepony.model.capabilities.ICapitated; import com.minelittlepony.render.HornGlowRenderer; import com.minelittlepony.render.PonyRenderer; +import net.minecraft.client.model.ModelBase; + import static org.lwjgl.opengl.GL11.*; import static net.minecraft.client.renderer.GlStateManager.*; import static com.minelittlepony.model.PonyModelConstants.*; @@ -13,7 +15,7 @@ public class UnicornHorn { private PonyRenderer horn; private HornGlowRenderer glow; - public UnicornHorn(AbstractPonyModel pony, float yOffset, float stretch) { + public UnicornHorn(T pony, float yOffset, float stretch) { horn = new PonyRenderer(pony, 0, 3); glow = new HornGlowRenderer(pony, 0, 3); diff --git a/src/main/java/com/minelittlepony/render/PonySkullRenderer.java b/src/main/java/com/minelittlepony/render/PonySkullRenderer.java index d7e2a7b6..625e96cc 100644 --- a/src/main/java/com/minelittlepony/render/PonySkullRenderer.java +++ b/src/main/java/com/minelittlepony/render/PonySkullRenderer.java @@ -1,39 +1,45 @@ package com.minelittlepony.render; -import java.io.IOException; +import java.util.Map; + import javax.annotation.Nullable; -import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.minelittlepony.MineLittlePony; import com.minelittlepony.PonyConfig; +import com.minelittlepony.ducks.IRenderItem; import com.minelittlepony.model.components.ModelPonyHead; import com.minelittlepony.pony.data.Pony; +import com.minelittlepony.render.ponies.RenderPonySkeleton; +import com.minelittlepony.render.ponies.RenderPonyZombie; import com.mojang.authlib.GameProfile; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; +import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; + import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.GlStateManager.DestFactor; +import net.minecraft.client.renderer.GlStateManager.SourceFactor; import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.client.resources.DefaultPlayerSkin; import net.minecraft.entity.Entity; -import net.minecraft.tileentity.TileEntitySkull; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -@Mixin(TileEntitySkullRenderer.class) -public abstract class PonySkullRenderer extends TileEntitySpecialRenderer { +public class PonySkullRenderer extends TileEntitySkullRenderer implements IRenderItem { private final ModelPonyHead ponyHead = new ModelPonyHead(); private boolean renderAsPony = false; - @Inject(method = "renderSkull(FFFLnet/minecraft/util/EnumFacing;FILcom/mojang/authlib/GameProfile;IF)V", - at = @At("HEAD")) - private void onRenderSkull(float x, float y, float z, EnumFacing facing, float rotationIn, int skullType, @Nullable GameProfile profile, int destroyStage, float animateTicks, CallbackInfo info) { + protected boolean transparency = false; + public void renderSkull(float x, float y, float z, EnumFacing facing, float rotationIn, int skullType, @Nullable GameProfile profile, int destroyStage, float animateTicks, CallbackInfo info) { PonyConfig config = MineLittlePony.getConfig(); switch (skullType) @@ -53,6 +59,97 @@ public abstract class PonySkullRenderer extends TileEntitySpecialRenderer map = minecraft.getSkinManager().loadSkinFromCache(profile); + + if (map.containsKey(Type.SKIN)) { + return minecraft.getSkinManager().loadSkin(map.get(Type.SKIN), Type.SKIN); + } else { + return DefaultPlayerSkin.getDefaultSkin(EntityPlayer.getUUID(profile)); + } + } + + return DefaultPlayerSkin.getDefaultSkinLegacy(); + } + + return RenderPonyZombie.ZOMBIE; + } + + public void renderPonySkull(float x, float y, float z, EnumFacing facing, float rotationIn, int skullType, @Nullable GameProfile profile, int destroyStage, float animateTicks) { + if (destroyStage >= 0) { + bindTexture(DESTROY_STAGES[destroyStage]); + GlStateManager.matrixMode(5890); + GlStateManager.pushMatrix(); + GlStateManager.scale(4.0F, 2.0F, 1.0F); + GlStateManager.translate(0.0625F, 0.0625F, 0.0625F); + GlStateManager.matrixMode(5888); + } else { + bindTexture(getSkinResource(profile, skullType)); + } + + GlStateManager.pushMatrix(); + GlStateManager.disableCull(); + + switch (facing) { + case UP: + GlStateManager.translate(x + 0.5F, y, z + 0.5F); + break; + case NORTH: + GlStateManager.translate(x + 0.5F, y + 0.25F, z + 0.74F); + break; + case SOUTH: + GlStateManager.translate(x + 0.5F, y + 0.25F, z + 0.26F); + rotationIn = 180.0F; + break; + case WEST: + GlStateManager.translate(x + 0.74F, y + 0.25F, z + 0.5F); + rotationIn = 270.0F; + break; + case EAST: + default: + GlStateManager.translate(x + 0.26F, y + 0.25F, z + 0.5F); + rotationIn = 90.0F; + } + + GlStateManager.enableRescaleNormal(); + GlStateManager.scale(-1, -1, 1); + GlStateManager.enableAlpha(); + + if (skullType == 3) { + if (transparency) { + GlStateManager.tryBlendFuncSeparate(SourceFactor.CONSTANT_COLOR, DestFactor.ONE, SourceFactor.ONE, DestFactor.ZERO); + } else { + GlStateManager.enableBlendProfile(GlStateManager.Profile.PLAYER_SKIN); + } + } + + ponyHead.render((Entity)null, animateTicks, 0, 0, rotationIn, 0, 0.0625F); + GlStateManager.popMatrix(); + + if (destroyStage >= 0) { + GlStateManager.matrixMode(5890); + GlStateManager.popMatrix(); + GlStateManager.matrixMode(5888); + } } @Redirect(method = "renderSkull(FFFLnet/minecraft/util/EnumFacing;FILcom/mojang/authlib/GameProfile;IF)V", @@ -66,30 +163,14 @@ public abstract class PonySkullRenderer extends TileEntitySpecialRenderer extends RenderLiving private Pony pony; public RenderPonyMob(RenderManager manager, ModelWrapper model) { - super(manager, model.getModel(), 0.5F); + super(manager, model.getBody(), 0.5F); playerModel = model; - ponyModel = playerModel.getModel(); + ponyModel = playerModel.getBody(); addLayers(); } @@ -96,7 +96,7 @@ public abstract class RenderPonyMob extends RenderLiving } @Override - public ModelWrapper getPlayerModel() { + public ModelWrapper getModelWrapper() { return playerModel; } diff --git a/src/main/java/com/minelittlepony/render/layer/AbstractPonyLayer.java b/src/main/java/com/minelittlepony/render/layer/AbstractPonyLayer.java index b895aace..4700328b 100644 --- a/src/main/java/com/minelittlepony/render/layer/AbstractPonyLayer.java +++ b/src/main/java/com/minelittlepony/render/layer/AbstractPonyLayer.java @@ -43,7 +43,7 @@ public abstract class AbstractPonyLayer implements L } public AbstractPonyModel getPlayerModel() { - return ((IRenderPony) getRenderer()).getPlayerModel().getModel(); + return ((IRenderPony) getRenderer()).getModelWrapper().getBody(); } @SuppressWarnings("unchecked") diff --git a/src/main/java/com/minelittlepony/render/layer/LayerPonyArmor.java b/src/main/java/com/minelittlepony/render/layer/LayerPonyArmor.java index e609ca13..44678c81 100644 --- a/src/main/java/com/minelittlepony/render/layer/LayerPonyArmor.java +++ b/src/main/java/com/minelittlepony/render/layer/LayerPonyArmor.java @@ -40,7 +40,7 @@ public class LayerPonyArmor extends AbstractPonyLaye @Override public void doPonyRender(T entity, float move, float swing, float partialTicks, float ticks, float headYaw, float headPitch, float scale) { - pony = ((IRenderPony) getRenderer()).getPlayerModel(); + pony = ((IRenderPony) getRenderer()).getModelWrapper(); for (EntityEquipmentSlot i : EntityEquipmentSlot.values()) { if (i.getSlotType() == Type.ARMOR) { @@ -57,9 +57,9 @@ public class LayerPonyArmor extends AbstractPonyLaye ItemArmor itemarmor = (ItemArmor) itemstack.getItem(); ModelPonyArmor armour = getArmorModel(entity, itemstack, armorSlot, pony.getArmor().getArmorForSlot(armorSlot)); - armour.setModelAttributes(pony.getModel()); + armour.setModelAttributes(pony.getBody()); armour.setRotationAngles(move, swing, ticks, headYaw, headPitch, scale, entity); - armour.synchroniseLegs(pony.getModel()); + armour.synchroniseLegs(pony.getBody()); Tuple armors = getArmorTexture(entity, itemstack, armorSlot, null); prepareToRender(armour, armorSlot, armors.getSecond()); diff --git a/src/main/java/com/minelittlepony/render/layer/LayerPonyCape.java b/src/main/java/com/minelittlepony/render/layer/LayerPonyCape.java index 88161fc6..cf14579e 100644 --- a/src/main/java/com/minelittlepony/render/layer/LayerPonyCape.java +++ b/src/main/java/com/minelittlepony/render/layer/LayerPonyCape.java @@ -24,16 +24,16 @@ public class LayerPonyCape extends AbstractPonyLayer { @Override public void doPonyRender(@Nonnull AbstractClientPlayer player, float move, float swing, float partialTicks, float ticks, float headYaw, float headPitch, float scale) { - ModelWrapper model = ((IRenderPony) getRenderer()).getPlayerModel(); + ModelWrapper model = ((IRenderPony) getRenderer()).getModelWrapper(); if (player.hasPlayerInfo() && !player.isInvisible() && player.isWearing(EnumPlayerModelParts.CAPE) && player.getLocationCape() != null && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() != Items.ELYTRA) { pushMatrix(); - model.getModel().transform(BodyPart.BODY); + model.getBody().transform(BodyPart.BODY); translate(0, 0.24F, 0); - model.getModel().bipedBody.postRender(scale); + model.getBody().bipedBody.postRender(scale); double capeX = player.prevChasingPosX + (player.chasingPosX - player.prevChasingPosX) * scale - (player.prevPosX + (player.posX - player.prevPosX) * scale); double capeY = player.prevChasingPosY + (player.chasingPosY - player.prevChasingPosY) * scale - (player.prevPosY + (player.posY - player.prevPosY) * scale); @@ -64,7 +64,7 @@ public class LayerPonyCape extends AbstractPonyLayer { rotate(180, 0, 0, 1); rotate(90, 1, 0, 0); getRenderer().bindTexture(player.getLocationCape()); - model.getModel().renderCape(0.0625F); + model.getBody().renderCape(0.0625F); popMatrix(); } } diff --git a/src/main/java/com/minelittlepony/render/layer/LayerPonyCustomHead.java b/src/main/java/com/minelittlepony/render/layer/LayerPonyCustomHead.java index fe3bb952..545c50d2 100644 --- a/src/main/java/com/minelittlepony/render/layer/LayerPonyCustomHead.java +++ b/src/main/java/com/minelittlepony/render/layer/LayerPonyCustomHead.java @@ -103,7 +103,7 @@ public class LayerPonyCustomHead implements LayerRen } private ModelWrapper getModel() { - return ((IRenderPony) renderer).getModelWrapper(); + return ((IRenderPony) renderer).getModelWrapper(); } @Override diff --git a/src/main/java/com/minelittlepony/render/player/RenderPonyBase.java b/src/main/java/com/minelittlepony/render/player/RenderPonyBase.java index 74e9bc14..c0a0485e 100644 --- a/src/main/java/com/minelittlepony/render/player/RenderPonyBase.java +++ b/src/main/java/com/minelittlepony/render/player/RenderPonyBase.java @@ -144,13 +144,13 @@ public abstract class RenderPonyBase extends RenderPlayer implements IRenderPony } @Override - public ModelWrapper getPlayerModel() { + public ModelWrapper getModelWrapper() { return playerModel; } protected void setPlayerModel(ModelWrapper model) { playerModel = model; - mainModel = ponyModel = playerModel.getModel(); + mainModel = ponyModel = playerModel.getBody(); } protected void updateModel(AbstractClientPlayer player) { diff --git a/src/main/java/com/minelittlepony/render/ponies/RenderPonyGuardian.java b/src/main/java/com/minelittlepony/render/ponies/RenderPonyGuardian.java index ffd0040e..ffb35818 100644 --- a/src/main/java/com/minelittlepony/render/ponies/RenderPonyGuardian.java +++ b/src/main/java/com/minelittlepony/render/ponies/RenderPonyGuardian.java @@ -20,7 +20,7 @@ public class RenderPonyGuardian extends RenderGuardian { public RenderPonyGuardian(RenderManager manager) { super(manager); - mainModel = PMAPI.seapony.getModel(); + mainModel = PMAPI.seapony.getBody(); ponyRenderer = new RenderPonyMob.Proxy(manager, PMAPI.seapony) { @Override diff --git a/src/main/java/com/minelittlepony/render/ponies/RenderPonySkeleton.java b/src/main/java/com/minelittlepony/render/ponies/RenderPonySkeleton.java index 9e9e5968..7a98ae7b 100644 --- a/src/main/java/com/minelittlepony/render/ponies/RenderPonySkeleton.java +++ b/src/main/java/com/minelittlepony/render/ponies/RenderPonySkeleton.java @@ -14,9 +14,9 @@ import net.minecraft.util.ResourceLocation; public class RenderPonySkeleton extends RenderPonyMob { - private static final ResourceLocation SKELETON = new ResourceLocation("minelittlepony", "textures/entity/skeleton/skeleton_pony.png"); - private static final ResourceLocation WITHER = new ResourceLocation("minelittlepony", "textures/entity/skeleton/skeleton_wither_pony.png"); - private static final ResourceLocation STRAY = new ResourceLocation("minelittlepony", "textures/entity/skeleton/stray_pony.png"); + public static final ResourceLocation SKELETON = new ResourceLocation("minelittlepony", "textures/entity/skeleton/skeleton_pony.png"); + public static final ResourceLocation WITHER = new ResourceLocation("minelittlepony", "textures/entity/skeleton/skeleton_wither_pony.png"); + public static final ResourceLocation STRAY = new ResourceLocation("minelittlepony", "textures/entity/skeleton/stray_pony.png"); public RenderPonySkeleton(RenderManager manager) { super(manager, PMAPI.skeleton); @@ -28,8 +28,8 @@ public class RenderPonySkeleton extends Rende addLayer(new LayerBipedArmor(this) { @Override protected void initArmor() { - modelLeggings = getPlayerModel().getArmor().leggings; - modelArmor = getPlayerModel().getArmor().chestplate; + modelLeggings = getModelWrapper().getArmor().leggings; + modelArmor = getModelWrapper().getArmor().chestplate; } }); } diff --git a/src/main/java/com/minelittlepony/render/ponies/RenderPonyZombie.java b/src/main/java/com/minelittlepony/render/ponies/RenderPonyZombie.java index b4338e19..55303355 100644 --- a/src/main/java/com/minelittlepony/render/ponies/RenderPonyZombie.java +++ b/src/main/java/com/minelittlepony/render/ponies/RenderPonyZombie.java @@ -12,8 +12,8 @@ import net.minecraft.util.ResourceLocation; public class RenderPonyZombie extends RenderPonyMob { - private static final ResourceLocation ZOMBIE = new ResourceLocation("minelittlepony", "textures/entity/zombie/zombie_pony.png"); - private static final ResourceLocation HUSK = new ResourceLocation("minelittlepony", "textures/entity/zombie/husk_pony.png"); + public static final ResourceLocation ZOMBIE = new ResourceLocation("minelittlepony", "textures/entity/zombie/zombie_pony.png"); + public static final ResourceLocation HUSK = new ResourceLocation("minelittlepony", "textures/entity/zombie/husk_pony.png"); public RenderPonyZombie(RenderManager manager) { super(manager, PMAPI.zombie);