From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Thu, 27 May 2021 21:58:24 -0700 Subject: [PATCH] More PotionEffectType API diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java index a220102c6e981e4c7d03039340423f05b8c2aeb9..29830a30a886f88254a6d0e7c5245fa14f44bd09 100644 --- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java +++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java @@ -104,4 +104,46 @@ public class CraftPotionEffectType extends PotionEffectType { public Color getColor() { return Color.fromRGB(this.handle.getColor()); } + // Paper start + @Override + public org.bukkit.NamespacedKey getKey() { + return org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(net.minecraft.core.Registry.MOB_EFFECT.getKey(this.handle)); + } + + @Override + public java.util.Map getEffectAttributes() { + // re-create map each time because a nms MobEffect can have its attributes modified + final java.util.Map attributeMap = new java.util.HashMap<>(); + this.handle.getAttributeModifiers().forEach((attribute, attributeModifier) -> { + attributeMap.put(org.bukkit.craftbukkit.attribute.CraftAttributeMap.fromMinecraft(attribute.toString()), org.bukkit.craftbukkit.attribute.CraftAttributeInstance.convert(attributeModifier)); + }); + return java.util.Map.copyOf(attributeMap); + } + + @Override + public double getAttributeModifierAmount(org.bukkit.attribute.Attribute attribute, int effectAmplifier) { + com.google.common.base.Preconditions.checkArgument(effectAmplifier >= 0, "effectAmplifier must be greater than or equal to 0"); + net.minecraft.world.entity.ai.attributes.Attribute nmsAttribute = org.bukkit.craftbukkit.attribute.CraftAttributeMap.toMinecraft(attribute); + com.google.common.base.Preconditions.checkArgument(this.handle.getAttributeModifiers().containsKey(nmsAttribute), attribute + " is not present on " + this.getKey()); + return this.handle.getAttributeModifierValue(effectAmplifier, this.handle.getAttributeModifiers().get(nmsAttribute)); + } + + @Override + public PotionEffectType.Category getEffectCategory() { + return fromNMS(handle.getCategory()); + } + + @Override + public String translationKey() { + return this.handle.getDescriptionId(); + } + + public static PotionEffectType.Category fromNMS(net.minecraft.world.effect.MobEffectCategory mobEffectInfo) { + return switch (mobEffectInfo) { + case BENEFICIAL -> PotionEffectType.Category.BENEFICIAL; + case HARMFUL -> PotionEffectType.Category.HARMFUL; + case NEUTRAL -> PotionEffectType.Category.NEUTRAL; + }; + } + // Paper end } diff --git a/src/test/java/io/papermc/paper/effects/EffectCategoryTest.java b/src/test/java/io/papermc/paper/effects/EffectCategoryTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a5012bc0469ba03cde66749a11f4e7d93206bfd7 --- /dev/null +++ b/src/test/java/io/papermc/paper/effects/EffectCategoryTest.java @@ -0,0 +1,28 @@ +package io.papermc.paper.effects; + +import io.papermc.paper.adventure.PaperAdventure; +import net.minecraft.world.effect.MobEffectCategory; +import org.bukkit.craftbukkit.potion.CraftPotionEffectType; +import org.bukkit.potion.PotionEffectType; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class EffectCategoryTest { + + @Test + public void testEffectCategoriesExist() { + for (MobEffectCategory mobEffectInfo : MobEffectCategory.values()) { + assertNotNull(mobEffectInfo + " is missing a bukkit equivalent", CraftPotionEffectType.fromNMS(mobEffectInfo)); + } + } + + @Test + public void testCategoryHasEquivalentColors() { + for (MobEffectCategory mobEffectInfo : MobEffectCategory.values()) { + PotionEffectType.Category bukkitEffectCategory = CraftPotionEffectType.fromNMS(mobEffectInfo); + assertEquals(mobEffectInfo.getTooltipFormatting().name() + " doesn't equal " + bukkitEffectCategory.getColor(), bukkitEffectCategory.getColor(), PaperAdventure.asAdventure(mobEffectInfo.getTooltipFormatting())); + } + } +}