diff --git a/patches/api/More-Enchantment-API.patch b/patches/api/More-Enchantment-API.patch index c83224b2e4..55863eaed9 100644 --- a/patches/api/More-Enchantment-API.patch +++ b/patches/api/More-Enchantment-API.patch @@ -109,10 +109,24 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + * @param level the level of enchantment + * @param entityCategory the category of entity + * @return the damage increase ++ * @deprecated Use {@link #getDamageIncrease(int, org.bukkit.entity.EntityType)} instead. ++ * Enchantment damage increase is no longer handled via {@link org.bukkit.entity.EntityCategory}s, but ++ * is instead controlled by tags, e.g. {@link org.bukkit.Tag#ENTITY_TYPES_SENSITIVE_TO_BANE_OF_ARTHROPODS}. ++ * As such, a category cannot properly represent all entities defined by the tags. + */ ++ @Deprecated(forRemoval = true, since = "1.20.5") + public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityCategory entityCategory); + + /** ++ * Gets the damage increase as a result of the level and entity type specified ++ * ++ * @param level the level of enchantment ++ * @param entityType the type of entity. ++ * @return the damage increase ++ */ ++ public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityType entityType); ++ ++ /** + * Gets the equipment slots where this enchantment is considered "active". + * + * @return the equipment slots diff --git a/patches/server/Add-entity-knockback-API.patch b/patches/server/Add-entity-knockback-API.patch index 1d65cf2023..3533ad0b90 100644 --- a/patches/server/Add-entity-knockback-API.patch +++ b/patches/server/Add-entity-knockback-API.patch @@ -9,9 +9,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -0,0 +0,0 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { - throw new IllegalArgumentException(entityCategory + " is an unrecognized entity category"); + throw new UnsupportedOperationException("Cannot set the hurt direction on a non player"); } - // Paper end - more enchant API + // Paper end - hurt direction API + + // Paper start - knockback API + @Override diff --git a/patches/server/More-Enchantment-API.patch b/patches/server/More-Enchantment-API.patch index d8fe697e12..eb2be97b33 100644 --- a/patches/server/More-Enchantment-API.patch +++ b/patches/server/More-Enchantment-API.patch @@ -53,7 +53,29 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + + @Override + public float getDamageIncrease(int level, org.bukkit.entity.EntityCategory entityCategory) { -+ return handle.getDamageBonus(level, org.bukkit.craftbukkit.entity.CraftLivingEntity.fromBukkitEntityCategory(entityCategory)); ++ return handle.getDamageBonus(level, guessEntityTypeFromEnchantmentCategory(entityCategory)); ++ } ++ ++ @Override ++ public float getDamageIncrease(int level, org.bukkit.entity.EntityType entityType) { ++ return handle.getDamageBonus(level, org.bukkit.craftbukkit.util.CraftMagicNumbers.getEntityTypes(entityType)); ++ } ++ ++ @Deprecated(forRemoval = true) ++ private net.minecraft.world.entity.EntityType<?> guessEntityTypeFromEnchantmentCategory( ++ final org.bukkit.entity.EntityCategory entityCategory ++ ) { ++ final net.minecraft.tags.TagKey<net.minecraft.world.entity.EntityType<?>> tag = switch (entityCategory) { ++ case ARTHROPOD -> net.minecraft.tags.EntityTypeTags.SENSITIVE_TO_BANE_OF_ARTHROPODS; ++ case UNDEAD -> net.minecraft.tags.EntityTypeTags.SENSITIVE_TO_SMITE; ++ case WATER -> net.minecraft.tags.EntityTypeTags.SENSITIVE_TO_IMPALING; ++ default -> null; ++ }; ++ if (tag == null) return null; ++ ++ return net.minecraft.core.registries.BuiltInRegistries.ENTITY_TYPE.getTag(tag) ++ .map(e -> e.size() > 0 ? e.get(0).value() : null) ++ .orElse(null); + } + + @Override @@ -77,33 +99,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 // Paper end @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -@@ -0,0 +0,0 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { - throw new UnsupportedOperationException("Cannot set the hurt direction on a non player"); - } - // Paper end - hurt direction API -+ -+ // Paper start - more enchant API -+ public static MobType fromBukkitEntityCategory(EntityCategory entityCategory) { -+ switch (entityCategory) { -+ case NONE: -+ return MobType.UNDEFINED; -+ case UNDEAD: -+ return MobType.UNDEAD; -+ case ARTHROPOD: -+ return MobType.ARTHROPOD; -+ case ILLAGER: -+ return MobType.ILLAGER; -+ case WATER: -+ return MobType.WATER; -+ } -+ throw new IllegalArgumentException(entityCategory + " is an unrecognized entity category"); -+ } -+ // Paper end - more enchant API - } diff --git a/src/test/java/io/papermc/paper/enchantments/EnchantmentRarityTest.java b/src/test/java/io/papermc/paper/enchantments/EnchantmentRarityTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000