More PotionEffectType API

== AT ==
public net.minecraft.world.effect.MobEffect attributeModifiers
public net.minecraft.world.effect.MobEffect$AttributeTemplate
This commit is contained in:
Jake Potrebic 2021-05-27 21:58:24 -07:00
parent 0a2552a791
commit cf0525cba8
2 changed files with 72 additions and 0 deletions

View file

@ -129,6 +129,48 @@ public class CraftPotionEffectType extends PotionEffectType implements Handleabl
return this.handle.getDescriptionId();
}
// Paper start
@Override
public java.util.Map<org.bukkit.attribute.Attribute, org.bukkit.attribute.AttributeModifier> getEffectAttributes() {
// re-create map each time because a nms MobEffect can have its attributes modified
final java.util.Map<org.bukkit.attribute.Attribute, org.bukkit.attribute.AttributeModifier> attributeMap = new java.util.HashMap<>();
this.handle.attributeModifiers.forEach((attribute, attributeModifier) -> {
attributeMap.put(
org.bukkit.craftbukkit.attribute.CraftAttribute.minecraftHolderToBukkit(attribute),
// use zero as amplifier to get the base amount, as it is amount = base * (amplifier + 1)
org.bukkit.craftbukkit.attribute.CraftAttributeInstance.convert(attributeModifier.create(0))
);
});
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");
Holder<net.minecraft.world.entity.ai.attributes.Attribute> nmsAttribute = org.bukkit.craftbukkit.attribute.CraftAttribute.bukkitToMinecraftHolder(attribute);
com.google.common.base.Preconditions.checkArgument(this.handle.attributeModifiers.containsKey(nmsAttribute), attribute + " is not present on " + this.getKey());
return this.handle.attributeModifiers.get(nmsAttribute).create(effectAmplifier).amount();
}
@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
@Override
public boolean equals(Object other) {
if (this == other) {

View file

@ -0,0 +1,30 @@
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.bukkit.support.environment.AllFeatures;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@AllFeatures
public class EffectCategoryTest {
@Test
public void testEffectCategoriesExist() {
for (MobEffectCategory mobEffectInfo : MobEffectCategory.values()) {
assertNotNull(CraftPotionEffectType.fromNMS(mobEffectInfo), mobEffectInfo + " is missing a bukkit equivalent");
}
}
@Test
public void testCategoryHasEquivalentColors() {
for (MobEffectCategory mobEffectInfo : MobEffectCategory.values()) {
PotionEffectType.Category bukkitEffectCategory = CraftPotionEffectType.fromNMS(mobEffectInfo);
assertEquals(bukkitEffectCategory.getColor(), PaperAdventure.asAdventure(mobEffectInfo.getTooltipFormatting()), mobEffectInfo.getTooltipFormatting().name() + " doesn't equal " + bukkitEffectCategory.getColor());
}
}
}