• 🏆 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!

Local timer dont stop.

Level 6
Joined
Aug 26, 2016
Messages
101
Why timer doesn't stop?


JASS:
function Trig_LMB22_Actions takes nothing returns nothing
local timer TimerAct2 = GetExpiredTimer()
local integer BB = GetHandleId(TimerAct2)



call DisplayTextToForce( GetPlayersAll(), "Off" )
call PauseTimer(TimerAct2)
call DestroyTimer(TimerAct2)

set TimerAct2 = null

 endfunction
 
 
 
 function Trig_LMB21_Actions takes nothing returns nothing
local timer TimerAct2 = CreateTimer()
local integer BB = GetHandleId(TimerAct2)
call SaveReal(Hash, BB, StringHash("processs"), 0)
call DisplayTextToForce( GetPlayersAll(), "On" )
call TimerStart(TimerAct2, 0.10, false, function Trig_LMB21_Actions)
set TimerAct2 = null
endfunction




 function Trig_LMB22_Conditions takes nothing returns boolean  
     if ( not ( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT ) ) then
        return false
    endif
    return true
endfunction
function Trig_LMB21_Conditions takes nothing returns boolean  
     if ( not ( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT ) ) then
        return false
    endif
    return true
endfunction

 
 
//===========================================================================
function InitTrig_LMB2 takes nothing returns nothing
    set gg_trg_LMB2 = CreateTrigger(  )
    
    call TriggerAddCondition( gg_trg_LMB2, Condition( function Trig_LMB22_Conditions ) )
    call TriggerAddCondition( gg_trg_LMB2, Condition( function Trig_LMB21_Conditions ) )

endfunction
 
Level 6
Joined
Aug 26, 2016
Messages
101
Is this all the script? Because where is Trig_LMB21_Actions being runned? since the trigger doesn't have events or actions (and has the same condition twice).
function Trig_LMB21_Actions takes nothing returns nothing
local timer TimerAct2 = CreateTimer()
local integer BB = GetHandleId(TimerAct2)
call SaveReal(Hash, BB, StringHash("processs"), 0)
call DisplayTextToForce( GetPlayersAll(), "On" )
call TimerStart(TimerAct2, 0.10, false, function Trig_LMB21_Actions)
set TimerAct2 = null
endfunction
 

Uncle

Warcraft Moderator
Level 64
Joined
Aug 10, 2018
Messages
6,579
Nowhere in that Code does Trig_LMB22_Actions get called.

We also don't see any Events/Actions so we have no idea if they even exist.

Here's some code that should work assuming your Hashtable stuff isn't broken:
vJASS:
library Example initializer Example_Init
   
    function Example_Timer_Callback takes nothing returns nothing
        local timer TimerAct2 = GetExpiredTimer()
        local integer BB = GetHandleId(TimerAct2)
       
        call DisplayTextToForce( GetPlayersAll(), "Off" )
        call PauseTimer(TimerAct2)
        call DestroyTimer(TimerAct2)
       
        set TimerAct2 = null
    endfunction
       
    function Example_Action takes nothing returns nothing
        local timer TimerAct2 = CreateTimer()
        local integer BB = GetHandleId(TimerAct2)

        call SaveReal(Hash, BB, StringHash("processs"), 0)
        call DisplayTextToForce( GetPlayersAll(), "On" )
        call TimerStart(TimerAct2, 0.10, false, function Example_Timer_Callback)

        set TimerAct2 = null
    endfunction

    function Example_Condition takes nothing returns boolean 
         if ( not ( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT ) ) then
            return false
        endif
        return true
    endfunction
   
    //===========================================================================
    function Example_Init takes nothing returns nothing
        local trigger t = CreateTrigger()

        // Events, Conditions, Actions
        call TriggerRegisterPlayerMouseEventBJ( t, Player(0), bj_MOUSEEVENTTYPE_DOWN )
        call TriggerAddCondition( t, Condition( function Example_Condition ) )
        call TriggerAddAction( t, function Example_Action )

        set t = null
    endfunction
endlibrary
This code will start a Timer and Destroy it after 0.10 seconds whenever Player 1 (Red) presses the Right mouse button.
 
Last edited:

Uncle

Warcraft Moderator
Level 64
Joined
Aug 10, 2018
Messages
6,579
Your interface jass script in the UI folder is using the same library name as my example code. You can't have two libraries with the same name. Also, for some reason your Lmb script is missing my library so it's Init function never runs. Change it to use a different Library name and it'll work:

this works.png
 

Uncle

Warcraft Moderator
Level 64
Joined
Aug 10, 2018
Messages
6,579
The code in Juse is missing the Library.

Look at the picture above. See how the Library says initializer Example_Init at the top? This tells the game to run the Example_Init function during map initialization. If you don't run Example_Init() then the trigger will never be created and nothing will happen.

If you don't want to use a Library you can instead just call the Init function manually:
  • Events
    • Time - Elapsed game time is 1.00 seconds
  • Conditions
  • Actions
    • Custom script: call Example_Init()
The code works fine as long as you set it up correctly. Don't forget to rename things to fit your map so you can avoid these kinds of issues.
 
Last edited:
Level 6
Joined
Aug 26, 2016
Messages
101
Timer dont stop.
library Timer initializer InitTrig_Timer function Example_Timer_Callback takes nothing returns nothing local timer TimerAct2 = GetExpiredTimer() local integer BB = GetHandleId(TimerAct2) call DisplayTextToForce( GetPlayersAll(), "Off" ) call PauseTimer(TimerAct2) call DestroyTimer(TimerAct2) set TimerAct2 = null endfunction function Example_Action takes nothing returns nothing local timer TimerAct2 = CreateTimer() local integer BB = GetHandleId(TimerAct2) call SaveReal(Hash, BB, StringHash("processs"), 0) call DisplayTextToForce( GetPlayersAll(), "On" ) call TimerStart(TimerAct2, 0.10, false, function Example_Action) set TimerAct2 = null endfunction function Example_Condition takes nothing returns boolean if ( not ( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT ) ) then return false endif return true endfunction //=========================================================================== function InitTrig_Timer takes nothing returns nothing local trigger t = CreateTrigger() // Events, Conditions, Actions call TriggerRegisterPlayerMouseEventBJ( t, Player(0), bj_MOUSEEVENTTYPE_DOWN ) call TriggerAddCondition( t, Condition( function Example_Condition ) ) call TriggerAddAction( t, function Example_Action ) call TriggerRegisterPlayerMouseEventBJ( t, Player(0), bj_MOUSEEVENTTYPE_UP ) call TriggerAddAction( t, function Example_Timer_Callback ) set t = null endfunction endlibrary
 

Uncle

Warcraft Moderator
Level 64
Joined
Aug 10, 2018
Messages
6,579
These two lines don't make any sense here:
vJASS:
call TriggerRegisterPlayerMouseEventBJ( t, Player(0), bj_MOUSEEVENTTYPE_UP )
call TriggerAddAction( t, function Example_Timer_Callback )

You're running the Timer Callback function when you release the mouse button, which is supposed to run when the Timer expires.
vJASS:
local timer TimerAct2 = GetExpiredTimer()
^ How is it going to get the expired timer when the Event says "Player 1 releases the mouse button". There is no Timer related to that Event therefore there is no GetExpiredTimer() Event Response.

Also, you need to split those Events up into two different triggers, one for pressing and one for releasing the mouse.

I'm gonna go ahead and assume that you want it so your Hero fires missiles while you hold down the Right mouse button and stops firing when you release the Right mouse button. I base this off of your very detailed explanation: "timer does not turn off." "Don't work" ".." :p

vJASS:
library MouseMissileSystem initializer MMS_Init

    globals
        hashtable mms_hash = InitHashtable()
        timer array mms_timers
        real array mms_x
        real array mms_y
    endglobals

    function MMS_Launch_Missile_Callback takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local integer pn = LoadInteger(mms_hash, GetHandleId(t), 0)
        local player p = Player(pn)

        call DisplayTextToForce( GetPlayersAll(), "Launch a missile for: " + GetPlayerName(p) + " at X/Y: " + R2S(mms_x[pn]) + " / " + R2S(mms_y[pn]))
        call CreateUnit(p, 'hfoo', mms_x[pn], mms_y[pn], 270)

        set p = null
        set t = null
    endfunction
 
    function MMS_Right_Click_Released takes nothing returns nothing
        local player p = GetTriggerPlayer()
        local integer pn = GetPlayerId(p)
        local timer t = mms_timers[pn]
 
        call DisplayTextToForce( GetPlayersAll(), "Off" )

        call PauseTimer(t)
        call DestroyTimer(t)
 
        set p = null
        set t = null
    endfunction
 
    function MMS_Right_Click_Pressed takes nothing returns nothing
        local player p = GetTriggerPlayer()
        local integer pn = GetPlayerId(p)

        call DisplayTextToForce( GetPlayersAll(), "On" )

        set mms_timers[pn] = CreateTimer()
        call TimerStart(mms_timers[pn], 0.25, true, function MMS_Launch_Missile_Callback)
        call SaveInteger(mms_hash, GetHandleId(mms_timers[pn]), 0, pn)
 
        set p = null
    endfunction

    function MMS_Mouse_Moved takes nothing returns nothing
        local player p = GetTriggerPlayer()
        local integer pn = GetPlayerId(p)

        set mms_x[pn] = BlzGetTriggerPlayerMouseX()
        set mms_y[pn] = BlzGetTriggerPlayerMouseY()

        set p = null
    endfunction

    function MMS_Condition takes nothing returns boolean
         if ( not ( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT ) ) then
            return false
        endif
        return true
    endfunction
 
    //===========================================================================
    function MMS_Init takes nothing returns nothing
        local integer pn = 0
        local trigger press = CreateTrigger()
        local trigger release = CreateTrigger()
        local trigger move = CreateTrigger()

        // Pressed right mouse button
        call TriggerAddCondition( press, Condition( function MMS_Condition ) )
        call TriggerAddAction( press, function MMS_Right_Click_Pressed )

        // Released right mouse button
        call TriggerAddCondition( release, Condition( function MMS_Condition ) )
        call TriggerAddAction( release, function MMS_Right_Click_Released )

        // Moved mouse
        call TriggerAddAction( move, function MMS_Mouse_Moved )

        // Register events for all 24 players
        loop
            call TriggerRegisterPlayerMouseEventBJ( press, Player(pn), bj_MOUSEEVENTTYPE_DOWN )
            call TriggerRegisterPlayerMouseEventBJ( release, Player(pn), bj_MOUSEEVENTTYPE_UP )
            call TriggerRegisterPlayerMouseEventBJ( move, Player(pn), bj_MOUSEEVENTTYPE_MOVE )
            set pn = pn + 1
            exitwhen pn == 24
        endloop

        set press = null
        set release = null
        set move = null
    endfunction

endlibrary
This will track each Player's mouse position. It will also Create a Footman every 0.25 seconds at their Mouse Position as long as they're holding the Right mouse button down.

I didn't feel like importing a missile system so the Footman serves as an example of how you can interact with the mouse position. You would replace the Footman code with your code for launching a Missile. You would launch the missile from the position of the player's Hero to those given X/Y coordinates. You can track the Hero using a Unit array variable the same way I'm tracking the timers/coordinates.
 

Attachments

  • Mouse Missile System 1.w3m
    17.6 KB · Views: 2
Last edited:
Level 6
Joined
Aug 26, 2016
Messages
101
but I'm wondering why two shells are created and not 5 as I indicated in the Loo.
JASS:
library Shoot initializer InitTrig_ShootTest

function Trig_ShootTest_Actions2 takes nothing returns nothing
local timer TimerAct = GetExpiredTimer()
local integer id = GetHandleId(TimerAct)
local unit marine = LoadUnitHandle(Hash, id, StringHash("marine"))
local unit Target = LoadUnitHandle(Hash, id, StringHash("Target"))
local integer z = 0
local unit Dummy = LoadUnitHandle(Hash, id, StringHash("Dummy")) 
local real process = LoadReal(Hash, id, StringHash("process")) + LoadReal(Hash, id, StringHash("Speed"))
local group gACT
local unit u = null

 if process > LoadReal(Hash, id, StringHash("maxDis")) then
 call DestroyGroup(LoadGroupHandle(Hash, id, StringHash("group")))
 call KillUnit(Dummy)
 call FlushChildHashtable(Hash, id)
 call PauseTimer(TimerAct)
 call DestroyTimer(TimerAct)
 
else

 call SaveReal(Hash, id, StringHash("process"), process)
 call SetUnitX(Dummy, GetUnitX(Dummy) + LoadReal(Hash, id, StringHash("Speed")) * Cos(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
 call SetUnitY(Dummy, GetUnitY(Dummy) + LoadReal(Hash, id, StringHash("Speed")) * Sin(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
 
 set gACT =CreateGroup()
 call GroupEnumUnitsInRange(gACT, GetUnitX(Dummy),GetUnitY(Dummy), LoadReal(Hash, id, StringHash("Aoe")), null )
 
 loop
 
  set u = FirstOfGroup(gACT)
  exitwhen u == null
  
  if GetWidgetLife(u) > 0.405 and not IsUnitInGroup(u, LoadGroupHandle(Hash, id, StringHash("group"))) then
  
      if IsUnitEnemy(u, GetOwningPlayer(marine)) then
         call UnitDamageTarget(marine, u, LoadReal(Hash, id, StringHash("Damege")), false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, null)
         call DestroyEffect(AddSpecialEffectTarget(LoadStr(Hash, id, StringHash("BloodEfect")), u, "chest"))
         call RemoveUnit(Dummy)
      else
      
      endif
  
  endif
  
  call GroupRemoveUnit(gACT, u)
  
  endloop
  
   call DestroyGroup(gACT)
   
  endif 
  
set Target = null
set marine = null
set Dummy = null
set TimerAct = null
set gACT = null

endfunction

function Trig_ShootTest_Actions takes nothing returns nothing

local integer z = 0
local unit marine = gg_unit_H000_0003
local unit Target = gg_unit_n000_0005
local real xMarine = GetUnitX(marine)
local real yMarine = GetUnitY(marine)
local real xTarget = GetUnitX(Target)
local real yTarget = GetUnitY(Target)
local real angle = bj_RADTODEG * Atan2(yTarget - yMarine, xTarget - xMarine) + GetRandomReal(-12.00, 12.00)
local unit Dummy = CreateUnit(GetOwningPlayer(marine), 'n001', xMarine, yMarine, angle)

local real maxDis = 1200
local real Damege = 50
local real Aoe = 90
local real Speed = 2000

local string BloodEfect = "Objects/Spawnmodels/Human/HumanBlood/HumanBloodKnight.mdl"

local timer TimerAct = CreateTimer()
local integer id = GetHandleId(TimerAct)
 
    if xMarine == xTarget and yMarine == yMarine then
        set angle = GetUnitFacing(marine)
    endif

call SetUnitX(Dummy, xMarine + 106 * Cos(angle * bj_DEGTORAD))
call SetUnitY(Dummy, yMarine + 106 * Sin(angle * bj_DEGTORAD))

call SaveUnitHandle(Hash, id, StringHash("marine"), marine)
call SaveUnitHandle(Hash, id, StringHash("Target"), Target)


call SaveReal(Hash, id, StringHash("Damege"), Damege)
call SaveReal(Hash, id, StringHash("maxDis"), maxDis)
call SaveReal(Hash, id, StringHash("Aoe"), Aoe)
call SaveReal(Hash, id, StringHash("angle"), angle)
call SaveReal(Hash, id, StringHash("Speed"), Speed * 0.03)
call SaveStr(Hash, id, StringHash("BloodEfect"), BloodEfect)
call SaveReal(Hash, id, StringHash("process"), 0)
call SaveGroupHandle(Hash, id, StringHash("group"), CreateGroup())


loop 
call SaveUnitHandle(Hash, id, StringHash("Dummy"), Dummy)
call DisplayTextToForce( GetPlayersAll(), "Shoot" )

call TimerStart(TimerAct, 0.03, true, function Trig_ShootTest_Actions2)
    
    
    call SetUnitAnimation( gg_unit_H000_0003, "attack" )
set z = z + 1
    exitwhen z == 5 
endloop
    call StopSoundBJ( gg_snd_GyrocopterImpactHit1, false )
    call PlaySoundBJ( gg_snd_GyrocopterImpactHit1 )
set marine = null
set Target = null
set Dummy = null
set TimerAct = null
    
endfunction

function Trig_ShootTest_Conditions takes nothing returns boolean  
    return BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT
endfunction


//===========================================================================
function InitTrig_ShootTest takes nothing returns nothing
    
    local trigger w = CreateTrigger()
    call TriggerRegisterPlayerMouseEventBJ( w, Player(0), bj_MOUSEEVENTTYPE_DOWN )
    call TriggerAddCondition( w, Condition( function Trig_ShootTest_Conditions ) )
    call TriggerAddAction( w, function Trig_ShootTest_Actions )
    
endfunction

endlibrary
 

Uncle

Warcraft Moderator
Level 64
Joined
Aug 10, 2018
Messages
6,579
I don't really understand what you're trying to do here. Why are you looping any of these Actions?
vJASS:
loop
call SaveUnitHandle(Hash, id, StringHash("Dummy"), Dummy)
call DisplayTextToForce( GetPlayersAll(), "Shoot" )

call TimerStart(TimerAct, 0.03, true, function Trig_ShootTest_Actions2)
 
 
    call SetUnitAnimation( gg_unit_H000_0003, "attack" )
set z = z + 1
    exitwhen z == 5
endloop
All of these Actions should only happen once, if at all.

I also don't see anything about a Shell. I guess you mean the Dummy unit? I only see it being created once:
vJASS:
local unit Dummy = CreateUnit(GetOwningPlayer(marine), 'n001', xMarine, yMarine, angle)

I suggest using a system like this for your missiles:

It's going to be A LOT better than anything you and I can possibly come up with.
 

Uncle

Warcraft Moderator
Level 64
Joined
Aug 10, 2018
Messages
6,579
Here's an example. I'm using GUI for the Relativistic Missiles system but it could also be done through code.

Edit: Attached another example (3) with a weapon equipping system for firing different types of missiles.
 

Attachments

  • Mouse Missile System 2.w3m
    80.7 KB · Views: 2
  • Mouse Missile System 3.w3m
    84 KB · Views: 3
Last edited:
Level 6
Joined
Aug 26, 2016
Messages
101
Why two projectiles created in library?
JASS:
library Shoot initializer InitTrig_ShootTest

globals
  hashtable Hash = InitHashtable()
endglobals

function Trig_ShootTest_Actions2 takes nothing returns nothing
local timer TimerAct = GetExpiredTimer()
local integer id = GetHandleId(TimerAct)
local unit marine = LoadUnitHandle(Hash, id, StringHash("marine"))
local unit Target = LoadUnitHandle(Hash, id, StringHash("Target"))

local unit Dummy = LoadUnitHandle(Hash, id, StringHash("Dummy")) 
local real process = LoadReal(Hash, id, StringHash("process")) + LoadReal(Hash, id, StringHash("Speed"))
local group gACT
local unit u = null

 if process > LoadReal(Hash, id, StringHash("maxDis")) then
 call DestroyGroup(LoadGroupHandle(Hash, id, StringHash("group")))
 call KillUnit(Dummy)
 call FlushChildHashtable(Hash, id)
 call PauseTimer(TimerAct)
 call DestroyTimer(TimerAct)
 
else

 call SaveReal(Hash, id, StringHash("process"), process)
 call SetUnitX(Dummy, GetUnitX(Dummy) + LoadReal(Hash, id, StringHash("Speed")) * Cos(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
 call SetUnitY(Dummy, GetUnitY(Dummy) + LoadReal(Hash, id, StringHash("Speed")) * Sin(LoadReal(Hash, id, StringHash("angle")) * bj_DEGTORAD))
 
 set gACT =CreateGroup()
 call GroupEnumUnitsInRange(gACT, GetUnitX(Dummy),GetUnitY(Dummy), LoadReal(Hash, id, StringHash("Aoe")), null )
 
 loop
 
  set u = FirstOfGroup(gACT)
  exitwhen u == null
  
  if GetWidgetLife(u) > 0.405 and not IsUnitInGroup(u, LoadGroupHandle(Hash, id, StringHash("group"))) then
  
      if IsUnitEnemy(u, GetOwningPlayer(marine)) then
         call UnitDamageTarget(marine, u, LoadReal(Hash, id, StringHash("Damege")), false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, null)
         call DestroyEffect(AddSpecialEffectTarget(LoadStr(Hash, id, StringHash("BloodEfect")), u, "chest"))
         call RemoveUnit(Dummy)
      else
      
      endif
  
  endif
  
  call GroupRemoveUnit(gACT, u)
  
  endloop
  
   call DestroyGroup(gACT)
   
  endif 
set Target = null
set marine = null
set Dummy = null
set TimerAct = null
set gACT = null

endfunction


function Trig_ShootTest_Actions takes nothing returns nothing
local unit marine = gg_unit_H000_0003
local unit Target = gg_unit_n000_0005
local real xMarine = GetUnitX(marine)
local real yMarine = GetUnitY(marine)
local real xTarget = GetUnitX(Target)
local real yTarget = GetUnitY(Target)
local real angle = bj_RADTODEG * Atan2(yTarget - yMarine, xTarget - xMarine) + GetRandomReal(-6.00, 6.00)
local unit Dummy = CreateUnit(GetOwningPlayer(marine), 'n001', xMarine, yMarine, angle)

local real maxDis = 1200
local real Damege = 50
local real Aoe = 90
local real Speed = 2000

local string BloodEfect = "Objects/Spawnmodels/Human/HumanBlood/HumanBloodKnight.mdl"

local timer TimerAct = CreateTimer()
local integer id = GetHandleId(TimerAct)
if xMarine == xTarget and yMarine == yMarine then
        set angle = GetUnitFacing(marine)
    endif

call SetUnitX(Dummy, xMarine + 106 * Cos(angle * bj_DEGTORAD))
call SetUnitY(Dummy, yMarine + 106 * Sin(angle * bj_DEGTORAD))

call SaveUnitHandle(Hash, id, StringHash("marine"), marine)
call SaveUnitHandle(Hash, id, StringHash("Target"), Target)
call SaveUnitHandle(Hash, id, StringHash("Dummy"), Dummy)

call SaveReal(Hash, id, StringHash("Damege"), Damege)
call SaveReal(Hash, id, StringHash("maxDis"), maxDis)
call SaveReal(Hash, id, StringHash("Aoe"), Aoe)
call SaveReal(Hash, id, StringHash("angle"), angle)
call SaveReal(Hash, id, StringHash("Speed"), Speed * 0.03)
call SaveStr(Hash, id, StringHash("BloodEfect"), BloodEfect)
call SaveReal(Hash, id, StringHash("process"), 0)
call SaveGroupHandle(Hash, id, StringHash("group"), CreateGroup())

call DisplayTextToForce( GetPlayersAll(), "Shoot" )
call TimerStart(TimerAct, 0.03, true, function Trig_ShootTest_Actions2)
    call StopSoundBJ( gg_snd_GyrocopterImpactHit1, false )
    call PlaySoundBJ( gg_snd_GyrocopterImpactHit1 )
    call SetUnitAnimation( gg_unit_H000_0003, "attack" )

set marine = null
set Target = null
set Dummy = null
set TimerAct = null


endfunction

function Trig_ShootTest_Conditions takes nothing returns boolean  
    return BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT
endfunction


//===========================================================================
function InitTrig_ShootTest takes nothing returns nothing
    
    local trigger w = CreateTrigger()
    call TriggerRegisterPlayerMouseEventBJ( w, Player(0), bj_MOUSEEVENTTYPE_DOWN )
    call TriggerAddCondition( w, Condition( function Trig_ShootTest_Conditions ) )
    call TriggerAddAction( w, function Trig_ShootTest_Actions )
    
endfunction

endlibrary
 
Top