240 lines
9.1 KiB
Diff
240 lines
9.1 KiB
Diff
--- ../src-base/minecraft/net/minecraft/entity/item/EntityBoat.java
|
|
+++ ../src-work/minecraft/net/minecraft/entity/item/EntityBoat.java
|
|
@@ -17,6 +17,16 @@
|
|
import net.minecraft.util.MathHelper;
|
|
import net.minecraft.world.World;
|
|
|
|
+// CraftBukkit start
|
|
+import org.bukkit.Location;
|
|
+import org.bukkit.craftbukkit.event.CraftEventFactory;
|
|
+import org.bukkit.entity.Vehicle;
|
|
+import org.bukkit.event.vehicle.VehicleDamageEvent;
|
|
+import org.bukkit.event.vehicle.VehicleDestroyEvent;
|
|
+import org.bukkit.event.vehicle.VehicleEntityCollisionEvent;
|
|
+import org.bukkit.event.vehicle.VehicleMoveEvent;
|
|
+// CraftBukkit end
|
|
+
|
|
public class EntityBoat extends Entity
|
|
{
|
|
private boolean isBoatEmpty;
|
|
@@ -35,6 +45,32 @@
|
|
private double velocityZ;
|
|
private static final String __OBFID = "CL_00001667";
|
|
|
|
+ // CraftBukkit start
|
|
+ public double maxSpeed = 0.4D;
|
|
+ public double occupiedDeceleration = 0.2D;
|
|
+ public double unoccupiedDeceleration = -1;
|
|
+ public boolean landBoats = false;
|
|
+
|
|
+ @Override
|
|
+
|
|
+ /**
|
|
+ * Applies a velocity to each of the entities pushing them away from each other. Args: entity
|
|
+ */
|
|
+ public void applyEntityCollision(Entity entity)
|
|
+ {
|
|
+ org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity();
|
|
+ VehicleEntityCollisionEvent event = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), hitEntity);
|
|
+ this.worldObj.getServer().getPluginManager().callEvent(event);
|
|
+
|
|
+ if (event.isCancelled())
|
|
+ {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ super.applyEntityCollision(entity);
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
public EntityBoat(World p_i1704_1_)
|
|
{
|
|
super(p_i1704_1_);
|
|
@@ -82,6 +118,7 @@
|
|
this.prevPosX = p_i1705_2_;
|
|
this.prevPosY = p_i1705_4_;
|
|
this.prevPosZ = p_i1705_6_;
|
|
+ this.worldObj.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit
|
|
}
|
|
|
|
public double getMountedYOffset()
|
|
@@ -97,6 +134,19 @@
|
|
}
|
|
else if (!this.worldObj.isRemote && !this.isDead)
|
|
{
|
|
+ // CraftBukkit start
|
|
+ Vehicle vehicle = (Vehicle) this.getBukkitEntity();
|
|
+ org.bukkit.entity.Entity attacker = (p_70097_1_.getEntity() == null) ? null : p_70097_1_.getEntity().getBukkitEntity();
|
|
+ VehicleDamageEvent event = new VehicleDamageEvent(vehicle, attacker, (double) p_70097_2_);
|
|
+ this.worldObj.getServer().getPluginManager().callEvent(event);
|
|
+
|
|
+ if (event.isCancelled())
|
|
+ {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ // f = event.getDamage(); // TODO Why don't we do this?
|
|
+ // CraftBukkit end
|
|
this.setForwardDirection(-this.getForwardDirection());
|
|
this.setTimeSinceHit(10);
|
|
this.setDamageTaken(this.getDamageTaken() + p_70097_2_ * 10.0F);
|
|
@@ -105,6 +155,18 @@
|
|
|
|
if (flag || this.getDamageTaken() > 40.0F)
|
|
{
|
|
+ // CraftBukkit start
|
|
+ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker);
|
|
+ this.worldObj.getServer().getPluginManager().callEvent(destroyEvent);
|
|
+
|
|
+ if (destroyEvent.isCancelled())
|
|
+ {
|
|
+ this.setDamageTaken(40F); // Maximize damage so this doesn't get triggered again right away
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
+
|
|
if (this.riddenByEntity != null)
|
|
{
|
|
this.riddenByEntity.mountEntity(this);
|
|
@@ -181,6 +243,13 @@
|
|
|
|
public void onUpdate()
|
|
{
|
|
+ // CraftBukkit start
|
|
+ double prevX = this.posX;
|
|
+ double prevY = this.posY;
|
|
+ double prevZ = this.posZ;
|
|
+ float prevYaw = this.rotationYaw;
|
|
+ float prevPitch = this.rotationPitch;
|
|
+ // CraftBukkit end
|
|
super.onUpdate();
|
|
|
|
if (this.getTimeSinceHit() > 0)
|
|
@@ -303,7 +372,25 @@
|
|
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;
|
|
}
|
|
+ // CraftBukkit start - Support unoccupied deceleration
|
|
+ else if (unoccupiedDeceleration >= 0)
|
|
+ {
|
|
+ this.motionX *= unoccupiedDeceleration;
|
|
+ this.motionZ *= unoccupiedDeceleration;
|
|
|
|
+ // Kill lingering speed
|
|
+ if (motionX <= 0.00001)
|
|
+ {
|
|
+ motionX = 0;
|
|
+ }
|
|
+
|
|
+ if (motionZ <= 0.00001)
|
|
+ {
|
|
+ motionZ = 0;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
d2 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
|
|
|
|
if (d2 > 0.35D)
|
|
@@ -347,18 +434,32 @@
|
|
|
|
if (block == Blocks.snow_layer)
|
|
{
|
|
+ // CraftBukkit start
|
|
+ if (CraftEventFactory.callEntityChangeBlockEvent(this, i1, k, j, Blocks.air, 0).isCancelled())
|
|
+ {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
this.worldObj.setBlockToAir(i1, k, j);
|
|
this.isCollidedHorizontally = false;
|
|
}
|
|
else if (block == Blocks.waterlily)
|
|
{
|
|
+ // CraftBukkit start
|
|
+ if (CraftEventFactory.callEntityChangeBlockEvent(this, i1, k, j, Blocks.air, 0).isCancelled())
|
|
+ {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
this.worldObj.func_147480_a(i1, k, j, true);
|
|
this.isCollidedHorizontally = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
- if (this.onGround)
|
|
+ if (this.onGround && !this.landBoats) // CraftBukkit
|
|
{
|
|
this.motionX *= 0.5D;
|
|
this.motionY *= 0.5D;
|
|
@@ -371,17 +472,27 @@
|
|
{
|
|
if (!this.worldObj.isRemote && !this.isDead)
|
|
{
|
|
- this.setDead();
|
|
+ // CraftBukkit start
|
|
+ Vehicle vehicle = (Vehicle) this.getBukkitEntity();
|
|
+ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null);
|
|
+ this.worldObj.getServer().getPluginManager().callEvent(destroyEvent);
|
|
|
|
- for (l = 0; l < 3; ++l)
|
|
+ if (!destroyEvent.isCancelled())
|
|
{
|
|
- this.func_145778_a(Item.getItemFromBlock(Blocks.planks), 1, 0.0F);
|
|
- }
|
|
+ this.setDead();
|
|
|
|
- for (l = 0; l < 2; ++l)
|
|
- {
|
|
- this.func_145778_a(Items.stick, 1, 0.0F);
|
|
+ for (l = 0; l < 3; ++l)
|
|
+ {
|
|
+ this.func_145778_a(Item.getItemFromBlock(Blocks.planks), 1, 0.0F);
|
|
+ }
|
|
+
|
|
+ for (l = 0; l < 2; ++l)
|
|
+ {
|
|
+ this.func_145778_a(Items.stick, 1, 0.0F);
|
|
+ }
|
|
}
|
|
+
|
|
+ // CraftBukkit end
|
|
}
|
|
}
|
|
else
|
|
@@ -415,7 +526,22 @@
|
|
|
|
this.rotationYaw = (float)((double)this.rotationYaw + d7);
|
|
this.setRotation(this.rotationYaw, this.rotationPitch);
|
|
+ // CraftBukkit start
|
|
+ org.bukkit.Server server = this.worldObj.getServer();
|
|
+ org.bukkit.World bworld = this.worldObj.getWorld();
|
|
+ Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch);
|
|
+ Location to = new Location(bworld, this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
|
|
+ Vehicle vehicle = (Vehicle) this.getBukkitEntity();
|
|
+ server.getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle));
|
|
|
|
+ if (!from.equals(to))
|
|
+ {
|
|
+ VehicleMoveEvent event = new VehicleMoveEvent(vehicle, from, to);
|
|
+ server.getPluginManager().callEvent(event);
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
+
|
|
if (!this.worldObj.isRemote)
|
|
{
|
|
List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D));
|
|
@@ -435,6 +561,7 @@
|
|
|
|
if (this.riddenByEntity != null && this.riddenByEntity.isDead)
|
|
{
|
|
+ this.riddenByEntity.ridingEntity = null; // CraftBukkit
|
|
this.riddenByEntity = null;
|
|
}
|
|
}
|