• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!

[vJASS] Trigger no enabling

Status
Not open for further replies.
I'm trying my hand at some vJASS and this one trigger is not being enabled. I'm not very good at vJASS so any help is appreciated.

THE TRIGGER
JASS:
scope PB initializer Persistent_Beam_Tracking

globals
    public trigger Persistent_Beam_Tracking_Trigger = CreateTrigger()
    ...
endglobals

...

function Persistent_Beam_Tracking takes nothing returns nothing
    call DisableTrigger(Persistent_Beam_Tracking_Trigger)
    call TriggerRegisterTimerEvent(Persistent_Beam_Tracking_Trigger, 0.03125, true)
    call TriggerAddCondition(Persistent_Beam_Tracking_Trigger, function Persistent_Beam_Tracking_Actions)
endfunction

endscope

THE ENABLER
JASS:
if not IsTriggerEnabled(PB_Persistent_Beam_Tracking_Trigger) then
        call BJDebugMsg("Tracking is Disabled")
        call EnableTrigger(gg_trg_Persistent_Beam_Cancel_A)
        call EnableTrigger(gg_trg_Persistent_Beam_Cancel_B)
        call EnableTrigger(PB_Persistent_Beam_Tracking_Trigger)
    else
        call BJDebugMsg("Tracking is Enabled")
endif

Whenever I test the trigger, it always says "Tracking is Disabled", so I'm assuming the initializer way requires a different approach to enabling/disabling triggers?
 
The ENABLER runs whenever a unit deals damage to another one. I've tested this and the ENABLER trigger runs just fine, it's the call EnableTrigger(PB_Persistent_Beam_Tracking_Trigger) that doesn't seem to work.
JASS:
function Persistent_Beam_Attack_Actions takes nothing returns boolean

    local real xA = .0
    local real yA = .0
    local real xB = .0
    local real yB = .0
    local real xC = .0
    local real yC = .0
    local real dx = .0
    local real dy = .0
    local real distance = .0
    local real angle = .0
    local integer SOURCE_ID = GetUnitUserData(udg_DamageEventSource)
   
    if BeamConfig_Beam_IsABeamer[SOURCE_ID] and udg_DamageEventType == 0 and not udg_IsDamageSpell then
        set udg_DamageEventAmount = 0.00
        set udg_DamageEventType = udg_DamageTypeBlocked
        set PB_Beam_HitStack[SOURCE_ID] = (PB_Beam_HitStack[SOURCE_ID] + 1)
        set PB_Beam_DamageStack[SOURCE_ID] = (PB_Beam_DamageStack[SOURCE_ID] + udg_DamageEventPrevAmt)
        if not IsUnitInGroup(udg_DamageEventSource, PB_Beam_MainGroup) then
            set PB_Beam_IntervalDMGTrigger[SOURCE_ID] = (33 / BeamConfig_HitsPerSecond[SOURCE_ID])
            set PB_BeamOwner[SOURCE_ID] = GetOwningPlayer(udg_DamageEventSource)
            if BeamConfig_AttackType[SOURCE_ID] == ATTACK_TYPE_MAGIC then
                set PB_Beam_CannotHitMagicImmune[SOURCE_ID] = true
            endif
            // -------- -------- -------- -------- -------- -------- -------- --------
            set xA = GetUnitX(udg_DamageEventSource)
            set yA = GetUnitY(udg_DamageEventSource)
            set xB = GetUnitX(udg_DamageEventTarget)
            set yB = GetUnitY(udg_DamageEventTarget)
            set dx = xB-xA
            set dy = yB-yA
            set distance = SquareRoot(dx*dx+dy*dy)
            set angle = Atan2(yA-yB, xA-xB)
            // -------- -------- -------- -------- -------- -------- -------- --------
            if BeamConfig_CasterOffset[SOURCE_ID] > 0.00 then
                set xC = xA + Cos(angle) * BeamConfig_CasterOffset[SOURCE_ID]
                set yC = yA + Sin(angle) * BeamConfig_CasterOffset[SOURCE_ID]
                set PB_BeamCaster[SOURCE_ID] = CreateUnit(PB_BeamOwner[SOURCE_ID], BeamConfig_DummyType[SOURCE_ID], xC, yC, angle * bj_RADTODEG)
            else
                set PB_BeamCaster[SOURCE_ID] = CreateUnit(PB_BeamOwner[SOURCE_ID], BeamConfig_DummyType[SOURCE_ID], xA, yA, angle * bj_RADTODEG)
            endif
            call PauseUnit(PB_BeamCaster[SOURCE_ID], true)
            call SetUnitFlyHeight(PB_BeamCaster[SOURCE_ID], (GetUnitFlyHeight(udg_DamageEventSource) + BeamConfig_CasterHeight[SOURCE_ID] ), 0.00)
            call SetUnitScale(PB_BeamCaster[SOURCE_ID], BeamConfig_CasterScale[SOURCE_ID]*.01, 0., 0. )
            // -------- -------- -------- -------- -------- -------- -------- --------
            set PB_BeamMover[SOURCE_ID] = CreateUnit(PB_BeamOwner[SOURCE_ID], BeamConfig_DummyType[SOURCE_ID], xB, yB, angle * bj_RADTODEG)
            call PauseUnit(PB_BeamMover[SOURCE_ID], true)
            if BeamConfig_IsMoverGrounded[SOURCE_ID] then
                call SetUnitFlyHeight(PB_BeamMover[SOURCE_ID], 0.00, 0.00)
            else
                call SetUnitFlyHeight(PB_BeamMover[SOURCE_ID], (GetUnitFlyHeight(udg_DamageEventTarget) + 50.00 ), 0.00)
            endif
            call SetUnitScale(PB_BeamMover[SOURCE_ID], BeamConfig_MoverScale[SOURCE_ID]*.01, 0., 0.)
            // -------- -------- -------- -------- -------- -------- -------- --------
            if BeamConfig_BeamTypeCharge[SOURCE_ID] != null then
                set PB_BeamLightning[SOURCE_ID] = AddLightningEx(BeamConfig_BeamTypeCharge[SOURCE_ID], true, /*
                */ GetUnitX(PB_BeamCaster[SOURCE_ID]), GetUnitY(PB_BeamCaster[SOURCE_ID]), GetUnitZ(PB_BeamCaster[SOURCE_ID]), /*
                */ GetUnitX(PB_BeamMover[SOURCE_ID]), GetUnitY(PB_BeamMover[SOURCE_ID]), GetUnitZ(PB_BeamMover[SOURCE_ID]))
                call SetLightningColor(PB_BeamLightning[SOURCE_ID], BeamConfig_RED[SOURCE_ID], BeamConfig_GREEN[SOURCE_ID], BeamConfig_BLUE[SOURCE_ID], BeamConfig_ALPHA[SOURCE_ID])
            endif
            set PB_BeamTarget[SOURCE_ID] = udg_DamageEventTarget
            call GroupAddUnit(PB_Beam_MainGroup, udg_DamageEventSource)
            set PB_ActiveBeams = PB_ActiveBeams + 1
            set PB_ActiveBeamer[PB_ActiveBeams] = udg_DamageEventSource
            if not IsTriggerEnabled(PB_Persistent_Beam_Tracking_Trigger) then
                call BJDebugMsg("Tracking is DISabled")
                call EnableTrigger(gg_trg_Persistent_Beam_Cancel)
                call EnableTrigger(gg_trg_Persistent_Beam_Cancel_B)
                call EnableTrigger(PB_Persistent_Beam_Tracking_Trigger)
            else
                call BJDebugMsg("Tracking is Enabled")
            endif
            set udg_BeamEvent_Source = udg_DamageEventSource
            set udg_BeamEvent_Target = udg_DamageEventTarget
            set udg_BeamEvent_Caster = PB_BeamCaster[SOURCE_ID]
            set udg_BeamEvent_Mover = PB_BeamMover[SOURCE_ID]
            set udg_BeamEvent_Damage = udg_DamageEventPrevAmt
            set udg_BeamEvent = 1.00
            set udg_BeamEvent = 0.00
            set udg_BeamEvent_Source = null
            set udg_BeamEvent_Target = null
            set udg_BeamEvent_Caster = null
            set udg_BeamEvent_Mover = null
            set udg_BeamEvent_Damage = 0.00
        else
            if udg_DamageEventTarget != PB_BeamTarget[SOURCE_ID] then
                set PB_BeamTarget[SOURCE_ID] = udg_DamageEventTarget
            endif
        endif
    endif
    return false
endfunction

//===========================================================================
function InitTrig_Persistent_Beam_Attack takes nothing returns nothing
    set gg_trg_Persistent_Beam_Attack = CreateTrigger()
    call TriggerRegisterVariableEvent( gg_trg_Persistent_Beam_Attack, "udg_DamageModifierEvent", EQUAL, 1.00 )
    call TriggerAddCondition( gg_trg_Persistent_Beam_Attack, function Persistent_Beam_Attack_Actions )
endfunction
 
Level 39
Joined
Feb 27, 2007
Messages
5,024
Generally speaking it would be smarter and simpler to use a timer instead of a periodic trigger. Timers can't have conditions, but you can just check the condition you need in an if block inside the callback function.

The problem is that you can't Persistent_Beam_Tracking_Trigger = CreateTrigger() in the globals declaration, so it's effectively = null. I believe it might also crash the globals declaration when it gets there in the map's initialization so anything that comes after it will also not be initialized. You can set it to a value (if it was an integer instead of trigger, for example, or null for handles), but you can't call any functions in the declaration. For example:
JASS:
globals
    integer ThisWorks = 0+22-34/17
    real ThisAlsoWorks = ThisWorks * 0.25

    integer ThisDoesntWork = GetRandomInt(1,20)
    unit ThisIsNoGood = CreateUnit(...)
    trigger ThisIsHowYouHaveToDoIt = null
endglobals

function init takes nothing returns nothing
    set ThisIsHowYouHaveToDoIt = CreateTrigger()
endfunction
 
Last edited:
Level 39
Joined
Feb 27, 2007
Messages
5,024
Creating triggers should work in globals.
Then why does GUI do this? Not that GUI really does most things sensibly, but you'd think that the trigger variable declarations would do it there if they could.
JASS:
function Trig_Melee_Initialization_Actions takes nothing returns nothing
    call MeleeStartingVisibility(  )
    call MeleeStartingHeroLimit(  )
    call MeleeGrantHeroItems(  )
    call MeleeStartingResources(  )
    call MeleeClearExcessUnits(  )
    call MeleeStartingUnits(  )
    call MeleeStartingAI(  )
    call MeleeInitVictoryDefeat(  )
endfunction

//===========================================================================
function InitTrig_Melee_Initialization takes nothing returns nothing
@    set gg_trg_Melee_Initialization = CreateTrigger(  ) @
    call TriggerAddAction( gg_trg_Melee_Initialization, function Trig_Melee_Initialization_Actions )
endfunction
 
Level 37
Joined
Jul 22, 2015
Messages
3,485
JASS:
scope A initializer onInit
 
    globals
        public trigger TEST_TRIGGER = CreateTrigger()
    endglobals
 
    private function onInit takes nothing returns nothing
        if (TEST_TRIGGER != null) then
            call BJDebugMsg("Not null")
        endif
    endfunction

endscope
^ This worked for me.


JASS:
scope A initializer onInit
 
    globals
        public trigger TEST_TRIGGER = CreateTrigger()
    endglobals
 
    private function onInit takes nothing returns nothing
        call DisableTrigger(TEST_TRIGGER)
    endfunction

endscope

scope B initializer onInit

    private function onInit takes nothing returns nothing
        if IsTriggerEnabled(A_TEST_TRIGGER) then
            call BJDebugMsg("Trigger is already enabled")
        else
            call BJDebugMsg("Disabling trigger")
            call EnableTrigger(A_TEST_TRIGGER)
        endif
        if IsTriggerEnabled(A_TEST_TRIGGER) then
            call BJDebugMsg("Enabled")
        else
            call BJDebugMsg("Disabled")
        endif
    endfunction

endscope
^ This also works for me. Printed out as "Disabling trigger" -> "Enabled". My guess is something else is turning off your trigger somewhere else.
 
Status
Not open for further replies.
Top