From 59dc2a758f50fecdd469403ce590e5e4ebfdde05 Mon Sep 17 00:00:00 2001 From: Chronoken Date: Tue, 13 Mar 2018 19:46:27 +0100 Subject: [PATCH] Buff effect position fix! Fixed a bug which existed even in nisovin's version of MagicSpells, it caused all effects with buff position in buff spells to increase each time you have used that buff spell. --- .../magicspells/spelleffects/SpellEffect.java | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/src/com/nisovin/magicspells/spelleffects/SpellEffect.java b/src/com/nisovin/magicspells/spelleffects/SpellEffect.java index bf02d1c33..4f7582a6f 100644 --- a/src/com/nisovin/magicspells/spelleffects/SpellEffect.java +++ b/src/com/nisovin/magicspells/spelleffects/SpellEffect.java @@ -155,13 +155,10 @@ public final Runnable playEffect(final Location location) { private Runnable playEffectLocationReal(Location location) { if (location == null) return playEffectLocation(null); - if (heightOffset != 0 || forwardOffset != 0) { - Location loc = location.clone(); - if (heightOffset != 0) loc.setY(loc.getY() + heightOffset); - if (forwardOffset != 0) loc.add(loc.getDirection().setY(0).normalize().multiply(forwardOffset)); - return playEffectLocation(loc); - } - return playEffectLocation(location.clone()); + Location loc = location.clone(); + if (heightOffset != 0) loc.setY(loc.getY() + heightOffset); + if (forwardOffset != 0) loc.add(loc.getDirection().setY(0).normalize().multiply(forwardOffset)); + return playEffectLocation(loc); } protected Runnable playEffectLocation(Location location) { @@ -194,14 +191,7 @@ public Runnable playEffect(Location location1, Location location2) { } public void playEffectWhileActiveOnEntity(final Entity entity, final SpellEffectActiveChecker checker) { - taskId = MagicSpells.scheduleRepeatingTask(new Runnable() { - - @Override - public void run() { - if (checker.isActive(entity)) playEffect(entity); - } - - }, 0, effectInterval); + new EffectTracker(entity, checker); } public OrbitTracker playEffectWhileActiveOrbit(final Entity entity, final SpellEffectActiveChecker checker) { @@ -214,7 +204,38 @@ public interface SpellEffectActiveChecker { boolean isActive(Entity entity); } - + + class EffectTracker implements Runnable { + + Entity entity; + SpellEffectActiveChecker checker; + int effectTrackerTaskId; + + public EffectTracker(Entity entity, SpellEffectActiveChecker checker) { + this.entity = entity; + this.checker = checker; + this.effectTrackerTaskId = MagicSpells.scheduleRepeatingTask(this, 0, effectInterval); + } + + @Override + public void run() { + // check for valid and alive caster + if (!entity.isValid() || !checker.isActive(entity)) { + stop(); + return; + } + + playEffect(entity); + + } + + public void stop() { + MagicSpells.cancelTask(effectTrackerTaskId); + entity = null; + } + + } + class OrbitTracker implements Runnable { Entity entity; @@ -296,15 +317,13 @@ public void stop() { */ public static SpellEffect createNewEffectByName(String name) { Class clazz = effects.get(name.toLowerCase()); - if (clazz != null) { - try { - return clazz.newInstance(); - } catch (Exception e) { - DebugHandler.debugGeneral(e); - return null; - } + if (clazz == null) return null; + try { + return clazz.newInstance(); + } catch (Exception e) { + DebugHandler.debugGeneral(e); + return null; } - return null; } public void playTrackingLinePatterns(Location origin, Location target, Entity originEntity, Entity targetEntity) {