library Track uses Table, Trigger
globals
private constant integer PLATFORM = 'OTip'
endglobals
struct Track extends array
readonly static HashTable hashtable
readonly static Table table
readonly static Trigger anyHover
readonly static Trigger anyClick
readonly static Track Triggering
implement AllocT
static method operator [] takes trackable t returns thistype
return table[GetHandleId(t)]
endmethod
method operator owner takes nothing returns player
return hashtable[this.id].player[1]
endmethod
method operator path takes nothing returns string
return hashtable[this.id].string[1]
endmethod
method operator x takes nothing returns real
return hashtable[this.id].real[1]
endmethod
method operator y takes nothing returns real
return hashtable[this.id].real[2]
endmethod
method operator z takes nothing returns real
return hashtable[this.id].real[3]
endmethod
method operator facing takes nothing returns real
return hashtable[this.id].real[4]
endmethod
method operator data takes nothing returns integer
return hashtable[this.id][3]
endmethod
method operator data= takes integer data returns nothing
set hashtable[this.id][3] = data
endmethod
method operator object takes nothing returns trackable
return hashtable[this.id].trackable[this.id]
endmethod
method operator id takes nothing returns integer
return table[this]
endmethod
method operator hoverTrigger takes nothing returns Trigger
return hashtable[this.id][1]
endmethod
method operator clickTrigger takes nothing returns Trigger
return hashtable[this.id][2]
endmethod
method operator enabled= takes boolean flag returns nothing
set hashtable[this.id].boolean[1] = flag
endmethod
method operator enabled takes nothing returns boolean
return hashtable[this.id].boolean[1]
endmethod
private static method onHover takes nothing returns boolean
local trackable t = GetTriggeringTrackable()
local thistype this = thistype[t]
set Triggering = this
if this.enabled then
call this.hoverTrigger.fire()
endif
return false
endmethod
private static method onClick takes nothing returns boolean
local trackable t = GetTriggeringTrackable()
local thistype this = thistype[t]
set Triggering = this
if this.enabled then
call this.clickTrigger.fire()
endif
return false
endmethod
method clearHoverActions takes nothing returns nothing
call this.hoverTrigger.clear()
endmethod
method clearClickActions takes nothing returns nothing
call this.clickTrigger.clear()
endmethod
method clear takes nothing returns nothing
call clearHoverActions()
call clearClickActions()
endmethod
static method registerAnyHoverEvent takes boolexpr c returns TriggerCondition
return anyHover.register(c)
endmethod
static method registerAnyClickEvent takes boolexpr c returns TriggerCondition
return anyClick.register(c)
endmethod
method registerHoverEvent takes boolexpr c returns TriggerCondition
return this.hoverTrigger.register(c)
endmethod
method registerClickEvent takes boolexpr c returns TriggerCondition
return this.clickTrigger.register(c)
endmethod
method destroy takes nothing returns nothing
call this.hoverTrigger.destroy()
call this.clickTrigger.destroy()
call hashtable.remove(this.id)
set table[this.id] = 0
set table[this] = 0
call this.deallocate()
endmethod
static method createEx takes string path, real x, real y, real z, real facing, player p, integer data returns thistype
local thistype this = create(path,x,y,z,facing,p)
set hashtable[this.id][3] = data
return this
endmethod
static method create takes string path, real x, real y, real z, real facing, player p returns thistype
local thistype this = allocate()
local destructable d = null
local string s = ""
local trackable t
local integer id
local Trigger trig
if p != null then
if p == GetLocalPlayer() then
set s = path
endif
else
set s = path
endif
if z != 0 then
set d = CreateDestructableZ(PLATFORM, x, y, z, 0, 1, 0)
endif
set t = CreateTrackable(s, x, y, facing)
set id = GetHandleId(t)
set table[id] = this
set table[this] = id
set hashtable[id].trackable[id] = t
set hashtable[id].real[1] = x
set hashtable[id].real[2] = y
set hashtable[id].real[3] = z
set hashtable[id].real[4] = facing
set hashtable[id].player[1] = p
set hashtable[id].boolean[1] = true // Enabled
set hashtable[id].string[1] = path
set trig = Trigger.create(false)
set hashtable[id][1] = trig // On Hover
call TriggerRegisterTrackableTrackEvent(trig.trigger, t)
call TriggerAddCondition(trig.trigger, Filter(function thistype.onHover))
call trig.reference(anyHover)
set trig = Trigger.create(false)
set hashtable[id][2] = Trigger.create(false) // On Click
call TriggerRegisterTrackableHitEvent(trig.trigger, t)
call TriggerAddCondition(trig.trigger, Filter(function thistype.onClick))
call trig.reference(anyClick)
return this
endmethod
private static method onInit takes nothing returns nothing
set hashtable = HashTable.create()
set table = Table.create()
set anyHover = Trigger.create(false)
set anyClick = Trigger.create(false)
endmethod
endstruct
// FUNCTION WRAPPERS
function CreateTrack takes string path, real x, real y, real z, real facing, player p returns Track
return Track.create(path,x,y,z,facing,p)
endfunction
function CreateTrackEx takes string path, real x, real y, real z, real facing, player p, integer data returns Track
return Track.createEx(path,x,y,z,facing,p,data)
endfunction
function DestroyTrack takes Track t returns nothing
call t.destroy()
endfunction
function GetTriggeringTrack takes nothing returns Track
return Track.Triggering
endfunction
//! textmacro GET_TRACK takes NAME, SUPER, TYPE
function GetTrack$NAME$ takes Track t returns $TYPE$
return t.$SUPER$
endfunction
//! endtextmacro
//! runtextmacro GET_TRACK("Data","data", "integer")
//! runtextmacro GET_TRACK("X","x", "real")
//! runtextmacro GET_TRACK("Y","y", "real")
//! runtextmacro GET_TRACK("Z","z", "real")
//! runtextmacro GET_TRACK("Facing","facing", "real")
//! runtextmacro GET_TRACK("Path","path", "string")
//! runtextmacro GET_TRACK("Owner","owner", "player")
//! runtextmacro GET_TRACK("Object","object", "trackable")
//! runtextmacro GET_TRACK("HoverTrigger", "hoverTrigger", "Trigger")
//! runtextmacro GET_TRACK("ClickTrigger", "clickTrigger", "Trigger")
function SetTrackData takes Track t, integer data returns nothing
set t.data = data
endfunction
function IsTrackEnabled takes Track t returns boolean
return t.enabled
endfunction
function EnableTrack takes Track t returns nothing
set t.enabled = true
endfunction
function DisableTrack takes Track t returns nothing
set t.enabled = false
endfunction
//! textmacro REGISTER_TRACK takes NAME
function RegisterAnyTrack$NAME$Event takes boolexpr c returns TriggerCondition
return Track.registerAny$NAME$Event(c)
endfunction
function RegisterTrack$NAME$Event takes Track t, boolexpr c returns TriggerCondition
return t.register$NAME$Event(c)
endfunction
function ClearTrack$NAME$Actions takes Track t returns nothing
call t.clear$NAME$Actions()
endfunction
//! endtextmacro
//! runtextmacro REGISTER_TRACK("Hover")
//! runtextmacro REGISTER_TRACK("Click")
function ClearTrackActions takes Track t returns nothing
call t.clear()
endfunction
endlibrary