From 99f530c9370bedc19bb90ae0b85cdcbcf3e7cce3 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Sun, 9 Jul 2017 01:38:30 -0500 Subject: [PATCH] Add Entity#fromMobSpawner API Merges and closes GH-752 --- .../Entity-fromMobSpawner.patch | 24 +++++++ .../Entity-fromMobSpawner.patch | 66 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 Spigot-API-Patches/Entity-fromMobSpawner.patch create mode 100644 Spigot-Server-Patches/Entity-fromMobSpawner.patch diff --git a/Spigot-API-Patches/Entity-fromMobSpawner.patch b/Spigot-API-Patches/Entity-fromMobSpawner.patch new file mode 100644 index 0000000000..f36ed56fcc --- /dev/null +++ b/Spigot-API-Patches/Entity-fromMobSpawner.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Sun, 18 Jun 2017 18:17:05 -0500 +Subject: [PATCH] Entity#fromMobSpawner() + + +diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java +index c86c1c5f..b3d59a39 100644 +--- a/src/main/java/org/bukkit/entity/Entity.java ++++ b/src/main/java/org/bukkit/entity/Entity.java +@@ -0,0 +0,0 @@ public interface Entity extends Metadatable, CommandSender, Nameable { + * @return Location where entity originates or null if not yet added + */ + Location getOrigin(); ++ ++ /** ++ * Returns whether this entity was spawned from a mob spawner. ++ * ++ * @return True if entity spawned from a mob spawner ++ */ ++ boolean fromMobSpawner(); + // Paper end + } +-- \ No newline at end of file diff --git a/Spigot-Server-Patches/Entity-fromMobSpawner.patch b/Spigot-Server-Patches/Entity-fromMobSpawner.patch new file mode 100644 index 0000000000..85178f876c --- /dev/null +++ b/Spigot-Server-Patches/Entity-fromMobSpawner.patch @@ -0,0 +1,66 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Sun, 18 Jun 2017 18:17:05 -0500 +Subject: [PATCH] Entity#fromMobSpawner() + + +diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java +index d34ec4ff..65d7e1a1 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -0,0 +0,0 @@ public abstract class Entity implements ICommandListener { + public final boolean defaultActivationState; + public long activatedTick = Integer.MIN_VALUE; + public boolean fromMobSpawner; ++ public boolean spawnedViaMobSpawner; // Paper - Yes this name is similar to above, upstream took the better one + protected int numCollisions = 0; // Paper + public void inactiveTick() { } + // Spigot end +@@ -0,0 +0,0 @@ public abstract class Entity implements ICommandListener { + if (origin != null) { + nbttagcompound.set("Paper.Origin", this.createList(origin.getX(), origin.getY(), origin.getZ())); + } ++ // Save entity's from mob spawner status ++ if (spawnedViaMobSpawner) { ++ nbttagcompound.setBoolean("Paper.FromMobSpawner", true); ++ } + // Paper end + return nbttagcompound; + } catch (Throwable throwable) { +@@ -0,0 +0,0 @@ public abstract class Entity implements ICommandListener { + if (!originTag.isEmpty()) { + origin = new Location(world.getWorld(), originTag.getDoubleAt(0), originTag.getDoubleAt(1), originTag.getDoubleAt(2)); + } ++ ++ spawnedViaMobSpawner = nbttagcompound.getBoolean("Paper.FromMobSpawner"); // Restore entity's from mob spawner status + // Paper end + + } catch (Throwable throwable) { +diff --git a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java b/src/main/java/net/minecraft/server/MobSpawnerAbstract.java +index dd740276..a5b5ef0f 100644 +--- a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java ++++ b/src/main/java/net/minecraft/server/MobSpawnerAbstract.java +@@ -0,0 +0,0 @@ public abstract class MobSpawnerAbstract { + if (this.spawnData.b().d() == 1 && this.spawnData.b().hasKeyOfType("id", 8) && entity instanceof EntityInsentient) { + ((EntityInsentient) entity).prepare(world.D(new BlockPosition(entity)), (GroupDataEntity) null); + } ++ entity.spawnedViaMobSpawner = true; // Paper + // Spigot Start + if ( entity.world.spigotConfig.nerfSpawnerMobs ) + { +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +index 05f3df4e..d23a72d6 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +@@ -0,0 +0,0 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { + Location origin = getHandle().origin; + return origin == null ? null : origin.clone(); + } ++ ++ @Override ++ public boolean fromMobSpawner() { ++ return getHandle().spawnedViaMobSpawner; ++ } + // Paper end + } +-- \ No newline at end of file