From 9dd9384d7770810899385ff6dcd962bf5f55a186 Mon Sep 17 00:00:00 2001 From: Matthew Messinger Date: Tue, 15 Dec 2015 00:32:57 -0500 Subject: [PATCH] Split the mob rendering apart into their own classes. Add some randomness for mob metadata. --- .../minelittlepony/model/ModelPony.java | 2 +- .../model/pony/pm_newPonyAdv.java | 2 +- .../model/pony/pm_zombiePony.java | 1 + .../renderer/RenderPonyMob.java | 72 +++++------------- .../renderer/RenderPonySkeleton.java | 20 +++-- .../renderer/RenderPonyZombie.java | 34 ++++++++- .../textures/entity/zombie/zombie_pony.png | Bin 4765 -> 5225 bytes 7 files changed, 72 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/brohoof/minelittlepony/model/ModelPony.java b/src/main/java/com/brohoof/minelittlepony/model/ModelPony.java index 25661893..ed517ab7 100644 --- a/src/main/java/com/brohoof/minelittlepony/model/ModelPony.java +++ b/src/main/java/com/brohoof/minelittlepony/model/ModelPony.java @@ -204,7 +204,7 @@ public abstract class ModelPony extends ModelPlayer { rotate(180.0F, 0.0F, 1.0F, 0.0F); } - if (this.metadata.getSize() == PonySize.FOAL) { + if (this.metadata.getSize() == PonySize.FOAL || isChild) { if (this.isSneak && !this.isFlying && !this.isArmour) { translate(0.0F, -0.12F, 0.0F); } diff --git a/src/main/java/com/brohoof/minelittlepony/model/pony/pm_newPonyAdv.java b/src/main/java/com/brohoof/minelittlepony/model/pony/pm_newPonyAdv.java index 39527a22..086cbf5b 100644 --- a/src/main/java/com/brohoof/minelittlepony/model/pony/pm_newPonyAdv.java +++ b/src/main/java/com/brohoof/minelittlepony/model/pony/pm_newPonyAdv.java @@ -507,7 +507,7 @@ public class pm_newPonyAdv extends ModelPony implements PonyModelConstants { rotate(180.0F, 0.0F, 1.0F, 0.0F); } - if (this.metadata.getSize() == PonySize.FOAL) { + if (this.metadata.getSize() == PonySize.FOAL || isChild) { if (this.isSneak && !this.isFlying && !this.isArmour) { translate(0.0F, -0.12F, 0.0F); } diff --git a/src/main/java/com/brohoof/minelittlepony/model/pony/pm_zombiePony.java b/src/main/java/com/brohoof/minelittlepony/model/pony/pm_zombiePony.java index 1874ef69..16e671ef 100644 --- a/src/main/java/com/brohoof/minelittlepony/model/pony/pm_zombiePony.java +++ b/src/main/java/com/brohoof/minelittlepony/model/pony/pm_zombiePony.java @@ -14,6 +14,7 @@ public class pm_zombiePony extends pm_newPonyAdv { float leftLegRotateAngleX; float var8; float var9; + // why are zombies flying? if (this.isFlying && this.metadata.getRace().hasWings()) { if (this.rainboom) { rightArmRotateAngleX = ROTATE_270; diff --git a/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonyMob.java b/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonyMob.java index 2f836c26..176c0c69 100644 --- a/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonyMob.java +++ b/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonyMob.java @@ -15,12 +15,11 @@ import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntityPigZombie; -import net.minecraft.entity.monster.EntitySkeleton; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; public abstract class RenderPonyMob extends RenderLiving implements IRenderPony { + protected ModelPony mobModel; protected PlayerModel playerModel; @@ -36,68 +35,23 @@ public abstract class RenderPonyMob extends RenderLiving } @Override - public void doRender(EntityLiving entity, double xPosition, double yPosition, double zPosition, float yaw, + public void doRender(Entity entity, double xPosition, double yPosition, double zPosition, float yaw, float partialTicks) { - ItemStack heldItem = entity.getHeldItem(); - this.playerModel.getModel().heldItemRight = heldItem == null ? 0 : 1; - - this.playerModel.getModel().isSneak = false; - this.playerModel.getModel().isFlying = false; - - if (entity instanceof EntitySkeleton) { - - switch (entity.getUniqueID().hashCode() % 3) { - case 0: - case 1: - this.playerModel.getModel().metadata.setRace(PonyRace.UNICORN); - break; - case 2: - this.playerModel.getModel().metadata.setRace(PonyRace.EARTH); - } - } else { - this.playerModel.getModel().metadata.setRace(PonyRace.EARTH); - } - - if (entity instanceof EntityPigZombie) { - this.playerModel.getModel().metadata.setGender(PonyGender.STALLION); - } else { - this.playerModel.getModel().metadata.setGender(PonyGender.MARE); - } - - if (entity instanceof EntitySkeleton) { - this.playerModel.getModel().metadata.setTail(TailLengths.STUB); - } else { - this.playerModel.getModel().metadata.setTail(TailLengths.FULL); - } - - this.playerModel.getModel().isSleeping = false; - if (MineLittlePony.getConfig().getShowScale().get()) { - this.shadowSize = 0.4F; - } - double yOrigin = yPosition; if (entity.isSneaking()) { yOrigin -= 0.125D; } - super.doRender(entity, xPosition, yOrigin, zPosition, yaw, partialTicks); this.playerModel.getModel().aimedBow = false; this.playerModel.getModel().isSneak = false; this.playerModel.getModel().heldItemRight = 0; } - @SuppressWarnings("unchecked") - @Override - public void doRender(Entity entity, double xPosition, double yPosition, double zPosition, float yaw, - float partialTicks) { - this.doRender((T) entity, xPosition, yPosition, zPosition, yaw, partialTicks); - } - protected abstract ResourceLocation getEntityTexture(T var1); @SuppressWarnings("unchecked") @Override - protected ResourceLocation getEntityTexture(Entity var1) { + protected final ResourceLocation getEntityTexture(Entity var1) { return this.getEntityTexture((T) var1); } @@ -105,7 +59,23 @@ public abstract class RenderPonyMob extends RenderLiving @SuppressWarnings("unchecked") @Override - protected void preRenderCallback(EntityLivingBase entitylivingbaseIn, float partialTickTime) { + protected final void preRenderCallback(EntityLivingBase entitylivingbaseIn, float partialTickTime) { + + ItemStack heldItem = entitylivingbaseIn.getHeldItem(); + this.playerModel.getModel().heldItemRight = heldItem == null ? 0 : 1; + + this.playerModel.getModel().isSneak = false; + this.playerModel.getModel().isFlying = false; + this.playerModel.getModel().isSleeping = false; + + this.playerModel.getModel().metadata.setRace(PonyRace.EARTH); + this.playerModel.getModel().metadata.setGender(PonyGender.MARE); + this.playerModel.getModel().metadata.setTail(TailLengths.FULL); + + if (MineLittlePony.getConfig().getShowScale().get()) { + this.shadowSize = 0.4F; + } + preRenderCallback((T) entitylivingbaseIn, partialTickTime); } @@ -115,7 +85,7 @@ public abstract class RenderPonyMob extends RenderLiving @SuppressWarnings("unchecked") @Override - protected void rotateCorpse(EntityLivingBase entity, float xPosition, float yPosition, float zPosition) { + protected final void rotateCorpse(EntityLivingBase entity, float xPosition, float yPosition, float zPosition) { this.rotateCorpse((T) entity, xPosition, yPosition, zPosition); } diff --git a/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonySkeleton.java b/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonySkeleton.java index 02ecf17a..631696ce 100644 --- a/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonySkeleton.java +++ b/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonySkeleton.java @@ -1,12 +1,15 @@ package com.brohoof.minelittlepony.renderer; +import java.util.Random; + import com.brohoof.minelittlepony.PonyManager; +import com.brohoof.minelittlepony.PonyRace; +import com.brohoof.minelittlepony.TailLengths; import com.brohoof.minelittlepony.model.PMAPI; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.layers.LayerBipedArmor; -import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntitySkeleton; import net.minecraft.util.ResourceLocation; @@ -28,10 +31,17 @@ public class RenderPonySkeleton extends RenderPonyMob { GlStateManager.scale(1.2F, 1.2F, 1.2F); } - } - - protected void a(EntityLivingBase entity, float partialTicks) { - this.preRenderCallback((EntitySkeleton) entity, partialTicks); + Random rand = new Random(skeleton.getUniqueID().hashCode()); + switch (rand.nextInt() % 3) { + case 0: + case 1: + this.playerModel.getModel().metadata.setRace(PonyRace.UNICORN); + this.playerModel.getModel().metadata.setGlowColor(rand.nextInt()); + break; + case 2: + this.playerModel.getModel().metadata.setRace(PonyRace.EARTH); + } + this.playerModel.getModel().metadata.setTail(TailLengths.STUB); } @Override diff --git a/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonyZombie.java b/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonyZombie.java index 28334653..13f6a40e 100644 --- a/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonyZombie.java +++ b/src/main/java/com/brohoof/minelittlepony/renderer/RenderPonyZombie.java @@ -1,6 +1,10 @@ package com.brohoof.minelittlepony.renderer; +import java.util.Random; + +import com.brohoof.minelittlepony.PonyGender; import com.brohoof.minelittlepony.PonyManager; +import com.brohoof.minelittlepony.PonyRace; import com.brohoof.minelittlepony.model.PMAPI; import net.minecraft.client.renderer.entity.RenderManager; @@ -14,10 +18,38 @@ public class RenderPonyZombie extends RenderPonyMob { super(rendermanager, PMAPI.zombie); } + @Override + protected void preRenderCallback(EntityZombie entity, float partick) { + Random rand = new Random(entity.getUniqueID().hashCode()); + + // 50-50 chance for gender + this.playerModel.getModel().metadata.setGender(rand.nextBoolean() ? PonyGender.MARE : PonyGender.STALLION); + + switch (rand.nextInt(5)) { + case 0: + case 1: + case 2: + this.playerModel.getModel().metadata.setRace(PonyRace.EARTH); + break; + case 3: + this.playerModel.getModel().metadata.setRace(PonyRace.PEGASUS); + break; + case 4: + this.playerModel.getModel().metadata.setRace(PonyRace.UNICORN); + break; + } + this.playerModel.getModel().metadata.setGlowColor(rand.nextInt()); + // Let's play the lottery! + if (rand.nextInt(10000) == 0) { + this.playerModel.getModel().metadata.setRace(PonyRace.ALICORN); + } + } + @Override protected void rotateCorpse(EntityZombie zombie, float xPosition, float yPosition, float zPosition) { + super.rotateCorpse(zombie, xPosition, yPosition, zPosition); if (zombie.isConverting()) { - yPosition += (float) (Math.cos(zombie.ticksExisted * 3.25D) * 3.141592653589793D * 0.25D); + yPosition += (float) (Math.cos(zombie.ticksExisted * 3.25D) * Math.PI * 0.25D); } } diff --git a/src/main/resources/assets/minelittlepony/textures/entity/zombie/zombie_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/zombie/zombie_pony.png index f82c7f8d7224d401a9d94fac1291418811599405..9a4a49530e9a951f645ca55de1dcf50424736648 100644 GIT binary patch literal 5225 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 literal 4765 zcmZu#XE+;t_fDw9ELvLytvx@V5>1SB8ECm^0RRAl-hFMezZLdxP=o&F z3a`gR0N|Rdp0oGp@KD(y%|#GS!q0cQm$j6LgCaHl8g_Q>%|YUn)DEV_Oi5mwun0so$2U5v&qn@xhuJc99Q!HbO5QOk#- zE1!@1|1@oocuJ4-ayNceH?k3)$P%YYEMIxoB#YXk$qy`^@80 z#ju{}5FhJEWu4R=txpbkeH!gl~Lu)}~u~*3dXo zl`@AVLz+KC6w4hw`c%f7V!eG?=N6z_MbxvkbdWg^@ID$zVQpL%G(^COCcmd%;(%&| zUuVJUL`Nm#yzksgm4v;77!HhxWK}@v0>CZYLGM7+i#dMfEK!_w0$DFlA$g-?3j|@gbdd%ysQZ*^<8gsGFadoD|sPSOgL=5m31NFJdviez;Sd` zH6`=i8pr2vWmnMny|jhFV$|l3zd&q83X|!ZjxeJH`=Rrm=OjGx0^?*d9hnps4Ucj^ zO8N)Sl?8U42jt=X0XSW(p!~v@p{L^^2La)gss<-95m<`ehf!Xt(%O0wD&*`u%ZGcJ z@7;EEW%xON7<5D_{yH)78Qzj-Io{wjRQV0MkCgJ%I#>}up1MyReO-7n2=3G+;HZEf zdnQ#TZ!avs=!|;TUfcA+1TFt!aQK#u*KwCT7iQiGLvhF2%iXJIeU1}ci&Q;qr-ufv zm*f+AMQtf?Aw%kt!{+sl4Ay5vx7<#3e??9Tu{&56Qjj9dLw^Q3qu`M}gm2;h}f^pNvXR&kW5dR;yH+k}HKe#3jQE_R$X(c^eP6G@MX@OLL|Mi-}hHkk{;N zU$$;vVKK7ov%MGZE8;s;z&}6>yn@^5JMl`+Q#jo}HAdFUcQxBD?!2*n%VJ_Y`@CPn z(*^Z=B5yR6u)$`V3YKRMvuM5sw@Uq9y;E!Lr|g#Mk%OvPJXZ@iTG2BW#nrMNgkC`$ z$H!8}WL>y_LXu2AhImZwpQQxmZ2Y=$vRlOk8cVV`+FcMs893@k)vplSRxTthM8N})@4ixBsAET6^C zkwRtPzDuzXBKV+_H%tqy3>mARn#qwA)~rh&N~rK1cT|auSJJ$i9vY$r=MP}uYBz82 zUHsvJUWTR(d@vuf;ceXm-No-)bb{a2UMn1r7XpA^#f7o5AAJw$`CaJl3&%~UXETdX zwCsBiDR%XQe072JTHcd^a%@|gwmM-Y3l-L+HeGeD<4d47Yeaqavs4i>eYs zk796ljaH$64Di_E{m6=-Z$0a=0DY-?AwKh=isVTaUgK8MlF~g~5H{b^p)eSF2Rpcx zVHC1Xn`|Zw5RgcF*ahM|j~g`3Q;#G*eVP(BGnlu?bHaZ$VGbr8_#)X}Z4bVz^)jSs za{N=MG=u^>lDTXJVr~$Q6nw!yfz2Z`RQzI@i;mNo9R<~nc>0=yBK20POfEP0l~0R#Pb+s< z-g_jZJ-s~OCC>yoKaABfx&wVTucorNVTY-c{!wIVt}uBo&Lg&`5!acgqvq|}zgzkdX7Fy4Ms6cmO&frYszM!Ch+JF|;~{~Uc-6}oP|vg1OY3dj~IRBW-- z4j5iIPZCz7PLgEF?k!u1Cu*FTDgWkX`onlnwY+3!??Fo7CJ!Wx_tCjzBBO+IIodZk zU2QP>%-Zjm>^tOl8lvt>K#lC2LNLA0?~->jfM!sfqaH z_;d%F(v8`Y_5s!V`1b2UzAY7q{!M8s!GLk{`43X1wD&mMWkJLJ29JQqO{uGX=!c2M z4f!GRwIbX6YL1RdLP%c7Zu#BMe;~UgyrJ@lpNb(JrE~-#ch2j$td-b}o)vlk{pWje zg~sR_!YP%<=}X5}naUWQXl1tv`p9B{X^v);@2lX9l4vpDt2|q=bQrwdb?A=L&)imJ zF+NDsm#7=c?Z6s!NYvU7l+8W3=;_%q%+oSV~P*Ng!!BV({nkS>6`L6xQM(9@*Eg(LJHol zg1^V)*_-Qldh)7cwtRlMr`2lS%P4xUfvoM>lVwI#6NeOfelCB)-cqyH5WV`eCQ19_ z&?K3*GQ+3}Dz`*)nVFCLta5?K@&Y6BE%f6or+?*R-2w%<Q@0*-}}MV0>?~42Qu^=WmASj6Z}RY#xbFQlvhHZAs$&t$5UNUReG5sYfYAI z{&cFemNFJvLSRK_uD9EK+s?K@5i zI%I1p{bISP2>QmlefjZdXkf&U2WoO2KI<@NBN_MH)qF;ydaUwOi7ig<_9*gQ30lHb z&c(Flcj3JYa_-z|7qr>Tzbempk%l$7Y*fmBeHa)WKJ&pWVg~<+udX;ys(x%E;}3YL z9T5^KW_Z`zasmM`C9wpSMaWB2>4z zIZ~wC$F2*30jB&EDM}ReeOAynpe{b@T$2D}#K)NGqe@P9{GpDLm=`_M9S~#xE1eJP zU)A334oR@)+X%mUf6nvGFPu)6M$^k^RFJ2~NkyBT(Inu#|7X9=X(~saah7eniKUJD zz>@H3(2;W&70&ffGXLVNT;iZaE@e0OT+!+P?ikRTi+OnW3vz8lRS)DoHM}q$?xeUW z>`ue5ARHPnL&Hf{J_^((WGWUsK;Uw3j$lbH@FTHnp~iFg@tY+cRNglQSy#nVQ&OR? z2F?|63yOUWLbF#rziPoEj!|$90mG}p>O+uods`Zg<=e=F!)XERI+-qKo}QFoH1t^` zx)g`b{!!E7Vd7j|pBn*X$+_VZ?X&b}V)3O{q$&8f*$RyBeoCKeO`@utH2w1_&M8nr z3nlx&&OJkC2W9-e*&7Z>FUs5g(lLu&c1}^gf75w>*fs3>S^&iCN{dE9LR62YXsRfs z19q#6svV1rh+y7 zMUq3_FZjG@zCIyvpl`~_efg{~bzX`0Raibv$i_3@qVK;3wtn|rR_rsq!V$kJw7iDX zaWPd(g+vC@S`~%H%W&49Ki#550AtatCU!NQ=%>Uk{pmTNXv@x|d@%&^^fOyrc8U>N zu{QAb0E~`HvQ!loy#C{jBy~yh^2#Mg9Va|p#kheI*=Z}q!$$pbVV%($=*!1=on&Pv zs!(hx)X5#BS1TNx4*Vh$*fh<=&%u{bQ}u$?&ol5~H_8xG#|CGSmpE-w+HRaVrErr6 zdg#D(XSx`Ff70aE|A09^68@Rhp?b4;6={6%caGUsCTyhDv=j~af@g0$Ha}59^K~i| zpKyB@u-{oHR1$8c9yt8scr9Po4O~^}-=$E9F7GKJFo+D_0V@ha(~2F;JeCB<97l_c z!7i@3_I}`>tl1P{8c9$I>qMiM1o~YRHuzCKH*jWEFwjvmtv~?saC#^^+vTf9Q0T1! z!FE&|0`*Q5{%(f(?Z#gHG{$VX{HJ<@V`^c2^nR@$=J4$^Hj*~MXf5h%xVJBbcF@j8 z^}~o;neq28iSKU(Uv4M#b+)+TYG3%S&oSp-ZYPCgxOAo~Zq5E(LS{0ZLv7j&X1#E2 zKUALt%tRy-AgSvr&V5c6K6+x?gnT#MWV z1ty;Bk8xmRF&$r*zH!_rd1g3TNL1gFT~7{1dWB$sC(W~qJ7+L+*xvP2;E^UMwF!{g zolKG3%w?iee4GYCA=DSksp3HZ@h-+iN+z4LQHy$qY+duZIlQh<-Qw}u=>(}f_d!E! z0l7vE`1g^2j|_C|Y71i1Jbkc)EmvBVpgV0~s_@3(`{(gFA`lMFD@Xaao|O(vqIarDt_ zOC8*R5foj%jOUJ&*deY7<@2BmElk%z{GgF+vgJ+pM#Uz^xw+Z6IoqEF^?AJw1S4w& zq(d;nJ8RC^2BK22a_qktUCRCT7XTXyq2#~(0xz^=z@Cg_e04z*Zq_MOsla?kWH~G$ zY|d{y;?j~_t#R@coC9bCdS3BfC{X9WLKx^+lUM&M(_K^uN{-EjLWb(d|6$9oXT2#t zjCL_~JVD13yh{9%yo@p*nF2L)o!2 z0RM$JJhY#j)C;ra{+~FWw7UQq&}C)D)Gnp|&Yq9kztZYbqS}gSVB9Dj6lwgR{Mb0^ zns`@)JRk?yNcl;5FR2VOiT;X_g*{oyc?XX)Ht$mAqHF{m9+e_&o6$fvu5Z2^Z!pzHS5jw~@hXo;^^^7Spv}^k2{}Y~ua-6YSfS)5ha-8X6gZCvfb_6+hS{ omO`TG*D=ko2HkEH51C9sEe|WlJvCnXdv*fo-80gz(R}p$KVxk=NdN!<