effectType = $effectType; $this->setDuration($duration ?? $effectType->getDefaultDuration()); $this->amplifier = $amplifier; $this->visible = $visible; $this->ambient = $ambient; $this->color = $overrideColor ?? $effectType->getColor(); } public function getId() : int{ return $this->effectType->getId(); } /** * @return Effect */ public function getType() : Effect{ return $this->effectType; } /** * @return int */ public function getDuration() : int{ return $this->duration; } /** * @param int $duration * @throws \InvalidArgumentException * * @return $this */ public function setDuration(int $duration) : EffectInstance{ if($duration < 0 or $duration > INT32_MAX){ throw new \InvalidArgumentException("Effect duration must be in range 0 - " . INT32_MAX . ", got $duration"); } $this->duration = $duration; return $this; } /** * Decreases the duration by the given number of ticks, without dropping below zero. * * @param int $ticks * * @return $this */ public function decreaseDuration(int $ticks) : EffectInstance{ $this->duration = max(0, $this->duration - $ticks); return $this; } /** * Returns whether the duration has run out. * * @return bool */ public function hasExpired() : bool{ return $this->duration <= 0; } /** * @return int */ public function getAmplifier() : int{ return $this->amplifier; } /** * Returns the level of this effect, which is always one higher than the amplifier. * * @return int */ public function getEffectLevel() : int{ return $this->amplifier + 1; } /** * @param int $amplifier * * @return $this */ public function setAmplifier(int $amplifier) : EffectInstance{ $this->amplifier = $amplifier; return $this; } /** * Returns whether this effect will produce some visible effect, such as bubbles or particles. * * @return bool */ public function isVisible() : bool{ return $this->visible; } /** * @param bool $visible * * @return $this */ public function setVisible(bool $visible = true) : EffectInstance{ $this->visible = $visible; return $this; } /** * Returns whether the effect originated from the ambient environment. * Ambient effects can originate from things such as a Beacon's area of effect radius. * If this flag is set, the amount of visible particles will be reduced by a factor of 5. * * @return bool */ public function isAmbient() : bool{ return $this->ambient; } /** * @param bool $ambient * * @return $this */ public function setAmbient(bool $ambient = true) : EffectInstance{ $this->ambient = $ambient; return $this; } /** * Returns the particle colour of this effect instance. This can be overridden on a per-EffectInstance basis, so it * is not reflective of the default colour of the effect. * * @return Color */ public function getColor() : Color{ return clone $this->color; } /** * Sets the colour of this EffectInstance. * * @param Color $color * * @return EffectInstance */ public function setColor(Color $color) : EffectInstance{ $this->color = clone $color; return $this; } /** * Resets the colour of this EffectInstance to the default specified by its type. * * @return EffectInstance */ public function resetColor() : EffectInstance{ $this->color = $this->effectType->getColor(); return $this; } }