From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Tue, 26 Jun 2018 21:34:40 -0400
Subject: [PATCH] RangedEntity API

Allows you to determine if an entity is capable of ranged attacks,
and to perform an attack.

diff --git a/src/main/java/com/destroystokyo/paper/entity/RangedEntity.java b/src/main/java/com/destroystokyo/paper/entity/RangedEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/entity/RangedEntity.java
@@ -0,0 +0,0 @@
+package com.destroystokyo.paper.entity;
+
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Mob;
+import org.jetbrains.annotations.NotNull;
+
+public interface RangedEntity extends Mob {
+    /**
+     * Attack the specified entity using a ranged attack.
+     *
+     * @param target the entity to target
+     * @param charge How "charged" the attack is (how far back the bow was pulled for Bow attacks).
+     *               This should be a value between 0 and 1, represented as targetDistance/maxDistance.
+     */
+    void rangedAttack(@NotNull LivingEntity target, float charge);
+
+    /**
+     * Sets that the Entity is "charging" up an attack, by raising its hands
+     *
+     * @param raiseHands Whether the entities hands are raised to charge attack
+     */
+    void setChargingAttack(boolean raiseHands);
+
+    /**
+     * Alias to {@link LivingEntity#isHandRaised()}, if the entity is charging an attack
+     * @return If entities hands are raised
+     */
+    default boolean isChargingAttack() {
+        return isHandRaised();
+    }
+}
diff --git a/src/main/java/org/bukkit/entity/Drowned.java b/src/main/java/org/bukkit/entity/Drowned.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/Drowned.java
+++ b/src/main/java/org/bukkit/entity/Drowned.java
@@ -0,0 +0,0 @@
 package org.bukkit.entity;
 
+import com.destroystokyo.paper.entity.RangedEntity;
+
 /**
  * Drowned zombie.
  */
-public interface Drowned extends Zombie { }
+public interface Drowned extends Zombie, RangedEntity { } // Paper
diff --git a/src/main/java/org/bukkit/entity/Illusioner.java b/src/main/java/org/bukkit/entity/Illusioner.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/Illusioner.java
+++ b/src/main/java/org/bukkit/entity/Illusioner.java
@@ -0,0 +0,0 @@
 package org.bukkit.entity;
 
+import com.destroystokyo.paper.entity.RangedEntity;
+
 /**
  * Represents an Illusioner "Illager".
  */
-public interface Illusioner extends Spellcaster { }
+public interface Illusioner extends Spellcaster, RangedEntity { // Paper
+
+}
diff --git a/src/main/java/org/bukkit/entity/Llama.java b/src/main/java/org/bukkit/entity/Llama.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/Llama.java
+++ b/src/main/java/org/bukkit/entity/Llama.java
@@ -0,0 +0,0 @@
 package org.bukkit.entity;
 
+import com.destroystokyo.paper.entity.RangedEntity;
 import org.bukkit.inventory.LlamaInventory;
 import org.jetbrains.annotations.NotNull;
 
 /**
  * Represents a Llama.
  */
-public interface Llama extends ChestedHorse {
+public interface Llama extends ChestedHorse, RangedEntity { // Paper
 
     /**
      * Represents the base color that the llama has.
diff --git a/src/main/java/org/bukkit/entity/Skeleton.java b/src/main/java/org/bukkit/entity/Skeleton.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/Skeleton.java
+++ b/src/main/java/org/bukkit/entity/Skeleton.java
@@ -0,0 +0,0 @@ package org.bukkit.entity;
 
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
+import com.destroystokyo.paper.entity.RangedEntity;
 
 /**
  * Represents a Skeleton.
  */
-public interface Skeleton extends Monster {
+public interface Skeleton extends Monster, RangedEntity { // Paper
 
     /**
      * Gets the current type of this skeleton.
diff --git a/src/main/java/org/bukkit/entity/Snowman.java b/src/main/java/org/bukkit/entity/Snowman.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/Snowman.java
+++ b/src/main/java/org/bukkit/entity/Snowman.java
@@ -0,0 +0,0 @@
 package org.bukkit.entity;
 
+import com.destroystokyo.paper.entity.RangedEntity;
+
 /**
  * Represents a snowman entity
  */
-public interface Snowman extends Golem {
+public interface Snowman extends Golem, RangedEntity { // Paper
 
     /**
      * Gets whether this snowman is in "derp mode", meaning it is not wearing a
diff --git a/src/main/java/org/bukkit/entity/Witch.java b/src/main/java/org/bukkit/entity/Witch.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/Witch.java
+++ b/src/main/java/org/bukkit/entity/Witch.java
@@ -0,0 +0,0 @@
 package org.bukkit.entity;
 
+import com.destroystokyo.paper.entity.RangedEntity;
+
 /**
  * Represents a Witch
  */
-public interface Witch extends Raider {
+public interface Witch extends Raider, RangedEntity { // Paper
 }
diff --git a/src/main/java/org/bukkit/entity/Wither.java b/src/main/java/org/bukkit/entity/Wither.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/Wither.java
+++ b/src/main/java/org/bukkit/entity/Wither.java
@@ -0,0 +0,0 @@
 package org.bukkit.entity;
 
+import com.destroystokyo.paper.entity.RangedEntity;
+
 /**
  * Represents a Wither boss
  */
-public interface Wither extends Monster, Boss {
+public interface Wither extends Monster, Boss, RangedEntity { // Paper
 }