From ea3a8f5ed1c5ca4b73d03342500ca257864570f7 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..7e393254 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/entity/SentientNPC.java @@ -0,0 +1,57 @@ +/* + * 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; + +import org.bukkit.entity.LivingEntity; + +/** + * 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 extends LivingEntity { + + /** + * Instructs this Creature to set the specified LivingEntity as its + * target. + *

+ * Hostile creatures may attack their target, and friendly creatures may + * follow their target. + * + * @param target New LivingEntity to target, or null to clear the target + */ + public void setTarget(LivingEntity target); + + /** + * Gets the current target of this Creature + * + * @return Current target of this creature, or null if none exists + */ + public LivingEntity getTarget(); +} 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..bbfb248e 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 @@ -15,12 +15,12 @@ public interface Creature extends LivingEntity { * * @param target New LivingEntity to target, or null to clear the target */ - public void setTarget(LivingEntity target); + //public void setTarget(LivingEntity target); // Paper - moved to SentientNPC /** * Gets the current target of this Creature * * @return Current target of this creature, or null if none exists */ - public LivingEntity getTarget(); + //public LivingEntity getTarget(); // Paper - moved to SentientNPC } 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 -- 2.18.0