I want to make a spell that will have an exploding part. The units near the explosion will be thrown away from the center of the explosion.
I wrote a code for it, but they won't fly.
the code:
What's wrong with it?
I wrote a code for it, but they won't fly.
the code:
JASS:
scope Explode initializer ExplodeInit
globals
private constant integer ExplodeID = 039;A550039; // Raw id
private constant real ExplodeDamage = 10. // Base damage
private constant real ExplodeAttribute = 3. // Attribute multiplier
private constant real ExplodeDistance = 150.
private constant real ExplodeSpeed = 550.
private constant real ExplodeRange = 300.
private constant real PERIOD = 0.04 // TT period
private constant string ExplodeEffect = "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl"
private constant string ExplodeAttach = "origin"
private constant real Arc = 1.3
private constant integer CrowForm = 039;Amrf039;
endglobals
private function Parabola takes real dist, real maxdist returns real
local real t = (dist*2)/maxdist-1
return (-t*t+1)*(maxdist/Arc)
endfunction
private function ExplodeConditions takes nothing returns boolean
return GetSpellAbilityId() == ExplodeID
endfunction
private constant function ExplodeDamageCalc takes integer attr returns real
return ExplodeDamage + (attr*ExplodeAttribute)
endfunction
private struct Boom
unit u
real dx
real dy
integer ticks
real Z
real maxdist
real startx
real starty
endstruct
private function ExplodeCallback takes nothing returns boolean
local Boom data = TT_GetData() // TT
local real x = GetUnitX(data.u)+data.dx
local real y = GetUnitY(data.u)+data.dy
local real dx = data.startx-x
local real dy = data.starty-y
local real distance = SquareRoot(dx*dx + dy*dy)
call SetUnitPosition(data.u,x,y)
set data.Z = Parabola(distance, data.maxdist)
call SetUnitFlyHeight(data.u,data.Z,0)
call DestroyEffect( AddSpecialEffectTarget( ExplodeEffect, data.u, ExplodeAttach))
set data.ticks = data.ticks - 1
if data.ticks <= 0 then
call SetUnitFlyHeight(data.u,GetUnitDefaultFlyHeight(data.u),0)
call data.destroy()
return true // stop ticking
endif
return false
endfunction
private function Explode takes unit u, location loc, real angle returns nothing
local Boom data = Boom.create()
local real x = GetLocationX(loc)
local real y = GetLocationY(loc)
local real dx = x-GetUnitX(u)
local real dy = y-GetUnitY(u)
local real distance = SquareRoot(dx*dx+dy*dy)
local real newx = GetUnitX(u) + (ExplodeDistance-distance) * Cos(angle)
local real newy = GetUnitY(u) + (ExplodeDistance-distance) * Sin(angle)
local real Dx
local real Dy
call UnitAddAbility( u,CrowForm )
call UnitRemoveAbility( u,CrowForm )
set data.u = u
set data.startZ = GetUnitFlyHeight(u)
set Dx = newx - x
set Dy = newy - y
set distance = SquareRoot(Dx * Dx + Dy * Dy)
set data.ticks = R2I(distance / (ExplodeSpeed*PERIOD))
set data.maxdist = distance
set angle = Atan2(Dy, Dx)
set data.dx = (ExplodeSpeed*PERIOD) * Cos(angle)
set data.dy = (ExplodeSpeed*PERIOD) * Sin(angle)
call TT_Start(function ExplodeCallback, data) // TT
endfunction
private function ExplodeCast takes nothing returns nothing
local unit u = GetTriggerUnit()
local location loc = GetSpellTargetLoc()
local player p = GetOwningPlayer(u)
local real x = GetLocationX(loc)
local real y = GetLocationY(loc)
local group g = CreateGroup()
local unit f
local real fx
local real fy
local real angle
local real dmg = ExplodeDamageCalc(GetHeroAgi(u,true))
set g = GetUnitsInRangeOfLocAll(ExplodeRange, loc)
call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl",x,y))
loop
set f = FirstOfGroup(g)
exitwhen f == null
if IsUnitEnemy(f,p) == true and GetWidgetLife(f) > .405 then
set fx = GetUnitX(f)
set fy = GetUnitY(f)
set angle = Atan2(fy-y,fx-x)
call Explode(f,loc,angle)
call UnitDamageTarget(u,f,dmg,true,true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_ACID, WEAPON_TYPE_WHOKNOWS)
endif
call GroupRemoveUnit(g,f)
endloop
call RemoveLocation(loc)
set loc = null
set u = null
endfunction
//===========================================================================
private function ExplodeInit takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function ExplodeConditions ) )
call TriggerAddAction( t, function ExplodeCast )
set t = null
endfunction
endscope
What's wrong with it?