|
1 | 1 | package com.nisovin.magicspells.spelleffects; |
2 | 2 |
|
3 | | -import java.util.HashMap; |
4 | 3 | import java.util.List; |
| 4 | +import java.util.HashMap; |
5 | 5 |
|
6 | | -import com.nisovin.magicspells.util.TimeUtil; |
7 | 6 | import org.bukkit.Location; |
8 | | -import org.bukkit.configuration.ConfigurationSection; |
9 | | -import org.bukkit.entity.Entity; |
10 | 7 | import org.bukkit.util.Vector; |
| 8 | +import org.bukkit.entity.Entity; |
| 9 | +import org.bukkit.configuration.ConfigurationSection; |
11 | 10 |
|
12 | | -import com.nisovin.magicspells.DebugHandler; |
| 11 | +import com.nisovin.magicspells.util.Util; |
13 | 12 | import com.nisovin.magicspells.MagicSpells; |
14 | | -import com.nisovin.magicspells.castmodifiers.ModifierSet; |
| 13 | +import com.nisovin.magicspells.DebugHandler; |
| 14 | +import com.nisovin.magicspells.util.TimeUtil; |
15 | 15 | import com.nisovin.magicspells.util.ConfigData; |
| 16 | +import com.nisovin.magicspells.castmodifiers.ModifierSet; |
16 | 17 | import com.nisovin.magicspells.util.expression.Expression; |
17 | 18 |
|
18 | 19 | /** |
@@ -54,7 +55,22 @@ public abstract class SpellEffect { |
54 | 55 |
|
55 | 56 | @ConfigData(field="orbit-tick-interval", dataType="int", defaultValue="2") |
56 | 57 | int tickInterval = 2; |
57 | | - |
| 58 | + |
| 59 | + @ConfigData(field="orbit-horiz-offset", dataType="double", defaultValue="0") |
| 60 | + float horizOffset = 0; |
| 61 | + |
| 62 | + @ConfigData(field="orbit-horiz-expand-radius", dataType="double", defaultValue="0") |
| 63 | + float horizExpandRadius = 0; |
| 64 | + |
| 65 | + @ConfigData(field="orbit-vert-expand-radius", dataType="double", defaultValue="0") |
| 66 | + float vertExpandRadius = 0; |
| 67 | + |
| 68 | + @ConfigData(field="orbit-horiz-expand-delay", dataType="double", defaultValue="0") |
| 69 | + int horizExpandDelay = 0; |
| 70 | + |
| 71 | + @ConfigData(field="orbit-vert-expand-delay", dataType="double", defaultValue="0") |
| 72 | + int vertExpandDelay = 0; |
| 73 | + |
58 | 74 | float ticksPerSecond; |
59 | 75 | float distancePerTick; |
60 | 76 | int ticksPerRevolution; |
@@ -89,6 +105,11 @@ public final void loadFromConfiguration(ConfigurationSection config) { |
89 | 105 | distanceBetween = config.getDouble("distance-between", distanceBetween); |
90 | 106 | effectInterval = config.getInt("effect-interval", effectInterval); |
91 | 107 |
|
| 108 | + horizExpandRadius = (float)config.getDouble("orbit-horiz-expand-radius", horizExpandRadius); |
| 109 | + horizExpandDelay = config.getInt("orbit-horiz-expand-delay", horizExpandDelay); |
| 110 | + vertExpandRadius = (float)config.getDouble("orbit-vert-expand-radius", vertExpandRadius); |
| 111 | + vertExpandDelay = config.getInt("orbit-vert-expand-delay", vertExpandDelay); |
| 112 | + horizOffset = (float)config.getDouble("orbit-horiz-offset", horizOffset); |
92 | 113 | orbitRadius = (float)config.getDouble("orbit-radius", orbitRadius); |
93 | 114 | secondsPerRevolution = (float)config.getDouble("orbit-seconds-per-revolution", secondsPerRevolution); |
94 | 115 | counterClockwise = config.getBoolean("orbit-counter-clockwise", counterClockwise); |
@@ -200,14 +221,27 @@ class OrbitTracker implements Runnable { |
200 | 221 | SpellEffectActiveChecker checker; |
201 | 222 | Vector currentPosition; |
202 | 223 | int orbitTrackerTaskId; |
| 224 | + int repeatingHorizTaskId; |
| 225 | + int repeatingVertTaskId; |
| 226 | + float orbRadius; |
| 227 | + float orbHeight; |
203 | 228 |
|
204 | 229 | int counter = 0; |
205 | 230 |
|
206 | 231 | public OrbitTracker(Entity entity, SpellEffectActiveChecker checker) { |
207 | 232 | this.entity = entity; |
208 | 233 | this.checker = checker; |
209 | 234 | this.currentPosition = entity.getLocation().getDirection().setY(0); |
| 235 | + Util.rotateVector(this.currentPosition, horizOffset); |
| 236 | + this.orbRadius = orbitRadius; |
| 237 | + this.orbHeight = orbitYOffset; |
210 | 238 | this.orbitTrackerTaskId = MagicSpells.scheduleRepeatingTask(this, 0, tickInterval); |
| 239 | + if (horizExpandDelay > 0 && horizExpandRadius != 0) { |
| 240 | + this.repeatingHorizTaskId = MagicSpells.scheduleRepeatingTask(() -> this.orbRadius += horizExpandRadius, horizExpandDelay, horizExpandDelay); |
| 241 | + } |
| 242 | + if (vertExpandDelay > 0 && vertExpandRadius != 0) { |
| 243 | + this.repeatingVertTaskId = MagicSpells.scheduleRepeatingTask(() -> this.orbHeight += vertExpandRadius, vertExpandDelay, vertExpandDelay); |
| 244 | + } |
211 | 245 | } |
212 | 246 |
|
213 | 247 | @Override |
@@ -240,11 +274,13 @@ private Location getLocation() { |
240 | 274 | perp = new Vector(-currentPosition.getZ(), 0, currentPosition.getX()); |
241 | 275 | } |
242 | 276 | currentPosition.add(perp.multiply(distancePerTick)).normalize(); |
243 | | - return entity.getLocation().add(0, orbitYOffset, 0).add(currentPosition.clone().multiply(orbitRadius)); |
| 277 | + return entity.getLocation().add(0, orbHeight, 0).add(currentPosition.clone().multiply(orbRadius)); |
244 | 278 | } |
245 | 279 |
|
246 | 280 | public void stop() { |
247 | 281 | MagicSpells.cancelTask(orbitTrackerTaskId); |
| 282 | + MagicSpells.cancelTask(repeatingHorizTaskId); |
| 283 | + MagicSpells.cancelTask(repeatingVertTaskId); |
248 | 284 | entity = null; |
249 | 285 | currentPosition = null; |
250 | 286 | } |
|
0 commit comments