Skip to content
Home
Post Code
Jass (Warcraft III)
Wurst
GUI (Warcraft III)
Galaxy (StarCraft II)
GUI (StarCraft II)
C++
Java
Delphi
Text
Search Code
Compare Code
Uploads
Draw
Create New Drawing
View Drawings
Graph
Log in
<pre class="jasscode"><span class="style_comment">/* 4 Packages included..</span> <span class="style_comment">Projectile superclass</span> <span class="style_comment">TimedBlasts (main system)</span> <span class="style_comment">Kamehameha (2d example of TimedBlasts System)</span> <span class="style_comment">AngryKame (3d example of TimedBlasts System</span> <span class="style_comment"></span> <span class="style_comment">TimedBlasts attempts to give a system to create various "timed blasts" that can be customized to create tons of different spells that follow the general layout</span> <span class="style_comment"></span> <span class="style_comment">User begins channeling animation, creating the projectile near them..</span> <span class="style_comment">after a certain size is reached, the projectile is launched to the target point inflicting damage.</span> <span class="style_comment"></span> <span class="style_comment">If two "clashable" blasts hit each other, the two casters will be in a struggle until one runs out of mana, and the winning blast will change target to its opposing caster unit.</span> <span class="style_comment"></span> <span class="style_comment">*visual example of what this code attempts to achieve in the case of a 3d clashable blast https://www.youtube.com/watch?v=M7i5Z3C5ZOk</span> <span class="style_comment">*note clashable and 3d hasn't been tested/made yet*</span> <span class="style_comment"></span> <span class="style_comment"></span> <span class="style_comment"> protected real impactAoe - size of aoe for damage to be done</span> <span class="style_comment"> protected real damage - damage to be done</span> <span class="style_comment"> protected real endScale - final scale of the blast before launching</span> <span class="style_comment"> protected boolean trailOn - creates a trail following the blast as it flies to the target</span> <span class="style_comment"> protected boolean dustOn - creates a dust effect around the caster as he fires</span> <span class="style_comment"> protected boolean pulseOn - makes the missile pulsate as it flies to the targeted area</span> <span class="style_comment"> protected boolean launchOn - creates a launch effect as the missile is launched</span> <span class="style_comment"> protected boolean dropOn - if the missile is fired from an aerial position, the missile is lowered to the targetted area</span> <span class="style_comment"> protected boolean flightOn - if the missile will be fired from an aerial position</span> <span class="style_comment"> protected string trailSFX - specify what SFX will be used for the trail</span> <span class="style_comment"> protected string pulseSFX - specify what SFX will be used for the pulse</span> <span class="style_comment"> protected string launchSFX - " "</span> <span class="style_comment"> protected string finalSFX - " "</span> <span class="style_comment"> protected string dustSFX - " "</span> <span class="style_comment"> protected real trailSize - size of trail created</span> <span class="style_comment"> protected real pulseSize - size of pulses</span> <span class="style_comment"> protected real launchSize - size of launch</span> <span class="style_comment"> protected colorA missileCol - color of missile</span> <span class="style_comment"> protected colorA trailCol = color of trail</span> <span class="style_comment"> protected colorA pulseCol = color of pulse</span> <span class="style_comment"> protected real speed - speed of missile during travel</span> <span class="style_comment"> protected int channelIndex - animation index to channel</span> <span class="style_comment"> protected int launchIndex - animation index to launch</span> <span class="style_comment"> protected real offsetDistance = 50 - small offset from caster</span> <span class="style_comment"> protected real realDropSpeed = -15 if there is a drop, reasonable dropspeed, can be changed</span> <span class="style_comment"> private real timeSinceLastTrail = 0 - used to create trail</span> <span class="style_comment"> private real timeSinceLastPulse = 0 - used to create pulses</span> <span class="style_comment"> private real timeSinceLastChannel = 0 - uses to create channel</span> <span class="style_comment"> protected real timeDistance - how long trails and pulses should last, depends on speed, and missile sizes, should be configured to each spell accordingly</span> <span class="style_comment"> protected sound throwSound = generic missile size</span> <span class="style_comment"> protected real lowerRate = 150. speed that a missile will lower if it is a 3d missile</span> <span class="style_comment"> protected real destroyExplode = 1.5 how long the destruction sfx will be played</span> <span class="style_comment"> protected boolean clashing - setting if the missile is ready to clash</span> <span class="style_comment"> protected boolean clashable - saves true value for clashable until channeling is complete</span> <span class="style_comment"> protected boolean clashed - if a missile has clashed, prevents further clashs</span> <span class="style_comment"> protected boolean channeling = if a missile is still channeling, it cannot clash yet</span> <span class="style_comment"></span> <span class="style_comment">*/</span> <span class="style_keyword">package</span> Projectile <span class="style_keyword">import</span> <span class="style_keyword">public</span> Entity <span class="style_keyword">public</span> <span class="style_keyword">class</span> Projectile <span class="style_keyword">extends</span> FxEntity <span class="style_comment">// Angles</span> <span class="style_keyword">protected</span> angle xyAngle <span class="style_keyword">private</span> vec3 startpos <span class="style_keyword">private</span> <span class="style_type">boolean</span> timed <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">private</span> <span class="style_type">boolean</span> ranged <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_comment">// Moving Speed</span> <span class="style_keyword">private</span> <span class="style_type">real</span> speed <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">private</span> <span class="style_type">real</span> acc <span class="style_symbol">=</span> <span class="style_int">1</span>.<span class="style_int">0</span> <span class="style_keyword">protected</span> <span class="style_type">real</span> dist <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">private</span> <span class="style_type">real</span> maxDist <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">protected</span> <span class="style_type">real</span> lifespan <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">protected</span> <span class="style_type">real</span> dropSpeed <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">construct</span><span class="style_symbol">(</span> vec3 pos<span class="style_symbol">,</span> <span class="style_type">real</span> radius<span class="style_symbol">,</span> <span class="style_type">player</span> owner<span class="style_symbol">,</span> angle xyAngle<span class="style_symbol">,</span> <span class="style_type">string</span> fxpath <span class="style_symbol">)</span> super<span class="style_symbol">(</span>pos<span class="style_symbol">,</span> radius<span class="style_symbol">,</span> owner<span class="style_symbol">,</span> xyAngle<span class="style_symbol">,</span> fxpath<span class="style_symbol">)</span> startpos <span class="style_symbol">=</span> pos setXYAngle<span class="style_symbol">(</span>xyAngle<span class="style_symbol">)</span> active <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">function</span> setRanged<span class="style_symbol">(</span><span class="style_type">real</span> maxDistance<span class="style_symbol">)</span> <span class="style_keyword">this</span>.maxDist <span class="style_symbol">=</span> maxDistance<span class="style_symbol">*</span>maxDistance ranged <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">function</span> setTimed<span class="style_symbol">(</span><span class="style_type">real</span> lifespan<span class="style_symbol">)</span> <span class="style_keyword">this</span>.lifespan <span class="style_symbol">=</span> lifespan timed <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">function</span> setSpeed<span class="style_symbol">(</span><span class="style_type">real</span> speed<span class="style_symbol">)</span> <span class="style_keyword">this</span>.speed <span class="style_symbol">=</span> speed <span class="style_comment">//angle.direction(real distance)</span> setVel<span class="style_symbol">(</span>vec3<span class="style_symbol">(</span>xyAngle.cos<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">*</span>speed<span class="style_symbol">,</span> xyAngle.sin<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">*</span>speed<span class="style_symbol">,</span> dropSpeed<span class="style_symbol">)</span><span class="style_symbol">)</span> <span class="style_keyword">function</span> setSpeed<span class="style_symbol">(</span><span class="style_type">real</span> speed<span class="style_symbol">,</span> <span class="style_type">real</span> drop<span class="style_symbol">)</span> <span class="style_keyword">this</span>.speed <span class="style_symbol">=</span> speed <span class="style_comment">//angle.direction(real distance)</span> setVel<span class="style_symbol">(</span>vec3<span class="style_symbol">(</span>xyAngle.cos<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">*</span>speed<span class="style_symbol">,</span> xyAngle.sin<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">*</span>speed<span class="style_symbol">,</span> drop<span class="style_symbol">)</span><span class="style_symbol">)</span> <span class="style_keyword">function</span> setAcc<span class="style_symbol">(</span><span class="style_type">real</span> factor<span class="style_symbol">)</span> <span class="style_keyword">this</span>.acc <span class="style_symbol">=</span> factor <span class="style_keyword">function</span> getSpeed<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">returns</span> <span class="style_type">real</span> <span class="style_keyword">return</span> speed <span class="style_keyword">function</span> setXYAngle<span class="style_symbol">(</span>angle xyA<span class="style_symbol">)</span> <span class="style_keyword">this</span>.xyAngle <span class="style_symbol">=</span> xyA fx.setXYAngle<span class="style_symbol">(</span>xyA<span class="style_symbol">)</span> <span class="style_keyword">function</span> setZAngle<span class="style_symbol">(</span>angle zA<span class="style_symbol">)</span> fx.setZAngle<span class="style_symbol">(</span>zA<span class="style_symbol">)</span> <span class="style_keyword">override</span> <span class="style_keyword">function</span> update<span class="style_symbol">(</span><span class="style_symbol">)</span> vel <span class="style_symbol">*</span><span class="style_symbol">=</span> acc pos <span class="style_symbol">+</span><span class="style_symbol">=</span> vel fixPos<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">if</span> timed lifespan <span class="style_symbol">-</span><span class="style_symbol">=</span> ANIMATION_PERIOD <span class="style_keyword">if</span> lifespan <<span class="style_symbol">=</span> <span class="style_int">0</span> done <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">return</span> <span class="style_keyword">if</span> ranged <span class="style_keyword">if</span> startpos.distToVecSquared<span class="style_symbol">(</span>pos<span class="style_symbol">)</span> > maxDist done <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">package</span> TimedBlasts <span class="style_keyword">import</span> Projectile <span class="style_keyword">import</span> LinkedListModule <span class="style_keyword">import</span> Fx <span class="style_keyword">import</span> Constants <span class="style_keyword">import</span> ClosureTimers <span class="style_keyword">import</span> Terrain <span class="style_keyword">import</span> LinkedList <span class="style_keyword">public</span> <span class="style_keyword">class</span> TimedBlasts <span class="style_keyword">extends</span> Projectile <span class="style_keyword">use</span> LinkedListModule <span class="style_comment">//Editable values</span> <span class="style_keyword">protected</span> <span class="style_type">real</span> impactAoe <span class="style_keyword">protected</span> <span class="style_type">real</span> damage <span class="style_keyword">protected</span> <span class="style_type">real</span> endScale <span class="style_keyword">protected</span> <span class="style_type">boolean</span> trailOn <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> dustOn <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> pulseOn <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> launchOn <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> dropOn <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> flightOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">protected</span> <span class="style_type">string</span> trailSFX <span class="style_keyword">protected</span> <span class="style_type">string</span> pulseSFX <span class="style_keyword">protected</span> <span class="style_type">string</span> launchSFX <span class="style_keyword">protected</span> <span class="style_type">string</span> finalSFX <span class="style_keyword">protected</span> <span class="style_type">string</span> dustSFX <span class="style_symbol">=</span> dustWave <span class="style_keyword">protected</span> <span class="style_type">real</span> trailSize <span class="style_keyword">protected</span> <span class="style_type">real</span> pulseSize <span class="style_keyword">protected</span> <span class="style_type">real</span> launchSize <span class="style_keyword">protected</span> colorA missileCol <span class="style_symbol">=</span> colorA<span class="style_symbol">(</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">)</span> <span class="style_keyword">protected</span> colorA trailCol <span class="style_symbol">=</span> colorA<span class="style_symbol">(</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">)</span> <span class="style_keyword">protected</span> colorA pulseCol <span class="style_symbol">=</span> colorA<span class="style_symbol">(</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">)</span> <span class="style_keyword">protected</span> <span class="style_type">real</span> speed <span class="style_keyword">protected</span> <span class="style_type">int</span> channelIndex <span class="style_keyword">protected</span> <span class="style_type">int</span> launchIndex <span class="style_keyword">protected</span> <span class="style_type">real</span> offsetDistance <span class="style_symbol">=</span> <span class="style_int">50</span> <span class="style_keyword">protected</span> <span class="style_type">real</span> realDropSpeed <span class="style_symbol">=</span> <span class="style_symbol">-</span><span class="style_int">15</span> <span class="style_keyword">private</span> <span class="style_type">real</span> timeSinceLastTrail <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">private</span> <span class="style_type">real</span> timeSinceLastPulse <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">private</span> <span class="style_type">real</span> timeSinceLastChannel <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">protected</span> <span class="style_type">real</span> timeDistance <span class="style_symbol">=</span> <span class="style_int">1</span> <span class="style_keyword">protected</span> <span class="style_type">sound</span> throwSound <span class="style_symbol">=</span> gg_snd_kamehameha_fire <span class="style_keyword">protected</span> <span class="style_type">real</span> lowerRate <span class="style_symbol">=</span> <span class="style_int">150</span>. <span class="style_keyword">protected</span> <span class="style_type">real</span> destroyExplode <span class="style_symbol">=</span> <span class="style_int">1</span>.<span class="style_int">5</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> clashing <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> clashable <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> clashed <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> <span class="style_type">boolean</span> channeling <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">protected</span> LinkedList<Fx> trailList <span class="style_symbol">=</span> <span class="style_keyword">new</span> LinkedList<Fx><span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_comment">//Instance Variables</span> <span class="style_keyword">private</span> vec3 target <span class="style_keyword">protected</span> <span class="style_type">unit</span> u <span class="style_keyword">private</span> <span class="style_type">timer</span> t <span class="style_symbol">=</span> getTimer<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">protected</span> <span class="style_type">real</span> scale <span class="style_keyword">protected</span> angle targetAngle <span class="style_keyword">private</span> <span class="style_type">boolean</span> missileCast <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">construct</span><span class="style_symbol">(</span><span class="style_type">unit</span> actor<span class="style_symbol">,</span>vec3 pos<span class="style_symbol">,</span> <span class="style_type">player</span> owner<span class="style_symbol">,</span> vec3 target<span class="style_symbol">,</span> <span class="style_type">string</span> SFX<span class="style_symbol">,</span> <span class="style_type">real</span> originalScale<span class="style_symbol">)</span> super<span class="style_symbol">(</span>pos.addReals<span class="style_symbol">(</span><span class="style_int">0</span><span class="style_symbol">,</span> <span class="style_int">0</span><span class="style_symbol">,</span> pos.withTerrainZ<span class="style_symbol">(</span><span class="style_symbol">)</span>.z<span class="style_symbol">)</span><span class="style_symbol">,</span> <span class="style_int">0</span><span class="style_symbol">,</span> owner<span class="style_symbol">,</span> pos.angleTo2d<span class="style_symbol">(</span>target<span class="style_symbol">)</span><span class="style_symbol">,</span> SFX<span class="style_symbol">)</span> <span class="style_keyword">this</span>.targetAngle <span class="style_symbol">=</span> pos.angleTo2d<span class="style_symbol">(</span>target<span class="style_symbol">)</span> <span class="style_keyword">this</span>.u <span class="style_symbol">=</span> actor <span class="style_keyword">this</span>.target <span class="style_symbol">=</span> target <span class="style_keyword">this</span>.u.pause<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.scale <span class="style_symbol">=</span> originalScale <span class="style_keyword">function</span> startMissile<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.setSpeed<span class="style_symbol">(</span><span class="style_int">0</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.pos <span class="style_symbol">=</span> pos.offset2d<span class="style_symbol">(</span>pos.angleTo2d<span class="style_symbol">(</span>target<span class="style_symbol">)</span><span class="style_symbol">,</span> offsetDistance<span class="style_symbol">)</span> <span class="style_keyword">this</span>.pos.z <span class="style_symbol">+</span><span class="style_symbol">=</span> <span class="style_int">50</span> <span class="style_keyword">this</span>.fixPos<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.fx.setColor<span class="style_symbol">(</span>missileCol<span class="style_symbol">)</span> <span class="style_keyword">this</span>.fx.setScale<span class="style_symbol">(</span><span class="style_keyword">this</span>.scale<span class="style_symbol">)</span> <span class="style_keyword">this</span>.t.setData<span class="style_symbol">(</span><span class="style_keyword">this</span> <span class="style_keyword">castTo</span> <span class="style_type">int</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.t.startPeriodic<span class="style_symbol">(</span>.<span class="style_int">1</span><span class="style_symbol">,</span> <span class="style_keyword">function</span> callExpandMissile<span class="style_symbol">)</span> <span class="style_comment">//if dust is activated</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.dustOn <span class="style_keyword">this</span>.createDust<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">function</span> createDust<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_type">effect</span> x <span class="style_symbol">=</span> <a class="style_function" href="http://www.mappedia.de/wiki/Jass:AddSpecialEffectTarget">AddSpecialEffectTarget</a><span class="style_symbol">(</span>dustSFX<span class="style_symbol">,</span> u<span class="style_symbol">,</span> <span class="style_string">"origin"</span><span class="style_symbol">)</span> <a class="style_function" href="http://www.mappedia.de/wiki/Jass:DestroyEffectBJ">DestroyEffectBJ</a><span class="style_symbol">(</span>x<span class="style_symbol">)</span> <span class="style_keyword">static</span> <span class="style_keyword">function</span> callExpandMissile<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">(</span><a class="style_function" href="http://www.mappedia.de/wiki/Jass:GetExpiredTimer">GetExpiredTimer</a><span class="style_symbol">(</span><span class="style_symbol">)</span>.getData<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">castTo</span> TimedBlasts<span class="style_symbol">)</span>.expandMissile<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">function</span> expandMissile<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.timeSinceLastChannel <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">this</span>.u.setAnimation<span class="style_symbol">(</span>channelIndex<span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.timeSinceLastChannel ><span class="style_symbol">=</span> <span class="style_symbol">(</span>.<span class="style_int">18</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.u.setAnimation<span class="style_symbol">(</span>channelIndex<span class="style_symbol">)</span> <span class="style_keyword">this</span>.timeSinceLastChannel <span class="style_symbol">-</span><span class="style_symbol">=</span> <span class="style_symbol">(</span>.<span class="style_int">17</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.timeSinceLastChannel <span class="style_symbol">+</span><span class="style_symbol">=</span> ANIMATION_PERIOD <span class="style_keyword">this</span>.scale <span class="style_symbol">+</span><span class="style_symbol">=</span> .<span class="style_int">05</span> <span class="style_keyword">this</span>.fx.setScale<span class="style_symbol">(</span><span class="style_keyword">this</span>.scale<span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.scale ><span class="style_symbol">=</span> endScale <span class="style_keyword">if</span> <span class="style_keyword">this</span>.flightOn <span class="style_keyword">this</span>.u.setFlyHeight<span class="style_symbol">(</span><span class="style_int">0</span><span class="style_symbol">,</span> lowerRate<span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.launchOn <span class="style_keyword">this</span>.createLaunchFX<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.dropOn <span class="style_keyword">this</span>.dropSpeed <span class="style_symbol">=</span> realDropSpeed <span class="style_keyword">this</span>.setSpeed<span class="style_symbol">(</span>speed<span class="style_symbol">)</span> <span class="style_keyword">this</span>.t.release<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.u.setAnimation<span class="style_symbol">(</span>launchIndex<span class="style_symbol">)</span> <a class="style_function" href="http://www.mappedia.de/wiki/Jass:PlaySoundOnUnitBJ">PlaySoundOnUnitBJ</a><span class="style_symbol">(</span><span class="style_keyword">this</span>.throwSound<span class="style_symbol">,</span> <span class="style_int">70</span><span class="style_symbol">,</span> <span class="style_keyword">this</span>.u<span class="style_symbol">)</span> <span class="style_keyword">this</span>.missileCast <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">if</span> <span class="style_keyword">not</span> <span class="style_keyword">this</span>.channeling <span class="style_keyword">this</span>.u.unpause<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.clashing <span class="style_keyword">this</span>.clashable <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_comment">//calculate frequency of trail creation</span> <span class="style_keyword">function</span> createLaunchFX<span class="style_symbol">(</span><span class="style_symbol">)</span> Fx launch <span class="style_symbol">=</span> <span class="style_keyword">new</span> Fx<span class="style_symbol">(</span>fx.getPos2<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">,</span><span class="style_keyword">this</span>.targetAngle<span class="style_symbol">,</span> kameLaunch<span class="style_symbol">)</span> launch.setScale<span class="style_symbol">(</span>launchSize<span class="style_symbol">)</span> doAfter<span class="style_symbol">(</span>.<span class="style_int">5</span><span class="style_symbol">,</span> <span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">-</span>> <span class="style_keyword">destroy</span> launch<span class="style_symbol">)</span> <span class="style_keyword">function</span> createTrail<span class="style_symbol">(</span><span class="style_symbol">)</span> Fx trail <span class="style_symbol">=</span> <span class="style_keyword">new</span> Fx<span class="style_symbol">(</span>fx.getPos3d<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">,</span> <span class="style_keyword">this</span>.targetAngle<span class="style_symbol">,</span> trailSFX<span class="style_symbol">)</span> ..setScale<span class="style_symbol">(</span>trailSize<span class="style_symbol">)</span> ..setColor<span class="style_symbol">(</span>trailCol<span class="style_symbol">)</span> <span class="style_keyword">if</span> flightOn <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_constant">false</span> trail.setZ<span class="style_symbol">(</span><span class="style_int">100</span><span class="style_symbol">)</span> <span class="style_comment">// doAfter(timeDistance, () -> trail.hiddenDestroy())</span> <span class="style_keyword">this</span>.trailList.add<span class="style_symbol">(</span>trail<span class="style_symbol">)</span> <span class="style_keyword">function</span> createPulse<span class="style_symbol">(</span><span class="style_symbol">)</span> Fx pulse <span class="style_symbol">=</span> <span class="style_keyword">new</span> Fx<span class="style_symbol">(</span>fx.getPos3d<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">,</span> <span class="style_keyword">this</span>.targetAngle<span class="style_symbol">,</span> pulseSFX<span class="style_symbol">)</span> ..setScale<span class="style_symbol">(</span>pulseSize<span class="style_symbol">)</span> ..setZAngle<span class="style_symbol">(</span><span class="style_symbol">-</span><span class="style_int">5200</span><span class="style_symbol">)</span> ..setColor<span class="style_symbol">(</span>pulseCol<span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.flightOn <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_constant">false</span> pulse.setZ<span class="style_symbol">(</span><span class="style_int">100</span><span class="style_symbol">)</span> <span class="style_comment">// pulse.getDummy().setAnimation(0)</span> doAfter<span class="style_symbol">(</span>timeDistance<span class="style_symbol">,</span> <span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">-</span>> pulse.hiddenDestroy<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> <span class="style_keyword">override</span> <span class="style_keyword">function</span> update<span class="style_symbol">(</span><span class="style_symbol">)</span> super.update<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_comment">//should be speed dependent at some level.</span> <span class="style_keyword">if</span> pos.toVec2<span class="style_symbol">(</span><span class="style_symbol">)</span>.distToVecSquared<span class="style_symbol">(</span>target.toVec2<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> < <span class="style_int">120</span><span class="style_symbol">*</span><span class="style_int">120</span> <span class="style_comment">//timeDistance = 0.15</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.getSpeed<span class="style_symbol">(</span><span class="style_symbol">)</span> > <span class="style_int">0</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.trailOn <span class="style_keyword">if</span> <span class="style_keyword">this</span>.timeSinceLastTrail > <span class="style_symbol">(</span><span class="style_int">2</span><span class="style_symbol">/</span>speed<span class="style_symbol">)</span> <span class="style_keyword">this</span>.createTrail<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.timeSinceLastTrail <span class="style_symbol">-</span><span class="style_symbol">=</span> <span class="style_symbol">(</span><span class="style_int">2</span><span class="style_symbol">/</span>speed<span class="style_symbol">)</span> <span class="style_keyword">this</span>.timeSinceLastTrail <span class="style_symbol">+</span><span class="style_symbol">=</span> ANIMATION_PERIOD <span class="style_keyword">if</span> <span class="style_keyword">this</span>.pulseOn <span class="style_keyword">if</span> <span class="style_keyword">this</span>.timeSinceLastPulse > <span class="style_symbol">(</span><span class="style_int">2</span><span class="style_symbol">/</span>speed<span class="style_symbol">)</span> <span class="style_keyword">this</span>.createPulse<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.timeSinceLastPulse <span class="style_symbol">-</span><span class="style_symbol">=</span> <span class="style_symbol">(</span><span class="style_int">2</span><span class="style_symbol">/</span>speed<span class="style_symbol">)</span> <span class="style_keyword">this</span>.timeSinceLastPulse <span class="style_symbol">+</span><span class="style_symbol">=</span> ANIMATION_PERIOD <span class="style_keyword">if</span> <span class="style_keyword">not</span> <span class="style_keyword">this</span>.clashed <span class="style_keyword">if</span> <span class="style_keyword">this</span>.clashable Entity e <span class="style_symbol">=</span> Entity.getFirst<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">while</span> e <span class="style_symbol">!</span><span class="style_symbol">=</span> <span class="style_keyword">null</span> <span class="style_keyword">if</span> e<span class="style_symbol">!</span><span class="style_symbol">=</span> <span class="style_keyword">this</span> <span class="style_keyword">and</span> <span class="style_keyword">this</span>.owner <span class="style_symbol">!</span><span class="style_symbol">=</span> e.owner <span class="style_keyword">if</span> <span class="style_keyword">this</span>.owner.isAllyOf<span class="style_symbol">(</span>e.owner<span class="style_symbol">)</span> TimedBlasts blast2 <span class="style_symbol">=</span> e <span class="style_keyword">castTo</span> TimedBlasts <span class="style_keyword">if</span> blast2.clashable <span class="style_keyword">and</span> <span class="style_keyword">not</span> blast2.clashed <span class="style_keyword">if</span> <span class="style_keyword">this</span>.pos.distToVecSquared<span class="style_symbol">(</span>e.pos<span class="style_symbol">)</span> < <span class="style_int">40000</span>. print<span class="style_symbol">(</span><span class="style_keyword">this</span>.pos.distToVecSquared<span class="style_symbol">(</span>e.pos<span class="style_symbol">)</span>.toString<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.pos.distToVecSquared<span class="style_symbol">(</span>e.pos<span class="style_symbol">)</span> < <span class="style_symbol">(</span><span class="style_int">120</span><span class="style_symbol">*</span><span class="style_int">120</span><span class="style_symbol">)</span> <span class="style_comment">//print("hi6!")</span> <span class="style_keyword">this</span>.onHit<span class="style_symbol">(</span>blast2<span class="style_symbol">)</span> e<span class="style_symbol">=</span>e.next <span class="style_keyword">if</span> <span class="style_symbol">(</span><span class="style_symbol">(</span><span class="style_keyword">this</span>.u.getPos<span class="style_symbol">(</span><span class="style_symbol">)</span>.distToVecSquared<span class="style_symbol">(</span>target.toVec2<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> < <span class="style_int">150</span><span class="style_symbol">*</span><span class="style_int">150</span><span class="style_symbol">)</span> <span class="style_keyword">or</span> <span class="style_symbol">(</span>pos.toVec2<span class="style_symbol">(</span><span class="style_symbol">)</span>.distToVecSquared<span class="style_symbol">(</span>target.toVec2<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> < <span class="style_int">64</span><span class="style_symbol">*</span><span class="style_int">64</span><span class="style_symbol">)</span><span class="style_symbol">)</span> <span class="style_keyword">and</span> missileCast <span class="style_keyword">for</span> <span class="style_type">unit</span> enemy <span class="style_keyword">from</span> ENUM_GROUP..enumUnitsInRange<span class="style_symbol">(</span>pos.toVec2<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">,</span> impactAoe<span class="style_symbol">)</span> <span class="style_keyword">if</span> enemy.isEnemy<span class="style_symbol">(</span>owner<span class="style_symbol">)</span> <span class="style_keyword">this</span>.u.damageTarget<span class="style_symbol">(</span>enemy<span class="style_symbol">,</span> damage<span class="style_symbol">)</span> done <span class="style_symbol">=</span> <span class="style_constant">true</span> terminate<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">function</span> onHit<span class="style_symbol">(</span>TimedBlasts blast2<span class="style_symbol">)</span> <span class="style_type">boolean</span> winner1 <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_type">boolean</span> winner2 <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_comment">//print("hi7!")</span> <span class="style_keyword">this</span>.clashed <span class="style_symbol">=</span> <span class="style_constant">true</span> blast2.clashed <span class="style_symbol">=</span> <span class="style_constant">true</span> blast2.setSpeed<span class="style_symbol">(</span><span class="style_int">0</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.setSpeed<span class="style_symbol">(</span><span class="style_int">0</span><span class="style_symbol">)</span> blast2.active <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">this</span>.active <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_comment">//this.fx.setScale(endScale+ 1)</span> <span class="style_comment">//blast2.fx.setScale(endScale+ 1)</span> doPeriodically<span class="style_symbol">(</span>.<span class="style_int">25</span><span class="style_symbol">,</span> <span class="style_symbol">(</span>CallbackPeriodic cb<span class="style_symbol">)</span> <span class="style_symbol">-</span>> <span class="style_keyword">begin</span> Fx effect1 <span class="style_symbol">=</span> <span class="style_keyword">new</span> Fx<span class="style_symbol">(</span>fx.getPos2<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">,</span><span class="style_keyword">this</span>.targetAngle<span class="style_symbol">,</span> iceNova<span class="style_symbol">)</span> ..setScale<span class="style_symbol">(</span><span class="style_int">1</span>.<span class="style_int">8</span><span class="style_symbol">)</span> ..setZ<span class="style_symbol">(</span><span class="style_int">100</span><span class="style_symbol">)</span> ..setZAngle<span class="style_symbol">(</span><span class="style_symbol">-</span><span class="style_int">5200</span><span class="style_symbol">)</span> Fx effect2 <span class="style_symbol">=</span> <span class="style_keyword">new</span> Fx<span class="style_symbol">(</span>blast2.fx.getPos2<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">,</span><span class="style_keyword">this</span>.targetAngle<span class="style_symbol">,</span> iceNova<span class="style_symbol">)</span> ..setScale<span class="style_symbol">(</span><span class="style_int">1</span>.<span class="style_int">8</span><span class="style_symbol">)</span> ..setZ<span class="style_symbol">(</span><span class="style_int">100</span><span class="style_symbol">)</span> ..setZAngle<span class="style_symbol">(</span><span class="style_symbol">-</span><span class="style_int">5200</span><span class="style_symbol">)</span> Fx effect5 <span class="style_symbol">=</span> <span class="style_keyword">new</span> Fx<span class="style_symbol">(</span><span class="style_symbol">(</span><span class="style_symbol">(</span>fx.getPos2<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">+</span> blast2.fx.getPos2<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> <span class="style_symbol">*</span>.<span class="style_int">5</span><span class="style_symbol">)</span>.toVec3<span class="style_symbol">(</span><span class="style_symbol">)</span>.addReals<span class="style_symbol">(</span><span class="style_int">0</span><span class="style_symbol">,</span> <span class="style_int">0</span><span class="style_symbol">,</span> <span class="style_int">50</span><span class="style_symbol">)</span><span class="style_symbol">,</span> <span class="style_keyword">this</span>.targetAngle<span class="style_symbol">,</span> sparklyExplosion<span class="style_symbol">)</span> ..setScale<span class="style_symbol">(</span><span class="style_int">5</span><span class="style_symbol">)</span> doAfter<span class="style_symbol">(</span>.<span class="style_int">25</span><span class="style_symbol">,</span> <span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">-</span>> <span class="style_keyword">begin</span> <span class="style_keyword">destroy</span><span class="style_symbol">(</span>effect1<span class="style_symbol">)</span> <span class="style_keyword">destroy</span><span class="style_symbol">(</span>effect2<span class="style_symbol">)</span> <span class="style_keyword">destroy</span><span class="style_symbol">(</span>effect5<span class="style_symbol">)</span> <span class="style_keyword">end</span><span class="style_symbol">)</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.u.getMana<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">0</span> winner2 <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">if</span> blast2.u.getMana<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">0</span> winner1 <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.u.setMana<span class="style_symbol">(</span>u.getMana<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">-</span><span class="style_int">1</span><span class="style_symbol">)</span> blast2.u.setMana<span class="style_symbol">(</span>blast2.u.getMana<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">-</span><span class="style_int">2</span><span class="style_symbol">)</span> <span class="style_keyword">if</span> winner1 print<span class="style_symbol">(</span><span class="style_keyword">this</span>.u.getName<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> blast2.terminate<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.target <span class="style_symbol">=</span> blast2.u.getPos3<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.setSpeed<span class="style_symbol">(</span><span class="style_keyword">this</span>.speed<span class="style_symbol">)</span> <span class="style_keyword">this</span>.active <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">destroy</span> cb <span class="style_keyword">if</span> winner2 <span class="style_keyword">and</span> <span class="style_keyword">not</span> winner1 print<span class="style_symbol">(</span>blast2.u.getName<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> terminate<span class="style_symbol">(</span><span class="style_symbol">)</span> blast2.target <span class="style_symbol">=</span> <span class="style_keyword">this</span>.u.getPos3<span class="style_symbol">(</span><span class="style_symbol">)</span> blast2.setSpeed<span class="style_symbol">(</span>blast2.speed<span class="style_symbol">)</span> blast2.active <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">destroy</span> cb <span class="style_keyword">end</span><span class="style_symbol">)</span> <span class="style_keyword">ondestroy</span> <span class="style_keyword">if</span> <span class="style_keyword">this</span>.channeling <span class="style_keyword">this</span>.u.unpause<span class="style_symbol">(</span><span class="style_symbol">)</span> Fx final <span class="style_symbol">=</span> <span class="style_keyword">new</span> Fx<span class="style_symbol">(</span>fx.getPos3d<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">,</span> <span class="style_keyword">this</span>.targetAngle<span class="style_symbol">,</span> finalSFX<span class="style_symbol">)</span> final.setScale<span class="style_symbol">(</span><span class="style_int">2</span><span class="style_symbol">)</span> doAfter<span class="style_symbol">(</span>destroyExplode<span class="style_symbol">,</span> <span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">-</span>> final.hiddenDestroy<span class="style_symbol">(</span><span class="style_symbol">)</span><span class="style_symbol">)</span> <span class="style_keyword">for</span> i <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">to</span> <span class="style_symbol">(</span><span class="style_keyword">this</span>.trailList.getSize<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">-</span><span class="style_int">1</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.trailList.get<span class="style_symbol">(</span>i<span class="style_symbol">)</span>.hiddenDestroy<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.done <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">package</span> Kamehameha <span class="style_keyword">import</span> Constants <span class="style_keyword">import</span> TimedBlasts <span class="style_keyword">constant</span> <span class="style_type">real</span> originalScale <span class="style_symbol">=</span> .<span class="style_int">2</span> <span class="style_keyword">public</span> <span class="style_keyword">class</span> Kamehameha <span class="style_keyword">extends</span> TimedBlasts <span class="style_keyword">construct</span><span class="style_symbol">(</span><span class="style_type">unit</span> actor<span class="style_symbol">,</span>vec3 pos<span class="style_symbol">,</span> <span class="style_type">player</span> owner<span class="style_symbol">,</span> vec3 target<span class="style_symbol">,</span> <span class="style_type">int</span> level<span class="style_symbol">)</span> super<span class="style_symbol">(</span>actor<span class="style_symbol">,</span>pos.addReals<span class="style_symbol">(</span><span class="style_int">0</span><span class="style_symbol">,</span> <span class="style_int">0</span><span class="style_symbol">,</span> <span class="style_int">50</span><span class="style_symbol">)</span><span class="style_symbol">,</span>owner<span class="style_symbol">,</span>target<span class="style_symbol">,</span>bigKamehamehaBall<span class="style_symbol">,</span>originalScale<span class="style_symbol">)</span> <span class="style_comment">//if (actor.getTypeId() == 'H001')</span> <span class="style_keyword">this</span>.impactAoe <span class="style_symbol">=</span> <span class="style_int">500</span> <span class="style_keyword">this</span>.damage <span class="style_symbol">=</span> <span class="style_int">150</span><span class="style_symbol">*</span>level.toReal<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">+</span> <span class="style_symbol">(</span><a class="style_function" href="http://www.mappedia.de/wiki/Jass:GetHeroInt">GetHeroInt</a><span class="style_symbol">(</span>actor<span class="style_symbol">,</span> <span class="style_constant">true</span><span class="style_symbol">)</span><span class="style_symbol">*</span><span class="style_int">10</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.trailOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.dustOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.pulseOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.launchOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_type">int</span> actorID <span class="style_symbol">=</span> actor.getTypeId<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">if</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H000'</span> <span class="style_keyword">this</span>.channelIndex <span class="style_symbol">=</span> <span class="style_int">11</span> <span class="style_keyword">this</span>.launchIndex <span class="style_symbol">=</span> <span class="style_int">12</span> <span class="style_keyword">this</span>.throwSound <span class="style_symbol">=</span> gg_snd_Kamehameha_Voice <span class="style_keyword">if</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H005'</span> <span class="style_keyword">or</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H009'</span> <span class="style_keyword">this</span>.channelIndex <span class="style_symbol">=</span> <span class="style_int">20</span> <span class="style_keyword">this</span>.launchIndex <span class="style_symbol">=</span> <span class="style_int">18</span> <span class="style_keyword">if</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H00A'</span> <span class="style_keyword">this</span>.channelIndex <span class="style_symbol">=</span> <span class="style_int">5</span> <span class="style_keyword">this</span>.launchIndex <span class="style_symbol">=</span> <span class="style_int">4</span> <span class="style_keyword">if</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H001'</span> <span class="style_keyword">or</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H008'</span> <span class="style_keyword">this</span>.channelIndex <span class="style_symbol">=</span> <span class="style_int">7</span> <span class="style_keyword">this</span>.launchIndex <span class="style_symbol">=</span> <span class="style_int">8</span> <span class="style_keyword">this</span>.throwSound <span class="style_symbol">=</span> gg_snd_GohanKame <span class="style_keyword">if</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H00D'</span> <span class="style_keyword">or</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H00E'</span> <span class="style_keyword">or</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H00F'</span> <span class="style_keyword">this</span>.channelIndex <span class="style_symbol">=</span> <span class="style_int">8</span> <span class="style_keyword">this</span>.launchIndex <span class="style_symbol">=</span> <span class="style_int">12</span> <span class="style_keyword">if</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H007'</span> <span class="style_keyword">this</span>.channelIndex <span class="style_symbol">=</span> <span class="style_int">9</span> <span class="style_keyword">this</span>.launchIndex <span class="style_symbol">=</span> <span class="style_int">13</span> <span class="style_keyword">if</span> actorID <span class="style_symbol">=</span><span class="style_symbol">=</span> <span class="style_int">'H00G'</span> <span class="style_keyword">this</span>.channelIndex <span class="style_symbol">=</span> <span class="style_int">12</span> <span class="style_keyword">this</span>.launchIndex <span class="style_symbol">=</span> <span class="style_int">11</span> <span class="style_keyword">this</span>.speed <span class="style_symbol">=</span> <span class="style_int">32</span> <span class="style_keyword">this</span>.endScale <span class="style_symbol">=</span> .<span class="style_int">6</span> <span class="style_keyword">this</span>.trailSFX <span class="style_symbol">=</span> bigKamehamehaBall <span class="style_keyword">this</span>.trailSize <span class="style_symbol">=</span> .<span class="style_int">3</span> <span class="style_keyword">this</span>.pulseSFX <span class="style_symbol">=</span> bluePulse <span class="style_keyword">this</span>.launchSFX <span class="style_symbol">=</span> kameLaunch <span class="style_keyword">this</span>.launchSize <span class="style_symbol">=</span> <span class="style_int">5</span> <span class="style_keyword">this</span>.finalSFX <span class="style_symbol">=</span> bigBlueExplosion <span class="style_keyword">this</span>.pulseSize <span class="style_symbol">=</span> <span class="style_int">1</span> <span class="style_keyword">this</span>.trailCol <span class="style_symbol">=</span> colorA<span class="style_symbol">(</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.clashing <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.channeling <span class="style_symbol">=</span> <span class="style_constant">true</span> startMissile<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_keyword">package</span> AngryKame <span class="style_keyword">import</span> Constants <span class="style_keyword">import</span> TimedBlasts <span class="style_keyword">import</span> ClosureTimers <span class="style_keyword">constant</span> <span class="style_type">real</span> originalScale <span class="style_symbol">=</span> .<span class="style_int">2</span> <span class="style_keyword">public</span> <span class="style_keyword">class</span> AngryKame <span class="style_keyword">extends</span> TimedBlasts <span class="style_keyword">construct</span><span class="style_symbol">(</span><span class="style_type">unit</span> actor<span class="style_symbol">,</span>vec3 pos<span class="style_symbol">,</span> <span class="style_type">player</span> owner<span class="style_symbol">,</span> vec3 target<span class="style_symbol">,</span> <span class="style_type">int</span> level<span class="style_symbol">)</span> super<span class="style_symbol">(</span>actor<span class="style_symbol">,</span>pos.addReals<span class="style_symbol">(</span><span class="style_int">0</span><span class="style_symbol">,</span> <span class="style_int">0</span><span class="style_symbol">,</span> <span class="style_int">700</span><span class="style_symbol">)</span><span class="style_symbol">,</span>owner<span class="style_symbol">,</span>target<span class="style_symbol">,</span>dummy2<span class="style_symbol">,</span>originalScale<span class="style_symbol">)</span> <span class="style_keyword">this</span>.impactAoe <span class="style_symbol">=</span> <span class="style_int">500</span> actor.setFlyHeight<span class="style_symbol">(</span><span class="style_int">700</span><span class="style_symbol">,</span> <span class="style_int">700</span>.<span class="style_symbol">)</span> <span class="style_keyword">this</span>.flightOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.dropOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.offsetDistance <span class="style_symbol">=</span> <span class="style_int">0</span> <span class="style_keyword">this</span>.missileCol <span class="style_symbol">=</span> colorA<span class="style_symbol">(</span><span class="style_int">150</span><span class="style_symbol">,</span><span class="style_int">150</span><span class="style_symbol">,</span><span class="style_int">0</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.speed <span class="style_symbol">=</span> <span class="style_int">25</span> <span class="style_keyword">this</span>.endScale <span class="style_symbol">=</span> <span class="style_int">1</span>.<span class="style_int">5</span> <span class="style_keyword">this</span>.dustSFX <span class="style_symbol">=</span> dustWave <span class="style_keyword">this</span>.damage <span class="style_symbol">=</span> <span class="style_int">5000</span><span class="style_symbol">*</span>level.toReal<span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">+</span> <span class="style_symbol">(</span><a class="style_function" href="http://www.mappedia.de/wiki/Jass:GetHeroInt">GetHeroInt</a><span class="style_symbol">(</span>actor<span class="style_symbol">,</span> <span class="style_constant">true</span><span class="style_symbol">)</span><span class="style_symbol">*</span><span class="style_int">20</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.finalSFX <span class="style_symbol">=</span> nuclearExplosion <span class="style_keyword">this</span>.trailOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.dustOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.pulseOn <span class="style_symbol">=</span> <span class="style_constant">true</span> <span class="style_keyword">this</span>.launchOn <span class="style_symbol">=</span> <span class="style_constant">false</span> <span class="style_keyword">this</span>.channelIndex <span class="style_symbol">=</span> <span class="style_int">20</span> <span class="style_keyword">this</span>.launchIndex <span class="style_symbol">=</span> <span class="style_int">10</span> <span class="style_keyword">this</span>.trailSFX <span class="style_symbol">=</span> pinkBall <span class="style_keyword">this</span>.trailSize <span class="style_symbol">=</span> .<span class="style_int">6</span> <span class="style_keyword">this</span>.launchSFX <span class="style_symbol">=</span> kameLaunch <span class="style_keyword">this</span>.launchSize <span class="style_symbol">=</span> <span class="style_int">5</span> <span class="style_keyword">this</span>.trailCol <span class="style_symbol">=</span> colorA<span class="style_symbol">(</span><span class="style_int">150</span><span class="style_symbol">,</span><span class="style_int">150</span><span class="style_symbol">,</span><span class="style_int">0</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">)</span> <span class="style_keyword">this</span>.lowerRate <span class="style_symbol">=</span> <span class="style_int">300</span>. <span class="style_keyword">this</span>.realDropSpeed <span class="style_symbol">=</span> <span class="style_symbol">-</span><span class="style_int">25</span> <span class="style_keyword">this</span>.destroyExplode <span class="style_symbol">=</span> <span class="style_int">3</span> <span class="style_keyword">this</span>.pulseSFX <span class="style_symbol">=</span> windBlue <span class="style_keyword">this</span>.pulseSize <span class="style_symbol">=</span> <span class="style_int">1</span>.<span class="style_int">2</span> <span class="style_keyword">this</span>.pulseCol <span class="style_symbol">=</span> colorA<span class="style_symbol">(</span><span class="style_int">150</span><span class="style_symbol">,</span><span class="style_int">150</span><span class="style_symbol">,</span><span class="style_int">0</span><span class="style_symbol">,</span><span class="style_int">255</span><span class="style_symbol">)</span> <span class="style_type">effect</span> x <span class="style_symbol">=</span> <a class="style_function" href="http://www.mappedia.de/wiki/Jass:AddSpecialEffectTarget">AddSpecialEffectTarget</a><span class="style_symbol">(</span>kamelightning<span class="style_symbol">,</span> u<span class="style_symbol">,</span> <span class="style_string">"origin"</span><span class="style_symbol">)</span> doAfter<span class="style_symbol">(</span><span class="style_int">1</span>.<span class="style_int">5</span><span class="style_symbol">,</span> <span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">-</span>> <span class="style_keyword">begin</span> doAfter<span class="style_symbol">(</span><span class="style_int">1</span><span class="style_symbol">,</span> <span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">-</span>> <span class="style_keyword">begin</span> <a class="style_function" href="http://www.mappedia.de/wiki/Jass:PlaySoundOnUnitBJ">PlaySoundOnUnitBJ</a><span class="style_symbol">(</span>gg_snd_angrykame<span class="style_symbol">,</span> <span class="style_int">70</span><span class="style_symbol">,</span> <span class="style_keyword">this</span>.u<span class="style_symbol">)</span> <span class="style_keyword">end</span><span class="style_symbol">)</span> startMissile<span class="style_symbol">(</span><span class="style_symbol">)</span> fx.setFx<span class="style_symbol">(</span>pinkBall<span class="style_symbol">)</span> <span class="style_keyword">end</span><span class="style_symbol">)</span> doAfter<span class="style_symbol">(</span><span class="style_int">12</span><span class="style_symbol">,</span> <span class="style_symbol">(</span><span class="style_symbol">)</span> <span class="style_symbol">-</span>> <span class="style_keyword">begin</span> <a class="style_function" href="http://www.mappedia.de/wiki/Jass:DestroyEffectBJ">DestroyEffectBJ</a><span class="style_symbol">(</span>x<span class="style_symbol">)</span> <span class="style_keyword">end</span><span class="style_symbol">)</span> </pre>
select language
jass
java
delphi
C++
php
GSL
galaxy
visualBasic
> wurst
Text
Markdown
select style
default
bbcode - default
Jasscraft
> jasscraft html
visual
lightweight
lightweightNr
goto line:
Compare with:
text copy window
edit this code
post new code
/* 4 Packages included.. Projectile superclass TimedBlasts (main system) Kamehameha (2d example of TimedBlasts System) AngryKame (3d example of TimedBlasts System TimedBlasts attempts to give a system to create various "timed blasts" that can be customized to create tons of different spells that follow the general layout User begins channeling animation, creating the projectile near them.. after a certain size is reached, the projectile is launched to the target point inflicting damage. If two "clashable" blasts hit each other, the two casters will be in a struggle until one runs out of mana, and the winning blast will change target to its opposing caster unit. *visual example of what this code attempts to achieve in the case of a 3d clashable blast https://www.youtube.com/watch?v=M7i5Z3C5ZOk *note clashable and 3d hasn't been tested/made yet* protected real impactAoe - size of aoe for damage to be done protected real damage - damage to be done protected real endScale - final scale of the blast before launching protected boolean trailOn - creates a trail following the blast as it flies to the target protected boolean dustOn - creates a dust effect around the caster as he fires protected boolean pulseOn - makes the missile pulsate as it flies to the targeted area protected boolean launchOn - creates a launch effect as the missile is launched protected boolean dropOn - if the missile is fired from an aerial position, the missile is lowered to the targetted area protected boolean flightOn - if the missile will be fired from an aerial position protected string trailSFX - specify what SFX will be used for the trail protected string pulseSFX - specify what SFX will be used for the pulse protected string launchSFX - " " protected string finalSFX - " " protected string dustSFX - " " protected real trailSize - size of trail created protected real pulseSize - size of pulses protected real launchSize - size of launch protected colorA missileCol - color of missile protected colorA trailCol = color of trail protected colorA pulseCol = color of pulse protected real speed - speed of missile during travel protected int channelIndex - animation index to channel protected int launchIndex - animation index to launch protected real offsetDistance = 50 - small offset from caster protected real realDropSpeed = -15 if there is a drop, reasonable dropspeed, can be changed private real timeSinceLastTrail = 0 - used to create trail private real timeSinceLastPulse = 0 - used to create pulses private real timeSinceLastChannel = 0 - uses to create channel protected real timeDistance - how long trails and pulses should last, depends on speed, and missile sizes, should be configured to each spell accordingly protected sound throwSound = generic missile size protected real lowerRate = 150. speed that a missile will lower if it is a 3d missile protected real destroyExplode = 1.5 how long the destruction sfx will be played protected boolean clashing - setting if the missile is ready to clash protected boolean clashable - saves true value for clashable until channeling is complete protected boolean clashed - if a missile has clashed, prevents further clashs protected boolean channeling = if a missile is still channeling, it cannot clash yet */ package Projectile import public Entity public class Projectile extends FxEntity // Angles protected angle xyAngle private vec3 startpos private boolean timed = false private boolean ranged = false // Moving Speed private real speed = 0 private real acc = 1.0 protected real dist = 0 private real maxDist = 0 protected real lifespan = 0 protected real dropSpeed = 0 construct( vec3 pos, real radius, player owner, angle xyAngle, string fxpath ) super(pos, radius, owner, xyAngle, fxpath) startpos = pos setXYAngle(xyAngle) active = false function setRanged(real maxDistance) this.maxDist = maxDistance*maxDistance ranged = true function setTimed(real lifespan) this.lifespan = lifespan timed = true function setSpeed(real speed) this.speed = speed //angle.direction(real distance) setVel(vec3(xyAngle.cos()*speed, xyAngle.sin()*speed, dropSpeed)) function setSpeed(real speed, real drop) this.speed = speed //angle.direction(real distance) setVel(vec3(xyAngle.cos()*speed, xyAngle.sin()*speed, drop)) function setAcc(real factor) this.acc = factor function getSpeed() returns real return speed function setXYAngle(angle xyA) this.xyAngle = xyA fx.setXYAngle(xyA) function setZAngle(angle zA) fx.setZAngle(zA) override function update() vel *= acc pos += vel fixPos() if timed lifespan -= ANIMATION_PERIOD if lifespan <= 0 done = true return if ranged if startpos.distToVecSquared(pos) > maxDist done = true package TimedBlasts import Projectile import LinkedListModule import Fx import Constants import ClosureTimers import Terrain import LinkedList public class TimedBlasts extends Projectile use LinkedListModule //Editable values protected real impactAoe protected real damage protected real endScale protected boolean trailOn = false protected boolean dustOn = false protected boolean pulseOn = false protected boolean launchOn = false protected boolean dropOn = false protected boolean flightOn = true protected string trailSFX protected string pulseSFX protected string launchSFX protected string finalSFX protected string dustSFX = dustWave protected real trailSize protected real pulseSize protected real launchSize protected colorA missileCol = colorA(255,255,255,255) protected colorA trailCol = colorA(255,255,255,255) protected colorA pulseCol = colorA(255,255,255,255) protected real speed protected int channelIndex protected int launchIndex protected real offsetDistance = 50 protected real realDropSpeed = -15 private real timeSinceLastTrail = 0 private real timeSinceLastPulse = 0 private real timeSinceLastChannel = 0 protected real timeDistance = 1 protected sound throwSound = gg_snd_kamehameha_fire protected real lowerRate = 150. protected real destroyExplode = 1.5 protected boolean clashing = false protected boolean clashable = false protected boolean clashed = false protected boolean channeling = false protected LinkedList<Fx> trailList = new LinkedList<Fx>() //Instance Variables private vec3 target protected unit u private timer t = getTimer() protected real scale protected angle targetAngle private boolean missileCast = false construct(unit actor,vec3 pos, player owner, vec3 target, string SFX, real originalScale) super(pos.addReals(0, 0, pos.withTerrainZ().z), 0, owner, pos.angleTo2d(target), SFX) this.targetAngle = pos.angleTo2d(target) this.u = actor this.target = target this.u.pause() this.scale = originalScale function startMissile() this.setSpeed(0) this.pos = pos.offset2d(pos.angleTo2d(target), offsetDistance) this.pos.z += 50 this.fixPos() this.fx.setColor(missileCol) this.fx.setScale(this.scale) this.t.setData(this castTo int) this.t.startPeriodic(.1, function callExpandMissile) //if dust is activated if this.dustOn this.createDust() function createDust() effect x = AddSpecialEffectTarget(dustSFX, u, "origin") DestroyEffectBJ(x) static function callExpandMissile() (GetExpiredTimer().getData() castTo TimedBlasts).expandMissile() function expandMissile() if this.timeSinceLastChannel == 0 this.u.setAnimation(channelIndex) if this.timeSinceLastChannel >= (.18) this.u.setAnimation(channelIndex) this.timeSinceLastChannel -= (.17) this.timeSinceLastChannel += ANIMATION_PERIOD this.scale += .05 this.fx.setScale(this.scale) if this.scale >= endScale if this.flightOn this.u.setFlyHeight(0, lowerRate) if this.launchOn this.createLaunchFX() if this.dropOn this.dropSpeed = realDropSpeed this.setSpeed(speed) this.t.release() this.u.setAnimation(launchIndex) PlaySoundOnUnitBJ(this.throwSound, 70, this.u) this.missileCast = true if not this.channeling this.u.unpause() if this.clashing this.clashable = true //calculate frequency of trail creation function createLaunchFX() Fx launch = new Fx(fx.getPos2(),this.targetAngle, kameLaunch) launch.setScale(launchSize) doAfter(.5, () -> destroy launch) function createTrail() Fx trail = new Fx(fx.getPos3d(), this.targetAngle, trailSFX) ..setScale(trailSize) ..setColor(trailCol) if flightOn == false trail.setZ(100) // doAfter(timeDistance, () -> trail.hiddenDestroy()) this.trailList.add(trail) function createPulse() Fx pulse = new Fx(fx.getPos3d(), this.targetAngle, pulseSFX) ..setScale(pulseSize) ..setZAngle(-5200) ..setColor(pulseCol) if this.flightOn == false pulse.setZ(100) // pulse.getDummy().setAnimation(0) doAfter(timeDistance, () -> pulse.hiddenDestroy()) override function update() super.update() //should be speed dependent at some level. if pos.toVec2().distToVecSquared(target.toVec2()) < 120*120 //timeDistance = 0.15 if this.getSpeed() > 0 if this.trailOn if this.timeSinceLastTrail > (2/speed) this.createTrail() this.timeSinceLastTrail -= (2/speed) this.timeSinceLastTrail += ANIMATION_PERIOD if this.pulseOn if this.timeSinceLastPulse > (2/speed) this.createPulse() this.timeSinceLastPulse -= (2/speed) this.timeSinceLastPulse += ANIMATION_PERIOD if not this.clashed if this.clashable Entity e = Entity.getFirst() while e != null if e!= this and this.owner != e.owner if this.owner.isAllyOf(e.owner) TimedBlasts blast2 = e castTo TimedBlasts if blast2.clashable and not blast2.clashed if this.pos.distToVecSquared(e.pos) < 40000. print(this.pos.distToVecSquared(e.pos).toString()) if this.pos.distToVecSquared(e.pos) < (120*120) //print("hi6!") this.onHit(blast2) e=e.next if ((this.u.getPos().distToVecSquared(target.toVec2()) < 150*150) or (pos.toVec2().distToVecSquared(target.toVec2()) < 64*64)) and missileCast for unit enemy from ENUM_GROUP..enumUnitsInRange(pos.toVec2(), impactAoe) if enemy.isEnemy(owner) this.u.damageTarget(enemy, damage) done = true terminate() function onHit(TimedBlasts blast2) boolean winner1 = false boolean winner2 = false //print("hi7!") this.clashed = true blast2.clashed = true blast2.setSpeed(0) this.setSpeed(0) blast2.active = false this.active = false //this.fx.setScale(endScale+ 1) //blast2.fx.setScale(endScale+ 1) doPeriodically(.25, (CallbackPeriodic cb) -> begin Fx effect1 = new Fx(fx.getPos2(),this.targetAngle, iceNova) ..setScale(1.8) ..setZ(100) ..setZAngle(-5200) Fx effect2 = new Fx(blast2.fx.getPos2(),this.targetAngle, iceNova) ..setScale(1.8) ..setZ(100) ..setZAngle(-5200) Fx effect5 = new Fx(((fx.getPos2() + blast2.fx.getPos2()) *.5).toVec3().addReals(0, 0, 50), this.targetAngle, sparklyExplosion) ..setScale(5) doAfter(.25, () -> begin destroy(effect1) destroy(effect2) destroy(effect5) end) if this.u.getMana() == 0 winner2 = true if blast2.u.getMana() == 0 winner1 = true this.u.setMana(u.getMana()-1) blast2.u.setMana(blast2.u.getMana()-2) if winner1 print(this.u.getName()) blast2.terminate() this.target = blast2.u.getPos3() this.setSpeed(this.speed) this.active = true destroy cb if winner2 and not winner1 print(blast2.u.getName()) terminate() blast2.target = this.u.getPos3() blast2.setSpeed(blast2.speed) blast2.active = true destroy cb end) ondestroy if this.channeling this.u.unpause() Fx final = new Fx(fx.getPos3d(), this.targetAngle, finalSFX) final.setScale(2) doAfter(destroyExplode, () -> final.hiddenDestroy()) for i = 0 to (this.trailList.getSize() -1) this.trailList.get(i).hiddenDestroy() this.done = true package Kamehameha import Constants import TimedBlasts constant real originalScale = .2 public class Kamehameha extends TimedBlasts construct(unit actor,vec3 pos, player owner, vec3 target, int level) super(actor,pos.addReals(0, 0, 50),owner,target,bigKamehamehaBall,originalScale) //if (actor.getTypeId() == 'H001') this.impactAoe = 500 this.damage = 150*level.toReal() + (GetHeroInt(actor, true)*10) this.trailOn = true this.dustOn = true this.pulseOn = true this.launchOn = true int actorID = actor.getTypeId() if actorID == 'H000' this.channelIndex = 11 this.launchIndex = 12 this.throwSound = gg_snd_Kamehameha_Voice if actorID == 'H005' or actorID == 'H009' this.channelIndex = 20 this.launchIndex = 18 if actorID == 'H00A' this.channelIndex = 5 this.launchIndex = 4 if actorID == 'H001' or actorID == 'H008' this.channelIndex = 7 this.launchIndex = 8 this.throwSound = gg_snd_GohanKame if actorID == 'H00D' or actorID == 'H00E' or actorID == 'H00F' this.channelIndex = 8 this.launchIndex = 12 if actorID == 'H007' this.channelIndex = 9 this.launchIndex = 13 if actorID == 'H00G' this.channelIndex = 12 this.launchIndex = 11 this.speed = 32 this.endScale = .6 this.trailSFX = bigKamehamehaBall this.trailSize = .3 this.pulseSFX = bluePulse this.launchSFX = kameLaunch this.launchSize = 5 this.finalSFX = bigBlueExplosion this.pulseSize = 1 this.trailCol = colorA(255,255,255,255) this.clashing = true this.channeling = true startMissile() package AngryKame import Constants import TimedBlasts import ClosureTimers constant real originalScale = .2 public class AngryKame extends TimedBlasts construct(unit actor,vec3 pos, player owner, vec3 target, int level) super(actor,pos.addReals(0, 0, 700),owner,target,dummy2,originalScale) this.impactAoe = 500 actor.setFlyHeight(700, 700.) this.flightOn = true this.dropOn = true this.offsetDistance = 0 this.missileCol = colorA(150,150,0,255) this.speed = 25 this.endScale = 1.5 this.dustSFX = dustWave this.damage = 5000*level.toReal() + (GetHeroInt(actor, true)*20) this.finalSFX = nuclearExplosion this.trailOn = true this.dustOn = true this.pulseOn = true this.launchOn = false this.channelIndex = 20 this.launchIndex = 10 this.trailSFX = pinkBall this.trailSize = .6 this.launchSFX = kameLaunch this.launchSize = 5 this.trailCol = colorA(150,150,0,255) this.lowerRate = 300. this.realDropSpeed = -25 this.destroyExplode = 3 this.pulseSFX = windBlue this.pulseSize = 1.2 this.pulseCol = colorA(150,150,0,255) effect x = AddSpecialEffectTarget(kamelightning, u, "origin") doAfter(1.5, () -> begin doAfter(1, () -> begin PlaySoundOnUnitBJ(gg_snd_angrykame, 70, this.u) end) startMissile() fx.setFx(pinkBall) end) doAfter(12, () -> begin DestroyEffectBJ(x) end)