TriggerHappy
...
- Reaction score
- 341
MultiClick
Simple system that allows you to register double or tripple click events.
Also allows you to easily add your clicks easily.
Example
Changelog
Version 1.1 - Latest
Simple system that allows you to register double or tripple click events.
Also allows you to easily add your clicks easily.
JASS:
library MultiClick
globals
private constant real TIMER_TIMEOUT = 0.40
private constant integer SUBTRACT = 0x100000
endglobals
// Don't modify below this line
private function True takes nothing returns boolean
return true
endfunction
private function H2I takes handle h returns integer
return h
return 0
endfunction
//! textmacro MULTICLICK takes NAME,CLICKS
globals
private integer array INDEXED_TIMERS_$NAME$
endglobals
private struct $NAME$
trigger pointer
trigger execute
timer expire
integer max
integer clicks
boolean b
static method create takes trigger t, player p, integer max returns $NAME$
local $NAME$ d = GetPlayerId(p)
set d.execute = CreateTrigger()
set d.pointer = t
set d.expire = CreateTimer()
set d.b = true
set d.max = max
set d.clicks = 0
set INDEXED_TIMERS_$NAME$[H2I(d.expire)] = d
return d
endmethod
endstruct
private function $NAME$_GetTimerId takes timer t returns integer
return H2I(t)-SUBTRACT
endfunction
private function $NAME$_Reset takes nothing returns nothing
set $NAME$(INDEXED_TIMERS_$NAME$[$NAME$_GetTimerId(GetExpiredTimer())]).clicks = 0
endfunction
private function $NAME$_Execute takes nothing returns nothing
local $NAME$ d = GetPlayerId(GetTriggerPlayer())
set d.clicks = d.clicks + 1
if d.clicks == 1 then
call TimerStart(d.expire, TIMER_TIMEOUT, false, function $NAME$_Reset)
endif
if d.clicks == d.max then
if IsTriggerEnabled(d.pointer) and TriggerEvaluate(d.pointer) then
call TriggerExecute(d.pointer)
endif
endif
endfunction
function TriggerRegister$NAME$Click takes trigger t, player p returns nothing
local $NAME$ d = GetPlayerId(p)
if d.b == null then
set d = $NAME$.create(t, p, $CLICKS$)
else
debug call BJDebugMsg("You already have a $NAME$Click registered for " + GetPlayerName(p))
return
endif
call TriggerRegisterPlayerUnitEvent(d.execute, p, EVENT_PLAYER_UNIT_SELECTED, Filter(function True))
call TriggerAddAction(d.execute, function $NAME$_Execute)
endfunction
//! endtextmacro
//! runtextmacro MULTICLICK("Double", "2")
//! runtextmacro MULTICLICK("Tripple", "3")
endlibrary
Example
JASS:
function double takes nothing returns nothing
call BJDebugMsg("DoubleClick")
call BJDebugMsg(" ")
endfunction
//===========================================================================
function InitTrig_mc_test takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterDoubleClick(t, Player(0))
call TriggerAddAction(t, function double)
endfunction
Changelog
Version 1.1 - Latest
- Removed O(n) search.