-9 Removals
+6 Additions
public class HomingTask extends BukkitRunnable { public class ChasingTask extends BukkitRunnable {
private static final double MaxRotationAngle = 0.12;
private static final double TargetSpeed = 1.4;
Arrow arrow; Arrow arrow;
LivingEntity target; LivingEntity target;
public HomingTask(final Arrow arrow, final LivingEntity target, final Plugin plugin) { public ChasingTask(final Arrow arrow, final LivingEntity target, final ChasingArrows plugin) {
super(); super();
this.arrow = arrow; this.arrow = arrow;
this.target = target; this.target = target;
this.runTaskTimer(plugin, 1L, 1L); this.runTaskTimer((Plugin)plugin, 1L, 1L);
} }
public void run() { public void run() {
final double speed = this.arrow.getVelocity().length(); final double speed = this.arrow.getVelocity().length();
if (this.arrow.isOnGround() || this.arrow.isDead() || this.target.isDead()) { if (this.arrow.isOnGround() || this.arrow.isDead() || this.target.isDead()) {
this.cancel(); this.cancel();
return; return;
} }
final Vector toTarget = this.target.getLocation().clone().add(new Vector(0.0, 0.5, 0.0)).subtract(this.arrow.getLocation()).toVector(); final Vector toTarget = this.target.getLocation().clone().add(new Vector(0.0, 0.5, 0.0)).subtract(this.arrow.getLocation()).toVector();
final Vector dirVelocity = this.arrow.getVelocity().clone().normalize(); final Vector dirVelocity = this.arrow.getVelocity().clone().normalize();
final Vector dirToTarget = toTarget.clone().normalize(); final Vector dirToTarget = toTarget.clone().normalize();
final double angle = dirVelocity.angle(dirToTarget); final double angle = dirVelocity.angle(dirToTarget);
double newSpeed = 0.9 * speed + 0.13999999999999999; double newSpeed = 0.9 * speed + 0.14;
if (this.target instanceof Player && this.arrow.getLocation().distance(this.target.getLocation()) < 8.0) { if (this.target instanceof Player && this.arrow.getLocation().distance(this.target.getLocation()) < 8.0) {
final Player player = (Player)this.target; final Player player = (Player)this.target;
if (player.isBlocking()) { if (player.isBlocking()) {
newSpeed = speed * 0.6; newSpeed = speed * 0.6;
} }
} }
Vector newVelocity; Vector newVelocity;
if (angle < 0.12) { if (angle < 0.12) {
newVelocity = dirVelocity.clone().multiply(newSpeed); newVelocity = dirVelocity.clone().multiply(newSpeed);
} }
else { else {
final Vector newDir = dirVelocity.clone().multiply((angle - 0.12) / angle).add(dirToTarget.clone().multiply(0.12 / angle)); final Vector newDir = dirVelocity.clone().multiply((angle - 0.12) / angle).add(dirToTarget.clone().multiply(0.12 / angle));
newDir.normalize(); newDir.normalize();
newVelocity = newDir.clone().multiply(newSpeed); newVelocity = newDir.clone().multiply(newSpeed);
} }
this.arrow.setVelocity(newVelocity.add(new Vector(0.0, 0.03, 0.0))); this.arrow.setVelocity(newVelocity.add(new Vector(0.0, 0.03, 0.0)));
this.arrow.getWorld().playEffect(this.arrow.getLocation(), Effect.SMOKE, 0);
} }
}}
Editor
Original Text
Changed Text