Pegasus wings flap slower when underwater

This commit is contained in:
Sollace 2018-06-03 22:23:32 +02:00
parent b879c979ce
commit d3efbc5c05
9 changed files with 44 additions and 22 deletions

View file

@ -31,13 +31,9 @@ import static com.minelittlepony.model.PonyModelConstants.*;
*/ */
public abstract class AbstractPonyModel extends ModelPlayer implements IModel { public abstract class AbstractPonyModel extends ModelPlayer implements IModel {
/**
* The model's current scale.
*/
protected float scale = 0.0625F;
public boolean isFlying; public boolean isFlying;
public boolean isSleeping; public boolean isSleeping;
public boolean isSwimming;
/** /**
* Associcated pony data. * Associcated pony data.
@ -660,6 +656,11 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel {
return isFlying && canFly(); return isFlying && canFly();
} }
@Override
public boolean isSwimming() {
return isSwimming;
}
@Override @Override
public boolean isChild() { public boolean isChild() {
return metadata.getSize() == PonySize.FOAL || isChild; return metadata.getSize() == PonySize.FOAL || isChild;
@ -691,7 +692,7 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel {
pushMatrix(); pushMatrix();
transform(BodyPart.NECK); transform(BodyPart.NECK);
renderNeck(); renderNeck(scale);
popMatrix(); popMatrix();
pushMatrix(); pushMatrix();
@ -701,7 +702,7 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel {
pushMatrix(); pushMatrix();
transform(BodyPart.LEGS); transform(BodyPart.LEGS);
renderLegs(); renderLegs(scale);
popMatrix(); popMatrix();
} }
@ -718,7 +719,7 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel {
bipedHead.postRender(scale); bipedHead.postRender(scale);
} }
protected void renderNeck() { protected void renderNeck(float scale) {
GlStateManager.scale(0.9, 0.9, 0.9); GlStateManager.scale(0.9, 0.9, 0.9);
neck.render(scale); neck.render(scale);
} }
@ -740,7 +741,7 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel {
tail.render(scale); tail.render(scale);
} }
protected void renderLegs() { protected void renderLegs(float scale) {
if (!isSneak) bipedBody.postRender(scale); if (!isSneak) bipedBody.postRender(scale);
bipedLeftArm.render(scale); bipedLeftArm.render(scale);

View file

@ -33,12 +33,12 @@ public class ModelPonyArmor extends AbstractPonyModel {
@Override @Override
protected void renderBody(Entity entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { protected void renderBody(Entity entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) {
flankGuard.render(this.scale); flankGuard.render(scale);
saddle.render(this.scale); saddle.render(scale);
} }
@Override @Override
protected void renderLegs() { protected void renderLegs(float scale) {
if (!isSneak) { if (!isSneak) {
boolean isLegs = saddle.showModel; boolean isLegs = saddle.showModel;
saddle.showModel = true; saddle.showModel = true;
@ -46,7 +46,7 @@ public class ModelPonyArmor extends AbstractPonyModel {
saddle.showModel = isLegs; saddle.showModel = isLegs;
} }
super.renderLegs(); super.renderLegs(scale);
} }
@Override @Override

View file

@ -36,6 +36,11 @@ public interface IModel {
*/ */
boolean isFlying(); boolean isFlying();
/**
* Returns true if this model is wimming underwater.
*/
boolean isSwimming();
/** /**
* Returns true if we're flying really fast. * Returns true if we're flying really fast.
*/ */

View file

@ -5,6 +5,6 @@ public interface IModelPegasus extends IModel {
* Returns true if the wings are spread. * Returns true if the wings are spread.
*/ */
default boolean wingsAreOpen() { default boolean wingsAreOpen() {
return isFlying() || isCrouching(); return isSwimming() || isFlying() || isCrouching();
} }
} }

View file

@ -56,8 +56,11 @@ public class PegasusWings implements IModelPart {
} }
public float getWingRotationFactor(float ticks) { public float getWingRotationFactor(float ticks) {
if (pegasus.isSwimming()) {
return (MathHelper.sin(ticks * 0.136f) / 2) + ROTATE_270;
}
if (pegasus.isFlying()) { if (pegasus.isFlying()) {
return (MathHelper.sin(ticks * 0.536f) * 1) + ROTATE_270 + 0.4f; return MathHelper.sin(ticks * 0.536f) + ROTATE_270 + 0.4f;
} }
return LEFT_WING_ROTATE_ANGLE_Z_SNEAK; return LEFT_WING_ROTATE_ANGLE_Z_SNEAK;
} }

View file

@ -20,9 +20,9 @@ public class ModelZebra extends ModelEarthPony {
} }
@Override @Override
protected void renderNeck() { protected void renderNeck(float scale) {
GlStateManager.scale(1, 1.1F, 1); GlStateManager.scale(1, 1.1F, 1);
super.renderNeck(); super.renderNeck(scale);
} }
@Override @Override
@ -38,13 +38,13 @@ public class ModelZebra extends ModelEarthPony {
super.initHeadPositions(yOffset, stretch); super.initHeadPositions(yOffset, stretch);
bristles.offset(-1, -1, -3) bristles.offset(-1, -1, -3)
.box(0, -10, 2, 2, 6, 2, scale) .box(0, -10, 2, 2, 6, 2, stretch)
.box(0, -10, 4, 2, 8, 2, scale) .box(0, -10, 4, 2, 8, 2, stretch)
.box(0, -8, 6, 2, 6, 2, scale) .box(0, -8, 6, 2, 6, 2, stretch)
.rotateAngleX = 0.3F; .rotateAngleX = 0.3F;
bristles.child(0).offset(-1.01F, 2, -7) //0.01 to prevent z-fighting bristles.child(0).offset(-1.01F, 2, -7) //0.01 to prevent z-fighting
.box(0, -10, 4, 2, 8, 2, scale) .box(0, -10, 4, 2, 8, 2, stretch)
.box(0, -8, 6, 2, 6, 2, scale) .box(0, -8, 6, 2, 6, 2, stretch)
.rotateAngleX = -1F; .rotateAngleX = -1F;
} }
} }

View file

@ -6,12 +6,15 @@ import com.minelittlepony.mixin.MixinThreadDownloadImageData;
import com.minelittlepony.model.ModelWrapper; import com.minelittlepony.model.ModelWrapper;
import com.voxelmodpack.hdskins.DynamicTextureImage; import com.voxelmodpack.hdskins.DynamicTextureImage;
import com.voxelmodpack.hdskins.ThreadDownloadImageETag; import com.voxelmodpack.hdskins.ThreadDownloadImageETag;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.ITextureObject; import net.minecraft.client.renderer.texture.ITextureObject;
import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.client.resources.IResource; import net.minecraft.client.resources.IResource;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -101,6 +104,14 @@ public class Pony {
!(entity.onGround || entity.isRiding() || entity.isOnLadder() || entity.isInWater()); !(entity.onGround || entity.isRiding() || entity.isOnLadder() || entity.isInWater());
} }
public boolean isSwimming(EntityLivingBase entity) {
return isFullySubmerged(entity) && !(entity.onGround || entity.isOnLadder());
}
public boolean isFullySubmerged(EntityLivingBase entity) {
return entity.isInWater() && entity.getEntityWorld().getBlockState(new BlockPos(entity.getPositionEyes(1))).getMaterial() == Material.WATER;
}
public ModelWrapper getModel(boolean ignorePony) { public ModelWrapper getModel(boolean ignorePony) {
return getRace(ignorePony).getModel().getModel(smallArms); return getRace(ignorePony).getModel().getModel(smallArms);
} }

View file

@ -64,6 +64,7 @@ public abstract class RenderPonyMob<T extends EntityLiving> extends RenderLiving
ponyModel.isSneak = entity.isSneaking(); ponyModel.isSneak = entity.isSneaking();
ponyModel.isSleeping = entity.isPlayerSleeping(); ponyModel.isSleeping = entity.isPlayerSleeping();
ponyModel.isFlying = pony.isPegasusFlying(entity); ponyModel.isFlying = pony.isPegasusFlying(entity);
ponyModel.isSwimming = pony.isSwimming(entity);
super.preRenderCallback(entity, ticks); super.preRenderCallback(entity, ticks);
shadowSize = getShadowScale(); shadowSize = getShadowScale();

View file

@ -53,6 +53,7 @@ public abstract class RenderPonyBase extends RenderPlayer implements IRenderPony
ponyModel.isSneak = player.isSneaking(); ponyModel.isSneak = player.isSneaking();
ponyModel.isSleeping = player.isPlayerSleeping(); ponyModel.isSleeping = player.isPlayerSleeping();
ponyModel.isFlying = pony.isPegasusFlying(player); ponyModel.isFlying = pony.isPegasusFlying(player);
ponyModel.isSwimming = pony.isSwimming(player);
super.preRenderCallback(player, ticks); super.preRenderCallback(player, ticks);
shadowSize = getShadowScale(); shadowSize = getShadowScale();