Fixed positioning of ponies riding other ponies, and fixed hitbox calculation (sort of)

This commit is contained in:
Sollace 2018-10-29 17:57:43 +02:00
parent 2f56d64cb5
commit 3db1965da4
10 changed files with 51 additions and 26 deletions

View file

@ -38,7 +38,7 @@ public interface IRenderPony<T extends EntityLivingBase> {
model.transform(BodyPart.BACK);
getInternalRenderer().applyPostureRiding(entity, entity.ticksExisted + ticks, yaw, ticks);
getInternalRenderer().applyPostureRiding(entity, yaw, ticks);
}
}
}

View file

@ -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

View file

@ -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<T extends EntityLivingBase> {
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<EntityLivingBase> 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<T extends EntityLivingBase> {
}
@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<EntityLivingBase>)posture).transform(ponyModel, player, motionX, motionY, motionZ, pitch, yaw, ticks);
((PonyPosture<EntityLivingBase>)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<EntityLivingBase>)posture).transform(ponyModel, player, motionX, -motionY, motionZ, pitch, yaw, ticks);
((PonyPosture<EntityLivingBase>)posture).transform(ponyModel, player, motionX, -motionY, motionZ, yaw, ticks);
}
}

View file

@ -60,6 +60,12 @@ public abstract class RenderPonyMob<T extends EntityLiving> 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);

View file

@ -144,10 +144,11 @@ public class RenderPonyPlayer extends RenderPlayer implements IRenderPony<Abstra
}
@Override
protected void applyRotations(AbstractClientPlayer player, float yaw, float pitch, float ticks) {
super.applyRotations(player, yaw, pitch, ticks);
protected void applyRotations(AbstractClientPlayer player, float age, float yaw, float ticks) {
yaw = renderPony.getRenderYaw(player, yaw, ticks);
super.applyRotations(player, age, yaw, ticks);
renderPony.applyPostureTransform(player, yaw, pitch, ticks);
renderPony.applyPostureTransform(player, yaw, ticks);
}
@Override

View file

@ -14,5 +14,5 @@ public interface PonyPosture<T extends EntityLivingBase> {
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);
}

View file

@ -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);

View file

@ -7,7 +7,7 @@ import net.minecraft.entity.EntityLivingBase;
public class PostureElytra implements PonyPosture<EntityLivingBase> {
@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);
}

View file

@ -6,7 +6,7 @@ import net.minecraft.entity.EntityLivingBase;
public class PostureFalling implements PonyPosture<EntityLivingBase> {
@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;
}
}

View file

@ -13,7 +13,7 @@ public class PostureFlight extends MotionCompositor implements PonyPosture<Abstr
}
@Override
public void transform(AbstractPonyModel model, AbstractClientPlayer player, double motionX, double motionY, double motionZ, float pitch, float yaw, float ticks) {
public void transform(AbstractPonyModel model, AbstractClientPlayer player, double motionX, double motionY, double motionZ, float yaw, float ticks) {
model.motionPitch = (float) calculateIncline(player, motionX, motionY, motionZ);
GlStateManager.rotate(model.motionPitch, 1, 0, 0);