diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityBoat.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityBoat.java new file mode 100644 index 0000000..56ba8db --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/mixins/MixinEntityBoat.java @@ -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; + } + } +} + diff --git a/src/main/resources/mixins.cinder_loe.json b/src/main/resources/mixins.cinder_loe.json index fbf809e..0dbda23 100644 --- a/src/main/resources/mixins.cinder_loe.json +++ b/src/main/resources/mixins.cinder_loe.json @@ -9,6 +9,7 @@ "MixinEnchantmentHelper", "MixinEntity", "MixinEntityArrow", + "MixinEntityBoat", "MixinItemRenderer", "MixinLOTRArmorModels", "MixinLOTRBrewingRecipes",