From 224fe4b7ab29948c9d1de6ffd533d112709073ac Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 26 May 2018 22:50:30 +0200 Subject: [PATCH] Add pony features to skulls (WIP) --- .../model/AbstractPonyModel.java | 5 + .../model/capabilities/ICapitated.java | 7 ++ .../model/capabilities/IModel.java | 2 +- .../model/components/ModelPonyHead.java | 42 ++++++++ .../render/PonySkullRenderer.java | 95 +++++++++++++++++++ .../render/layer/LayerPonyCustomHead.java | 4 +- 6 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/minelittlepony/model/capabilities/ICapitated.java create mode 100644 src/main/java/com/minelittlepony/model/components/ModelPonyHead.java create mode 100644 src/main/java/com/minelittlepony/render/PonySkullRenderer.java diff --git a/src/main/java/com/minelittlepony/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/model/AbstractPonyModel.java index 51890ac1..f54c0af1 100644 --- a/src/main/java/com/minelittlepony/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/model/AbstractPonyModel.java @@ -178,6 +178,11 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel { copyModelAngles(bipedBody, bipedBodyWear); } + @Override + public ModelRenderer getHead() { + return bipedHead; + } + /** * Sets the head rotation point. */ diff --git a/src/main/java/com/minelittlepony/model/capabilities/ICapitated.java b/src/main/java/com/minelittlepony/model/capabilities/ICapitated.java new file mode 100644 index 00000000..113101c0 --- /dev/null +++ b/src/main/java/com/minelittlepony/model/capabilities/ICapitated.java @@ -0,0 +1,7 @@ +package com.minelittlepony.model.capabilities; + +import net.minecraft.client.model.ModelRenderer; + +public interface ICapitated { + ModelRenderer getHead(); +} diff --git a/src/main/java/com/minelittlepony/model/capabilities/IModel.java b/src/main/java/com/minelittlepony/model/capabilities/IModel.java index 027cbf60..fd54eebe 100644 --- a/src/main/java/com/minelittlepony/model/capabilities/IModel.java +++ b/src/main/java/com/minelittlepony/model/capabilities/IModel.java @@ -5,7 +5,7 @@ import com.minelittlepony.model.armour.PonyArmor; import com.minelittlepony.pony.data.IPonyData; import com.minelittlepony.pony.data.PonyWearable; -public interface IModel { +public interface IModel extends ICapitated { /** * Sets up this model's initial values, like a constructor... diff --git a/src/main/java/com/minelittlepony/model/components/ModelPonyHead.java b/src/main/java/com/minelittlepony/model/components/ModelPonyHead.java new file mode 100644 index 00000000..99958ea0 --- /dev/null +++ b/src/main/java/com/minelittlepony/model/components/ModelPonyHead.java @@ -0,0 +1,42 @@ +package com.minelittlepony.model.components; + +import com.minelittlepony.model.capabilities.ICapitated; +import com.minelittlepony.pony.data.IPonyData; +import com.minelittlepony.pony.data.PonyData; + +import net.minecraft.client.model.ModelHumanoidHead; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelPonyHead extends ModelHumanoidHead implements ICapitated { + + private final PonySnout snout; + + private final UnicornHorn horn; + + public IPonyData metadata = new PonyData(); + + public ModelPonyHead() { + super(); + + snout = new PonySnout(this); + horn = new UnicornHorn(this, 0, 0); + } + + @Override + public ModelRenderer getHead() { + return skeletonHead; + } + + @Override + public void render(Entity entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { + + snout.setGender(metadata.getGender()); + + super.render(entity, move, swing, ticks, headYaw, headPitch, scale); + + if (metadata.hasMagic()) { + horn.render(scale); + } + } +} diff --git a/src/main/java/com/minelittlepony/render/PonySkullRenderer.java b/src/main/java/com/minelittlepony/render/PonySkullRenderer.java new file mode 100644 index 00000000..d7e2a7b6 --- /dev/null +++ b/src/main/java/com/minelittlepony/render/PonySkullRenderer.java @@ -0,0 +1,95 @@ +package com.minelittlepony.render; + +import java.io.IOException; +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.model.components.ModelPonyHead; +import com.minelittlepony.pony.data.Pony; +import com.mojang.authlib.GameProfile; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntitySkull; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; + +@Mixin(TileEntitySkullRenderer.class) +public abstract class PonySkullRenderer extends TileEntitySpecialRenderer { + + 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) { + + PonyConfig config = MineLittlePony.getConfig(); + + switch (skullType) + { + default: + case 0: //skeleton + case 1: //wither skeleton + renderAsPony = config.skeletons; + break; + case 2: //zombie + renderAsPony = config.zombies; + break; + case 3: // player + renderAsPony = true; + break; + case 4: // creeper + case 5: // dragon + renderAsPony = false; + } + } + + @Redirect(method = "renderSkull(FFFLnet/minecraft/util/EnumFacing;FILcom/mojang/authlib/GameProfile;IF)V", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/model/ModelBase;render(Let/minecraft/entity/Entity;FFFFFFF)V")) + private void redirectRender(ModelBase self, Entity entity, float ticks, float swing, float swingAmount, float age, float headYaw, float headPitch, float scale) { + if (renderAsPony) { + self = ponyHead; + } + + self.render(entity, swing, swingAmount, age, headYaw, headPitch, scale); + } + + @Inject(method = "bindTexture(Lnet/minecraft/util/ResourceLocation;)V", + at = @At("HEAD"), cancellable = true) + private void onBindTexture(ResourceLocation location, CallbackInfo info) { + location = resolvePonyResource(location); + + Pony pony = MineLittlePony.getInstance().getManager().getPony(location, false); + ponyHead.metadata = pony.getMetadata(); + super.bindTexture(location); + } + + private ResourceLocation resolvePonyResource(ResourceLocation human) { + String domain = human.getResourceDomain(); + String path = human.getResourcePath(); + if (domain.equals("minecraft")) { + domain = "minelittlepony"; + } + + ResourceLocation pony = new ResourceLocation(domain, path); + + try { + Minecraft.getMinecraft().getResourceManager().getResource(pony); + return pony; + } catch (IOException e) { + return human; + } + } +} diff --git a/src/main/java/com/minelittlepony/render/layer/LayerPonyCustomHead.java b/src/main/java/com/minelittlepony/render/layer/LayerPonyCustomHead.java index a0174ce7..fe3bb952 100644 --- a/src/main/java/com/minelittlepony/render/layer/LayerPonyCustomHead.java +++ b/src/main/java/com/minelittlepony/render/layer/LayerPonyCustomHead.java @@ -37,7 +37,7 @@ public class LayerPonyCustomHead 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().getModel(); + AbstractPonyModel model = getModel().getBody(); Item item = itemstack.getItem(); pushMatrix(); @@ -103,7 +103,7 @@ public class LayerPonyCustomHead implements LayerRen } private ModelWrapper getModel() { - return ((IRenderPony) renderer).getPlayerModel(); + return ((IRenderPony) renderer).getModelWrapper(); } @Override