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
[code][color=999999][i]/* 4 Packages included..[/i][/color] [color=999999][i]Projectile superclass[/i][/color] [color=999999][i]TimedBlasts (main system)[/i][/color] [color=999999][i]Kamehameha (2d example of TimedBlasts System)[/i][/color] [color=999999][i]AngryKame (3d example of TimedBlasts System[/i][/color] [color=999999][i][/i][/color] [color=999999][i]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[/i][/color] [color=999999][i][/i][/color] [color=999999][i]User begins channeling animation, creating the projectile near them..[/i][/color] [color=999999][i]after a certain size is reached, the projectile is launched to the target point inflicting damage.[/i][/color] [color=999999][i][/i][/color] [color=999999][i]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.[/i][/color] [color=999999][i][/i][/color] [color=999999][i]*visual example of what this code attempts to achieve in the case of a 3d clashable blast https://www.youtube.com/watch?v=M7i5Z3C5ZOk[/i][/color] [color=999999][i]*note clashable and 3d hasn't been tested/made yet*[/i][/color] [color=999999][i][/i][/color] [color=999999][i][/i][/color] [color=999999][i] protected real impactAoe - size of aoe for damage to be done[/i][/color] [color=999999][i] protected real damage - damage to be done[/i][/color] [color=999999][i] protected real endScale - final scale of the blast before launching[/i][/color] [color=999999][i] protected boolean trailOn - creates a trail following the blast as it flies to the target[/i][/color] [color=999999][i] protected boolean dustOn - creates a dust effect around the caster as he fires[/i][/color] [color=999999][i] protected boolean pulseOn - makes the missile pulsate as it flies to the targeted area[/i][/color] [color=999999][i] protected boolean launchOn - creates a launch effect as the missile is launched[/i][/color] [color=999999][i] protected boolean dropOn - if the missile is fired from an aerial position, the missile is lowered to the targetted area[/i][/color] [color=999999][i] protected boolean flightOn - if the missile will be fired from an aerial position[/i][/color] [color=999999][i] protected string trailSFX - specify what SFX will be used for the trail[/i][/color] [color=999999][i] protected string pulseSFX - specify what SFX will be used for the pulse[/i][/color] [color=999999][i] protected string launchSFX - " "[/i][/color] [color=999999][i] protected string finalSFX - " "[/i][/color] [color=999999][i] protected string dustSFX - " "[/i][/color] [color=999999][i] protected real trailSize - size of trail created[/i][/color] [color=999999][i] protected real pulseSize - size of pulses[/i][/color] [color=999999][i] protected real launchSize - size of launch[/i][/color] [color=999999][i] protected colorA missileCol - color of missile[/i][/color] [color=999999][i] protected colorA trailCol = color of trail[/i][/color] [color=999999][i] protected colorA pulseCol = color of pulse[/i][/color] [color=999999][i] protected real speed - speed of missile during travel[/i][/color] [color=999999][i] protected int channelIndex - animation index to channel[/i][/color] [color=999999][i] protected int launchIndex - animation index to launch[/i][/color] [color=999999][i] protected real offsetDistance = 50 - small offset from caster[/i][/color] [color=999999][i] protected real realDropSpeed = -15 if there is a drop, reasonable dropspeed, can be changed[/i][/color] [color=999999][i] private real timeSinceLastTrail = 0 - used to create trail[/i][/color] [color=999999][i] private real timeSinceLastPulse = 0 - used to create pulses[/i][/color] [color=999999][i] private real timeSinceLastChannel = 0 - uses to create channel[/i][/color] [color=999999][i] protected real timeDistance - how long trails and pulses should last, depends on speed, and missile sizes, should be configured to each spell accordingly[/i][/color] [color=999999][i] protected sound throwSound = generic missile size[/i][/color] [color=999999][i] protected real lowerRate = 150. speed that a missile will lower if it is a 3d missile[/i][/color] [color=999999][i] protected real destroyExplode = 1.5 how long the destruction sfx will be played[/i][/color] [color=999999][i] protected boolean clashing - setting if the missile is ready to clash[/i][/color] [color=999999][i] protected boolean clashable - saves true value for clashable until channeling is complete[/i][/color] [color=999999][i] protected boolean clashed - if a missile has clashed, prevents further clashs[/i][/color] [color=999999][i] protected boolean channeling = if a missile is still channeling, it cannot clash yet[/i][/color] [color=999999][i][/i][/color] [color=999999][i][/i][/color] [color=999999][i][/i][/color] [color=999999][i][/i][/color] [color=999999][i][/i][/color] [color=999999][i][/i][/color] [color=999999][i][/i][/color] [color=999999][i]*/[/i][/color] [color=7777FF][b]package[/b][/color] Projectile [color=7777FF][b]import[/b][/color] [color=7777FF][b]public[/b][/color] Entity [color=7777FF][b]public[/b][/color] [color=7777FF][b]class[/b][/color] Projectile [color=7777FF][b]extends[/b][/color] FxEntity [color=999999][i]// Angles[/i][/color] [color=7777FF][b]protected[/b][/color] angle xyAngle [color=7777FF][b]private[/b][/color] vec3 startpos [color=7777FF][b]private[/b][/color] [color=AA77FF]boolean[/color] timed [b]=[/b] false [color=7777FF][b]private[/b][/color] [color=AA77FF]boolean[/color] ranged [b]=[/b] false [color=999999][i]// Moving Speed[/i][/color] [color=7777FF][b]private[/b][/color] [color=AA77FF]real[/color] speed [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]private[/b][/color] [color=AA77FF]real[/color] acc [b]=[/b] [color=FFFF77]1[/color].[color=FFFF77]0[/color] [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] dist [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]private[/b][/color] [color=AA77FF]real[/color] maxDist [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] lifespan [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] dropSpeed [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]construct[/b][/color][b]([/b] vec3 pos[b],[/b] [color=AA77FF]real[/color] radius[b],[/b] [color=AA77FF]player[/color] owner[b],[/b] angle xyAngle[b],[/b] [color=AA77FF]string[/color] fxpath [b])[/b] super[b]([/b]pos[b],[/b] radius[b],[/b] owner[b],[/b] xyAngle[b],[/b] fxpath[b])[/b] startpos [b]=[/b] pos setXYAngle[b]([/b]xyAngle[b])[/b] active [b]=[/b] false [color=7777FF][b]function[/b][/color] setRanged[b]([/b][color=AA77FF]real[/color] maxDistance[b])[/b] [color=7777FF][b]this[/b][/color].maxDist [b]=[/b] maxDistance[b]*[/b]maxDistance ranged [b]=[/b] true [color=7777FF][b]function[/b][/color] setTimed[b]([/b][color=AA77FF]real[/color] lifespan[b])[/b] [color=7777FF][b]this[/b][/color].lifespan [b]=[/b] lifespan timed [b]=[/b] true [color=7777FF][b]function[/b][/color] setSpeed[b]([/b][color=AA77FF]real[/color] speed[b])[/b] [color=7777FF][b]this[/b][/color].speed [b]=[/b] speed [color=999999][i]//angle.direction(real distance)[/i][/color] setVel[b]([/b]vec3[b]([/b]xyAngle.cos[b]([/b][b])[/b][b]*[/b]speed[b],[/b] xyAngle.sin[b]([/b][b])[/b][b]*[/b]speed[b],[/b] dropSpeed[b])[/b][b])[/b] [color=7777FF][b]function[/b][/color] setSpeed[b]([/b][color=AA77FF]real[/color] speed[b],[/b] [color=AA77FF]real[/color] drop[b])[/b] [color=7777FF][b]this[/b][/color].speed [b]=[/b] speed [color=999999][i]//angle.direction(real distance)[/i][/color] setVel[b]([/b]vec3[b]([/b]xyAngle.cos[b]([/b][b])[/b][b]*[/b]speed[b],[/b] xyAngle.sin[b]([/b][b])[/b][b]*[/b]speed[b],[/b] drop[b])[/b][b])[/b] [color=7777FF][b]function[/b][/color] setAcc[b]([/b][color=AA77FF]real[/color] factor[b])[/b] [color=7777FF][b]this[/b][/color].acc [b]=[/b] factor [color=7777FF][b]function[/b][/color] getSpeed[b]([/b][b])[/b] [color=7777FF][b]returns[/b][/color] [color=AA77FF]real[/color] [color=7777FF][b]return[/b][/color] speed [color=7777FF][b]function[/b][/color] setXYAngle[b]([/b]angle xyA[b])[/b] [color=7777FF][b]this[/b][/color].xyAngle [b]=[/b] xyA fx.setXYAngle[b]([/b]xyA[b])[/b] [color=7777FF][b]function[/b][/color] setZAngle[b]([/b]angle zA[b])[/b] fx.setZAngle[b]([/b]zA[b])[/b] [color=7777FF][b]override[/b][/color] [color=7777FF][b]function[/b][/color] update[b]([/b][b])[/b] vel [b]*[/b][b]=[/b] acc pos [b]+[/b][b]=[/b] vel fixPos[b]([/b][b])[/b] [color=7777FF][b]if[/b][/color] timed lifespan [b]-[/b][b]=[/b] ANIMATION_PERIOD [color=7777FF][b]if[/b][/color] lifespan <[b]=[/b] [color=FFFF77]0[/color] done [b]=[/b] true [color=7777FF][b]return[/b][/color] [color=7777FF][b]if[/b][/color] ranged [color=7777FF][b]if[/b][/color] startpos.distToVecSquared[b]([/b]pos[b])[/b] > maxDist done [b]=[/b] true [color=7777FF][b]package[/b][/color] TimedBlasts [color=7777FF][b]import[/b][/color] Projectile [color=7777FF][b]import[/b][/color] LinkedListModule [color=7777FF][b]import[/b][/color] Fx [color=7777FF][b]import[/b][/color] Constants [color=7777FF][b]import[/b][/color] ClosureTimers [color=7777FF][b]import[/b][/color] Terrain [color=7777FF][b]import[/b][/color] LinkedList [color=7777FF][b]public[/b][/color] [color=7777FF][b]class[/b][/color] TimedBlasts [color=7777FF][b]extends[/b][/color] Projectile [color=7777FF][b]use[/b][/color] LinkedListModule [color=999999][i]//Editable values[/i][/color] [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] impactAoe [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] damage [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] endScale [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] trailOn [b]=[/b] false [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] dustOn [b]=[/b] false [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] pulseOn [b]=[/b] false [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] launchOn [b]=[/b] false [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] dropOn [b]=[/b] false [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] flightOn [b]=[/b] true [color=7777FF][b]protected[/b][/color] [color=AA77FF]string[/color] trailSFX [color=7777FF][b]protected[/b][/color] [color=AA77FF]string[/color] pulseSFX [color=7777FF][b]protected[/b][/color] [color=AA77FF]string[/color] launchSFX [color=7777FF][b]protected[/b][/color] [color=AA77FF]string[/color] finalSFX [color=7777FF][b]protected[/b][/color] [color=AA77FF]string[/color] dustSFX [b]=[/b] dustWave [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] trailSize [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] pulseSize [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] launchSize [color=7777FF][b]protected[/b][/color] colorA missileCol [b]=[/b] colorA[b]([/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b])[/b] [color=7777FF][b]protected[/b][/color] colorA trailCol [b]=[/b] colorA[b]([/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b])[/b] [color=7777FF][b]protected[/b][/color] colorA pulseCol [b]=[/b] colorA[b]([/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b])[/b] [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] speed [color=7777FF][b]protected[/b][/color] [color=AA77FF]int[/color] channelIndex [color=7777FF][b]protected[/b][/color] [color=AA77FF]int[/color] launchIndex [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] offsetDistance [b]=[/b] [color=FFFF77]50[/color] [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] realDropSpeed [b]=[/b] [b]-[/b][color=FFFF77]15[/color] [color=7777FF][b]private[/b][/color] [color=AA77FF]real[/color] timeSinceLastTrail [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]private[/b][/color] [color=AA77FF]real[/color] timeSinceLastPulse [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]private[/b][/color] [color=AA77FF]real[/color] timeSinceLastChannel [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] timeDistance [b]=[/b] [color=FFFF77]1[/color] [color=7777FF][b]protected[/b][/color] [color=AA77FF]sound[/color] throwSound [b]=[/b] gg_snd_kamehameha_fire [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] lowerRate [b]=[/b] [color=FFFF77]150[/color]. [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] destroyExplode [b]=[/b] [color=FFFF77]1[/color].[color=FFFF77]5[/color] [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] clashing [b]=[/b] false [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] clashable [b]=[/b] false [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] clashed [b]=[/b] false [color=7777FF][b]protected[/b][/color] [color=AA77FF]boolean[/color] channeling [b]=[/b] false [color=7777FF][b]protected[/b][/color] LinkedList<Fx> trailList [b]=[/b] [color=7777FF][b]new[/b][/color] LinkedList<Fx>[b]([/b][b])[/b] [color=999999][i]//Instance Variables[/i][/color] [color=7777FF][b]private[/b][/color] vec3 target [color=7777FF][b]protected[/b][/color] [color=AA77FF]unit[/color] u [color=7777FF][b]private[/b][/color] [color=AA77FF]timer[/color] t [b]=[/b] getTimer[b]([/b][b])[/b] [color=7777FF][b]protected[/b][/color] [color=AA77FF]real[/color] scale [color=7777FF][b]protected[/b][/color] angle targetAngle [color=7777FF][b]private[/b][/color] [color=AA77FF]boolean[/color] missileCast [b]=[/b] false [color=7777FF][b]construct[/b][/color][b]([/b][color=AA77FF]unit[/color] actor[b],[/b]vec3 pos[b],[/b] [color=AA77FF]player[/color] owner[b],[/b] vec3 target[b],[/b] [color=AA77FF]string[/color] SFX[b],[/b] [color=AA77FF]real[/color] originalScale[b])[/b] super[b]([/b]pos.addReals[b]([/b][color=FFFF77]0[/color][b],[/b] [color=FFFF77]0[/color][b],[/b] pos.withTerrainZ[b]([/b][b])[/b].z[b])[/b][b],[/b] [color=FFFF77]0[/color][b],[/b] owner[b],[/b] pos.angleTo2d[b]([/b]target[b])[/b][b],[/b] SFX[b])[/b] [color=7777FF][b]this[/b][/color].targetAngle [b]=[/b] pos.angleTo2d[b]([/b]target[b])[/b] [color=7777FF][b]this[/b][/color].u [b]=[/b] actor [color=7777FF][b]this[/b][/color].target [b]=[/b] target [color=7777FF][b]this[/b][/color].u.pause[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].scale [b]=[/b] originalScale [color=7777FF][b]function[/b][/color] startMissile[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].setSpeed[b]([/b][color=FFFF77]0[/color][b])[/b] [color=7777FF][b]this[/b][/color].pos [b]=[/b] pos.offset2d[b]([/b]pos.angleTo2d[b]([/b]target[b])[/b][b],[/b] offsetDistance[b])[/b] [color=7777FF][b]this[/b][/color].pos.z [b]+[/b][b]=[/b] [color=FFFF77]50[/color] [color=7777FF][b]this[/b][/color].fixPos[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].fx.setColor[b]([/b]missileCol[b])[/b] [color=7777FF][b]this[/b][/color].fx.setScale[b]([/b][color=7777FF][b]this[/b][/color].scale[b])[/b] [color=7777FF][b]this[/b][/color].t.setData[b]([/b][color=7777FF][b]this[/b][/color] [color=7777FF][b]castTo[/b][/color] [color=AA77FF]int[/color][b])[/b] [color=7777FF][b]this[/b][/color].t.startPeriodic[b]([/b].[color=FFFF77]1[/color][b],[/b] [color=7777FF][b]function[/b][/color] callExpandMissile[b])[/b] [color=999999][i]//if dust is activated[/i][/color] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].dustOn [color=7777FF][b]this[/b][/color].createDust[b]([/b][b])[/b] [color=7777FF][b]function[/b][/color] createDust[b]([/b][b])[/b] [color=AA77FF]effect[/color] x [b]=[/b] [url=http://starcraft-mapping.de/wiki/AddSpecialEffectTarget]AddSpecialEffectTarget[/url][b]([/b]dustSFX[b],[/b] u[b],[/b] [color=77FF77]"origin"[/color][b])[/b] [url=http://starcraft-mapping.de/wiki/DestroyEffectBJ]DestroyEffectBJ[/url][b]([/b]x[b])[/b] [color=7777FF][b]static[/b][/color] [color=7777FF][b]function[/b][/color] callExpandMissile[b]([/b][b])[/b] [b]([/b][url=http://starcraft-mapping.de/wiki/GetExpiredTimer]GetExpiredTimer[/url][b]([/b][b])[/b].getData[b]([/b][b])[/b] [color=7777FF][b]castTo[/b][/color] TimedBlasts[b])[/b].expandMissile[b]([/b][b])[/b] [color=7777FF][b]function[/b][/color] expandMissile[b]([/b][b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].timeSinceLastChannel [b]=[/b][b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]this[/b][/color].u.setAnimation[b]([/b]channelIndex[b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].timeSinceLastChannel >[b]=[/b] [b]([/b].[color=FFFF77]18[/color][b])[/b] [color=7777FF][b]this[/b][/color].u.setAnimation[b]([/b]channelIndex[b])[/b] [color=7777FF][b]this[/b][/color].timeSinceLastChannel [b]-[/b][b]=[/b] [b]([/b].[color=FFFF77]17[/color][b])[/b] [color=7777FF][b]this[/b][/color].timeSinceLastChannel [b]+[/b][b]=[/b] ANIMATION_PERIOD [color=7777FF][b]this[/b][/color].scale [b]+[/b][b]=[/b] .[color=FFFF77]05[/color] [color=7777FF][b]this[/b][/color].fx.setScale[b]([/b][color=7777FF][b]this[/b][/color].scale[b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].scale >[b]=[/b] endScale [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].flightOn [color=7777FF][b]this[/b][/color].u.setFlyHeight[b]([/b][color=FFFF77]0[/color][b],[/b] lowerRate[b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].launchOn [color=7777FF][b]this[/b][/color].createLaunchFX[b]([/b][b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].dropOn [color=7777FF][b]this[/b][/color].dropSpeed [b]=[/b] realDropSpeed [color=7777FF][b]this[/b][/color].setSpeed[b]([/b]speed[b])[/b] [color=7777FF][b]this[/b][/color].t.release[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].u.setAnimation[b]([/b]launchIndex[b])[/b] [url=http://starcraft-mapping.de/wiki/PlaySoundOnUnitBJ]PlaySoundOnUnitBJ[/url][b]([/b][color=7777FF][b]this[/b][/color].throwSound[b],[/b] [color=FFFF77]70[/color][b],[/b] [color=7777FF][b]this[/b][/color].u[b])[/b] [color=7777FF][b]this[/b][/color].missileCast [b]=[/b] true [color=7777FF][b]if[/b][/color] [color=7777FF][b]not[/b][/color] [color=7777FF][b]this[/b][/color].channeling [color=7777FF][b]this[/b][/color].u.unpause[b]([/b][b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].clashing [color=7777FF][b]this[/b][/color].clashable [b]=[/b] true [color=999999][i]//calculate frequency of trail creation[/i][/color] [color=7777FF][b]function[/b][/color] createLaunchFX[b]([/b][b])[/b] Fx launch [b]=[/b] [color=7777FF][b]new[/b][/color] Fx[b]([/b]fx.getPos2[b]([/b][b])[/b][b],[/b][color=7777FF][b]this[/b][/color].targetAngle[b],[/b] kameLaunch[b])[/b] launch.setScale[b]([/b]launchSize[b])[/b] doAfter[b]([/b].[color=FFFF77]5[/color][b],[/b] [b]([/b][b])[/b] [b]-[/b]> [color=7777FF][b]destroy[/b][/color] launch[b])[/b] [color=7777FF][b]function[/b][/color] createTrail[b]([/b][b])[/b] Fx trail [b]=[/b] [color=7777FF][b]new[/b][/color] Fx[b]([/b]fx.getPos3d[b]([/b][b])[/b][b],[/b] [color=7777FF][b]this[/b][/color].targetAngle[b],[/b] trailSFX[b])[/b] ..setScale[b]([/b]trailSize[b])[/b] ..setColor[b]([/b]trailCol[b])[/b] [color=7777FF][b]if[/b][/color] flightOn [b]=[/b][b]=[/b] false trail.setZ[b]([/b][color=FFFF77]100[/color][b])[/b] [color=999999][i]// doAfter(timeDistance, () -> trail.hiddenDestroy())[/i][/color] [color=7777FF][b]this[/b][/color].trailList.add[b]([/b]trail[b])[/b] [color=7777FF][b]function[/b][/color] createPulse[b]([/b][b])[/b] Fx pulse [b]=[/b] [color=7777FF][b]new[/b][/color] Fx[b]([/b]fx.getPos3d[b]([/b][b])[/b][b],[/b] [color=7777FF][b]this[/b][/color].targetAngle[b],[/b] pulseSFX[b])[/b] ..setScale[b]([/b]pulseSize[b])[/b] ..setZAngle[b]([/b][b]-[/b][color=FFFF77]5200[/color][b])[/b] ..setColor[b]([/b]pulseCol[b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].flightOn [b]=[/b][b]=[/b] false pulse.setZ[b]([/b][color=FFFF77]100[/color][b])[/b] [color=999999][i]// pulse.getDummy().setAnimation(0)[/i][/color] doAfter[b]([/b]timeDistance[b],[/b] [b]([/b][b])[/b] [b]-[/b]> pulse.hiddenDestroy[b]([/b][b])[/b][b])[/b] [color=7777FF][b]override[/b][/color] [color=7777FF][b]function[/b][/color] update[b]([/b][b])[/b] super.update[b]([/b][b])[/b] [color=999999][i]//should be speed dependent at some level.[/i][/color] [color=7777FF][b]if[/b][/color] pos.toVec2[b]([/b][b])[/b].distToVecSquared[b]([/b]target.toVec2[b]([/b][b])[/b][b])[/b] < [color=FFFF77]120[/color][b]*[/b][color=FFFF77]120[/color] [color=999999][i]//timeDistance = 0.15[/i][/color] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].getSpeed[b]([/b][b])[/b] > [color=FFFF77]0[/color] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].trailOn [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].timeSinceLastTrail > [b]([/b][color=FFFF77]2[/color][b]/[/b]speed[b])[/b] [color=7777FF][b]this[/b][/color].createTrail[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].timeSinceLastTrail [b]-[/b][b]=[/b] [b]([/b][color=FFFF77]2[/color][b]/[/b]speed[b])[/b] [color=7777FF][b]this[/b][/color].timeSinceLastTrail [b]+[/b][b]=[/b] ANIMATION_PERIOD [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].pulseOn [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].timeSinceLastPulse > [b]([/b][color=FFFF77]2[/color][b]/[/b]speed[b])[/b] [color=7777FF][b]this[/b][/color].createPulse[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].timeSinceLastPulse [b]-[/b][b]=[/b] [b]([/b][color=FFFF77]2[/color][b]/[/b]speed[b])[/b] [color=7777FF][b]this[/b][/color].timeSinceLastPulse [b]+[/b][b]=[/b] ANIMATION_PERIOD [color=7777FF][b]if[/b][/color] [color=7777FF][b]not[/b][/color] [color=7777FF][b]this[/b][/color].clashed [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].clashable Entity e [b]=[/b] Entity.getFirst[b]([/b][b])[/b] [color=7777FF][b]while[/b][/color] e [b]![/b][b]=[/b] [color=7777FF][b]null[/b][/color] [color=7777FF][b]if[/b][/color] e[b]![/b][b]=[/b] [color=7777FF][b]this[/b][/color] [color=7777FF][b]and[/b][/color] [color=7777FF][b]this[/b][/color].owner [b]![/b][b]=[/b] e.owner [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].owner.isAllyOf[b]([/b]e.owner[b])[/b] TimedBlasts blast2 [b]=[/b] e [color=7777FF][b]castTo[/b][/color] TimedBlasts [color=7777FF][b]if[/b][/color] blast2.clashable [color=7777FF][b]and[/b][/color] [color=7777FF][b]not[/b][/color] blast2.clashed [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].pos.distToVecSquared[b]([/b]e.pos[b])[/b] < [color=FFFF77]40000[/color]. print[b]([/b][color=7777FF][b]this[/b][/color].pos.distToVecSquared[b]([/b]e.pos[b])[/b].toString[b]([/b][b])[/b][b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].pos.distToVecSquared[b]([/b]e.pos[b])[/b] < [b]([/b][color=FFFF77]120[/color][b]*[/b][color=FFFF77]120[/color][b])[/b] [color=999999][i]//print("hi6!")[/i][/color] [color=7777FF][b]this[/b][/color].onHit[b]([/b]blast2[b])[/b] e[b]=[/b]e.next [color=7777FF][b]if[/b][/color] [b]([/b][b]([/b][color=7777FF][b]this[/b][/color].u.getPos[b]([/b][b])[/b].distToVecSquared[b]([/b]target.toVec2[b]([/b][b])[/b][b])[/b] < [color=FFFF77]150[/color][b]*[/b][color=FFFF77]150[/color][b])[/b] [color=7777FF][b]or[/b][/color] [b]([/b]pos.toVec2[b]([/b][b])[/b].distToVecSquared[b]([/b]target.toVec2[b]([/b][b])[/b][b])[/b] < [color=FFFF77]64[/color][b]*[/b][color=FFFF77]64[/color][b])[/b][b])[/b] [color=7777FF][b]and[/b][/color] missileCast [color=7777FF][b]for[/b][/color] [color=AA77FF]unit[/color] enemy [color=7777FF][b]from[/b][/color] ENUM_GROUP..enumUnitsInRange[b]([/b]pos.toVec2[b]([/b][b])[/b][b],[/b] impactAoe[b])[/b] [color=7777FF][b]if[/b][/color] enemy.isEnemy[b]([/b]owner[b])[/b] [color=7777FF][b]this[/b][/color].u.damageTarget[b]([/b]enemy[b],[/b] damage[b])[/b] done [b]=[/b] true terminate[b]([/b][b])[/b] [color=7777FF][b]function[/b][/color] onHit[b]([/b]TimedBlasts blast2[b])[/b] [color=AA77FF]boolean[/color] winner1 [b]=[/b] false [color=AA77FF]boolean[/color] winner2 [b]=[/b] false [color=999999][i]//print("hi7!")[/i][/color] [color=7777FF][b]this[/b][/color].clashed [b]=[/b] true blast2.clashed [b]=[/b] true blast2.setSpeed[b]([/b][color=FFFF77]0[/color][b])[/b] [color=7777FF][b]this[/b][/color].setSpeed[b]([/b][color=FFFF77]0[/color][b])[/b] blast2.active [b]=[/b] false [color=7777FF][b]this[/b][/color].active [b]=[/b] false [color=999999][i]//this.fx.setScale(endScale+ 1)[/i][/color] [color=999999][i]//blast2.fx.setScale(endScale+ 1)[/i][/color] doPeriodically[b]([/b].[color=FFFF77]25[/color][b],[/b] [b]([/b]CallbackPeriodic cb[b])[/b] [b]-[/b]> [color=7777FF][b]begin[/b][/color] Fx effect1 [b]=[/b] [color=7777FF][b]new[/b][/color] Fx[b]([/b]fx.getPos2[b]([/b][b])[/b][b],[/b][color=7777FF][b]this[/b][/color].targetAngle[b],[/b] iceNova[b])[/b] ..setScale[b]([/b][color=FFFF77]1[/color].[color=FFFF77]8[/color][b])[/b] ..setZ[b]([/b][color=FFFF77]100[/color][b])[/b] ..setZAngle[b]([/b][b]-[/b][color=FFFF77]5200[/color][b])[/b] Fx effect2 [b]=[/b] [color=7777FF][b]new[/b][/color] Fx[b]([/b]blast2.fx.getPos2[b]([/b][b])[/b][b],[/b][color=7777FF][b]this[/b][/color].targetAngle[b],[/b] iceNova[b])[/b] ..setScale[b]([/b][color=FFFF77]1[/color].[color=FFFF77]8[/color][b])[/b] ..setZ[b]([/b][color=FFFF77]100[/color][b])[/b] ..setZAngle[b]([/b][b]-[/b][color=FFFF77]5200[/color][b])[/b] Fx effect5 [b]=[/b] [color=7777FF][b]new[/b][/color] Fx[b]([/b][b]([/b][b]([/b]fx.getPos2[b]([/b][b])[/b] [b]+[/b] blast2.fx.getPos2[b]([/b][b])[/b][b])[/b] [b]*[/b].[color=FFFF77]5[/color][b])[/b].toVec3[b]([/b][b])[/b].addReals[b]([/b][color=FFFF77]0[/color][b],[/b] [color=FFFF77]0[/color][b],[/b] [color=FFFF77]50[/color][b])[/b][b],[/b] [color=7777FF][b]this[/b][/color].targetAngle[b],[/b] sparklyExplosion[b])[/b] ..setScale[b]([/b][color=FFFF77]5[/color][b])[/b] doAfter[b]([/b].[color=FFFF77]25[/color][b],[/b] [b]([/b][b])[/b] [b]-[/b]> [color=7777FF][b]begin[/b][/color] [color=7777FF][b]destroy[/b][/color][b]([/b]effect1[b])[/b] [color=7777FF][b]destroy[/b][/color][b]([/b]effect2[b])[/b] [color=7777FF][b]destroy[/b][/color][b]([/b]effect5[b])[/b] [color=7777FF][b]end[/b][/color][b])[/b] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].u.getMana[b]([/b][b])[/b] [b]=[/b][b]=[/b] [color=FFFF77]0[/color] winner2 [b]=[/b] true [color=7777FF][b]if[/b][/color] blast2.u.getMana[b]([/b][b])[/b] [b]=[/b][b]=[/b] [color=FFFF77]0[/color] winner1 [b]=[/b] true [color=7777FF][b]this[/b][/color].u.setMana[b]([/b]u.getMana[b]([/b][b])[/b][b]-[/b][color=FFFF77]1[/color][b])[/b] blast2.u.setMana[b]([/b]blast2.u.getMana[b]([/b][b])[/b][b]-[/b][color=FFFF77]2[/color][b])[/b] [color=7777FF][b]if[/b][/color] winner1 print[b]([/b][color=7777FF][b]this[/b][/color].u.getName[b]([/b][b])[/b][b])[/b] blast2.terminate[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].target [b]=[/b] blast2.u.getPos3[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].setSpeed[b]([/b][color=7777FF][b]this[/b][/color].speed[b])[/b] [color=7777FF][b]this[/b][/color].active [b]=[/b] true [color=7777FF][b]destroy[/b][/color] cb [color=7777FF][b]if[/b][/color] winner2 [color=7777FF][b]and[/b][/color] [color=7777FF][b]not[/b][/color] winner1 print[b]([/b]blast2.u.getName[b]([/b][b])[/b][b])[/b] terminate[b]([/b][b])[/b] blast2.target [b]=[/b] [color=7777FF][b]this[/b][/color].u.getPos3[b]([/b][b])[/b] blast2.setSpeed[b]([/b]blast2.speed[b])[/b] blast2.active [b]=[/b] true [color=7777FF][b]destroy[/b][/color] cb [color=7777FF][b]end[/b][/color][b])[/b] [color=7777FF][b]ondestroy[/b][/color] [color=7777FF][b]if[/b][/color] [color=7777FF][b]this[/b][/color].channeling [color=7777FF][b]this[/b][/color].u.unpause[b]([/b][b])[/b] Fx final [b]=[/b] [color=7777FF][b]new[/b][/color] Fx[b]([/b]fx.getPos3d[b]([/b][b])[/b][b],[/b] [color=7777FF][b]this[/b][/color].targetAngle[b],[/b] finalSFX[b])[/b] final.setScale[b]([/b][color=FFFF77]2[/color][b])[/b] doAfter[b]([/b]destroyExplode[b],[/b] [b]([/b][b])[/b] [b]-[/b]> final.hiddenDestroy[b]([/b][b])[/b][b])[/b] [color=7777FF][b]for[/b][/color] i [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]to[/b][/color] [b]([/b][color=7777FF][b]this[/b][/color].trailList.getSize[b]([/b][b])[/b] [b]-[/b][color=FFFF77]1[/color][b])[/b] [color=7777FF][b]this[/b][/color].trailList.get[b]([/b]i[b])[/b].hiddenDestroy[b]([/b][b])[/b] [color=7777FF][b]this[/b][/color].done [b]=[/b] true [color=7777FF][b]package[/b][/color] Kamehameha [color=7777FF][b]import[/b][/color] Constants [color=7777FF][b]import[/b][/color] TimedBlasts [color=7777FF][b]constant[/b][/color] [color=AA77FF]real[/color] originalScale [b]=[/b] .[color=FFFF77]2[/color] [color=7777FF][b]public[/b][/color] [color=7777FF][b]class[/b][/color] Kamehameha [color=7777FF][b]extends[/b][/color] TimedBlasts [color=7777FF][b]construct[/b][/color][b]([/b][color=AA77FF]unit[/color] actor[b],[/b]vec3 pos[b],[/b] [color=AA77FF]player[/color] owner[b],[/b] vec3 target[b],[/b] [color=AA77FF]int[/color] level[b])[/b] super[b]([/b]actor[b],[/b]pos.addReals[b]([/b][color=FFFF77]0[/color][b],[/b] [color=FFFF77]0[/color][b],[/b] [color=FFFF77]50[/color][b])[/b][b],[/b]owner[b],[/b]target[b],[/b]bigKamehamehaBall[b],[/b]originalScale[b])[/b] [color=999999][i]//if (actor.getTypeId() == 'H001')[/i][/color] [color=7777FF][b]this[/b][/color].impactAoe [b]=[/b] [color=FFFF77]500[/color] [color=7777FF][b]this[/b][/color].damage [b]=[/b] [color=FFFF77]150[/color][b]*[/b]level.toReal[b]([/b][b])[/b] [b]+[/b] [b]([/b][url=http://starcraft-mapping.de/wiki/GetHeroInt]GetHeroInt[/url][b]([/b]actor[b],[/b] true[b])[/b][b]*[/b][color=FFFF77]10[/color][b])[/b] [color=7777FF][b]this[/b][/color].trailOn [b]=[/b] true [color=7777FF][b]this[/b][/color].dustOn [b]=[/b] true [color=7777FF][b]this[/b][/color].pulseOn [b]=[/b] true [color=7777FF][b]this[/b][/color].launchOn [b]=[/b] true [color=AA77FF]int[/color] actorID [b]=[/b] actor.getTypeId[b]([/b][b])[/b] [color=7777FF][b]if[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H000'[/color] [color=7777FF][b]this[/b][/color].channelIndex [b]=[/b] [color=FFFF77]11[/color] [color=7777FF][b]this[/b][/color].launchIndex [b]=[/b] [color=FFFF77]12[/color] [color=7777FF][b]this[/b][/color].throwSound [b]=[/b] gg_snd_Kamehameha_Voice [color=7777FF][b]if[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H005'[/color] [color=7777FF][b]or[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H009'[/color] [color=7777FF][b]this[/b][/color].channelIndex [b]=[/b] [color=FFFF77]20[/color] [color=7777FF][b]this[/b][/color].launchIndex [b]=[/b] [color=FFFF77]18[/color] [color=7777FF][b]if[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H00A'[/color] [color=7777FF][b]this[/b][/color].channelIndex [b]=[/b] [color=FFFF77]5[/color] [color=7777FF][b]this[/b][/color].launchIndex [b]=[/b] [color=FFFF77]4[/color] [color=7777FF][b]if[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H001'[/color] [color=7777FF][b]or[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H008'[/color] [color=7777FF][b]this[/b][/color].channelIndex [b]=[/b] [color=FFFF77]7[/color] [color=7777FF][b]this[/b][/color].launchIndex [b]=[/b] [color=FFFF77]8[/color] [color=7777FF][b]this[/b][/color].throwSound [b]=[/b] gg_snd_GohanKame [color=7777FF][b]if[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H00D'[/color] [color=7777FF][b]or[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H00E'[/color] [color=7777FF][b]or[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H00F'[/color] [color=7777FF][b]this[/b][/color].channelIndex [b]=[/b] [color=FFFF77]8[/color] [color=7777FF][b]this[/b][/color].launchIndex [b]=[/b] [color=FFFF77]12[/color] [color=7777FF][b]if[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H007'[/color] [color=7777FF][b]this[/b][/color].channelIndex [b]=[/b] [color=FFFF77]9[/color] [color=7777FF][b]this[/b][/color].launchIndex [b]=[/b] [color=FFFF77]13[/color] [color=7777FF][b]if[/b][/color] actorID [b]=[/b][b]=[/b] [color=FFFF77]'H00G'[/color] [color=7777FF][b]this[/b][/color].channelIndex [b]=[/b] [color=FFFF77]12[/color] [color=7777FF][b]this[/b][/color].launchIndex [b]=[/b] [color=FFFF77]11[/color] [color=7777FF][b]this[/b][/color].speed [b]=[/b] [color=FFFF77]32[/color] [color=7777FF][b]this[/b][/color].endScale [b]=[/b] .[color=FFFF77]6[/color] [color=7777FF][b]this[/b][/color].trailSFX [b]=[/b] bigKamehamehaBall [color=7777FF][b]this[/b][/color].trailSize [b]=[/b] .[color=FFFF77]3[/color] [color=7777FF][b]this[/b][/color].pulseSFX [b]=[/b] bluePulse [color=7777FF][b]this[/b][/color].launchSFX [b]=[/b] kameLaunch [color=7777FF][b]this[/b][/color].launchSize [b]=[/b] [color=FFFF77]5[/color] [color=7777FF][b]this[/b][/color].finalSFX [b]=[/b] bigBlueExplosion [color=7777FF][b]this[/b][/color].pulseSize [b]=[/b] [color=FFFF77]1[/color] [color=7777FF][b]this[/b][/color].trailCol [b]=[/b] colorA[b]([/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b],[/b][color=FFFF77]255[/color][b])[/b] [color=7777FF][b]this[/b][/color].clashing [b]=[/b] true [color=7777FF][b]this[/b][/color].channeling [b]=[/b] true startMissile[b]([/b][b])[/b] [color=7777FF][b]package[/b][/color] AngryKame [color=7777FF][b]import[/b][/color] Constants [color=7777FF][b]import[/b][/color] TimedBlasts [color=7777FF][b]import[/b][/color] ClosureTimers [color=7777FF][b]constant[/b][/color] [color=AA77FF]real[/color] originalScale [b]=[/b] .[color=FFFF77]2[/color] [color=7777FF][b]public[/b][/color] [color=7777FF][b]class[/b][/color] AngryKame [color=7777FF][b]extends[/b][/color] TimedBlasts [color=7777FF][b]construct[/b][/color][b]([/b][color=AA77FF]unit[/color] actor[b],[/b]vec3 pos[b],[/b] [color=AA77FF]player[/color] owner[b],[/b] vec3 target[b],[/b] [color=AA77FF]int[/color] level[b])[/b] super[b]([/b]actor[b],[/b]pos.addReals[b]([/b][color=FFFF77]0[/color][b],[/b] [color=FFFF77]0[/color][b],[/b] [color=FFFF77]700[/color][b])[/b][b],[/b]owner[b],[/b]target[b],[/b]dummy2[b],[/b]originalScale[b])[/b] [color=7777FF][b]this[/b][/color].impactAoe [b]=[/b] [color=FFFF77]500[/color] actor.setFlyHeight[b]([/b][color=FFFF77]700[/color][b],[/b] [color=FFFF77]700[/color].[b])[/b] [color=7777FF][b]this[/b][/color].flightOn [b]=[/b] true [color=7777FF][b]this[/b][/color].dropOn [b]=[/b] true [color=7777FF][b]this[/b][/color].offsetDistance [b]=[/b] [color=FFFF77]0[/color] [color=7777FF][b]this[/b][/color].missileCol [b]=[/b] colorA[b]([/b][color=FFFF77]150[/color][b],[/b][color=FFFF77]150[/color][b],[/b][color=FFFF77]0[/color][b],[/b][color=FFFF77]255[/color][b])[/b] [color=7777FF][b]this[/b][/color].speed [b]=[/b] [color=FFFF77]25[/color] [color=7777FF][b]this[/b][/color].endScale [b]=[/b] [color=FFFF77]1[/color].[color=FFFF77]5[/color] [color=7777FF][b]this[/b][/color].dustSFX [b]=[/b] dustWave [color=7777FF][b]this[/b][/color].damage [b]=[/b] [color=FFFF77]5000[/color][b]*[/b]level.toReal[b]([/b][b])[/b] [b]+[/b] [b]([/b][url=http://starcraft-mapping.de/wiki/GetHeroInt]GetHeroInt[/url][b]([/b]actor[b],[/b] true[b])[/b][b]*[/b][color=FFFF77]20[/color][b])[/b] [color=7777FF][b]this[/b][/color].finalSFX [b]=[/b] nuclearExplosion [color=7777FF][b]this[/b][/color].trailOn [b]=[/b] true [color=7777FF][b]this[/b][/color].dustOn [b]=[/b] true [color=7777FF][b]this[/b][/color].pulseOn [b]=[/b] true [color=7777FF][b]this[/b][/color].launchOn [b]=[/b] false [color=7777FF][b]this[/b][/color].channelIndex [b]=[/b] [color=FFFF77]20[/color] [color=7777FF][b]this[/b][/color].launchIndex [b]=[/b] [color=FFFF77]10[/color] [color=7777FF][b]this[/b][/color].trailSFX [b]=[/b] pinkBall [color=7777FF][b]this[/b][/color].trailSize [b]=[/b] .[color=FFFF77]6[/color] [color=7777FF][b]this[/b][/color].launchSFX [b]=[/b] kameLaunch [color=7777FF][b]this[/b][/color].launchSize [b]=[/b] [color=FFFF77]5[/color] [color=7777FF][b]this[/b][/color].trailCol [b]=[/b] colorA[b]([/b][color=FFFF77]150[/color][b],[/b][color=FFFF77]150[/color][b],[/b][color=FFFF77]0[/color][b],[/b][color=FFFF77]255[/color][b])[/b] [color=7777FF][b]this[/b][/color].lowerRate [b]=[/b] [color=FFFF77]300[/color]. [color=7777FF][b]this[/b][/color].realDropSpeed [b]=[/b] [b]-[/b][color=FFFF77]25[/color] [color=7777FF][b]this[/b][/color].destroyExplode [b]=[/b] [color=FFFF77]3[/color] [color=7777FF][b]this[/b][/color].pulseSFX [b]=[/b] windBlue [color=7777FF][b]this[/b][/color].pulseSize [b]=[/b] [color=FFFF77]1[/color].[color=FFFF77]2[/color] [color=7777FF][b]this[/b][/color].pulseCol [b]=[/b] colorA[b]([/b][color=FFFF77]150[/color][b],[/b][color=FFFF77]150[/color][b],[/b][color=FFFF77]0[/color][b],[/b][color=FFFF77]255[/color][b])[/b] [color=AA77FF]effect[/color] x [b]=[/b] [url=http://starcraft-mapping.de/wiki/AddSpecialEffectTarget]AddSpecialEffectTarget[/url][b]([/b]kamelightning[b],[/b] u[b],[/b] [color=77FF77]"origin"[/color][b])[/b] doAfter[b]([/b][color=FFFF77]1[/color].[color=FFFF77]5[/color][b],[/b] [b]([/b][b])[/b] [b]-[/b]> [color=7777FF][b]begin[/b][/color] doAfter[b]([/b][color=FFFF77]1[/color][b],[/b] [b]([/b][b])[/b] [b]-[/b]> [color=7777FF][b]begin[/b][/color] [url=http://starcraft-mapping.de/wiki/PlaySoundOnUnitBJ]PlaySoundOnUnitBJ[/url][b]([/b]gg_snd_angrykame[b],[/b] [color=FFFF77]70[/color][b],[/b] [color=7777FF][b]this[/b][/color].u[b])[/b] [color=7777FF][b]end[/b][/color][b])[/b] startMissile[b]([/b][b])[/b] fx.setFx[b]([/b]pinkBall[b])[/b] [color=7777FF][b]end[/b][/color][b])[/b] doAfter[b]([/b][color=FFFF77]12[/color][b],[/b] [b]([/b][b])[/b] [b]-[/b]> [color=7777FF][b]begin[/b][/color] [url=http://starcraft-mapping.de/wiki/DestroyEffectBJ]DestroyEffectBJ[/url][b]([/b]x[b])[/b] [color=7777FF][b]end[/b][/color][b])[/b] [/code]
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)