From f520998365b8620cd1cd203dab37b91ba17ecf03 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 29 Jun 2018 18:36:03 +0200 Subject: [PATCH] SHOOO BE DOO! https://www.youtube.com/watch?v=iakTl9SZTTY --- .../com/minelittlepony/PonyRenderManager.java | 2 +- .../model/AbstractPonyModel.java | 43 ++++++++++++++++++- .../model/player/PlayerModels.java | 16 ++++++- .../model/ponies/ModelSeapony.java | 8 ++++ .../minelittlepony/pony/data/PonyData.java | 2 +- .../minelittlepony/pony/data/PonyRace.java | 3 +- .../render/player/RenderPonyPlayer.java | 17 +++++--- .../render/player/RenderSeaponyPlayer.java | 28 ++++++++++++ .../minelittlepony/transform/PonyPosture.java | 1 + .../transform/PostureFlight.java | 19 ++++---- .../transform/PostureSwimming.java | 20 +++++++++ 11 files changed, 137 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/minelittlepony/render/player/RenderSeaponyPlayer.java create mode 100644 src/main/java/com/minelittlepony/transform/PostureSwimming.java diff --git a/src/main/java/com/minelittlepony/PonyRenderManager.java b/src/main/java/com/minelittlepony/PonyRenderManager.java index cae53c53..6b3fe77c 100644 --- a/src/main/java/com/minelittlepony/PonyRenderManager.java +++ b/src/main/java/com/minelittlepony/PonyRenderManager.java @@ -47,7 +47,7 @@ public class PonyRenderManager { } private void addPlayerSkin(RenderManager manager, boolean slimArms, PlayerModels playerModel) { - RenderPonyPlayer renderer = new RenderPonyPlayer(manager, slimArms, playerModel.getModel(slimArms)); + RenderPonyPlayer renderer = playerModel.createRenderer(manager, slimArms); ((MixinRenderManager)manager).getSkinMap().put(playerModel.getId(slimArms), renderer); } diff --git a/src/main/java/com/minelittlepony/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/model/AbstractPonyModel.java index 7c7b270c..4810ea91 100644 --- a/src/main/java/com/minelittlepony/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/model/AbstractPonyModel.java @@ -73,7 +73,7 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel { * Checks flying and speed conditions and sets rainboom to true if we're a species with wings and is going faaast. */ protected void checkRainboom(Entity entity, float swing) { - rainboom = canFly() && Math.sqrt(entity.motionX * entity.motionX + entity.motionZ * entity.motionZ) > 0.4F; + rainboom = isSwimming() || canFly() && Math.sqrt(entity.motionX * entity.motionX + entity.motionZ * entity.motionZ) > 0.4F; } public void updateLivingState(EntityLivingBase entity, Pony pony) { @@ -222,7 +222,9 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel { * */ protected void rotateLegs(float move, float swing, float ticks, Entity entity) { - if (isFlying()) { + if (isSwimming()) { + rotateLegsSwimming(move, swing, ticks, entity); + } else if (isFlying()) { rotateLegsInFlight(move, swing, ticks, entity); } else { rotateLegsOnGround(move, swing, ticks, entity); @@ -256,6 +258,43 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel { bipedRightLeg.rotationPointZ = bipedLeftLeg.rotationPointZ = 10; } + /** + * Rotates legs in quopy fashion whilst swimming. + * + * @param move Entity motion parameter - i.e. velocity in no specific direction used in bipeds to calculate step amount. + * @param swing Degree to which each 'limb' swings. + * @param ticks Total whole and partial ticks since the entity's existance. Used in animations together with {@code swing} and {@code move}. + * @param entity The entity we're being called for. + * + */ + protected void rotateLegsSwimming(float move, float swing, float ticks, Entity entity) { + + float forward = ROTATE_270 - ROTATE_90/3; + float down = ROTATE_90; + + float leftX = down + MathHelper.sin((move / 3) + 2*PI/3) / 2; + float leftY = -forward - MathHelper.sin((move / 3) + 2*PI/3); + + float rightX = down + MathHelper.sin(move / 3) / 2; + float rightY = forward + MathHelper.sin(move / 3); + + + bipedLeftArm.rotateAngleX = leftX; + bipedLeftArm.rotateAngleY = leftY; + + bipedRightArm.rotateAngleY = rightY; + bipedRightArm.rotateAngleX = rightX; + + + + bipedLeftLeg.rotateAngleX = leftX; + bipedRightLeg.rotateAngleX = rightX; + + bipedLeftLeg.rotateAngleY = 0; + bipedRightLeg.rotateAngleY = 0; + + + } /** * Rotates legs in quopy fashion whilst flying. diff --git a/src/main/java/com/minelittlepony/model/player/PlayerModels.java b/src/main/java/com/minelittlepony/model/player/PlayerModels.java index b47eaae4..4f86f717 100644 --- a/src/main/java/com/minelittlepony/model/player/PlayerModels.java +++ b/src/main/java/com/minelittlepony/model/player/PlayerModels.java @@ -1,6 +1,11 @@ package com.minelittlepony.model.player; import com.minelittlepony.model.PMAPI; +import com.minelittlepony.render.player.RenderPonyPlayer; +import com.minelittlepony.render.player.RenderSeaponyPlayer; + +import net.minecraft.client.renderer.entity.RenderManager; + import com.minelittlepony.model.ModelWrapper; public enum PlayerModels { @@ -12,7 +17,12 @@ public enum PlayerModels { PEGASUS("pegasus", "slimpegasus", () -> PMAPI.pegasus, () -> PMAPI.pegasusSmall), UNICORN("unicorn", "slimunicorn", () -> PMAPI.unicorn, () -> PMAPI.unicornSmall), ALICORN("alicorn", "slimalicorn", () -> PMAPI.alicorn, () -> PMAPI.alicornSmall), - ZEBRA("zebra", "slimzebra", () -> PMAPI.zebra, () -> PMAPI.zebraSmall); + ZEBRA("zebra", "slimzebra", () -> PMAPI.zebra, () -> PMAPI.zebraSmall), + SEAPONY("seapony", "slimseapony", () -> PMAPI.seapony, () -> PMAPI.seapony) { + public RenderPonyPlayer createRenderer(RenderManager manager, boolean slimArms) { + return new RenderSeaponyPlayer(manager, slimArms, PlayerModels.UNICORN.getModel(slimArms), getModel(slimArms)); + } + }; private final ModelResolver normal, slim; @@ -34,6 +44,10 @@ public enum PlayerModels { return useSlimArms ? slimKey : normalKey; } + public RenderPonyPlayer createRenderer(RenderManager manager, boolean slimArms) { + return new RenderPonyPlayer(manager, slimArms, getModel(slimArms)); + } + /** * FIXME: PMAPI fields are null when the game starts. */ diff --git a/src/main/java/com/minelittlepony/model/ponies/ModelSeapony.java b/src/main/java/com/minelittlepony/model/ponies/ModelSeapony.java index a1250272..ef0565b7 100644 --- a/src/main/java/com/minelittlepony/model/ponies/ModelSeapony.java +++ b/src/main/java/com/minelittlepony/model/ponies/ModelSeapony.java @@ -92,8 +92,16 @@ public class ModelSeapony extends ModelUnicorn { bipedRightArm.rotateAngleY += 0.3F; } + + @Override + protected void rotateLegsSwimming(float move, float swing, float ticks, Entity entity) { + super.rotateLegsOnGround(move, swing, ticks, entity); + } + @Override public void render(Entity entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { + setVisible(bipedLeftArmwear.showModel); + GlStateManager.pushMatrix(); GlStateManager.translate(0, 0.6F, 0); super.render(entity, move, swing, ticks, headYaw, headPitch, scale); diff --git a/src/main/java/com/minelittlepony/pony/data/PonyData.java b/src/main/java/com/minelittlepony/pony/data/PonyData.java index eb11e93c..46accf3a 100644 --- a/src/main/java/com/minelittlepony/pony/data/PonyData.java +++ b/src/main/java/com/minelittlepony/pony/data/PonyData.java @@ -72,7 +72,7 @@ public class PonyData implements IPonyData { @Override public boolean hasMagic() { - return race != null && race.hasHorn() && glowColor != 0; + return race != null && getRace().hasHorn() && getGlowColor() != 0; } @Override diff --git a/src/main/java/com/minelittlepony/pony/data/PonyRace.java b/src/main/java/com/minelittlepony/pony/data/PonyRace.java index c659719b..3271d4c9 100644 --- a/src/main/java/com/minelittlepony/pony/data/PonyRace.java +++ b/src/main/java/com/minelittlepony/pony/data/PonyRace.java @@ -13,7 +13,8 @@ public enum PonyRace implements ITriggerPixelMapped { ZEBRA(0xd0cccf, PlayerModels.ZEBRA, false, false), REFORMED_CHANGELING(0xcaed5a, PlayerModels.ALICORN, true, true), GRIFFIN(0xae9145, PlayerModels.PEGASUS, true, false), - HIPPOGRIFF(0xd6ddac, PlayerModels.PEGASUS, true, false); + HIPPOGRIFF(0xd6ddac, PlayerModels.PEGASUS, true, false), + SEAPONY(0x333333, PlayerModels.SEAPONY, false, true); private boolean wings; private boolean horn; diff --git a/src/main/java/com/minelittlepony/render/player/RenderPonyPlayer.java b/src/main/java/com/minelittlepony/render/player/RenderPonyPlayer.java index 1f64eba5..63d1154c 100644 --- a/src/main/java/com/minelittlepony/render/player/RenderPonyPlayer.java +++ b/src/main/java/com/minelittlepony/render/player/RenderPonyPlayer.java @@ -93,8 +93,7 @@ public class RenderPonyPlayer extends RenderPlayer implements IRenderPony { public RenderPonyPlayer(RenderManager manager, boolean useSmallArms, ModelWrapper model) { super(manager, useSmallArms); - playerModel = model; - mainModel = ponyModel = playerModel.getBody(); + setPonyModel(model); layerRenderers.clear(); addLayers(); @@ -194,12 +193,14 @@ public class RenderPonyPlayer extends RenderPlayer implements IRenderPony { if (entity.isEntityAlive() && entity.isPlayerSleeping()) return null; + if (getModelWrapper().getBody().isSwimming()) { + return PonyPosture.SWIMMING; + } + if (getModelWrapper().getBody().isGoingFast()) { return PonyPosture.FLIGHT; } - //TODO: MC1.13 transformSwimming() - return PonyPosture.FALLING; } @@ -219,9 +220,13 @@ public class RenderPonyPlayer extends RenderPlayer implements IRenderPony { mainModel = ponyModel = playerModel.getBody(); } - protected void updateModel(AbstractClientPlayer player) { + protected void updatePony(AbstractClientPlayer player) { pony = MineLittlePony.getInstance().getManager().getPony(player); - playerModel.apply(pony.getMetadata()); + } + + protected void updateModel(AbstractClientPlayer player) { + updatePony(player); + getModelWrapper().apply(pony.getMetadata()); } @Override diff --git a/src/main/java/com/minelittlepony/render/player/RenderSeaponyPlayer.java b/src/main/java/com/minelittlepony/render/player/RenderSeaponyPlayer.java new file mode 100644 index 00000000..58856c16 --- /dev/null +++ b/src/main/java/com/minelittlepony/render/player/RenderSeaponyPlayer.java @@ -0,0 +1,28 @@ +package com.minelittlepony.render.player; + +import com.minelittlepony.model.ModelWrapper; + +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.RenderManager; + +public class RenderSeaponyPlayer extends RenderPonyPlayer { + + protected ModelWrapper seapony; + protected ModelWrapper normalPony; + + public RenderSeaponyPlayer(RenderManager manager, boolean useSmallArms, ModelWrapper model, ModelWrapper alternate) { + super(manager, useSmallArms, model); + + seapony = alternate; + normalPony = model; + } + + protected void updatePony(AbstractClientPlayer player) { + super.updatePony(player); + + boolean wet = pony.isFullySubmerged(player); + + setPonyModel(wet ? seapony : normalPony); + } + +} diff --git a/src/main/java/com/minelittlepony/transform/PonyPosture.java b/src/main/java/com/minelittlepony/transform/PonyPosture.java index d8561bf5..3dbbcb5c 100644 --- a/src/main/java/com/minelittlepony/transform/PonyPosture.java +++ b/src/main/java/com/minelittlepony/transform/PonyPosture.java @@ -7,6 +7,7 @@ import net.minecraft.entity.EntityLivingBase; public interface PonyPosture { PonyPosture ELYTRA = new PostureElytra(); PonyPosture FLIGHT = new PostureFlight(); + PonyPosture SWIMMING = new PostureSwimming(); PonyPosture FALLING = new PostureFalling(); default boolean applies(EntityLivingBase entity) { diff --git a/src/main/java/com/minelittlepony/transform/PostureFlight.java b/src/main/java/com/minelittlepony/transform/PostureFlight.java index 766033e0..761a0dd8 100644 --- a/src/main/java/com/minelittlepony/transform/PostureFlight.java +++ b/src/main/java/com/minelittlepony/transform/PostureFlight.java @@ -14,7 +14,7 @@ public class PostureFlight implements PonyPosture { return entity instanceof AbstractClientPlayer; } - private double calculateRoll(AbstractClientPlayer player, double motionX, double motionY, double motionZ) { + protected double calculateRoll(AbstractClientPlayer player, double motionX, double motionY, double motionZ) { // since model roll should probably be calculated from model rotation rather than entity rotation... double roll = MathUtil.sensibleAngle(player.prevRenderYawOffset - player.renderYawOffset); @@ -38,23 +38,22 @@ public class PostureFlight implements PonyPosture { return MathHelper.clamp(roll, -54, 54); } - - @Override - public void transform(AbstractPonyModel model, AbstractClientPlayer player, double motionX, double motionY, double motionZ, float pitch, float yaw, float ticks) { + protected double calculateIncline(AbstractClientPlayer player, double motionX, double motionY, double motionZ) { double dist = Math.sqrt(motionX * motionX + motionZ * motionZ); double angle = Math.atan2(motionY, dist); if (!player.capabilities.isFlying) { - if (angle > 0) { - angle = 0; - } else { - angle /= 2; - } + angle /= 2; } angle = MathUtil.clampLimit(angle, Math.PI / 3); - model.motionPitch = (float) Math.toDegrees(angle); + return Math.toDegrees(angle); + } + + @Override + public void transform(AbstractPonyModel model, AbstractClientPlayer player, double motionX, double motionY, double motionZ, float pitch, float yaw, float ticks) { + model.motionPitch = (float) calculateIncline(player, motionX, motionY, motionZ); GlStateManager.rotate(model.motionPitch, 1, 0, 0); diff --git a/src/main/java/com/minelittlepony/transform/PostureSwimming.java b/src/main/java/com/minelittlepony/transform/PostureSwimming.java new file mode 100644 index 00000000..c62ccc97 --- /dev/null +++ b/src/main/java/com/minelittlepony/transform/PostureSwimming.java @@ -0,0 +1,20 @@ +package com.minelittlepony.transform; + +import net.minecraft.client.entity.AbstractClientPlayer; + +public class PostureSwimming extends PostureFlight { + + @Override + protected double calculateRoll(AbstractClientPlayer player, double motionX, double motionY, double motionZ) { + + motionX *= 2; + motionZ *= 2; + + return super.calculateRoll(player, motionX, motionY, motionZ); + } + + @Override + protected double calculateIncline(AbstractClientPlayer player, double motionX, double motionY, double motionZ) { + return super.calculateIncline(player, motionX, motionY, motionZ); + } +}