package net.minestom.server.potion;
import net.minestom.server.entity.Entity;
import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.play.EntityEffectPacket;
import net.minestom.server.network.packet.server.play.RemoveEntityEffectPacket;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
import static net.minestom.server.network.NetworkBuffer.BYTE;
import static net.minestom.server.network.NetworkBuffer.VAR_INT;
/**
* Represents a potion effect that can be added to an {@link net.minestom.server.entity.Entity}.
*
* @param effect the potion effect
* @param amplifier the amplifier starting at 0 (level 1)
* @param duration the duration (in ticks) that the potion will last
* @param flags the flags of the potion, see {@link #flags()}
*/
public record Potion(@NotNull PotionEffect effect, byte amplifier,
int duration, byte flags) implements NetworkBuffer.Writer {
/**
* A flag indicating that this Potion is ambient (it came from a beacon).
*
* @see #PARTICLES_FLAG
* @see #ICON_FLAG
* @see #flags()
*/
public static final byte AMBIENT_FLAG = 0x01;
/**
* A flag indicating that this Potion has particles.
*
* @see #AMBIENT_FLAG
* @see #ICON_FLAG
* @see #flags()
*/
public static final byte PARTICLES_FLAG = 0x02;
/**
* A flag indicating that this Potion has an icon.
*
* @see #AMBIENT_FLAG
* @see #PARTICLES_FLAG
* @see #flags()
*/
public static final byte ICON_FLAG = 0x04;
/**
* Creates a new Potion with no flags.
*
* @see #Potion(PotionEffect, byte, int, byte)
*/
public Potion(@NotNull PotionEffect effect, byte amplifier, int duration) {
this(effect, amplifier, duration, (byte) 0);
}
public Potion(@NotNull NetworkBuffer reader) {
this(Objects.requireNonNull(PotionEffect.fromId(reader.read(VAR_INT))), reader.read(BYTE),
reader.read(VAR_INT), reader.read(BYTE));
}
/**
* Returns the flags that this Potion has.
*
* @see #AMBIENT_FLAG
* @see #PARTICLES_FLAG
* @see #ICON_FLAG
*/
@Override
public byte flags() {
return flags;
}
/**
* Returns whether this Potion is ambient (it came from a beacon) or not.
*
* @return true
if the Potion is ambient
*/
public boolean isAmbient() {
return (flags & AMBIENT_FLAG) == AMBIENT_FLAG;
}
/**
* Returns whether this Potion has particles or not.
*
* @return true
if the Potion has particles
*/
public boolean hasParticles() {
return (flags & PARTICLES_FLAG) == PARTICLES_FLAG;
}
/**
* Returns whether this Potion has an icon or not.
*
* @return true
if the Potion has an icon
*/
public boolean hasIcon() {
return (flags & ICON_FLAG) == ICON_FLAG;
}
/**
* Sends a packet that a potion effect has been applied to the entity.
*
* Used internally by {@link net.minestom.server.entity.Player#addEffect(Potion)} * * @param entity the entity to add the effect to */ public void sendAddPacket(@NotNull Entity entity) { entity.sendPacketToViewersAndSelf(new EntityEffectPacket(entity.getEntityId(), this, null)); } /** * Sends a packet that a potion effect has been removed from the entity. *
* Used internally by {@link net.minestom.server.entity.Player#removeEffect(PotionEffect)} * * @param entity the entity to remove the effect from */ public void sendRemovePacket(@NotNull Entity entity) { entity.sendPacketToViewersAndSelf(new RemoveEntityEffectPacket(entity.getEntityId(), effect)); } @Override public void write(@NotNull NetworkBuffer writer) { writer.write(VAR_INT, effect.id()); writer.write(BYTE, amplifier); writer.write(VAR_INT, duration); writer.write(BYTE, flags); } }