blob: 56bf93e7c4112ece3e24a995f86cc1d4a14d9511 [file] [log] [blame] [raw]
package com.legacy.aether.entities.util;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.potion.Potion;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import com.legacy.aether.entities.passive.EntityAetherAnimal;
import com.legacy.aether.player.PlayerAether;
public abstract class EntityMountable extends EntityAetherAnimal {
protected float jumpPower;
protected int field_110285_bP;
protected boolean mountJumping;
protected boolean playStepSound = false;
protected boolean canJumpMidAir = false;
public EntityMountable(World world) {
super(world);
}
@Override
public void entityInit() {
super.entityInit();
this.dataWatcher.addObject(17, new Byte((byte) 0)); //onGroundClient
this.dataWatcher.addObject(18, new Byte((byte) 0));
}
@Override
public boolean canRiderInteract() {
return true;
}
@Override
public boolean shouldDismountInWater(Entity rider) {
return false;
}
public boolean isOnGround() {
return this.dataWatcher.getWatchableObjectByte(17) == (byte) 1;
}
private void setOnGround(boolean onGround) {
this.dataWatcher.updateObject(17, (byte) (onGround ? 1 : 0));
}
public boolean isRiderSneaking() {
return this.dataWatcher.getWatchableObjectByte(18) == (byte) 1;
}
public void setRiderSneaking(boolean riderSneaking) {
this.dataWatcher.updateObject(18, (byte) (riderSneaking ? 1 : 0));
}
@Override
public void onUpdate() {
super.onUpdate();
if (!this.worldObj.isRemote) {
if (this.onGround != this.isOnGround()) {
this.setOnGround(this.onGround);
}
this.updateRider();
}
}
public void updateRider() {
if (this.canDismount() && this.riddenByEntity instanceof EntityPlayer) {
PlayerAether playerAether = PlayerAether.get((EntityPlayer) this.riddenByEntity);
if (playerAether.isMountSneaking()) {
if (this.onGround) {
this.riddenByEntity.mountEntity(null);
playerAether.setMountSneaking(false);
}
this.setRiderSneaking(true);
} else {
this.setRiderSneaking(false);
}
}
}
private float updateRotation(float angle, float targetAngle, float maxIncrease) {
float f = MathHelper.wrapAngleTo180_float(targetAngle - angle);
if (f > maxIncrease) {
f = maxIncrease;
}
if (f < -maxIncrease) {
f = -maxIncrease;
}
return angle + f;
}
@Override
public void moveEntityWithHeading(float par1, float par2) {
Entity entity = this.riddenByEntity;
if (entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) entity;
this.prevRotationYaw = this.rotationYaw = player.rotationYaw;
this.prevRotationPitch = this.rotationPitch = player.rotationPitch;
this.rotationYawHead = player.rotationYawHead;
par1 = player.moveStrafing;
par2 = player.moveForward;
if (par2 <= 0.0F) {
par2 *= 0.25F;
this.field_110285_bP = 0;
}
double d01 = player.posX - this.posX;
double d2 = player.posZ - this.posZ;
float f = (float) (Math.atan2(d2, d01) * (180D / Math.PI)) - 90.0F;
if (player.moveStrafing != 0.0F && player.worldObj.isRemote) {
this.rotationYaw = this.updateRotation(this.rotationYaw, f, 40.0F);
}
if (PlayerAether.get(player).isJumping()) {
onMountedJump(par1, par2);
}
if (this.jumpPower > 0.0F && !this.isMountJumping() && (this.onGround || this.canJumpMidAir)) {
this.motionY = this.getMountJumpStrength() * (double) this.jumpPower;
if (this.isPotionActive(Potion.jump)) {
this.motionY += (double) ((float) (this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.1F);
}
this.setMountJumping(true);
this.isAirBorne = true;
this.jumpPower = 0.0F;
if (!this.worldObj.isRemote) {
this.moveEntity(this.motionX, this.motionY, this.motionZ);
}
}
this.motionX *= 0.35F;
this.motionZ *= 0.35F;
this.stepHeight = 1.0F;
if (!this.worldObj.isRemote) {
this.jumpMovementFactor = this.getAIMoveSpeed() * 0.6F;
super.moveEntityWithHeading(par1, par2);
}
if (this.onGround) {
this.jumpPower = 0.0F;
this.setMountJumping(false);
}
this.prevLimbSwingAmount = this.limbSwingAmount;
double d0 = this.posX - this.prevPosX;
double d1 = this.posZ - this.prevPosZ;
float f4 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F;
if (f4 > 1.0F) {
f4 = 1.0F;
}
this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F;
this.limbSwing += this.limbSwingAmount;
} else {
this.stepHeight = 0.5F;
this.jumpMovementFactor = 0.02F;
super.moveEntityWithHeading(par1, par2);
}
}
@Override
public float getAIMoveSpeed() {
return this.riddenByEntity != null ? this.getMountedMoveSpeed() : super.getAIMoveSpeed();
}
@Override
protected void func_145780_a(int x, int y, int z, Block block) {
}
public float getMountedMoveSpeed() {
return 0.15F;
}
protected double getMountJumpStrength() {
return 1.0D;
}
protected void setMountJumping(boolean mountJumping) {
this.mountJumping = mountJumping;
}
protected boolean isMountJumping() {
return this.mountJumping;
}
public void onMountedJump(float par1, float par2) {
this.jumpPower = 0.4F;
}
public boolean canDismount() {
return true;
}
}