more impl

This commit is contained in:
Paul Reilly 2023-07-19 21:34:07 -05:00
parent eb3805eb1f
commit e6ac8cfee5
7 changed files with 152 additions and 51 deletions

View File

@ -5,7 +5,6 @@ import app.simplexdev.arcanumocculta.api.caster.CasterLevel;
import app.simplexdev.arcanumocculta.api.spell.enums.Damages; import app.simplexdev.arcanumocculta.api.spell.enums.Damages;
import app.simplexdev.arcanumocculta.api.spell.enums.Durations; import app.simplexdev.arcanumocculta.api.spell.enums.Durations;
import app.simplexdev.arcanumocculta.api.spell.enums.ManaCosts; import app.simplexdev.arcanumocculta.api.spell.enums.ManaCosts;
import app.simplexdev.arcanumocculta.util.SpellUtils;
import java.util.List; import java.util.List;
import java.util.SplittableRandom; import java.util.SplittableRandom;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -22,7 +21,6 @@ import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType; import org.bukkit.potion.PotionType;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@ -53,6 +51,20 @@ public abstract class AbstractSpell implements Spell
this.coolDown = coolDown; this.coolDown = coolDown;
} }
private static ItemDisplay createProjectile(final Material visual, final World world, final Location location,
final Vector velocity)
{
final ItemDisplay display = (ItemDisplay) world.spawnEntity(location, EntityType.ITEM_DISPLAY);
display.setItemStack(new ItemStack(visual));
display.setGravity(true);
display.setPersistent(false);
display.setSilent(true);
display.setShadowRadius(0);
display.setShadowStrength(0);
display.setVelocity(velocity);
return display;
}
@Override @Override
public String getName() public String getName()
{ {
@ -155,10 +167,31 @@ public abstract class AbstractSpell implements Spell
getSpellEffects())); getSpellEffects()));
} }
public void simulateExplosion(final Location location, final float size, boolean breakBlocks) { public void simulateExplosion(final Location location, final float size, boolean breakBlocks)
{
location.getWorld().createExplosion(location, size, true, breakBlocks); location.getWorld().createExplosion(location, size, true, breakBlocks);
} }
public Vector tracerVector(final Caster caster)
{
return caster.bukkit().getLocation().clone().getDirection().multiply(2);
}
public Location topLocation(final Caster caster)
{
final World world = caster.bukkit().getWorld();
final Location eyeLocation = caster.bukkit().getEyeLocation().clone();
final int diff = world.getMaxHeight() - eyeLocation.getBlockY();
return eyeLocation.add(0, diff, 0);
}
public Vector meteorVector(final Caster caster)
{
final Location topLocation = topLocation(caster);
final Vector v = topLocation.getDirection().normalize();
return v.multiply(new Vector(0, -5, 0));
}
public Entity prepareProjectile(final Caster caster, final Material visual, final Vector velocity) public Entity prepareProjectile(final Caster caster, final Material visual, final Vector velocity)
{ {
final double expMod = getLevelRequirement().getExperienceMarker(); final double expMod = getLevelRequirement().getExperienceMarker();
@ -172,7 +205,7 @@ public abstract class AbstractSpell implements Spell
return projectile; return projectile;
} }
public void tracer(final World world, final Location location, final Particle particle) public void tracerDirectional(final World world, final Location location, final Particle particle)
{ {
world.spawnParticle(particle, world.spawnParticle(particle,
location, location,
@ -182,6 +215,13 @@ public abstract class AbstractSpell implements Spell
random().nextDouble(-2, 2)); random().nextDouble(-2, 2));
} }
public void tracerRGB(final World world, final Location location,
final Particle particle, final int r,
final int g, final int b)
{
world.spawnParticle(particle, location, 0, r, g, b);
}
public void spiral(final World world, final Location location, final Particle particle) public void spiral(final World world, final Location location, final Particle particle)
{ {
final double step = 0.5; final double step = 0.5;
@ -202,12 +242,14 @@ public abstract class AbstractSpell implements Spell
final Particle particle, final Particle particle,
final float size, final float size,
final int duration, final int duration,
final PotionType effect) { final PotionType effect)
{
AreaEffectCloud cloud = (AreaEffectCloud) world.spawnEntity(location, EntityType.AREA_EFFECT_CLOUD); AreaEffectCloud cloud = (AreaEffectCloud) world.spawnEntity(location, EntityType.AREA_EFFECT_CLOUD);
cloud.setParticle(particle); cloud.setParticle(particle);
cloud.setDuration(duration); cloud.setDuration(duration);
if (effect != null) { if (effect != null)
{
cloud.setBasePotionData(new PotionData(effect)); cloud.setBasePotionData(new PotionData(effect));
} }
@ -223,18 +265,4 @@ public abstract class AbstractSpell implements Spell
for (final SpellEffect effect : effects) for (final SpellEffect effect : effects)
effect.apply(target, caster); effect.apply(target, caster);
} }
private static ItemDisplay createProjectile(final Material visual, final World world, final Location location,
final Vector velocity)
{
final ItemDisplay display = (ItemDisplay) world.spawnEntity(location, EntityType.ITEM_DISPLAY);
display.setItemStack(new ItemStack(visual));
display.setGravity(true);
display.setPersistent(false);
display.setSilent(true);
display.setShadowRadius(0);
display.setShadowStrength(0);
display.setVelocity(velocity);
return display;
}
} }

View File

@ -23,16 +23,17 @@
package app.simplexdev.arcanumocculta.api.spell.enums; package app.simplexdev.arcanumocculta.api.spell.enums;
// Reference for implementation. // Reference for implementation.
// Remove entries when complete in order to keep track of progress.
public enum SpellTypes public enum SpellTypes
{ {
SOUL_PEBBLE, SOUL_SHARD, LARGE_SOUL_SHARD, SOUL_COMET, SOUL_SPIRAL, LARGE_SOUL_SHARD, SOUL_COMET, SOUL_SPIRAL,
SOUL_SHOWER, SOUL_ARC, SOUL_BARRAGE, SOUL_BURST, SOUL_CANNON, SOUL_HAMMER, SOUL_BLAST, SOUL_EXPLOSION, SOUL_SHOWER, SOUL_ARC, SOUL_BARRAGE, SOUL_BURST, SOUL_CANNON, SOUL_HAMMER, SOUL_BLAST, SOUL_EXPLOSION,
SOUL_PHALANX, GREAT_SOUL_PHALANX, SOUL_MIST, ARS_NOVA, ARS_ENIGMA, ARS_ULTIMA, SOUL_PHALANX, GREAT_SOUL_PHALANX, SOUL_MIST, ARS_NOVA, ARS_ENIGMA, ARS_ULTIMA,
FLAME_SLING, FLAME_BURST, CATCH_FLAME, FLAME_BARRAGE, FIREBALL, METEORITE, METEOR, FLAME_WHIP, FLAME_FAN, FLAME_BURST, CATCH_FLAME, FLAME_BARRAGE, FIREBALL, METEORITE, METEOR, FLAME_WHIP, FLAME_FAN,
FLAME_ORB, FLAME_PILLARS, FLAME_WHIRLWIND, FLAME_ORB, FLAME_PILLARS, FLAME_WHIRLWIND,
WITHER_BURST, WITHER_SHOT, WITHER_SHARD, WITHER_COMET, WITHER_METEORITE, WITHER_BURST, WITHER_SHOT, WITHER_SHARD, WITHER_COMET,
HEALING, GREATER_HEALING, HEAL_OTHER, HEALING_HANDS, HEALING_WAVE, GUARDIAN_PROTECTION, SAVIORS_BLESSING, HEALING, GREATER_HEALING, HEAL_OTHER, HEALING_HANDS, HEALING_WAVE, GUARDIAN_PROTECTION, SAVIORS_BLESSING,
DIVING_BLESSING, DIVINE_GRACE, ULTIMATE_HEALING, DIVINE_INTERVENTION, DIVINE_RETRIBUTION, DIVING_BLESSING, DIVINE_GRACE, ULTIMATE_HEALING, DIVINE_INTERVENTION, DIVINE_RETRIBUTION,

View File

@ -63,9 +63,7 @@ public class FlameSling extends AbstractSpell
return; return;
final Entity projectile = prepareProjectile(caster, Material.FIRE_CHARGE, final Entity projectile = prepareProjectile(caster, Material.FIRE_CHARGE,
caster.bukkit() tracerVector(caster));
.getLocation().clone()
.getDirection().multiply(2));
while (!projectile.isDead()) { while (!projectile.isDead()) {
if (!projectile.getNearbyEntities(1, 1, 1).isEmpty()) { if (!projectile.getNearbyEntities(1, 1, 1).isEmpty()) {

View File

@ -44,15 +44,11 @@ public final class SoulPebble extends AbstractSpell
} }
final Entity projectile = prepareProjectile(caster, Material.AIR, final Entity projectile = prepareProjectile(caster, Material.AIR,
caster.bukkit() tracerVector(caster));
.getLocation()
.clone()
.getDirection()
.multiply(2));
while (!projectile.isOnGround() || !projectile.isDead()) while (!projectile.isOnGround() || !projectile.isDead())
{ {
tracer(projectile.getWorld(), projectile.getLocation(), Particle.SOUL); tracerDirectional(projectile.getWorld(), projectile.getLocation(), Particle.SOUL);
if (!projectile.getNearbyEntities(1, 1, 1).isEmpty()) if (!projectile.getNearbyEntities(1, 1, 1).isEmpty())
{ {

View File

@ -64,17 +64,13 @@ public final class SoulShard extends AbstractSpell
} }
final Entity projectile = prepareProjectile(caster, Material.AIR, final Entity projectile = prepareProjectile(caster, Material.AIR,
caster.bukkit() tracerVector(caster));
.getLocation()
.clone()
.getDirection()
.multiply(2));
while (!projectile.isDead()) while (!projectile.isDead())
{ {
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
{ {
tracer(projectile.getWorld(), projectile.getLocation(), Particle.SOUL); tracerDirectional(projectile.getWorld(), projectile.getLocation(), Particle.SOUL);
} }
if (!projectile.getNearbyEntities(1, 1, 1).isEmpty()) if (!projectile.getNearbyEntities(1, 1, 1).isEmpty())

View File

@ -0,0 +1,86 @@
/*
* Copyright (c) 2023 Simplex Development Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* with the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package app.simplexdev.arcanumocculta.spells.wither;
import app.simplexdev.arcanumocculta.api.caster.Caster;
import app.simplexdev.arcanumocculta.api.caster.CasterLevel;
import app.simplexdev.arcanumocculta.api.spell.AbstractSpell;
import app.simplexdev.arcanumocculta.api.spell.SpellEffect;
import app.simplexdev.arcanumocculta.api.spell.enums.Damages;
import app.simplexdev.arcanumocculta.api.spell.enums.Durations;
import app.simplexdev.arcanumocculta.api.spell.enums.ManaCosts;
import app.simplexdev.arcanumocculta.api.wand.Wand;
import app.simplexdev.arcanumocculta.util.SpellUtils;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.entity.Entity;
public class WitherBurst extends AbstractSpell
{
protected WitherBurst()
{
super("Wither Burst", "wither_burst",
"Fire a bolt of withering energy at your enemies.",
CasterLevel.ADEPT,
Damages.SEVERE,
Durations.MEDIUM,
ManaCosts.HEAVY_CAST,
120L);
}
@Override
public SpellEffect[] getSpellEffects()
{
final SpellEffect[] effects = new SpellEffect[1];
effects[0] = SpellUtils.witherEffectBase(baseDamage(), effectDuration());
return effects;
}
@Override
public void cast(Caster caster, Wand wand)
{
if (!checkManaCosts(caster))
return;
final Entity projectile = prepareProjectile(caster,
Material.AIR,
tracerVector(caster));
while (!projectile.isDead())
{
tracerRGB(projectile.getWorld(), projectile.getLocation(), Particle.SPELL_MOB, 16, 16, 16);
if (!projectile.getNearbyEntities(1, 1, 1).isEmpty())
{
applyEffects(projectile.getNearbyEntities(1, 1, 1), caster);
projectile.remove();
}
if (projectile.isOnGround())
{
projectile.remove();
}
}
}
}

View File

@ -32,10 +32,8 @@ import app.simplexdev.arcanumocculta.api.spell.enums.ManaCosts;
import app.simplexdev.arcanumocculta.api.wand.Wand; import app.simplexdev.arcanumocculta.api.wand.Wand;
import app.simplexdev.arcanumocculta.util.SpellUtils; import app.simplexdev.arcanumocculta.util.SpellUtils;
import java.util.List; import java.util.List;
import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.util.Vector;
public final class WitherMeteorite extends AbstractSpell public final class WitherMeteorite extends AbstractSpell
{ {
@ -63,16 +61,14 @@ public final class WitherMeteorite extends AbstractSpell
@Override @Override
public void cast(Caster caster, Wand wand) public void cast(Caster caster, Wand wand)
{ {
if (this.checkManaCosts(caster)) if (!checkManaCosts(caster))
return; return;
final Location location = caster.bukkit().getEyeLocation().clone().add(0, 256, 0);
final Vector direction = location.getDirection().add(new Vector(0, -5, 0));
final Entity projectile = prepareProjectile(caster, final Entity projectile = prepareProjectile(caster,
Material.WITHER_SKELETON_SKULL, Material.WITHER_SKELETON_SKULL,
direction); meteorVector(caster));
getSpellEffects()[1] = SpellUtils.meteorLikeEffectBase(baseDamage(), direction, 4F); getSpellEffects()[1] = SpellUtils.meteorLikeEffectBase(baseDamage(), meteorVector(caster), 4F);
while (!projectile.isDead()) while (!projectile.isDead())
{ {