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:
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() == 039;A082039;)
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, 039;u00O039;, GetOwningPlayer(c), GetUnitLoc(c), GetUnitFacing(c))
set proj = GetLastCreatedUnit()
call UnitApplyTimedLifeBJ( 1.70, 039;BTLF039;, 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()) == 039;u00O039;) 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