effectType = $effectType; $this->setDuration($duration ?? $effectType->getDefaultDuration()); $this->setAmplifier($amplifier); $this->visible = $visible; $this->ambient = $ambient; $this->color = $overrideColor ?? $effectType->getColor(); } public function getType() : Effect{ return $this->effectType; } /** * Returns the number of ticks remaining until the effect expires. */ public function getDuration() : int{ return $this->duration; } /** * Sets the number of ticks remaining until the effect expires. * * @throws \InvalidArgumentException * * @return $this */ public function setDuration(int $duration) : EffectInstance{ if($duration < 0 || $duration > Limits::INT32_MAX){ throw new \InvalidArgumentException("Effect duration must be in range 0 - " . Limits::INT32_MAX . ", got $duration"); } $this->duration = $duration; return $this; } /** * Decreases the duration by the given number of ticks, without dropping below zero. * * @return $this */ public function decreaseDuration(int $ticks) : EffectInstance{ $this->duration = max(0, $this->duration - $ticks); return $this; } /** * Returns whether the duration has run out. */ public function hasExpired() : bool{ return $this->duration <= 0; } public function getAmplifier() : int{ return $this->amplifier; } /** * Returns the level of this effect, which is always one higher than the amplifier. */ public function getEffectLevel() : int{ return $this->amplifier + 1; } /** * @return $this */ public function setAmplifier(int $amplifier) : EffectInstance{ if($amplifier < 0 || $amplifier > 255){ throw new \InvalidArgumentException("Amplifier must be in range 0 - 255, got $amplifier"); } $this->amplifier = $amplifier; return $this; } /** * Returns whether this effect will produce some visible effect, such as bubbles or particles. */ public function isVisible() : bool{ return $this->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. */ public function isAmbient() : bool{ return $this->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. */ public function getColor() : Color{ return $this->color; } /** * Sets the colour of this EffectInstance. */ public function setColor(Color $color) : EffectInstance{ $this->color = $color; return $this; } /** * Resets the colour of this EffectInstance to the default specified by its type. */ public function resetColor() : EffectInstance{ $this->color = $this->effectType->getColor(); return $this; } }