This commit is contained in:
Sollace 2018-06-29 18:36:03 +02:00
parent 04b852ce7e
commit f520998365
11 changed files with 137 additions and 22 deletions

View file

@ -47,7 +47,7 @@ public class PonyRenderManager {
} }
private void addPlayerSkin(RenderManager manager, boolean slimArms, PlayerModels playerModel) { 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); ((MixinRenderManager)manager).getSkinMap().put(playerModel.getId(slimArms), renderer);
} }

View file

@ -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. * 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) { 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) { 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) { 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); rotateLegsInFlight(move, swing, ticks, entity);
} else { } else {
rotateLegsOnGround(move, swing, ticks, entity); rotateLegsOnGround(move, swing, ticks, entity);
@ -256,6 +258,43 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel {
bipedRightLeg.rotationPointZ = bipedLeftLeg.rotationPointZ = 10; 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. * Rotates legs in quopy fashion whilst flying.

View file

@ -1,6 +1,11 @@
package com.minelittlepony.model.player; package com.minelittlepony.model.player;
import com.minelittlepony.model.PMAPI; 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; import com.minelittlepony.model.ModelWrapper;
public enum PlayerModels { public enum PlayerModels {
@ -12,7 +17,12 @@ public enum PlayerModels {
PEGASUS("pegasus", "slimpegasus", () -> PMAPI.pegasus, () -> PMAPI.pegasusSmall), PEGASUS("pegasus", "slimpegasus", () -> PMAPI.pegasus, () -> PMAPI.pegasusSmall),
UNICORN("unicorn", "slimunicorn", () -> PMAPI.unicorn, () -> PMAPI.unicornSmall), UNICORN("unicorn", "slimunicorn", () -> PMAPI.unicorn, () -> PMAPI.unicornSmall),
ALICORN("alicorn", "slimalicorn", () -> PMAPI.alicorn, () -> PMAPI.alicornSmall), 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; private final ModelResolver normal, slim;
@ -34,6 +44,10 @@ public enum PlayerModels {
return useSlimArms ? slimKey : normalKey; 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. * FIXME: PMAPI fields are null when the game starts.
*/ */

View file

@ -92,8 +92,16 @@ public class ModelSeapony extends ModelUnicorn {
bipedRightArm.rotateAngleY += 0.3F; bipedRightArm.rotateAngleY += 0.3F;
} }
@Override
protected void rotateLegsSwimming(float move, float swing, float ticks, Entity entity) {
super.rotateLegsOnGround(move, swing, ticks, entity);
}
@Override @Override
public void render(Entity entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { public void render(Entity entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) {
setVisible(bipedLeftArmwear.showModel);
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
GlStateManager.translate(0, 0.6F, 0); GlStateManager.translate(0, 0.6F, 0);
super.render(entity, move, swing, ticks, headYaw, headPitch, scale); super.render(entity, move, swing, ticks, headYaw, headPitch, scale);

View file

@ -72,7 +72,7 @@ public class PonyData implements IPonyData {
@Override @Override
public boolean hasMagic() { public boolean hasMagic() {
return race != null && race.hasHorn() && glowColor != 0; return race != null && getRace().hasHorn() && getGlowColor() != 0;
} }
@Override @Override

View file

@ -13,7 +13,8 @@ public enum PonyRace implements ITriggerPixelMapped<PonyRace> {
ZEBRA(0xd0cccf, PlayerModels.ZEBRA, false, false), ZEBRA(0xd0cccf, PlayerModels.ZEBRA, false, false),
REFORMED_CHANGELING(0xcaed5a, PlayerModels.ALICORN, true, true), REFORMED_CHANGELING(0xcaed5a, PlayerModels.ALICORN, true, true),
GRIFFIN(0xae9145, PlayerModels.PEGASUS, true, false), 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 wings;
private boolean horn; private boolean horn;

View file

@ -93,8 +93,7 @@ public class RenderPonyPlayer extends RenderPlayer implements IRenderPony {
public RenderPonyPlayer(RenderManager manager, boolean useSmallArms, ModelWrapper model) { public RenderPonyPlayer(RenderManager manager, boolean useSmallArms, ModelWrapper model) {
super(manager, useSmallArms); super(manager, useSmallArms);
playerModel = model; setPonyModel(model);
mainModel = ponyModel = playerModel.getBody();
layerRenderers.clear(); layerRenderers.clear();
addLayers(); addLayers();
@ -194,12 +193,14 @@ public class RenderPonyPlayer extends RenderPlayer implements IRenderPony {
if (entity.isEntityAlive() && entity.isPlayerSleeping()) return null; if (entity.isEntityAlive() && entity.isPlayerSleeping()) return null;
if (getModelWrapper().getBody().isSwimming()) {
return PonyPosture.SWIMMING;
}
if (getModelWrapper().getBody().isGoingFast()) { if (getModelWrapper().getBody().isGoingFast()) {
return PonyPosture.FLIGHT; return PonyPosture.FLIGHT;
} }
//TODO: MC1.13 transformSwimming()
return PonyPosture.FALLING; return PonyPosture.FALLING;
} }
@ -219,9 +220,13 @@ public class RenderPonyPlayer extends RenderPlayer implements IRenderPony {
mainModel = ponyModel = playerModel.getBody(); mainModel = ponyModel = playerModel.getBody();
} }
protected void updateModel(AbstractClientPlayer player) { protected void updatePony(AbstractClientPlayer player) {
pony = MineLittlePony.getInstance().getManager().getPony(player); pony = MineLittlePony.getInstance().getManager().getPony(player);
playerModel.apply(pony.getMetadata()); }
protected void updateModel(AbstractClientPlayer player) {
updatePony(player);
getModelWrapper().apply(pony.getMetadata());
} }
@Override @Override

View file

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

View file

@ -7,6 +7,7 @@ import net.minecraft.entity.EntityLivingBase;
public interface PonyPosture<T extends EntityLivingBase> { public interface PonyPosture<T extends EntityLivingBase> {
PonyPosture<EntityLivingBase> ELYTRA = new PostureElytra(); PonyPosture<EntityLivingBase> ELYTRA = new PostureElytra();
PonyPosture<? extends EntityLivingBase> FLIGHT = new PostureFlight(); PonyPosture<? extends EntityLivingBase> FLIGHT = new PostureFlight();
PonyPosture<? extends EntityLivingBase> SWIMMING = new PostureSwimming();
PonyPosture<EntityLivingBase> FALLING = new PostureFalling(); PonyPosture<EntityLivingBase> FALLING = new PostureFalling();
default boolean applies(EntityLivingBase entity) { default boolean applies(EntityLivingBase entity) {

View file

@ -14,7 +14,7 @@ public class PostureFlight implements PonyPosture<AbstractClientPlayer> {
return entity instanceof AbstractClientPlayer; 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... // since model roll should probably be calculated from model rotation rather than entity rotation...
double roll = MathUtil.sensibleAngle(player.prevRenderYawOffset - player.renderYawOffset); double roll = MathUtil.sensibleAngle(player.prevRenderYawOffset - player.renderYawOffset);
@ -38,23 +38,22 @@ public class PostureFlight implements PonyPosture<AbstractClientPlayer> {
return MathHelper.clamp(roll, -54, 54); return MathHelper.clamp(roll, -54, 54);
} }
protected double calculateIncline(AbstractClientPlayer player, double motionX, double motionY, double motionZ) {
@Override
public void transform(AbstractPonyModel model, AbstractClientPlayer player, double motionX, double motionY, double motionZ, float pitch, float yaw, float ticks) {
double dist = Math.sqrt(motionX * motionX + motionZ * motionZ); double dist = Math.sqrt(motionX * motionX + motionZ * motionZ);
double angle = Math.atan2(motionY, dist); double angle = Math.atan2(motionY, dist);
if (!player.capabilities.isFlying) { if (!player.capabilities.isFlying) {
if (angle > 0) { angle /= 2;
angle = 0;
} else {
angle /= 2;
}
} }
angle = MathUtil.clampLimit(angle, Math.PI / 3); 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); GlStateManager.rotate(model.motionPitch, 1, 0, 0);

View file

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