From 3db1965da431698f8a93bbb1cf7cc5f192f37d9c Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 29 Oct 2018 17:57:43 +0200 Subject: [PATCH] Fixed positioning of ponies riding other ponies, and fixed hitbox calculation (sort of) --- .../com/minelittlepony/ducks/IRenderPony.java | 2 +- .../com/minelittlepony/pony/data/Pony.java | 15 ++++++++---- .../com/minelittlepony/render/RenderPony.java | 24 +++++++++++++------ .../minelittlepony/render/RenderPonyMob.java | 6 +++++ .../render/player/RenderPonyPlayer.java | 7 +++--- .../minelittlepony/transform/PonyPosture.java | 2 +- .../transform/PonyTransformation.java | 15 ++++++------ .../transform/PostureElytra.java | 2 +- .../transform/PostureFalling.java | 2 +- .../transform/PostureFlight.java | 2 +- 10 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/minelittlepony/ducks/IRenderPony.java b/src/main/java/com/minelittlepony/ducks/IRenderPony.java index 466e0c07..86731a18 100644 --- a/src/main/java/com/minelittlepony/ducks/IRenderPony.java +++ b/src/main/java/com/minelittlepony/ducks/IRenderPony.java @@ -38,7 +38,7 @@ public interface IRenderPony { model.transform(BodyPart.BACK); - getInternalRenderer().applyPostureRiding(entity, entity.ticksExisted + ticks, yaw, ticks); + getInternalRenderer().applyPostureRiding(entity, yaw, ticks); } } } diff --git a/src/main/java/com/minelittlepony/pony/data/Pony.java b/src/main/java/com/minelittlepony/pony/data/Pony.java index 580bc389..f1ab0e16 100644 --- a/src/main/java/com/minelittlepony/pony/data/Pony.java +++ b/src/main/java/com/minelittlepony/pony/data/Pony.java @@ -166,11 +166,16 @@ public class Pony implements IPony { public Vec3d getAbsoluteRidingOffset(EntityLivingBase entity) { IPony ridingPony = getMountedPony(entity); + + if (ridingPony != null) { EntityLivingBase ridee = (EntityLivingBase)entity.getRidingEntity(); Vec3d offset = ridingPony.getMetadata().getSize().getTranformation().getRiderOffset(); - return ridingPony.getAbsoluteRidingOffset(ridee).add(-offset.x / 4, offset.y / 5, -offset.z / 4); + float scale = ridingPony.getMetadata().getSize().getScaleFactor(); + + return ridingPony.getAbsoluteRidingOffset(ridee) + .add(0, offset.y - ridee.height * 1/scale, 0); } return entity.getPositionVector(); @@ -178,13 +183,15 @@ public class Pony implements IPony { @Override public AxisAlignedBB getComputedBoundingBox(EntityLivingBase entity) { - float scale = getMetadata().getSize().getScaleFactor(); + float scale = getMetadata().getSize().getScaleFactor() + 0.1F; Vec3d pos = getAbsoluteRidingOffset(entity); + float width = entity.width * scale; + return new AxisAlignedBB( - - entity.width / 2, (entity.height * scale), -entity.width / 2, - entity.width / 2, 0, entity.width / 2).offset(pos); + - width, (entity.height * scale), -width, + width, 0, width).offset(pos); } @Override diff --git a/src/main/java/com/minelittlepony/render/RenderPony.java b/src/main/java/com/minelittlepony/render/RenderPony.java index e48dfd47..319eca1a 100644 --- a/src/main/java/com/minelittlepony/render/RenderPony.java +++ b/src/main/java/com/minelittlepony/render/RenderPony.java @@ -6,6 +6,7 @@ import com.minelittlepony.model.AbstractPonyModel; import com.minelittlepony.model.ModelWrapper; import com.minelittlepony.pony.data.IPony; import com.minelittlepony.transform.PonyPosture; +import com.minelittlepony.util.math.MathUtil; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.culling.ICamera; @@ -57,18 +58,27 @@ public class RenderPony { translateRider(entity, ticks); } + public float getRenderYaw(T entity, float rotationYaw, float partialTicks) { + if (entity.isRiding()) { + Entity mount = entity.getRidingEntity(); + if (mount instanceof EntityLivingBase) { + return MathUtil.interpolateDegress(((EntityLivingBase)mount).prevRenderYawOffset, ((EntityLivingBase)mount).renderYawOffset, partialTicks); + } + } + + return rotationYaw; + } + protected void translateRider(EntityLivingBase entity, float ticks) { if (entity.isRiding()) { Entity ridingEntity = entity.getRidingEntity(); if (ridingEntity instanceof EntityLivingBase) { - translateRider((EntityLivingBase)ridingEntity, ticks); - IRenderPony renderer = MineLittlePony.getInstance().getRenderManager().getPonyRenderer((EntityLivingBase)ridingEntity); if (renderer != null) { // negate vanilla translations so the rider begins at the ridees feet. - GlStateManager.translate(0, (ridingEntity.posY - entity.posY), 0); + GlStateManager.translate(0, -ridingEntity.height, 0); @SuppressWarnings("unchecked") IPony riderPony = renderer.getEntityPony((EntityLivingBase)ridingEntity); @@ -80,25 +90,25 @@ public class RenderPony { } @SuppressWarnings("unchecked") - public void applyPostureTransform(T player, float pitch, float yaw, float ticks) { + public void applyPostureTransform(T player, float yaw, float ticks) { PonyPosture posture = getPosture(player); if (posture != null && posture.applies(player)) { double motionX = player.posX - player.prevPosX; double motionY = player.onGround ? 0 : player.posY - player.prevPosY; double motionZ = player.posZ - player.prevPosZ; - ((PonyPosture)posture).transform(ponyModel, player, motionX, motionY, motionZ, pitch, yaw, ticks); + ((PonyPosture)posture).transform(ponyModel, player, motionX, motionY, motionZ, yaw, ticks); } } @SuppressWarnings("unchecked") - public void applyPostureRiding(T player, float pitch, float yaw, float ticks) { + public void applyPostureRiding(T player, float yaw, float ticks) { PonyPosture posture = getPosture(player); if (posture != null && posture.applies(player)) { double motionX = player.posX - player.prevPosX; double motionY = player.onGround ? 0 : player.posY - player.prevPosY; double motionZ = player.posZ - player.prevPosZ; - ((PonyPosture)posture).transform(ponyModel, player, motionX, -motionY, motionZ, pitch, yaw, ticks); + ((PonyPosture)posture).transform(ponyModel, player, motionX, -motionY, motionZ, yaw, ticks); } } diff --git a/src/main/java/com/minelittlepony/render/RenderPonyMob.java b/src/main/java/com/minelittlepony/render/RenderPonyMob.java index b56d2bf2..5758c573 100644 --- a/src/main/java/com/minelittlepony/render/RenderPonyMob.java +++ b/src/main/java/com/minelittlepony/render/RenderPonyMob.java @@ -60,6 +60,12 @@ public abstract class RenderPonyMob extends RenderLiving DebugBoundingBoxRenderer.instance.render(renderPony.getPony(entity), entity, ticks); } + @Override + protected void applyRotations(T entity, float ageInTicks, float rotationYaw, float partialTicks) { + rotationYaw = renderPony.getRenderYaw(entity, rotationYaw, partialTicks); + super.applyRotations(entity, ageInTicks, rotationYaw, partialTicks); + } + @Override public boolean shouldRender(T entity, ICamera camera, double camX, double camY, double camZ) { return super.shouldRender(entity, renderPony.getFrustrum(entity, camera), camX, camY, camZ); diff --git a/src/main/java/com/minelittlepony/render/player/RenderPonyPlayer.java b/src/main/java/com/minelittlepony/render/player/RenderPonyPlayer.java index 38ccd8a5..46bc2942 100644 --- a/src/main/java/com/minelittlepony/render/player/RenderPonyPlayer.java +++ b/src/main/java/com/minelittlepony/render/player/RenderPonyPlayer.java @@ -144,10 +144,11 @@ public class RenderPonyPlayer extends RenderPlayer implements IRenderPony { return true; } - void transform(AbstractPonyModel model, T entity, double motionX, double motionY, double motionZ, float pitch, float yaw, float ticks); + void transform(AbstractPonyModel model, T entity, double motionX, double motionY, double motionZ, float yaw, float ticks); } diff --git a/src/main/java/com/minelittlepony/transform/PonyTransformation.java b/src/main/java/com/minelittlepony/transform/PonyTransformation.java index 0d02a60e..070cb502 100644 --- a/src/main/java/com/minelittlepony/transform/PonyTransformation.java +++ b/src/main/java/com/minelittlepony/transform/PonyTransformation.java @@ -10,7 +10,7 @@ import com.minelittlepony.model.capabilities.IModel; public enum PonyTransformation { - NORMAL(0, 3, 0.5F) { + NORMAL(0, 3F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { if (model.isCrouching()) translate(0, -0.2F, 0); @@ -31,7 +31,7 @@ public enum PonyTransformation { } } }, - LANKY(0, 2.3F, 0.3F) { + LANKY(0, 2.6F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { if (model.isCrouching()) translate(0, -0.15F, 0); @@ -65,7 +65,7 @@ public enum PonyTransformation { } } }, - BULKY(0, 2.3F, 0.3F) { + BULKY(0, 2.3F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { if (model.isCrouching()) translate(0, -0.15F, 0); @@ -99,7 +99,7 @@ public enum PonyTransformation { } } }, - FOAL(0, 4.5F, 0.6F) { + FOAL(0, 3.8F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { if (model.isCrouching()) translate(0, -0.3F, 0); @@ -128,7 +128,7 @@ public enum PonyTransformation { } } }, - TALL(0, 2F, 0.6F) { + TALL(0, 2.2F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { if (model.isCrouching()) translate(0, -0.15F, 0); @@ -155,12 +155,13 @@ public enum PonyTransformation { if (model.isGoingFast()) translate(0, 0.05F, 0); break; case BACK: + riderOffset = new Vec3d(0, 2.2F, 0.75F); translateVec(riderOffset); break; } } }, - YEARLING(0, 4.3F, 0.6F) { + YEARLING(0, 3.8F, 0.75F) { @Override public void transform(IModel model, BodyPart part) { if (model.isCrouching()) translate(0, -0.15F, 0); @@ -194,7 +195,7 @@ public enum PonyTransformation { } }; - protected final Vec3d riderOffset; + protected Vec3d riderOffset; PonyTransformation(float rX, float rY, float rZ) { riderOffset = new Vec3d(rX, rY, rZ); diff --git a/src/main/java/com/minelittlepony/transform/PostureElytra.java b/src/main/java/com/minelittlepony/transform/PostureElytra.java index e708efc8..e79a3265 100644 --- a/src/main/java/com/minelittlepony/transform/PostureElytra.java +++ b/src/main/java/com/minelittlepony/transform/PostureElytra.java @@ -7,7 +7,7 @@ import net.minecraft.entity.EntityLivingBase; public class PostureElytra implements PonyPosture { @Override - public void transform(AbstractPonyModel model, EntityLivingBase entity, double motionX, double motionY, double motionZ, float pitch, float yaw, float ticks) { + public void transform(AbstractPonyModel model, EntityLivingBase entity, double motionX, double motionY, double motionZ, float yaw, float ticks) { GlStateManager.rotate(90, 1, 0, 0); GlStateManager.translate(0, entity.isSneaking() ? 0.2F : -1, 0); } diff --git a/src/main/java/com/minelittlepony/transform/PostureFalling.java b/src/main/java/com/minelittlepony/transform/PostureFalling.java index bb175652..2ed9e16f 100644 --- a/src/main/java/com/minelittlepony/transform/PostureFalling.java +++ b/src/main/java/com/minelittlepony/transform/PostureFalling.java @@ -6,7 +6,7 @@ import net.minecraft.entity.EntityLivingBase; public class PostureFalling implements PonyPosture { @Override - public void transform(AbstractPonyModel model, EntityLivingBase entity, double motionX, double motionY, double motionZ, float pitch, float yaw, float ticks) { + public void transform(AbstractPonyModel model, EntityLivingBase entity, double motionX, double motionY, double motionZ, float yaw, float ticks) { model.motionPitch = 0; } } diff --git a/src/main/java/com/minelittlepony/transform/PostureFlight.java b/src/main/java/com/minelittlepony/transform/PostureFlight.java index 145b20e8..60474287 100644 --- a/src/main/java/com/minelittlepony/transform/PostureFlight.java +++ b/src/main/java/com/minelittlepony/transform/PostureFlight.java @@ -13,7 +13,7 @@ public class PostureFlight extends MotionCompositor implements PonyPosture