diff --git a/paper-api/src/main/java/org/bukkit/entity/Arrow.java b/paper-api/src/main/java/org/bukkit/entity/Arrow.java index 79a8ac86aa..26d3473980 100644 --- a/paper-api/src/main/java/org/bukkit/entity/Arrow.java +++ b/paper-api/src/main/java/org/bukkit/entity/Arrow.java @@ -2,7 +2,5 @@ package org.bukkit.entity; /** * Represents an arrow. - * - * @author sk89q */ -public interface Arrow extends Entity {} +public interface Arrow extends Projectile {} diff --git a/paper-api/src/main/java/org/bukkit/entity/Egg.java b/paper-api/src/main/java/org/bukkit/entity/Egg.java index 29434d6f97..e60c8025e0 100644 --- a/paper-api/src/main/java/org/bukkit/entity/Egg.java +++ b/paper-api/src/main/java/org/bukkit/entity/Egg.java @@ -2,7 +2,5 @@ package org.bukkit.entity; /** * Represents an egg. - * - * @author sk89q */ -public interface Egg extends Entity {} +public interface Egg extends Projectile {} diff --git a/paper-api/src/main/java/org/bukkit/entity/Fireball.java b/paper-api/src/main/java/org/bukkit/entity/Fireball.java index 20e68fc882..95c60f8bce 100644 --- a/paper-api/src/main/java/org/bukkit/entity/Fireball.java +++ b/paper-api/src/main/java/org/bukkit/entity/Fireball.java @@ -1,6 +1,24 @@ package org.bukkit.entity; +import org.bukkit.util.Vector; + /** * Represents a Fireball. */ -public interface Fireball extends Explosive {} +public interface Fireball extends Projectile, Explosive { + /** + * Fireballs fly straight and do not take setVelocity(...) well. + * + * @param direction + * the direction this fireball is flying toward + */ + public void setDirection(Vector direction); + + /** + * Retrieve the direction this fireball is heading toward + * + * @return the direction + */ + public Vector getDirection(); + +} diff --git a/paper-api/src/main/java/org/bukkit/entity/Fish.java b/paper-api/src/main/java/org/bukkit/entity/Fish.java index c12a82feb6..5010805335 100644 --- a/paper-api/src/main/java/org/bukkit/entity/Fish.java +++ b/paper-api/src/main/java/org/bukkit/entity/Fish.java @@ -2,7 +2,5 @@ package org.bukkit.entity; /** * Represents a Fish. - * - * @author Cogito */ -public interface Fish extends Entity {} +public interface Fish extends Projectile {} diff --git a/paper-api/src/main/java/org/bukkit/entity/Projectile.java b/paper-api/src/main/java/org/bukkit/entity/Projectile.java new file mode 100644 index 0000000000..95666eace9 --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/entity/Projectile.java @@ -0,0 +1,23 @@ +package org.bukkit.entity; + +/** + * Represents a shootable entity + */ +public interface Projectile extends Entity { + + /** + * Retrieve the shooter of this projectile. The returned value can be null + * for projectiles shot from a {@link Dispenser} for example. + * + * @return the {@link LivingEntity} that shot this projectile + */ + public LivingEntity getShooter(); + + /** + * Set the shooter of this projectile + * + * @param shooter + * the {@link LivingEntity} that shot this projectile + */ + public void setShooter(LivingEntity shooter); +} diff --git a/paper-api/src/main/java/org/bukkit/entity/Snowball.java b/paper-api/src/main/java/org/bukkit/entity/Snowball.java index d51f01afe5..47a86c49ae 100644 --- a/paper-api/src/main/java/org/bukkit/entity/Snowball.java +++ b/paper-api/src/main/java/org/bukkit/entity/Snowball.java @@ -2,7 +2,5 @@ package org.bukkit.entity; /** * Implements a snowball. - * - * @author sk89q */ -public interface Snowball extends Entity {} +public interface Snowball extends Projectile {} diff --git a/paper-api/src/main/java/org/bukkit/event/Event.java b/paper-api/src/main/java/org/bukkit/event/Event.java index 80cc1c9567..888b29e5b9 100644 --- a/paper-api/src/main/java/org/bukkit/event/Event.java +++ b/paper-api/src/main/java/org/bukkit/event/Event.java @@ -2,6 +2,8 @@ package org.bukkit.event; import java.io.Serializable; +import org.bukkit.entity.Projectile; + /** * Represents an event */ @@ -618,6 +620,12 @@ public abstract class Event implements Serializable { * @see org.bukkit.event.entity.EntityTameEvent */ ENTITY_TAME (Category.LIVING_ENTITY), + /** + * Called when a {@link Projectile} hits something + * + * @see org.bukkit.event.entity.ProjectileHitEvent + */ + PROJECTILE_HIT (Category.ENTITY), /** * Called when a LivingEntity is regains health diff --git a/paper-api/src/main/java/org/bukkit/event/entity/EntityDamageByProjectileEvent.java b/paper-api/src/main/java/org/bukkit/event/entity/EntityDamageByProjectileEvent.java index 16420fde94..ec1845789d 100644 --- a/paper-api/src/main/java/org/bukkit/event/entity/EntityDamageByProjectileEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/entity/EntityDamageByProjectileEvent.java @@ -3,13 +3,18 @@ package org.bukkit.event.entity; import java.util.Random; import org.bukkit.entity.Entity; +import org.bukkit.entity.Projectile; public class EntityDamageByProjectileEvent extends EntityDamageByEntityEvent { - private Entity projectile; + private Projectile projectile; private boolean bounce; - public EntityDamageByProjectileEvent(Entity damager, Entity damagee, Entity projectile, DamageCause cause, int damage) { + public EntityDamageByProjectileEvent(Entity damagee, Projectile projectile, DamageCause cause, int damage) { + this(projectile.getShooter(), damagee, projectile, cause, damage); + } + + public EntityDamageByProjectileEvent(Entity damager, Entity damagee, Projectile projectile, DamageCause cause, int damage) { super(damager, damagee, cause, damage); this.projectile = projectile; Random random = new Random(); @@ -19,9 +24,10 @@ public class EntityDamageByProjectileEvent extends EntityDamageByEntityEvent { /** * The projectile used to cause the event + * * @return the projectile */ - public Entity getProjectile() { + public Projectile getProjectile() { return projectile; } diff --git a/paper-api/src/main/java/org/bukkit/event/entity/EntityListener.java b/paper-api/src/main/java/org/bukkit/event/entity/EntityListener.java index 2998d768fd..64076e4982 100644 --- a/paper-api/src/main/java/org/bukkit/event/entity/EntityListener.java +++ b/paper-api/src/main/java/org/bukkit/event/entity/EntityListener.java @@ -41,4 +41,6 @@ public class EntityListener implements Listener { public void onEntityTame(EntityTameEvent event) {} public void onEntityRegainHealth(EntityRegainHealthEvent event) {} + + public void onProjectileHit(ProjectileHitEvent event) {} } diff --git a/paper-api/src/main/java/org/bukkit/event/entity/ProjectileHitEvent.java b/paper-api/src/main/java/org/bukkit/event/entity/ProjectileHitEvent.java new file mode 100644 index 0000000000..08f80597f1 --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/event/entity/ProjectileHitEvent.java @@ -0,0 +1,11 @@ +package org.bukkit.event.entity; + +import org.bukkit.entity.Projectile; + +public class ProjectileHitEvent extends EntityEvent { + + public ProjectileHitEvent(Projectile projectile) { + super(Type.PROJECTILE_HIT, projectile); + } + +} diff --git a/paper-api/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/paper-api/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index 4757032d2e..8ee81fd070 100644 --- a/paper-api/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/paper-api/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -719,6 +719,13 @@ public final class JavaPluginLoader implements PluginLoader { } }; + case PROJECTILE_HIT: + return new EventExecutor() { + public void execute(Listener listener, Event event) { + ((EntityListener) listener).onProjectileHit((ProjectileHitEvent) event); + } + }; + // Vehicle Events case VEHICLE_CREATE: return new EventExecutor() {