From 40364131cbaa14de08fa7f8afba8aae5c92ece5e Mon Sep 17 00:00:00 2001
From: Bukkit/Spigot <noreply+git-bukkit@papermc.io>
Date: Thu, 13 Jan 2011 00:15:31 +1100
Subject: [PATCH] Implementation of the EntityDamage*Events.

A new event EntityDamageByProjectileEvent was created. EntityDamageByProjectileEvent
adds the ability to get the projectile entity (such as an egg) and also set if
the projectile 'bounces'. New interfaces were created to facilitate all kinds
of projectile entities. Changes were made to facilitate the new event, and
enable other events, for plugins and event listeners.

By: Andrew Ardill <andrew.ardill@gmail.com>
---
 .../main/java/org/bukkit/entity/Entity.java   |  2 +-
 .../main/java/org/bukkit/entity/Fireball.java |  9 +++++
 .../src/main/java/org/bukkit/entity/Fish.java |  9 +++++
 .../src/main/java/org/bukkit/event/Event.java |  7 ++++
 .../entity/EntityDamageByProjectileEvent.java | 35 +++++++++++++++++++
 .../bukkit/event/entity/EntityListener.java   |  6 ++++
 .../bukkit/plugin/java/JavaPluginLoader.java  |  8 +++++
 7 files changed, 75 insertions(+), 1 deletion(-)
 create mode 100644 paper-api/src/main/java/org/bukkit/entity/Fireball.java
 create mode 100644 paper-api/src/main/java/org/bukkit/entity/Fish.java
 create mode 100644 paper-api/src/main/java/org/bukkit/event/entity/EntityDamageByProjectileEvent.java

diff --git a/paper-api/src/main/java/org/bukkit/entity/Entity.java b/paper-api/src/main/java/org/bukkit/entity/Entity.java
index 42e0cf49b8..aeb8425619 100644
--- a/paper-api/src/main/java/org/bukkit/entity/Entity.java
+++ b/paper-api/src/main/java/org/bukkit/entity/Entity.java
@@ -9,7 +9,7 @@ import org.bukkit.World;
  */
 public interface Entity {
     /**
-     * Gets the entitys current position
+     * Gets the entity's current position
      *
      * @return Location containing the position of this entity
      */
diff --git a/paper-api/src/main/java/org/bukkit/entity/Fireball.java b/paper-api/src/main/java/org/bukkit/entity/Fireball.java
new file mode 100644
index 0000000000..424de3013f
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/entity/Fireball.java
@@ -0,0 +1,9 @@
+package org.bukkit.entity;
+
+/**
+ * Represents a Fireball.
+ * 
+ * @author Cogito
+ */
+public interface Fireball extends Entity {
+}
diff --git a/paper-api/src/main/java/org/bukkit/entity/Fish.java b/paper-api/src/main/java/org/bukkit/entity/Fish.java
new file mode 100644
index 0000000000..44fcede759
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/entity/Fish.java
@@ -0,0 +1,9 @@
+package org.bukkit.entity;
+
+/**
+ * Represents a Fish.
+ * 
+ * @author Cogito
+ */
+public interface Fish extends Entity {
+}
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 0e32359b9b..a7399da703 100644
--- a/paper-api/src/main/java/org/bukkit/event/Event.java
+++ b/paper-api/src/main/java/org/bukkit/event/Event.java
@@ -417,6 +417,13 @@ public abstract class Event {
          * @see org.bukkit.event.entity.EntityDamageByEntityEvent
          */
         ENTITY_DAMAGEDBY_ENTITY (Category.LIVING_ENTITY),
+        
+        /**
+         * Called when a LivingEntity is damaged by a projectile Entity
+         *
+         * @see org.bukkit.event.entity.EntityDamageByProjectileEvent
+         */
+        ENTITY_DAMAGEDBY_PROJECTILE (Category.LIVING_ENTITY),
 
         /**
          * Called when a LivingEntity is damaged with no source.
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
new file mode 100644
index 0000000000..96529bd691
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/event/entity/EntityDamageByProjectileEvent.java
@@ -0,0 +1,35 @@
+package org.bukkit.event.entity;
+
+import java.util.Random;
+
+import org.bukkit.entity.Entity;
+
+public class EntityDamageByProjectileEvent extends EntityDamageByEntityEvent {
+
+    private Entity projectile;
+    private boolean bounce;
+
+    public EntityDamageByProjectileEvent(Entity damager, Entity damagee, Entity projectile, DamageCause cause, int damage) {
+        super(damager, damagee, cause, damage);
+        this.projectile = projectile;
+        Random random = new Random();
+        this.bounce = random.nextBoolean();
+    }
+
+    /**
+     * The projectile used to cause the event
+     * @return the projectile
+     */
+    public Entity getProjectile() {
+        return projectile;
+    }
+
+    public void setBounce(boolean bounce){
+        this.bounce = bounce;
+    }
+
+    public boolean getBounce(){
+        return bounce;
+    }
+
+}
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 da21f0d85e..03bc5ba09a 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
@@ -15,6 +15,12 @@ public class EntityListener implements Listener {
     public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
     }
     
+    public void onEntityDamageByProjectile(EntityDamageByProjectileEvent event) {
+    }
+    
     public void onEntityCombust(EntityCombustEvent event) {
     }
+
+    public void onEntityDamage(EntityDamageEvent event) {
+    }
 }
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 9288f00018..5ed12363b1 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
@@ -21,6 +21,8 @@ import org.bukkit.event.block.*;
 import org.bukkit.event.entity.EntityCombustEvent;
 import org.bukkit.event.entity.EntityDamageByBlockEvent;
 import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDamageByProjectileEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
 import org.bukkit.event.entity.EntityListener;
 import org.bukkit.event.player.*;
 import org.bukkit.event.server.PluginEvent;
@@ -216,6 +218,12 @@ public final class JavaPluginLoader implements PluginLoader {
                 case ENTITY_DAMAGEDBY_ENTITY:
                     trueListener.onEntityDamageByEntity((EntityDamageByEntityEvent)event);
                     break;
+                case ENTITY_DAMAGEDBY_PROJECTILE:
+                    trueListener.onEntityDamageByProjectile((EntityDamageByProjectileEvent)event);
+                    break;
+                case ENTITY_DAMAGED:
+                    trueListener.onEntityDamage((EntityDamageEvent)event);
+                    break;
                 case ENTITY_DEATH:
                     // TODO: ENTITY_DEATH hook
                     break;