Leaking and knockback issues

Karst

Member
Reaction score
4
Hello everyone, old time World Editor, new poster here.

After years of editing I started reaching the limits of what GUI can do more and more often, so I started to learn JASS.

Now my first JASS spell is nearing completion but there are problems.
The spell will be used by a unit in a game mode I've been working on for about a year. One-on-one games usually last no more than about 10-15 minutes, army sizes are quite small, usually around 4-10 units per player.

1) It leaks. I don't expect it to really cause problems in an actual game since it'll have cooldown, mana cost, and will require two upgrades, but right now it starts to seriously lag after about 25 uses or so.

2) I haven't found a good way of applying a knockback effect to every unit of a unit group at once. Apparently it's impossible to start a timer function within a loop.

Oh yeah, and I'm using KaTTaNa's Handler function system.

These are the two relevant triggers:

JASS:
function Trig_PulseBeam_Conditions takes nothing returns boolean
    return ( GetSpellAbilityId() == 'A082')
endfunction

function targetcond takes nothing returns boolean
    if ( IsUnitType(GetFilterUnit(), UNIT_TYPE_MECHANICAL) == true ) then
        return false
    endif
    if ( IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == true ) then
        return false
    endif
    if ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit())) == false ) then
        return false
    endif
    if ( IsUnitAliveBJ(GetFilterUnit()) == false) then
        return false
    endif
    return true
endfunction


function flight takes nothing returns nothing
    local timer t = GetExpiredTimer ()
    local unit u = GetHandleUnit(t,"v")
    local group g
    call SetUnitPositionLoc (u, PolarProjectionBJ ( GetUnitLoc (u), 20, GetUnitFacing (u)))
    set g = GetUnitsInRangeOfLocMatching(100, GetUnitLoc(u), Condition(function targetcond))
    if (CountUnitsInGroup (g) != 0) then
    call KillUnit (u)
    endif
endfunction

function create takes nothing returns nothing
    local timer ti = GetExpiredTimer ()
    local timer t = CreateTimer ()
    local unit proj
    local unit c = GetHandleUnit(ti, "c")
    call CreateNUnitsAtLoc( 1, 'u00O', GetOwningPlayer(c), GetUnitLoc(c), GetUnitFacing(c))
    set proj = GetLastCreatedUnit()
    call UnitApplyTimedLifeBJ( 1.70, 'BTLF', proj )
    call SetHandleHandle(t,"v",proj)
    call TimerStart (t, 0.035, true, function flight)
    call TriggerSleepAction (1.70)
    call RemoveUnit(proj)
    call PauseTimer (t)
    call FlushHandleLocals (t)
    call DestroyTimer (t)
    set proj = null
    set c = null
    set ti = null
    set t = null    
endfunction

function Trig_PulseBeam_Actions takes nothing returns nothing
    local unit cast = GetTriggerUnit ()
    local timer ti = CreateTimer ()
    call SetHandleHandle (ti, "c", cast)
    call TimerStart (ti, 0.16, true, function create)
    call TriggerSleepAction (1.60)
    call PauseTimer (ti)
    call DestroyTimer (ti)
    set ti = null
    set cast = null
endfunction

//===========================================================================
function InitTrig_PulseBeam takes nothing returns nothing
    set gg_trg_PulseBeam = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_PulseBeam, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_PulseBeam, Condition( function Trig_PulseBeam_Conditions ) )
    call TriggerAddAction( gg_trg_PulseBeam, function Trig_PulseBeam_Actions )
endfunction


JASS:
function Trig_PulseBeamEffect_Conditions takes nothing returns boolean
    if (GetUnitTypeId(GetDyingUnit()) == 'u00O') then
        return true
    endif
    return false
endfunction

function Trig_PulseBeamEffect_Func001001003 takes nothing returns boolean
    return ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == true )
endfunction

//function knock takes nothing returns nothing
//    local timer k = GetExpiredTimer ()
//    local unit u = GetHandleUnit (k, "ku")
//    local real x = GetHandleReal (k, "xd")
//    local real y = GetHandleReal (k, "yd")
//    local location l = Location (x, y)
//    call SetUnitPositionLoc(u, PolarProjectionBJ(GetUnitLoc(u), 10, AngleBetweenPoints (l, GetUnitLoc(u))))
//endfunction

// I hope all the //-disabled actions aren't too annoying.

function Trig_PulseBeamEffect_Actions takes nothing returns nothing
    local unit d = GetDyingUnit ()
    local group g = GetUnitsInRangeOfLocMatching(120.00, GetUnitLoc(d), Condition(function targetcond))
//    local real x = GetLocationX (GetUnitLoc (d))
//    local real y = GetLocationY (GetUnitLoc (d))
//    local unit u
//    local timer k = CreateTimer ()
    call AddSpecialEffectLocBJ( GetUnitLoc(GetDyingUnit()), "Units\\NightElf\\Wisp\\WispExplode.mdl" )
    call DestroyEffectBJ( GetLastCreatedEffectBJ() )    
//    call SetHandleHandle (k, "ta", g)
//    call SetHandleReal (k, "xd", x)
//    call SetHandleReal (k, "yd", y)
//    loop
//        set u = FirstOfGroup (g)
//        exitwhen u == null
//        call GroupRemoveUnit (g, u)
//        call SetHandleHandle (k, "ku", u)     
//    endloop
    call TriggerSleepAction (0.24)
//    call PauseTimer (k)
//    call FlushHandleLocals (k)
//    call DestroyTimer (k)
    call RemoveUnit (d)
//    set k = null
    set g = null
    set d = null
//    set u = null   
endfunction

//===========================================================================
function InitTrig_PulseBeamEffect takes nothing returns nothing
    set gg_trg_PulseBeamEffect = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_PulseBeamEffect, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_PulseBeamEffect, Condition( function Trig_PulseBeamEffect_Conditions ) )
    call TriggerAddAction( gg_trg_PulseBeamEffect, function Trig_PulseBeamEffect_Actions )
endfunction
 

Viikuna

No Marlo no game.
Reaction score
265
Kattanas Handle Vars is kinda old & slow system and it can be pretty dangerous too. In these days Jassers have much more powerful recources to deploy. vJass is a nice extension to normal Jass, and it provides some pretty cool new features to ease our coding.

First you should get NewGen, in case you dont have it yet. Its something must have. Also you should update to newest version of JassHelper.

Some useful links:
JassHelper manual ( List of all vJass features )
How use NewGen after 1.22 patch.

About the knockback.
You should use structs ( vJass feature ) for your knockback. There is pretty good knockback tutorial by Silvennon, here and it requires some struct knowledge.

I can write you some really simple example later, unless some other guy manages to do it first.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top