You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
9.1 KiB
239 lines
9.1 KiB
--- ../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; |
|
} |
|
}
|
|
|