Add HiddenPotionEffect API

This commit is contained in:
Tamion 2023-11-05 09:50:48 +01:00
parent 27a62b6b53
commit 0a1e7d6d0f
2 changed files with 63 additions and 13 deletions

View file

@ -591,6 +591,9 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
/**
* Adds the given {@link PotionEffect} to the living entity.
* <p>
* Note: {@link PotionEffect#getHiddenPotionEffect()} is ignored when
* adding the effect to the entity.
*
* @param effect PotionEffect to be added
* @return whether the effect could be added
@ -615,6 +618,9 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
/**
* Attempts to add all of the given {@link PotionEffect} to the living
* entity.
* <p>
* Note: {@link PotionEffect#getHiddenPotionEffect()} is ignored when
* adding the effect to the entity.
*
* @param effects the effects to add
* @return whether all of the effects could be added

View file

@ -28,6 +28,7 @@ public class PotionEffect implements ConfigurationSerializable {
*/
public static final int INFINITE_DURATION = -1;
private static final String HIDDEN_EFFECT = "hidden_effect"; // Paper
private static final String AMPLIFIER = "amplifier";
private static final String DURATION = "duration";
private static final String TYPE = "effect";
@ -40,6 +41,32 @@ public class PotionEffect implements ConfigurationSerializable {
private final boolean ambient;
private final boolean particles;
private final boolean icon;
private final PotionEffect hiddenEffect; // Paper
/**
* Creates a potion effect.
* @param type effect type
* @param duration measured in ticks, see {@link
* PotionEffect#getDuration()}
* @param amplifier the amplifier, see {@link PotionEffect#getAmplifier()}
* @param ambient the ambient status, see {@link PotionEffect#isAmbient()}
* @param particles the particle status, see {@link PotionEffect#hasParticles()}
* @param icon the icon status, see {@link PotionEffect#hasIcon()}
* @param hiddenEffect the hidden PotionEffect
* @hidden Internal-- hidden effects are only shown internally
*/
@org.jetbrains.annotations.ApiStatus.Internal // Paper
public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon, @Nullable PotionEffect hiddenEffect) { // Paper
Preconditions.checkArgument(type != null, "effect type cannot be null");
this.type = type;
this.duration = duration;
this.amplifier = amplifier;
this.ambient = ambient;
this.particles = particles;
this.icon = icon;
// Paper start
this.hiddenEffect = hiddenEffect;
}
/**
* Creates a potion effect.
@ -52,13 +79,8 @@ public class PotionEffect implements ConfigurationSerializable {
* @param icon the icon status, see {@link PotionEffect#hasIcon()}
*/
public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon) {
Preconditions.checkArgument(type != null, "effect type cannot be null");
this.type = type;
this.duration = duration;
this.amplifier = amplifier;
this.ambient = ambient;
this.particles = particles;
this.icon = icon;
this(type, duration, amplifier, ambient, particles, icon, null);
// Paper end
}
/**
@ -106,7 +128,7 @@ public class PotionEffect implements ConfigurationSerializable {
* @param map the map to deserialize from
*/
public PotionEffect(@NotNull Map<String, Object> map) {
this(getEffectType(map), getInt(map, DURATION), getInt(map, AMPLIFIER), getBool(map, AMBIENT, false), getBool(map, PARTICLES, true), getBool(map, ICON, getBool(map, PARTICLES, true)));
this(getEffectType(map), getInt(map, DURATION), getInt(map, AMPLIFIER), getBool(map, AMBIENT, false), getBool(map, PARTICLES, true), getBool(map, ICON, getBool(map, PARTICLES, true)), (PotionEffect) map.get(HIDDEN_EFFECT)); // Paper
}
// Paper start
@ -134,6 +156,19 @@ public class PotionEffect implements ConfigurationSerializable {
public PotionEffect withIcon(boolean icon) {
return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon);
}
/**
* Returns the PotionEffect that will become active
* after the current PotionEffect has run out.
* <p>
* Note: This value is only applicable to type applied to living entities.
*
* @return The hidden PotionEffect.
*/
@Nullable
public PotionEffect getHiddenPotionEffect() {
return hiddenEffect;
}
// Paper end
@NotNull
@ -170,19 +205,27 @@ public class PotionEffect implements ConfigurationSerializable {
@Override
@NotNull
public Map<String, Object> serialize() {
return ImmutableMap.<String, Object>builder()
ImmutableMap.Builder<String, Object> builder = ImmutableMap.<String, Object>builder() // Paper
.put(TYPE, type.getKey().toString())
.put(DURATION, duration)
.put(AMPLIFIER, amplifier)
.put(AMBIENT, ambient)
.put(PARTICLES, particles)
.put(ICON, icon)
.build();
.put(ICON, icon);
// Paper start
if (this.hiddenEffect != null) {
builder.put(HIDDEN_EFFECT, this.hiddenEffect);
}
return builder.build();
// Paper end
}
/**
* Attempts to add the effect represented by this object to the given
* {@link LivingEntity}.
* <p>
* Note: {@link PotionEffect#getHiddenPotionEffect()} is ignored when
* adding the effect to the entity.
*
* @param entity The entity to add this effect to
* @return Whether the effect could be added
@ -201,7 +244,7 @@ public class PotionEffect implements ConfigurationSerializable {
return false;
}
PotionEffect that = (PotionEffect) obj;
return this.type.equals(that.type) && this.ambient == that.ambient && this.amplifier == that.amplifier && this.duration == that.duration && this.particles == that.particles && this.icon == that.icon;
return this.type.equals(that.type) && this.ambient == that.ambient && this.amplifier == that.amplifier && this.duration == that.duration && this.particles == that.particles && this.icon == that.icon && java.util.Objects.equals(this.hiddenEffect, that.hiddenEffect); // Paper
}
/**
@ -306,11 +349,12 @@ public class PotionEffect implements ConfigurationSerializable {
hash ^= 0x22222222 >> (ambient ? 1 : -1);
hash ^= 0x22222222 >> (particles ? 1 : -1);
hash ^= 0x22222222 >> (icon ? 1 : -1);
if (hiddenEffect != null) hash = hash * 31 + hiddenEffect.hashCode(); // Paper
return hash;
}
@Override
public String toString() {
return type.getName() + (ambient ? ":(" : ":") + duration + "t-x" + amplifier + (ambient ? ")" : "");
return "PotionEffect{" + "amplifier=" + amplifier + ", duration=" + duration + ", type=" + type + ", ambient=" + ambient + ", particles=" + particles + ", icon=" + icon + ", hiddenEffect=" + hiddenEffect + '}'; // Paper
}
}