2022-01-23 19:42:38 +01:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
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
2024-04-06 21:53:39 +02:00
index 3e1273222492006c7a5bcfaefca12fb264ee20dd..6a5b7fd9fb276c5df7b01646530ee45c62b49460 100644
2022-01-23 19:42:38 +01:00
--- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java
+++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java
2024-04-06 21:53:39 +02:00
@@ -114,6 +114,48 @@ public class CraftPotionEffectType extends PotionEffectType implements Handleabl
return this.handle.getDescriptionId();
2022-01-23 19:42:38 +01:00
}
2024-01-26 20:17:06 +01:00
2022-01-23 19:42:38 +01:00
+ // 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.getAttributeModifiers().forEach((attribute, attributeModifier) -> {
2023-09-23 00:33:14 +02:00
+ attributeMap.put(
2023-09-23 04:06:03 +02:00
+ org.bukkit.craftbukkit.attribute.CraftAttribute.stringToBukkit(attribute.toString()),
2023-09-23 00:33:14 +02:00
+ // 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))
+ );
2022-01-23 19:42:38 +01:00
+ });
+ 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");
2023-09-23 04:06:03 +02:00
+ net.minecraft.world.entity.ai.attributes.Attribute nmsAttribute = org.bukkit.craftbukkit.attribute.CraftAttribute.bukkitToMinecraft(attribute);
2022-01-23 19:42:38 +01:00
+ com.google.common.base.Preconditions.checkArgument(this.handle.getAttributeModifiers().containsKey(nmsAttribute), attribute + " is not present on " + this.getKey());
2023-09-23 00:33:14 +02:00
+ return this.handle.getAttributeModifiers().get(nmsAttribute).create(effectAmplifier).getAmount();
2022-01-23 19:42:38 +01:00
+ }
+
+ @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
2024-01-26 20:17:06 +01:00
+
@Override
public boolean equals(Object other) {
if (this == other) {
2022-01-23 19:42:38 +01:00
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
2023-09-24 09:16:58 +02:00
index 0000000000000000000000000000000000000000..6262598f85bd7d9af5546cc0a96531b2f4baf64d
2022-01-23 19:42:38 +01:00
--- /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;
2023-09-24 09:16:58 +02:00
+import org.junit.jupiter.api.Test;
2022-01-23 19:42:38 +01:00
+
2023-09-24 09:16:58 +02:00
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
2022-01-23 19:42:38 +01:00
+
+public class EffectCategoryTest {
+
+ @Test
+ public void testEffectCategoriesExist() {
+ for (MobEffectCategory mobEffectInfo : MobEffectCategory.values()) {
2023-09-24 09:16:58 +02:00
+ assertNotNull(CraftPotionEffectType.fromNMS(mobEffectInfo), mobEffectInfo + " is missing a bukkit equivalent");
2022-01-23 19:42:38 +01:00
+ }
+ }
+
+ @Test
+ public void testCategoryHasEquivalentColors() {
+ for (MobEffectCategory mobEffectInfo : MobEffectCategory.values()) {
+ PotionEffectType.Category bukkitEffectCategory = CraftPotionEffectType.fromNMS(mobEffectInfo);
2023-09-24 09:16:58 +02:00
+ assertEquals(bukkitEffectCategory.getColor(), PaperAdventure.asAdventure(mobEffectInfo.getTooltipFormatting()), mobEffectInfo.getTooltipFormatting().name() + " doesn't equal " + bukkitEffectCategory.getColor());
2022-01-23 19:42:38 +01:00
+ }
+ }
+}