diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 0bc226c730..f5e61f9f25 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -2,12 +2,14 @@ import com.denizenscript.denizen.nms.util.BoundingBox; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.BlockFace; +import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -367,4 +369,8 @@ public void setLastHurtBy(LivingEntity mob, LivingEntity damager) { public void setFallingBlockType(FallingBlock entity, BlockData block) { throw new UnsupportedOperationException(); } + + public EntityTag getMobSpawnerDisplayEntity(CreatureSpawner spawner) { + throw new UnsupportedOperationException(); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java index 4c09e08939..c651ccd40e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java @@ -1267,12 +1267,24 @@ public static void registerTags() { // Returns the type of entity spawned by a mob spawner. // --> registerTag("spawner_type", (attribute, object) -> { - if (object.getBlockStateForTag(attribute) instanceof CreatureSpawner) { - return new EntityTag(DenizenEntityType.getByName(((CreatureSpawner) object.getBlockStateForTag(attribute)).getSpawnedType().name())); + if (!(object.getBlockStateForTag(attribute) instanceof CreatureSpawner)) { + return null; } - else { + return new EntityTag(DenizenEntityType.getByName(((CreatureSpawner) object.getBlockStateForTag(attribute)).getSpawnedType().name())); + }); + + // <--[tag] + // @attribute + // @mechanism LocationTag.spawner_display_entity + // @returns EntityTag + // @description + // Returns the full "display entity" for the spawner. This can contain more data than just a type. + // --> + registerTag("spawner_display_entity", (attribute, object) -> { + if (!(object.getBlockStateForTag(attribute) instanceof CreatureSpawner)) { return null; } + return NMSHandler.getEntityHelper().getMobSpawnerDisplayEntity(((CreatureSpawner) object.getBlockStateForTag(attribute))).describe(attribute.context); }); // <--[tag] diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/BlockHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/BlockHelperImpl.java index 0b8cba8947..5760a9fdfd 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/BlockHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/BlockHelperImpl.java @@ -81,7 +81,7 @@ public List getBlocksList(PortalCreateEvent event) { return blocks; } - public T getTE(CraftBlockEntityState cbs) { + public static T getTE(CraftBlockEntityState cbs) { try { return (T) craftBlockEntityState_tileEntity.get(cbs); } diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java index bde078b3eb..b09cdb4748 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java @@ -3,6 +3,7 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.v1_17.ReflectionMappingsInfo; +import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizen.nms.v1_17.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.nms.interfaces.EntityHelper; @@ -34,6 +35,7 @@ import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.phys.AABB; @@ -46,9 +48,11 @@ import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.BlockFace; +import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; import org.bukkit.craftbukkit.v1_17_R1.block.CraftBlock; +import org.bukkit.craftbukkit.v1_17_R1.block.CraftCreatureSpawner; import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_17_R1.entity.*; import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory; @@ -822,4 +826,11 @@ public void setFallingBlockType(FallingBlock entity, BlockData block) { Debug.echoError(ex); } } + + @Override + public EntityTag getMobSpawnerDisplayEntity(CreatureSpawner spawner) { + SpawnerBlockEntity nmsSpawner = BlockHelperImpl.getTE((CraftCreatureSpawner) spawner); + net.minecraft.world.entity.Entity nmsEntity = nmsSpawner.getSpawner().getOrCreateDisplayEntity(((CraftWorld) spawner.getWorld()).getHandle()); + return new EntityTag(nmsEntity.getBukkitEntity()); + } }