Exploding Arrows, not working

Nexor

...
Reaction score
74
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:

JASS:
scope Explode initializer ExplodeInit

globals
    private constant integer ExplodeID        = 'A550'    // 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         = 'Amrf' 
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?
 

~GaLs~

† Ғσſ ŧħə ѕαĸε Φƒ ~Ğ䣚~ †
Reaction score
180
Use function BJDebugMsg() along with R2S() and check if every value is correctly assign.

I know math less, so I don't know that if or not that your equation are correct or not.
Just use the function and debug your code. :)
 

Nexor

...
Reaction score
74
the Z settings are wrong, the units are knocked away, they just won't do the parabola thing in the air.
I'll debug it and check.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top