Fixed boats breaking after collision
parent
872ed0c3af
commit
d79a72a835
@ -0,0 +1,359 @@
|
||||
package com.zivilon.cinder_loe.mixins;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import net.minecraft.entity.item.EntityBoat;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import lotr.common.item.LOTRWeaponStats;
|
||||
import net.minecraft.entity.projectile.EntityArrow;
|
||||
import net.minecraft.entity.item.EntityBoat;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.SharedMonsterAttributes;
|
||||
import net.minecraft.enchantment.EnchantmentHelper;
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import lotr.common.enchant.LOTREnchantmentHelper;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.network.play.server.S2BPacketChangeGameState;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import java.util.List;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.util.Vec3;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.material.Material;
|
||||
import java.util.List;
|
||||
import net.minecraft.entity.monster.EntityEnderman;
|
||||
|
||||
@Mixin(EntityBoat.class)
|
||||
public abstract class MixinEntityBoat extends Entity {
|
||||
|
||||
@Shadow private double speedMultiplier;
|
||||
@Shadow private int boatPosRotationIncrements;
|
||||
@Shadow private double boatPitch;
|
||||
@Shadow private double boatYaw;
|
||||
@Shadow private double boatX;
|
||||
@Shadow private double boatY;
|
||||
@Shadow private double boatZ;
|
||||
@Shadow private boolean isBoatEmpty;
|
||||
@Shadow public void setDamageTaken(float Shinare1){}
|
||||
@Shadow public float getDamageTaken(){return 0f;}
|
||||
@Shadow public int getTimeSinceHit(){return 0;}
|
||||
@Shadow void setTimeSinceHit(int Shinare2){}
|
||||
|
||||
|
||||
|
||||
|
||||
public MixinEntityBoat(World world) {
|
||||
super(world);
|
||||
}
|
||||
@Overwrite
|
||||
public void onUpdate()
|
||||
{
|
||||
super.onUpdate();
|
||||
|
||||
if (this.getTimeSinceHit() > 0)
|
||||
{
|
||||
this.setTimeSinceHit(this.getTimeSinceHit() - 1);
|
||||
}
|
||||
|
||||
if (this.getDamageTaken() > 0.0F)
|
||||
{
|
||||
this.setDamageTaken(this.getDamageTaken() - 1.0F);
|
||||
}
|
||||
|
||||
this.prevPosX = this.posX;
|
||||
this.prevPosY = this.posY;
|
||||
this.prevPosZ = this.posZ;
|
||||
byte b0 = 5;
|
||||
double d0 = 0.0D;
|
||||
|
||||
for (int i = 0; i < b0; ++i)
|
||||
{
|
||||
double d1 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(i + 0) / (double)b0 - 0.125D;
|
||||
double d3 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(i + 1) / (double)b0 - 0.125D;
|
||||
AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.boundingBox.minX, d1, this.boundingBox.minZ, this.boundingBox.maxX, d3, this.boundingBox.maxZ);
|
||||
|
||||
if (this.worldObj.isAABBInMaterial(axisalignedbb, Material.water))
|
||||
{
|
||||
d0 += 1.0D / (double)b0;
|
||||
}
|
||||
}
|
||||
|
||||
double d10 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
|
||||
double d2;
|
||||
double d4;
|
||||
int j;
|
||||
|
||||
if (d10 > 0.26249999999999996D)
|
||||
{
|
||||
d2 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D);
|
||||
d4 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D);
|
||||
|
||||
for (j = 0; (double)j < 1.0D + d10 * 60.0D; ++j)
|
||||
{
|
||||
double d5 = (double)(this.rand.nextFloat() * 2.0F - 1.0F);
|
||||
double d6 = (double)(this.rand.nextInt(2) * 2 - 1) * 0.7D;
|
||||
double d8;
|
||||
double d9;
|
||||
|
||||
if (this.rand.nextBoolean())
|
||||
{
|
||||
d8 = this.posX - d2 * d5 * 0.8D + d4 * d6;
|
||||
d9 = this.posZ - d4 * d5 * 0.8D - d2 * d6;
|
||||
this.worldObj.spawnParticle("splash", d8, this.posY - 0.125D, d9, this.motionX, this.motionY, this.motionZ);
|
||||
}
|
||||
else
|
||||
{
|
||||
d8 = this.posX + d2 + d4 * d5 * 0.7D;
|
||||
d9 = this.posZ + d4 - d2 * d5 * 0.7D;
|
||||
this.worldObj.spawnParticle("splash", d8, this.posY - 0.125D, d9, this.motionX, this.motionY, this.motionZ);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double d11;
|
||||
double d12;
|
||||
|
||||
if (this.worldObj.isRemote && this.isBoatEmpty)
|
||||
{
|
||||
if (this.boatPosRotationIncrements > 0)
|
||||
{
|
||||
d2 = this.posX + (this.boatX - this.posX) / (double)this.boatPosRotationIncrements;
|
||||
d4 = this.posY + (this.boatY - this.posY) / (double)this.boatPosRotationIncrements;
|
||||
d11 = this.posZ + (this.boatZ - this.posZ) / (double)this.boatPosRotationIncrements;
|
||||
d12 = MathHelper.wrapAngleTo180_double(this.boatYaw - (double)this.rotationYaw);
|
||||
this.rotationYaw = (float)((double)this.rotationYaw + d12 / (double)this.boatPosRotationIncrements);
|
||||
this.rotationPitch = (float)((double)this.rotationPitch + (this.boatPitch - (double)this.rotationPitch) / (double)this.boatPosRotationIncrements);
|
||||
--this.boatPosRotationIncrements;
|
||||
this.setPosition(d2, d4, d11);
|
||||
this.setRotation(this.rotationYaw, this.rotationPitch);
|
||||
}
|
||||
else
|
||||
{
|
||||
d2 = this.posX + this.motionX;
|
||||
d4 = this.posY + this.motionY;
|
||||
d11 = this.posZ + this.motionZ;
|
||||
this.setPosition(d2, d4, d11);
|
||||
|
||||
if (this.onGround)
|
||||
{
|
||||
this.motionX *= 0.5D;
|
||||
this.motionY *= 0.5D;
|
||||
this.motionZ *= 0.5D;
|
||||
}
|
||||
|
||||
this.motionX *= 0.9900000095367432D;
|
||||
this.motionY *= 0.949999988079071D;
|
||||
this.motionZ *= 0.9900000095367432D;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (d0 < 1.0D)
|
||||
{
|
||||
d2 = d0 * 2.0D - 1.0D;
|
||||
this.motionY += 0.03999999910593033D * d2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this.motionY < 0.0D)
|
||||
{
|
||||
this.motionY /= 2.0D;
|
||||
}
|
||||
|
||||
this.motionY += 0.007000000216066837D;
|
||||
}
|
||||
|
||||
if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase)
|
||||
{
|
||||
EntityLivingBase entitylivingbase = (EntityLivingBase)this.riddenByEntity;
|
||||
float f = this.riddenByEntity.rotationYaw + -entitylivingbase.moveStrafing * 90.0F;
|
||||
this.motionX += -Math.sin((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 0.05000000074505806D;
|
||||
this.motionZ += Math.cos((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 0.05000000074505806D;
|
||||
}
|
||||
|
||||
d2 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
|
||||
|
||||
if (d2 > 0.35D)
|
||||
{
|
||||
d4 = 0.35D / d2;
|
||||
this.motionX *= d4;
|
||||
this.motionZ *= d4;
|
||||
d2 = 0.35D;
|
||||
}
|
||||
|
||||
if (d2 > d10 && this.speedMultiplier < 0.35D)
|
||||
{
|
||||
this.speedMultiplier += (0.35D - this.speedMultiplier) / 35.0D;
|
||||
|
||||
if (this.speedMultiplier > 0.35D)
|
||||
{
|
||||
this.speedMultiplier = 0.35D;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.speedMultiplier -= (this.speedMultiplier - 0.07D) / 35.0D;
|
||||
|
||||
if (this.speedMultiplier < 0.07D)
|
||||
{
|
||||
this.speedMultiplier = 0.07D;
|
||||
}
|
||||
}
|
||||
|
||||
int l;
|
||||
|
||||
for (l = 0; l < 4; ++l)
|
||||
{
|
||||
int i1 = MathHelper.floor_double(this.posX + ((double)(l % 2) - 0.5D) * 0.8D);
|
||||
j = MathHelper.floor_double(this.posZ + ((double)(l / 2) - 0.5D) * 0.8D);
|
||||
|
||||
for (int j1 = 0; j1 < 2; ++j1)
|
||||
{
|
||||
int k = MathHelper.floor_double(this.posY) + j1;
|
||||
Block block = this.worldObj.getBlock(i1, k, j);
|
||||
|
||||
if (block == Blocks.snow_layer)
|
||||
{
|
||||
this.worldObj.setBlockToAir(i1, k, j);
|
||||
this.isCollidedHorizontally = false;
|
||||
}
|
||||
else if (block == Blocks.waterlily)
|
||||
{
|
||||
this.worldObj.func_147480_a(i1, k, j, true);
|
||||
this.isCollidedHorizontally = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this.onGround)
|
||||
{
|
||||
this.motionX *= 0.5D;
|
||||
this.motionY *= 0.5D;
|
||||
this.motionZ *= 0.5D;
|
||||
}
|
||||
|
||||
this.moveEntity(this.motionX, this.motionY, this.motionZ);
|
||||
this.motionX *= 0.9900000095367432D;
|
||||
this.motionY *= 0.949999988079071D;
|
||||
this.motionZ *= 0.9900000095367432D;
|
||||
this.rotationPitch = 0.0F;
|
||||
d4 = (double)this.rotationYaw;
|
||||
d11 = this.prevPosX - this.posX;
|
||||
d12 = this.prevPosZ - this.posZ;
|
||||
|
||||
if (d11 * d11 + d12 * d12 > 0.001D)
|
||||
{
|
||||
d4 = (double)((float)(Math.atan2(d12, d11) * 180.0D / Math.PI));
|
||||
}
|
||||
|
||||
double d7 = MathHelper.wrapAngleTo180_double(d4 - (double)this.rotationYaw);
|
||||
|
||||
if (d7 > 20.0D)
|
||||
{
|
||||
d7 = 20.0D;
|
||||
}
|
||||
|
||||
if (d7 < -20.0D)
|
||||
{
|
||||
d7 = -20.0D;
|
||||
}
|
||||
|
||||
this.rotationYaw = (float)((double)this.rotationYaw + d7);
|
||||
this.setRotation(this.rotationYaw, this.rotationPitch);
|
||||
|
||||
if (!this.worldObj.isRemote)
|
||||
{
|
||||
List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D));
|
||||
|
||||
if (list != null && !list.isEmpty())
|
||||
{
|
||||
for (int k1 = 0; k1 < list.size(); ++k1)
|
||||
{
|
||||
Entity entity = (Entity)list.get(k1);
|
||||
|
||||
if (entity != this.riddenByEntity && entity.canBePushed() && entity instanceof EntityBoat)
|
||||
{
|
||||
entity.applyEntityCollision(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this.riddenByEntity != null && this.riddenByEntity.isDead)
|
||||
{
|
||||
this.riddenByEntity = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void updateRiderPosition()
|
||||
{
|
||||
if (this.riddenByEntity != null)
|
||||
{
|
||||
double d0 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D;
|
||||
double d1 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D;
|
||||
this.riddenByEntity.setPosition(this.posX + d0, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + d1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* (abstract) Protected helper method to write subclass entity data to NBT.
|
||||
*/
|
||||
protected void writeEntityToNBT(NBTTagCompound p_70014_1_) {}
|
||||
|
||||
/**
|
||||
* (abstract) Protected helper method to read subclass entity data from NBT.
|
||||
*/
|
||||
protected void readEntityFromNBT(NBTTagCompound p_70037_1_) {}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public float getShadowSize()
|
||||
{
|
||||
return 0.0F;
|
||||
}
|
||||
|
||||
/**
|
||||
* First layer of player interaction
|
||||
*/
|
||||
public boolean interactFirst(EntityPlayer p_130002_1_)
|
||||
{
|
||||
if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != p_130002_1_)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!this.worldObj.isRemote)
|
||||
{
|
||||
p_130002_1_.mountEntity(this);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue