mirror of
https://github.com/PaperMC/Paper.git
synced 2025-08-17 13:24:17 -07:00
Expand PotionMeta Api to allow getting effective potion colour and effects (#12390)
This commit is contained in:
@@ -60,6 +60,27 @@ public interface PotionContents {
|
||||
@Contract(pure = true)
|
||||
@Nullable String customName();
|
||||
|
||||
/**
|
||||
* All effects that this component applies.
|
||||
* <p>
|
||||
* This is a combination of the base potion type and any custom effects.
|
||||
*
|
||||
* @return an unmodifiable list of all effects.
|
||||
*/
|
||||
@Contract(pure = true)
|
||||
@Unmodifiable List<PotionEffect> allEffects();
|
||||
|
||||
/**
|
||||
* Computes the effective colour of this potion contents component.
|
||||
* <p>
|
||||
* This blends all custom effects, or uses a default fallback colour.
|
||||
* It may or may not have an alpha channel, used for tipped arrows.
|
||||
*
|
||||
* @return the effective colour this component would display with.
|
||||
*/
|
||||
@Contract(pure = true)
|
||||
Color computeEffectiveColor();
|
||||
|
||||
@ApiStatus.Experimental
|
||||
@ApiStatus.NonExtendable
|
||||
interface Builder extends DataComponentBuilder<PotionContents> {
|
||||
|
@@ -8,6 +8,7 @@ import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.potion.PotionType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.annotations.Unmodifiable;
|
||||
|
||||
/**
|
||||
* Represents a potion or item that can have custom effects.
|
||||
@@ -74,6 +75,16 @@ public interface PotionMeta extends ItemMeta {
|
||||
@NotNull
|
||||
List<PotionEffect> getCustomEffects();
|
||||
|
||||
/**
|
||||
* All effects that this potion meta holds.
|
||||
* <p>
|
||||
* This is a combination of the base potion type and any custom effects.
|
||||
*
|
||||
* @return an unmodifiable list of all effects.
|
||||
*/
|
||||
@NotNull
|
||||
@Unmodifiable List<PotionEffect> getAllEffects();
|
||||
|
||||
/**
|
||||
* Adds a custom potion effect to this potion.
|
||||
*
|
||||
@@ -146,6 +157,16 @@ public interface PotionMeta extends ItemMeta {
|
||||
*/
|
||||
void setColor(@Nullable Color color);
|
||||
|
||||
/**
|
||||
* Computes the effective colour of this potion meta.
|
||||
* <p>
|
||||
* This blends all custom effects, or uses a default fallback color.
|
||||
*
|
||||
* @return the effective potion color
|
||||
*/
|
||||
@NotNull
|
||||
Color computeEffectiveColor();
|
||||
|
||||
/**
|
||||
* Checks for existence of a custom potion name translation suffix.
|
||||
*
|
||||
|
@@ -5,6 +5,8 @@ import io.papermc.paper.util.MCUtil;
|
||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.StreamSupport;
|
||||
import net.minecraft.world.effect.MobEffectInstance;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.craftbukkit.potion.CraftPotionType;
|
||||
@@ -48,6 +50,19 @@ public record PaperPotionContents(
|
||||
return this.impl.customName().orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Unmodifiable List<PotionEffect> allEffects() {
|
||||
//noinspection SimplifyStreamApiCallChains - explicity want it unmodifiable, as toList() api doesnt guarantee this.
|
||||
return StreamSupport.stream(this.impl.getAllEffects().spliterator(), false)
|
||||
.map(CraftPotionUtil::toBukkit)
|
||||
.collect(Collectors.toUnmodifiableList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Color computeEffectiveColor() {
|
||||
return Color.fromARGB(this.impl.getColor());
|
||||
}
|
||||
|
||||
static final class BuilderImpl implements PotionContents.Builder {
|
||||
|
||||
private final List<MobEffectInstance> customEffects = new ObjectArrayList<>();
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package org.bukkit.craftbukkit.inventory;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.Collections2;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap.Builder;
|
||||
import java.util.ArrayList;
|
||||
@@ -25,6 +26,7 @@ import org.bukkit.potion.PotionData;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.potion.PotionType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@DelegateDeserialization(SerializableMeta.class)
|
||||
class CraftMetaPotion extends CraftMetaItem implements PotionMeta {
|
||||
@@ -202,6 +204,19 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public List<PotionEffect> getAllEffects() {
|
||||
final ImmutableList.Builder<PotionEffect> builder = ImmutableList.builder();
|
||||
if (this.hasBasePotionType()) {
|
||||
builder.addAll(this.getBasePotionType().getPotionEffects());
|
||||
}
|
||||
if (this.hasCustomEffects()) {
|
||||
builder.addAll(this.customEffects);
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addCustomEffect(PotionEffect effect, boolean overwrite) {
|
||||
Preconditions.checkArgument(effect != null, "Potion effect cannot be null");
|
||||
@@ -305,6 +320,17 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta {
|
||||
this.color = color == null ? null : color.asRGB();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Color computeEffectiveColor() {
|
||||
if (hasColor()) return getColor();
|
||||
|
||||
return Color.fromRGB(
|
||||
PotionContents.getColorOptional(Collections2.transform(getAllEffects(), CraftPotionUtil::fromBukkit))
|
||||
.orElse(PotionContents.BASE_POTION_COLOR) & 0xFFFFFF
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCustomPotionName() {
|
||||
return this.customName != null;
|
||||
|
Reference in New Issue
Block a user