diff --git a/paper-api/src/main/java/io/papermc/paper/InternalAPIBridge.java b/paper-api/src/main/java/io/papermc/paper/InternalAPIBridge.java index 5a039f815a29..1590367ec2ff 100644 --- a/paper-api/src/main/java/io/papermc/paper/InternalAPIBridge.java +++ b/paper-api/src/main/java/io/papermc/paper/InternalAPIBridge.java @@ -29,6 +29,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Pose; +import org.bukkit.entity.SpawnCategory; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; @@ -97,6 +98,8 @@ class Holder { String getTranslationKey(EntityType entityType); + SpawnCategory getSpawnCategory(EntityType entityType); + /* * Called once by the version command on first use, then cached. */ diff --git a/paper-api/src/main/java/org/bukkit/entity/EntityType.java b/paper-api/src/main/java/org/bukkit/entity/EntityType.java index 1583067fe6fa..25f937c9acd7 100644 --- a/paper-api/src/main/java/org/bukkit/entity/EntityType.java +++ b/paper-api/src/main/java/org/bukkit/entity/EntityType.java @@ -343,6 +343,17 @@ public String getTranslationKey() { return InternalAPIBridge.get().getTranslationKey(this); } + /** + * Gets the spawn category of this entity type. + * + * @return the spawn category + * @throws IllegalArgumentException if the entity does not have a spawn category (is probably a custom entity) + */ + public @NotNull SpawnCategory getSpawnCategory() { + Preconditions.checkArgument(this != UNKNOWN, "UNKNOWN entities do not have a spawn category"); + return InternalAPIBridge.get().getSpawnCategory(this); + } + /** * Checks if the entity has default attributes. * diff --git a/paper-server/src/main/java/io/papermc/paper/PaperServerInternalAPIBridge.java b/paper-server/src/main/java/io/papermc/paper/PaperServerInternalAPIBridge.java index f4d5123d9488..4aca28fa472f 100644 --- a/paper-server/src/main/java/io/papermc/paper/PaperServerInternalAPIBridge.java +++ b/paper-server/src/main/java/io/papermc/paper/PaperServerInternalAPIBridge.java @@ -59,6 +59,7 @@ import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.util.CraftSpawnCategory; import org.bukkit.damage.DamageEffect; import org.bukkit.damage.DamageSource; import org.bukkit.damage.DamageType; @@ -66,6 +67,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Pose; +import org.bukkit.entity.SpawnCategory; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; @@ -111,6 +113,11 @@ public CombatEntry createCombatEntry( ); } + @Override + public SpawnCategory getSpawnCategory(EntityType entityType) { + return CraftSpawnCategory.toBukkit(CraftEntityType.bukkitToMinecraft(entityType).getCategory()); + } + private CombatEntry createCombatEntry( final net.minecraft.world.damagesource.DamageSource damageSource, final float damage, diff --git a/paper-server/src/test/java/org/bukkit/entity/EntityTypesTest.java b/paper-server/src/test/java/org/bukkit/entity/EntityTypesTest.java index a4e2c42e9a5d..0753b9462129 100644 --- a/paper-server/src/test/java/org/bukkit/entity/EntityTypesTest.java +++ b/paper-server/src/test/java/org/bukkit/entity/EntityTypesTest.java @@ -17,4 +17,12 @@ public void testTranslationKey() { } } } + + @Test + void testGetSpawnCategory() { + for (EntityType type : EntityType.values()) { + if (type == EntityType.UNKNOWN) continue; + assertNotNull(type.getSpawnCategory(), "SpawnCategory should not be null for " + type); + } + } }