--- a/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.java +++ b/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.java @@ -45,6 +45,14 @@ import net.minecraft.world.phys.AxisAlignedBB; import net.minecraft.world.phys.Vec3D; +// CraftBukkit start +import org.bukkit.Location; +import org.bukkit.craftbukkit.util.CraftLocation; +import org.bukkit.entity.Vehicle; +import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; +import org.bukkit.util.Vector; +// CraftBukkit end + public abstract class EntityMinecartAbstract extends VehicleEntity { private static final Vec3D LOWERED_PASSENGER_ATTACHMENT = new Vec3D(0.0D, 0.0D, 0.0D); @@ -69,6 +77,17 @@ return ImmutableMap.of(BlockPropertyTrackPosition.NORTH_SOUTH, Pair.of(baseblockposition2, baseblockposition3), BlockPropertyTrackPosition.EAST_WEST, Pair.of(baseblockposition, baseblockposition1), BlockPropertyTrackPosition.ASCENDING_EAST, Pair.of(baseblockposition4, baseblockposition1), BlockPropertyTrackPosition.ASCENDING_WEST, Pair.of(baseblockposition, baseblockposition5), BlockPropertyTrackPosition.ASCENDING_NORTH, Pair.of(baseblockposition2, baseblockposition7), BlockPropertyTrackPosition.ASCENDING_SOUTH, Pair.of(baseblockposition6, baseblockposition3), BlockPropertyTrackPosition.SOUTH_EAST, Pair.of(baseblockposition3, baseblockposition1), BlockPropertyTrackPosition.SOUTH_WEST, Pair.of(baseblockposition3, baseblockposition), BlockPropertyTrackPosition.NORTH_WEST, Pair.of(baseblockposition2, baseblockposition), BlockPropertyTrackPosition.NORTH_EAST, Pair.of(baseblockposition2, baseblockposition1)); })); + // CraftBukkit start + public boolean slowWhenEmpty = true; + private double derailedX = 0.5; + private double derailedY = 0.5; + private double derailedZ = 0.5; + private double flyingX = 0.95; + private double flyingY = 0.95; + private double flyingZ = 0.95; + public Double maxSpeed; + // CraftBukkit end + protected EntityMinecartAbstract(EntityTypes entitytypes, World world) { super(entitytypes, world); this.flipped = false; @@ -251,6 +270,14 @@ @Override public void tick() { + // CraftBukkit start + double prevX = this.getX(); + double prevY = this.getY(); + double prevZ = this.getZ(); + float prevYaw = this.getYRot(); + float prevPitch = this.getXRot(); + // CraftBukkit end + if (this.getHurtTime() > 0) { this.setHurtTime(this.getHurtTime() - 1); } @@ -260,8 +287,20 @@ } this.checkBelowWorld(); - this.handlePortal(); + // this.handlePortal(); // CraftBukkit - handled in postTick this.behavior.tick(); + // CraftBukkit start + org.bukkit.World bworld = this.level().getWorld(); + Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); + Location to = CraftLocation.toBukkit(this.position(), bworld, this.getYRot(), this.getXRot()); + Vehicle vehicle = (Vehicle) this.getBukkitEntity(); + + this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); + + if (!from.equals(to)) { + this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); + } + // CraftBukkit end this.updateInWaterStateAndDoFluidPushing(); if (this.isInLava()) { this.lavaIgnite(); @@ -345,12 +384,16 @@ this.setDeltaMovement(MathHelper.clamp(vec3d.x, -d0, d0), vec3d.y, MathHelper.clamp(vec3d.z, -d0, d0)); if (this.onGround()) { - this.setDeltaMovement(this.getDeltaMovement().scale(0.5D)); + // CraftBukkit start - replace magic numbers with our variables + this.setDeltaMovement(new Vec3D(this.getDeltaMovement().x * this.derailedX, this.getDeltaMovement().y * this.derailedY, this.getDeltaMovement().z * this.derailedZ)); + // CraftBukkit end } this.move(EnumMoveType.SELF, this.getDeltaMovement()); if (!this.onGround()) { - this.setDeltaMovement(this.getDeltaMovement().scale(0.95D)); + // CraftBukkit start - replace magic numbers with our variables + this.setDeltaMovement(new Vec3D(this.getDeltaMovement().x * this.flyingX, this.getDeltaMovement().y * this.flyingY, this.getDeltaMovement().z * this.flyingZ)); + // CraftBukkit end } } @@ -485,6 +528,14 @@ if (!this.level().isClientSide) { if (!entity.noPhysics && !this.noPhysics) { if (!this.hasPassenger(entity)) { + // CraftBukkit start + VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), entity.getBukkitEntity()); + this.level().getCraftServer().getPluginManager().callEvent(collisionEvent); + + if (collisionEvent.isCancelled()) { + return; + } + // CraftBukkit end double d0 = entity.getX() - this.getX(); double d1 = entity.getZ() - this.getZ(); double d2 = d0 * d0 + d1 * d1; @@ -603,4 +654,26 @@ public boolean isFurnace() { return false; } + + // CraftBukkit start - Methods for getting and setting flying and derailed velocity modifiers + public Vector getFlyingVelocityMod() { + return new Vector(flyingX, flyingY, flyingZ); + } + + public void setFlyingVelocityMod(Vector flying) { + flyingX = flying.getX(); + flyingY = flying.getY(); + flyingZ = flying.getZ(); + } + + public Vector getDerailedVelocityMod() { + return new Vector(derailedX, derailedY, derailedZ); + } + + public void setDerailedVelocityMod(Vector derailed) { + derailedX = derailed.getX(); + derailedY = derailed.getY(); + derailedZ = derailed.getZ(); + } + // CraftBukkit end }