Class AreaEffectSpell

java.lang.Object
com.binaris.wizardry.api.content.spell.Spell
com.binaris.wizardry.content.spell.abstr.AreaEffectSpell
Direct Known Subclasses:
BlindingFlash, Enrage, Firestorm, FontOfMana, ForestsCurse, GroupHeal, IceAge, InvigoratingPresence, PlagueOfDarkness

public abstract class AreaEffectSpell extends Spell
Base class for spells that affect entities within a specified area of effect (AoE). Handles finding targets within range, calculating the effective radius based on modifiers, and applying effects to each target.

This spell can be cast by entities (targeting around themselves or a specific target) and by location (targeting around a block position). The actual effect applied to each entity is defined by overriding the affectEntity(CastContext, Vec3, LivingEntity, int) method.

The area of effect radius is determined by the DefaultProperties.EFFECT_RADIUS property and can be modified by blast upgrades. Targets are automatically sorted by distance from the origin point, with closer entities being affected first.

The spell automatically spawns particle effects in a circular pattern around the origin point. You can customize the particle density by calling particleDensity(float) and override spawnParticle(Level, double, double, double) to define which particles to spawn.

Check Firestorm and FontOfMana for examples of area effect spells.

You must override the Spell.properties() to return an actual instance of SpellProperties for this spell or use Spell.assignProperties(SpellProperties), otherwise the spell will have no properties and may not function as intended.

  • Field Details

    • targetAllies

      protected boolean targetAllies
      Whether this spell targets allies instead of enemies. Defaults to false.
    • alwaysSucceed

      protected boolean alwaysSucceed
      Whether this spell should always succeed, even if no targets are affected. Defaults to false.
    • particleDensity

      protected float particleDensity
      Density multiplier for particle spawning. Higher values spawn more particles. Defaults to 0.65.
  • Constructor Details

    • AreaEffectSpell

      public AreaEffectSpell()
  • Method Details

    • targetAllies

      public AreaEffectSpell targetAllies(boolean targetAllies)
      Sets whether this spell targets allies instead of enemies.

      When set to true, the spell will only affect entities that are allied with the caster. When set to false (default), the spell will only affect valid enemy targets.

      Parameters:
      targetAllies - true to target allies, false to target enemies
      Returns:
      this spell instance for method chaining
    • alwaysSucceed

      public AreaEffectSpell alwaysSucceed(boolean alwaysSucceed)
      Sets whether this spell should always succeed, regardless of whether any targets are affected.

      When set to true, the spell will return true (success) even if no entities are found or affected. When set to false (default), the spell will only succeed if at least one entity is affected.

      Parameters:
      alwaysSucceed - true to always succeed, false to require at least one affected entity
      Returns:
      this spell instance for method chaining
    • particleDensity

      public AreaEffectSpell particleDensity(float particleDensity)
      Sets the particle density multiplier for this spell's visual effect.

      The actual particle count is calculated as particleDensity * π * radius², so higher values result in more particles being spawned. The default is 0.65.

      Parameters:
      particleDensity - the particle density multiplier
      Returns:
      this spell instance for method chaining
    • canCastByEntity

      public boolean canCastByEntity()
      Description copied from class: Spell
      Whether this spell can be cast by an entity source (e.g. a player or a mob). By default, this returns false, as some spells may be designed to only be cast by non-entity sources, but you can override this to return true if your spell is meant to be cast by entities.
      Overrides:
      canCastByEntity in class Spell
      Returns:
      true if this spell can be cast by an entity source, false otherwise.
    • canCastByLocation

      public boolean canCastByLocation()
      Description copied from class: Spell
      Whether this spell can be cast by a non-entity source (e.g. a command block or a dispenser). By default, this returns false, as most spells are meant to be cast by entities, but you can override this to return true if your spell is designed to be cast by non-entity sources.
      Overrides:
      canCastByLocation in class Spell
      Returns:
      true if this spell can be cast by a non-entity source, false otherwise.
    • cast

      public boolean cast(PlayerCastContext ctx)
      Description copied from class: Spell
      This cast method is meant to be used for spells that are cast by a player source. This is useful for spells that are meant to be cast by players, as it provides more information about the caster and the context of the cast.

      Override this method to implement the casting behavior for spells that are meant to be cast by players.

      Specified by:
      cast in class Spell
      Parameters:
      ctx - The context of the spell cast, containing information about the world, caster, hand used, modifiers, etc.
      Returns:
      true if the spell was successfully cast, false otherwise. If this returns false, the spell will not be considered as having been cast, so no cooldown will be applied.
    • cast

      public boolean cast(EntityCastContext ctx)
      Description copied from class: Spell
      This cast method is meant to be used for spells that are cast by an entity source, like a mob. This is useful for spells that are meant to be cast by entities, as it provides more information about the caster and the context of the cast.

      Override this method to implement the casting behavior for spells that are meant to be cast by entities.

      Overrides:
      cast in class Spell
      Parameters:
      ctx - The context of the spell cast, containing information about the world, caster, modifiers, etc.
      Returns:
      true if the spell was successfully cast, false otherwise. If this returns false, the spell will not be considered as having been cast, so no cooldown will be applied.
    • cast

      public boolean cast(LocationCastContext ctx)
      Description copied from class: Spell
      This cast method is meant to be used for spells that are not cast by an entity, but rather by a non-entity source, like a command block or a dispenser. This is useful for spells that are meant to be cast in a specific location without needing an entity to cast them. By default, this returns false, as most spells are meant to be cast by entities. You can override this to return true if your spell is meant to be cast by non-entity sources and to implement the casting behavior for that case.
      Overrides:
      cast in class Spell
      Parameters:
      ctx - The context of the spell cast, containing information about the world, location, modifiers, etc.
      Returns:
      true if the spell was successfully cast, false otherwise. If this returns false, the spell will not be considered as having been cast, so no cooldown will be applied.
    • findAndAffectEntities

      protected boolean findAndAffectEntities(CastContext ctx, net.minecraft.world.phys.Vec3 origin)
      Finds all entities within the effect radius and applies the spell's effect to them.

      This method calculates the effective radius, searches for all living entities within that radius, filters them based on the targetAllies setting, sorts them by distance from the origin, and then calls affectEntity(CastContext, Vec3, LivingEntity, int) for each target.

      On the client side, this method also spawns particle effects via spawnParticleEffect(CastContext, Vec3, double).

      Parameters:
      ctx - the cast context containing spell information and modifiers
      origin - the center point of the area effect
      Returns:
      true if at least one entity was affected, or if alwaysSucceed is true
    • affectEntity

      protected abstract boolean affectEntity(CastContext ctx, net.minecraft.world.phys.Vec3 origin, net.minecraft.world.entity.LivingEntity target, int targetCount)
      Applies the spell's effect to a single target entity.

      This method must be implemented by subclasses to define what happens when the spell affects an entity. It is called for each valid target found within the area of effect, in order of distance from the origin (closest first).

      Parameters:
      ctx - the cast context containing spell information and modifiers
      origin - the center point of the area effect
      target - the entity to affect
      targetCount - the index of this target in the sorted list (0 for the closest entity, 1 for the second closest, etc.)
      Returns:
      true if the entity was successfully affected, false otherwise
    • spawnParticleEffect

      protected void spawnParticleEffect(CastContext ctx, net.minecraft.world.phys.Vec3 origin, double radius)
      Spawns particle effects in a circular pattern around the origin point.

      The number of particles is determined by particleDensity * π * radius². Particles are spawned at random positions within the radius, distributed in a circle around the origin.

      This method calls spawnParticle(Level, double, double, double) for each particle position. Override spawnParticle to define which particles to spawn.

      Parameters:
      ctx - the cast context containing spell information
      origin - the center point of the area effect
      radius - the radius of the area effect
    • spawnParticle

      protected void spawnParticle(net.minecraft.world.level.Level world, double x, double y, double z)
      Spawns a single particle at the specified position.

      Override this method in subclasses to define which particle type to spawn and with what parameters. This method is called multiple times by spawnParticleEffect(CastContext, Vec3, double) to create the full particle effect.

      Parameters:
      world - the world to spawn the particle in
      x - the x coordinate
      y - the y coordinate
      z - the z coordinate