diff --git a/Spigot-API-Patches/0112-Add-SentientNPC-Interface-to-Entities.patch b/Spigot-API-Patches/0112-Add-SentientNPC-Interface-to-Entities.patch new file mode 100644 index 000000000..df5b60b32 --- /dev/null +++ b/Spigot-API-Patches/0112-Add-SentientNPC-Interface-to-Entities.patch @@ -0,0 +1,133 @@ +From 8290a8cef4bf55a6db5d39202d919ef8b1c38d4e Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 16 Jun 2018 13:41:00 -0400 +Subject: [PATCH] Add SentientNPC Interface to Entities + +Used to determine ACTUAL Living NPC's. Spigot mistakenly inversed the conditions for LivingEntity, and +used LivingEntity for Insentient Entities, and named the actual EntityLiving class EntityInsentient. + +This should of all been inversed on the implementation side. To make matters worse, Spigot never +exposed the differentiator that there are entities with AI that are not sentient/alive such as +Armor stands and Players are the only things that do not implement the REAL EntityLiving class (named Insentient internally) + +This interface lets you identify NPC entities capable of sentience, and able to move about and react to the world. + +diff --git a/src/main/java/com/destroystokyo/paper/entity/SentientNPC.java b/src/main/java/com/destroystokyo/paper/entity/SentientNPC.java +new file mode 100644 +index 00000000..a0bdf855 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/entity/SentientNPC.java +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 2018 Daniel Ennis (Aikar) MIT License ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining ++ * a copy of this software and associated documentation files (the ++ * "Software"), to deal in the Software without restriction, including ++ * without limitation the rights to use, copy, modify, merge, publish, ++ * distribute, sublicense, and/or sell copies of the Software, and to ++ * permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE ++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION ++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION ++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++package com.destroystokyo.paper.entity; ++ ++/** ++ * Used to determine ACTUAL Living NPC's. Spigot mistakenly inversed the conditions for LivingEntity, and ++ * used LivingEntity for Insentient Entities, and named the actual EntityLiving class EntityInsentient. ++ * ++ * This should of all been inversed on the implementation side. To make matters worse, Spigot never ++ * exposed the differentiator that there are entities with AI that are not sentient/alive such as ++ * Armor stands and Players are the only things that do not implement the REAL EntityLiving class (named Insentient internally) ++ * ++ * This interface lets you identify NPC entities capable of sentience, and able to move about and react to the world. ++ */ ++public interface SentientNPC { ++} +diff --git a/src/main/java/org/bukkit/entity/Ambient.java b/src/main/java/org/bukkit/entity/Ambient.java +index 779e3897..ef548fb4 100644 +--- a/src/main/java/org/bukkit/entity/Ambient.java ++++ b/src/main/java/org/bukkit/entity/Ambient.java +@@ -3,4 +3,5 @@ package org.bukkit.entity; + /** + * Represents an ambient mob + */ +-public interface Ambient extends LivingEntity {} ++public interface Ambient extends LivingEntity, com.destroystokyo.paper.entity.SentientNPC { // Paper ++} +diff --git a/src/main/java/org/bukkit/entity/ComplexLivingEntity.java b/src/main/java/org/bukkit/entity/ComplexLivingEntity.java +index f74411c3..1f00923e 100644 +--- a/src/main/java/org/bukkit/entity/ComplexLivingEntity.java ++++ b/src/main/java/org/bukkit/entity/ComplexLivingEntity.java +@@ -6,7 +6,7 @@ import java.util.Set; + * Represents a complex living entity - one that is made up of various smaller + * parts + */ +-public interface ComplexLivingEntity extends LivingEntity { ++public interface ComplexLivingEntity extends LivingEntity, com.destroystokyo.paper.entity.SentientNPC { // Paper + /** + * Gets a list of parts that belong to this complex entity + * +diff --git a/src/main/java/org/bukkit/entity/Creature.java b/src/main/java/org/bukkit/entity/Creature.java +index f223f55b..77cbefcb 100644 +--- a/src/main/java/org/bukkit/entity/Creature.java ++++ b/src/main/java/org/bukkit/entity/Creature.java +@@ -4,7 +4,7 @@ package org.bukkit.entity; + * Represents a Creature. Creatures are non-intelligent monsters or animals + * which have very simple abilities. + */ +-public interface Creature extends LivingEntity { ++public interface Creature extends LivingEntity, com.destroystokyo.paper.entity.SentientNPC { // Paper + + /** + * Instructs this Creature to set the specified LivingEntity as its +diff --git a/src/main/java/org/bukkit/entity/Flying.java b/src/main/java/org/bukkit/entity/Flying.java +index 4f16a26c..207e9922 100644 +--- a/src/main/java/org/bukkit/entity/Flying.java ++++ b/src/main/java/org/bukkit/entity/Flying.java +@@ -3,4 +3,6 @@ package org.bukkit.entity; + /** + * Represents a Flying Entity. + */ +-public interface Flying extends LivingEntity {} ++public interface Flying extends LivingEntity, com.destroystokyo.paper.entity.SentientNPC { // Paper ++ ++} +diff --git a/src/main/java/org/bukkit/entity/Slime.java b/src/main/java/org/bukkit/entity/Slime.java +index 0d87d203..d4eee19c 100644 +--- a/src/main/java/org/bukkit/entity/Slime.java ++++ b/src/main/java/org/bukkit/entity/Slime.java +@@ -3,7 +3,7 @@ package org.bukkit.entity; + /** + * Represents a Slime. + */ +-public interface Slime extends LivingEntity { ++public interface Slime extends LivingEntity, com.destroystokyo.paper.entity.SentientNPC { // Paper + + /** + * @return The size of the slime +diff --git a/src/main/java/org/bukkit/entity/WaterMob.java b/src/main/java/org/bukkit/entity/WaterMob.java +index 3e89ca0c..8d105e72 100644 +--- a/src/main/java/org/bukkit/entity/WaterMob.java ++++ b/src/main/java/org/bukkit/entity/WaterMob.java +@@ -3,4 +3,5 @@ package org.bukkit.entity; + /** + * Represents a Water Mob + */ +-public interface WaterMob extends LivingEntity {} ++public interface WaterMob extends LivingEntity, com.destroystokyo.paper.entity.SentientNPC { // Paper ++} +-- +2.17.1 +