Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,46 +7,54 @@

import com.nisovin.magicspells.Spell;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.util.SpellData;
import com.nisovin.magicspells.handlers.DebugHandler;

public class SpellPreImpactEvent extends SpellEvent implements Cancellable {

private LivingEntity target;
private float power;
private Spell deliverySpell;
private final Spell deliverySpell;

private SpellData spellData;

private boolean redirect;
private boolean cancelled;

@Deprecated
public SpellPreImpactEvent(Spell spellPayload, Spell deliverySpell, LivingEntity caster, LivingEntity target, float power) {
super(spellPayload, caster);
this.target = target;
this.power = power;
this(spellPayload, deliverySpell, new SpellData(caster, target, power));
}

public SpellPreImpactEvent(Spell spellPayload, Spell deliverySpell, SpellData spellData) {
super(spellPayload, spellData.caster());
this.deliverySpell = deliverySpell;
redirect = false;
cancelled = false;
this.spellData = spellData;
if (DebugHandler.isSpellPreImpactEventCheckEnabled()) MagicSpells.plugin.getLogger().info(toString());
}

public LivingEntity getTarget() {
return target;
return spellData.target();
}

public boolean getRedirected() {
return redirect;
}

public void setRedirected(boolean redirect) {
this.redirect = redirect;
}

public float getPower() {
return power;
return spellData.power();
}

public void setPower(float power) {
this.power = power;
spellData = spellData.power(power);
}


public SpellData getSpellData() {
return spellData;
}

public Spell getDeliverySpell() {
return deliverySpell;
}
Expand All @@ -60,14 +68,14 @@ public boolean isCancelled() {
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}

@Override
public String toString() {
String casterLabel = "Caster: " + (caster == null ? "null" : caster.toString());
String targetLabel = "Target: " + (target == null ? "null" : target.toString());
String spellLabel = "SpellPayload: " + (spell == null ? "null" : spell.toString());
String payloadSpellLabel = "Delivery Spell: " + (deliverySpell == null ? "null" : deliverySpell.toString());
String casterLabel = "Caster: " + caster;
String targetLabel = "Target: " + spellData.target();
String spellLabel = "SpellPayload: " + (spell == null ? "null" : spell.getInternalName());
String payloadSpellLabel = "Delivery Spell: " + (deliverySpell == null ? "null" : deliverySpell.getInternalName());
return Arrays.deepToString(new String[]{ casterLabel, targetLabel, spellLabel, payloadSpellLabel });
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,14 @@ public SpellData getSpellData() {
return spellData;
}

/**
* Sets the spell's {@link SpellData} to the provided value.
* @param data the new data
*/
public void setSpellData(SpellData data) {
spellData = data;
}

@Override
public boolean isCancelled() {
return cancelled;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
// NO API CHANGES - NEEDS TOTAL REWORK
public class ReflectSpell extends BuffSpell {

private final Map<UUID, ReflectData> reflectors;
private final Set<String> shieldBreakerNames;
private final Set<String> delayedReflectionSpells;
private final Map<UUID, ReflectData> reflectors = new HashMap<>();
private final Set<String> shieldBreakerNames = new HashSet<>();
private final Set<String> delayedReflectionSpells = new HashSet<>();

private final ConfigData<Float> reflectedSpellPowerMultiplier;

Expand All @@ -31,10 +31,6 @@ public class ReflectSpell extends BuffSpell {
public ReflectSpell(MagicConfig config, String spellName) {
super(config, spellName);

reflectors = new HashMap<>();
shieldBreakerNames = new HashSet<>();
delayedReflectionSpells = new HashSet<>();

shieldBreakerNames.addAll(getConfigStringList("shield-breakers", new ArrayList<>()));
delayedReflectionSpells.addAll(getConfigStringList("delayed-reflection-spells", new ArrayList<>()));

Expand Down Expand Up @@ -93,17 +89,15 @@ public void onSpellTarget(SpellTargetEvent event) {
if (!target.isValid()) return;
if (!isActive(target)) return;

if (shieldBreakerNames != null && shieldBreakerNames.contains(event.getSpell().getInternalName())) {
if (shieldBreakerNames.contains(event.getSpell().getInternalName())) {
turnOff(target);
return;
}
if (delayedReflectionSpells != null && delayedReflectionSpells.contains(event.getSpell().getInternalName())) {
// Let the delayed reflection spells target the reflector so the animations run
// It will get reflected later
return;
}

event.setTarget(event.getCaster());
// Let the delayed reflection spells target the reflector so the reflection is handled on impact instead.
if (delayedReflectionSpells.contains(event.getSpell().getInternalName())) return;

event.setSpellData(event.getSpellData().invert());
ReflectData data = reflectors.get(target.getUniqueId());

addUseAndChargeCost(target);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.nisovin.magicspells.events.SpellTargetEvent;
import com.nisovin.magicspells.zones.NoMagicZoneManager;
import com.nisovin.magicspells.spells.TargetedEntitySpell;
import com.nisovin.magicspells.events.SpellPreImpactEvent;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.TargetedLocationSpell;
import com.nisovin.magicspells.spells.TargetedEntityFromLocationSpell;
Expand Down Expand Up @@ -268,27 +269,38 @@ public CastResult castAtEntityFromLocation(SpellData data) {
//check entities in the beam range
for (LivingEntity e : loc.getNearbyLivingEntities(hitRadius, verticalHitRadius)) {
if (!e.isValid() || immune.contains(e)) continue;
if (!validTargetList.canTarget(data.caster(), e)) continue;
if (!validTargetList.canTarget(locData.caster(), e)) continue;

SpellTargetEvent event = new SpellTargetEvent(this, locData, e);
if (!event.callEvent()) continue;

SpellData subData = event.getSpellData();
LivingEntity entity = event.getTarget();

if (hitSpell != null) hitSpell.subcast(subData.noLocation());
if (entityLocationSpell != null) entityLocationSpell.subcast(subData.noTarget());
if (hitSpell != null) {
SpellPreImpactEvent preImpact = new SpellPreImpactEvent(hitSpell.getSpell(), BeamSpell.this, subData);
if (preImpact.callEvent()) {
subData = preImpact.getSpellData();

if (preImpact.getRedirected()) {
step.multiply(-1);
locData = subData.caster(entity);
continue mainLoop;
} else hitSpell.subcast(subData.noLocation());
}
}

playSpellEffects(EffectPosition.TARGET, entity, subData);
playSpellEffectsTrail(data.caster().getLocation(), entity.getLocation(), subData);
immune.add(e);
playSpellEffectsTrail(subData.caster().getLocation(), entity.getLocation(), subData);
immune.add(entity);
if (stopOnHitEntity) break mainLoop;
}
}

//end of the beam
if (!zoneManager.willFizzle(loc, this) && d >= maxDistance) {
playSpellEffects(EffectPosition.DELAYED, loc, data.location(loc));
playSpellEffects(EffectPosition.DELAYED, loc, locData.location(loc));
if (endSpell != null) endSpell.subcast(locData);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import org.bukkit.entity.ArmorStand;
import org.bukkit.event.EventHandler;
import org.bukkit.inventory.ItemStack;
import org.bukkit.attribute.Attribute;
import org.bukkit.entity.LivingEntity;
import org.bukkit.persistence.PersistentDataType;

Expand All @@ -28,6 +27,7 @@
import com.nisovin.magicspells.util.magicitems.MagicItem;
import com.nisovin.magicspells.util.magicitems.MagicItems;
import com.nisovin.magicspells.spells.TargetedEntitySpell;
import com.nisovin.magicspells.events.SpellPreImpactEvent;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.TargetedLocationSpell;
import com.nisovin.magicspells.spells.TargetedEntityFromLocationSpell;
Expand Down Expand Up @@ -298,7 +298,7 @@ public CastResult castAtEntityFromLocation(SpellData data) {
stand.getPersistentDataContainer().set(MS_BLOCK_BEAM, PersistentDataType.BOOLEAN, true);

if (hpFix) {
stand.getAttribute(Attribute.MAX_HEALTH).setBaseValue(health);
Util.setMaxHealth(stand, health);
stand.setHealth(health);
}

Expand All @@ -310,18 +310,29 @@ public CastResult castAtEntityFromLocation(SpellData data) {
//check entities in the beam range
for (LivingEntity e : loc.getNearbyLivingEntities(hitRadius, verticalHitRadius)) {
if (!e.isValid() || immune.contains(e)) continue;
if (!validTargetList.canTarget(data.caster(), e)) continue;
if (!validTargetList.canTarget(locData.caster(), e)) continue;

SpellTargetEvent event = new SpellTargetEvent(this, locData, e);
if (!event.callEvent()) continue;

SpellData subData = event.getSpellData();
LivingEntity subTarget = event.getTarget();

if (hitSpell != null) hitSpell.subcast(subData.noLocation());
if (hitSpell != null) {
SpellPreImpactEvent preImpact = new SpellPreImpactEvent(hitSpell.getSpell(), BlockBeamSpell.this, subData);
if (preImpact.callEvent()) {
subData = preImpact.getSpellData();

if (preImpact.getRedirected()) {
step.multiply(-1);
locData = subData.caster(e);
continue mainLoop;
} else hitSpell.subcast(subData.noLocation());
}
}

playSpellEffects(EffectPosition.TARGET, subTarget, subData);
playSpellEffectsTrail(data.caster().getLocation(), subTarget.getLocation(), subData);
playSpellEffectsTrail(subData.caster().getLocation(), subTarget.getLocation(), subData);
immune.add(e);

if (stopOnHitEntity) break mainLoop;
Expand All @@ -330,7 +341,7 @@ public CastResult castAtEntityFromLocation(SpellData data) {

//end of the beam
if (!zoneManager.willFizzle(loc, this) && d >= maxDistance) {
playSpellEffects(EffectPosition.DELAYED, loc, data.location(loc));
playSpellEffects(EffectPosition.DELAYED, loc, locData.location(loc));
if (endSpell != null) endSpell.subcast(locData);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import org.bukkit.Location;
import org.bukkit.entity.*;
import org.bukkit.util.Vector;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.PotionSplashEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
Expand Down Expand Up @@ -286,40 +285,27 @@ public void onCreatureSpawn(CreatureSpawnEvent event) {
}

@EventHandler
public void onProjectileHit(ProjectileHitEvent e) {
Projectile projectile = e.getEntity();
Block block = e.getHitBlock();
Entity entity = e.getHitEntity();
public void onProjectileHit(ProjectileHitEvent event) {
Projectile projectile = event.getEntity();

Iterator<ProjectileTracker> iterator = trackerSet.iterator();
Set<ProjectileTracker> trackers = new HashSet<>(trackerSet);
for (ProjectileTracker tracker : trackers) {
if (!projectile.equals(tracker.getProjectile())) continue;

SpellData subData = tracker.getSpellData();

if (block != null) {
while (iterator.hasNext()) {
ProjectileTracker tracker = iterator.next();
if (tracker.getProjectile() == null) continue;
if (!tracker.getProjectile().equals(projectile)) continue;
if (event.getHitBlock() != null) {
subData = subData.location(projectile.getLocation());

SpellData subData = tracker.getSpellData().location(projectile.getLocation());
if (tracker.getGroundSpell() != null) tracker.getGroundSpell().subcast(subData);
tracker.stop(false);
iterator.remove();

tracker.stop();
break;
}
}

if (entity instanceof LivingEntity livingEntity) {
while (iterator.hasNext()) {
ProjectileTracker tracker = iterator.next();
if (tracker.getProjectile() == null) continue;
if (!tracker.getProjectile().equals(projectile)) continue;

SpellData subData = tracker.getSpellData().target(livingEntity);
if (tracker.getHitSpell() != null) tracker.getHitSpell().subcast(subData);

playSpellEffects(EffectPosition.TARGET, livingEntity, subData);
e.setCancelled(true);
tracker.stop(false);
iterator.remove();
if (event.getHitEntity() instanceof LivingEntity target) {
event.setCancelled(true);
tracker.hitEntity(target, subData.target(target));
break;
}
}
Expand Down
Loading
Loading