Azlier
Old World Ghost
- Reaction score
- 461
Looks good to me.
library Trackable2
// The old Key Triggers implementation, by Jesus4Lyf. <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite1" alt=":)" title="Smile :)" loading="lazy" data-shortname=":)" />
// Found on <a href="http://www.thehelper.net/forums/showthread.php?t=78493" class="link link--internal">http://www.thehelper.net/forums/showthread.php?t=78493</a>
// Suitable only in very controlled circumstances, so it was never approved.
private function SetTriggerData takes trigger t, integer data returns nothing
call ResetTrigger(t)
loop
exitwhen data==0
call TriggerExecute(t)
set data=data-1
endloop
endfunction
private function GetTriggerData takes trigger t returns integer
return GetTriggerExecCount(t)
endfunction
// End Key Triggers implementation.
private struct TriggerChain
TriggerChain prev
TriggerChain next
trigger trig
method add takes trigger t returns nothing
local TriggerChain to=TriggerChain.create()
set to.trig=t
// Link
set this.next=to.next
set this.next.prev=this
set to.next=this
set this.prev=to
endmethod
static method createPointer takes nothing returns TriggerChain
local TriggerChain c=TriggerChain.create()
set c.next=0
set c.prev=0
return c
endmethod
method fireFromPointer takes nothing returns nothing
loop
set this=this.next
exitwhen this==0
if TriggerEvaluate(this.trig) then
call TriggerExecute(this.trig)
endif
endloop
endmethod
endstruct
private struct Data
real X
real Y
real Z
real Facing
string Model
integer UserData = 0
TriggerChain onHoverPointer
TriggerChain onClickPointer
static method create takes nothing returns Data
local Data d=Data.allocate()
set d.onHoverPointer=TriggerChain.createPointer()
set d.onClickPointer=TriggerChain.createPointer()
return d
endmethod
endstruct
private struct TriggerData
Data trackableData
player forPlayer
endstruct
globals
private Data TriggeringTrackable
private player TriggeringPlayer
//locals
private TriggerData triggerdata
endglobals
function TrackableHover takes nothing returns boolean
set triggerdata=GetTriggerData(GetTriggeringTrigger())
set TriggeringTrackable=triggerdata.trackableData
set TriggeringPlayer=triggerdata.forPlayer
call TriggeringTrackable.onHoverPointer.fireFromPointer()
return false // Must return false.
endfunction
function TrackableClick takes nothing returns boolean
set triggerdata=GetTriggerData(GetTriggeringTrigger())
set TriggeringTrackable=triggerdata.trackableData
set TriggeringPlayer=triggerdata.forPlayer
call TriggeringTrackable.onClickPointer.fireFromPointer()
return false // Must return false.
endfunction
function RigTrackable takes Data d, player p, trackable track returns nothing
local trigger trig
local TriggerData td=TriggerData.create()
set td.trackableData=d
set td.forPlayer=p
// Click
set trig=CreateTrigger()
call TriggerAddCondition(trig,Condition(function TrackableClick))
call SetTriggerData(trig,d)
call TriggerRegisterTrackableHitEvent(trig,track)
// Hover
set trig=CreateTrigger()
call TriggerAddCondition(trig,Condition(function TrackableHover))
call SetTriggerData(trig,d)
call TriggerRegisterTrackableTrackEvent(trig,track)
set trig=null // Unnecessary. *Shrugs*
endfunction
function CreateTrackable2 takes string modelPath, real x, real y, real z, real facing returns Data
local Data d = Data.create()
local string s = ""
local destructable platform = CreateDestructableZ(039;OTip039;,x,y,z,0.00,1,0)
local integer i = 11
loop
if GetLocalPlayer() == Player(i) then
set s = modelPath
else
set s = ""
endif
// No one cares about the stupid trackable.
// We never store it or attach to it. It's forgotten.
call RigTrackable(d,Player(i),CreateTrackable(s, x, y, facing))
exitwhen i == 0
set i = i - 1
endloop
set d.X = x
set d.Y = y
set d.Z = z
set d.Facing = facing
set d.Model = modelPath
call RemoveDestructable(platform)
set platform = null
return d
endfunction
function CreateTrackable2ForPlayer takes string modelPath, real x, real y, real z, real facing, player forPlayer returns Data
local Data d = Data.create()
local string s = ""
local destructable platform = CreateDestructableZ(039;OTip039;,x,y,z,0.00,1,0)
if GetLocalPlayer() == forPlayer then
set s = modelPath
endif
// No one cares about the stupid trackable.
// We never store it or attach to it. It's forgotten.
call RigTrackable(d,forPlayer,CreateTrackable(s, x, y, facing))
set d.X = x
set d.Y = y
set d.Z = z
set d.Facing = facing
set d.Model = modelPath
call RemoveDestructable(platform)
set platform = null
return d
endfunction
function TriggerRegisterTrackable2HitEvent takes trigger whichTrigger, Data d returns nothing
call d.onClickPointer.add(whichTrigger)
endfunction
function TriggerRegisterTrackable2TrackEvent takes trigger whichTrigger, Data d returns nothing
call d.onHoverPointer.add(whichTrigger)
endfunction
function GetTriggeringTrackable2 takes nothing returns Data
return TriggeringTrackable
endfunction
function GetTrackedPlayer takes nothing returns player
return TriggeringPlayer
endfunction
function SetTrackable2Data takes Data whichTrackable, integer whatData returns nothing
set whichTrackable.UserData = whatData
endfunction
function GetTrackable2Data takes Data whichTrackable returns integer
return whichTrackable.UserData
endfunction
//! textmacro Trackable2_Macro takes NAME, TYPE
function GetTrackable2$NAME$ takes Data which returns $TYPE$
return which.$NAME$
endfunction
//! endtextmacro
//! runtextmacro Trackable2_Macro ("X", "real")
//! runtextmacro Trackable2_Macro ("Y", "real")
//! runtextmacro Trackable2_Macro ("Z", "real")
//! runtextmacro Trackable2_Macro ("Facing", "real")
//! runtextmacro Trackable2_Macro ("Model", "string")
endlibrary
library Trackable2
// The old Key Triggers implementation, by Jesus4Lyf. <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite1" alt=":)" title="Smile :)" loading="lazy" data-shortname=":)" />
// Found on <a href="http://www.thehelper.net/forums/showthread.php?t=78493" class="link link--internal">http://www.thehelper.net/forums/showthread.php?t=78493</a>
// Suitable only in very controlled circumstances, so it was never approved.
private function SetTriggerData takes trigger t, integer data returns nothing
//call ResetTrigger(t)
loop
exitwhen data==0
call TriggerExecute(t)
set data=data-1
endloop
endfunction
private function GetTriggerData takes trigger t returns integer
return GetTriggerExecCount(t)
endfunction
// End Key Triggers implementation.
private struct TriggerChain
TriggerChain prev
TriggerChain next
trigger trig
method add takes trigger t returns nothing
local TriggerChain added=TriggerChain.create()
set added.trig=t
// Link
set added.next=this.next
set this.next.prev=added
set added.prev=this
set this.next=added
endmethod
static method createPointer takes nothing returns TriggerChain
local TriggerChain c=TriggerChain.create()
set c.next=0
set c.prev=0
return c
endmethod
method fireFromPointer takes nothing returns nothing
loop
set this=this.next
exitwhen this==0
if TriggerEvaluate(this.trig) then
call TriggerExecute(this.trig)
endif
endloop
endmethod
endstruct
private struct Data
real X
real Y
real Z
real Facing
string Model
integer UserData = 0
TriggerChain onHoverPointer
TriggerChain onClickPointer
static method create takes nothing returns Data
local Data d=Data.allocate()
set d.onHoverPointer=TriggerChain.createPointer()
set d.onClickPointer=TriggerChain.createPointer()
return d
endmethod
endstruct
private struct TriggerData
Data trackableData
player forPlayer
endstruct
globals
private Data TriggeringTrackable
private player TriggeringPlayer
//locals
private TriggerData triggerdata
endglobals
private function TrackableHover takes nothing returns boolean
set triggerdata=GetTriggerData(GetTriggeringTrigger()) // Get player and trackable.
set TriggeringTrackable=triggerdata.trackableData
set TriggeringPlayer=triggerdata.forPlayer
call TriggeringTrackable.onHoverPointer.fireFromPointer()
return false // Must return false.
endfunction
private function TrackableClick takes nothing returns boolean
set triggerdata=GetTriggerData(GetTriggeringTrigger()) // Get player and trackable.
set TriggeringTrackable=triggerdata.trackableData
set TriggeringPlayer=triggerdata.forPlayer
call TriggeringTrackable.onClickPointer.fireFromPointer()
return false // Must return false.
endfunction
private function RigTrackable takes Data d, player p, trackable track returns nothing
local trigger trig
// Contains player and trackable data
local TriggerData td=TriggerData.create()
set td.trackableData=d
set td.forPlayer=p
// Click
set trig=CreateTrigger()
call TriggerAddCondition(trig,Condition(function TrackableClick))
call SetTriggerData.execute(trig,td) // Attach player and trackable.
call TriggerRegisterTrackableHitEvent(trig,track)
// Hover
set trig=CreateTrigger()
call TriggerAddCondition(trig,Condition(function TrackableHover))
call SetTriggerData.execute(trig,td) // Attach player and trackable.
call TriggerRegisterTrackableTrackEvent(trig,track)
set trig=null // Unnecessary. *Shrugs*
endfunction
function CreateTrackable2 takes string modelPath, real x, real y, real z, real facing returns Data
local Data d = Data.create()
local string s = ""
local destructable platform = CreateDestructableZ(039;OTip039;,x,y,z,0.00,1,0)
local integer i = 11
loop
if GetLocalPlayer() == Player(i) then
set s = modelPath
else
set s = ""
endif
// No one cares about the stupid trackable.
// We never store it or attach to it. It's forgotten.
call RigTrackable(d,Player(i),CreateTrackable(s, x, y, facing))
exitwhen i == 0
set i = i - 1
endloop
set d.X = x
set d.Y = y
set d.Z = z
set d.Facing = facing
set d.Model = modelPath
call RemoveDestructable(platform)
set platform = null
return d
endfunction
function CreateTrackable2ForPlayer takes string modelPath, real x, real y, real z, real facing, player forPlayer returns Data
local Data d = Data.create()
local string s = ""
local destructable platform = CreateDestructableZ(039;OTip039;,x,y,z,0.00,1,0)
if GetLocalPlayer() == forPlayer then
set s = modelPath
endif
// No one cares about the stupid trackable.
// We never store it or attach to it. It's forgotten.
call RigTrackable(d,forPlayer,CreateTrackable(s, x, y, facing))
set d.X = x
set d.Y = y
set d.Z = z
set d.Facing = facing
set d.Model = modelPath
call RemoveDestructable(platform)
set platform = null
return d
endfunction
function TriggerRegisterTrackable2HitEvent takes trigger whichTrigger, Data d returns nothing
call d.onClickPointer.add(whichTrigger)
endfunction
function TriggerRegisterTrackable2TrackEvent takes trigger whichTrigger, Data d returns nothing
call d.onHoverPointer.add(whichTrigger)
endfunction
function GetTriggeringTrackable2 takes nothing returns Data
return TriggeringTrackable
endfunction
function GetTrackedPlayer takes nothing returns player
return TriggeringPlayer
endfunction
function SetTrackable2Data takes Data whichTrackable, integer whatData returns nothing
set whichTrackable.UserData = whatData
endfunction
function GetTrackable2Data takes Data whichTrackable returns integer
return whichTrackable.UserData
endfunction
//! textmacro Trackable2_Macro takes NAME, TYPE
function GetTrackable2$NAME$ takes Data which returns $TYPE$
return which.$NAME$
endfunction
//! endtextmacro
//! runtextmacro Trackable2_Macro ("X", "real")
//! runtextmacro Trackable2_Macro ("Y", "real")
//! runtextmacro Trackable2_Macro ("Z", "real")
//! runtextmacro Trackable2_Macro ("Facing", "real")
//! runtextmacro Trackable2_Macro ("Model", "string")
endlibrary
struct ListNode
ListNode next=0
integer yourData // Or some other thing you want a list of.
static method create takes ListNode addToWhichNode returns ListNode
local ListNode result=ListNode.allocate()
set addToWhichNode.next=result
return result
endmethod
endstruct