144 lines
3.8 KiB
Lua
144 lines
3.8 KiB
Lua
local gmod = gmod
|
|
local pairs = pairs
|
|
local isfunction = isfunction
|
|
local isstring = isstring
|
|
local isnumber = isnumber
|
|
local isbool = isbool
|
|
local IsValid = IsValid
|
|
local type = type
|
|
local ErrorNoHaltWithStack = ErrorNoHaltWithStack
|
|
|
|
module( "hook" )
|
|
|
|
local Hooks = {}
|
|
|
|
--[[---------------------------------------------------------
|
|
Name: GetTable
|
|
Desc: Returns a table of all hooks.
|
|
-----------------------------------------------------------]]
|
|
function GetTable()
|
|
return Hooks
|
|
end
|
|
|
|
--[[---------------------------------------------------------
|
|
Name: Add
|
|
Args: string hookName, any identifier, function func
|
|
Desc: Add a hook to listen to the specified event.
|
|
-----------------------------------------------------------]]
|
|
function Add( event_name, name, func )
|
|
|
|
if ( !isstring( event_name ) ) then ErrorNoHaltWithStack( "bad argument #1 to 'Add' (string expected, got " .. type( event_name ) .. ")" ) return end
|
|
if ( !isfunction( func ) ) then ErrorNoHaltWithStack( "bad argument #3 to 'Add' (function expected, got " .. type( func ) .. ")" ) return end
|
|
|
|
local notValid = name == nil || isnumber( name ) or isbool( name ) or isfunction( name ) or !name.IsValid
|
|
if ( !isstring( name ) and notValid ) then ErrorNoHaltWithStack( "bad argument #2 to 'Add' (string expected, got " .. type( name ) .. ")" ) return end
|
|
|
|
if ( Hooks[ event_name ] == nil ) then
|
|
Hooks[ event_name ] = {}
|
|
end
|
|
|
|
Hooks[ event_name ][ name ] = func
|
|
|
|
end
|
|
|
|
|
|
--[[---------------------------------------------------------
|
|
Name: Remove
|
|
Args: string hookName, identifier
|
|
Desc: Removes the hook with the given indentifier.
|
|
-----------------------------------------------------------]]
|
|
function Remove( event_name, name )
|
|
|
|
if ( !isstring( event_name ) ) then ErrorNoHaltWithStack( "bad argument #1 to 'Remove' (string expected, got " .. type( event_name ) .. ")" ) return end
|
|
|
|
local notValid = isnumber( name ) or isbool( name ) or isfunction( name ) or !name.IsValid
|
|
if ( !isstring( name ) and notValid ) then ErrorNoHaltWithStack( "bad argument #2 to 'Remove' (string expected, got " .. type( name ) .. ")" ) return end
|
|
|
|
if ( !Hooks[ event_name ] ) then return end
|
|
|
|
Hooks[ event_name ][ name ] = nil
|
|
|
|
end
|
|
|
|
|
|
--[[---------------------------------------------------------
|
|
Name: Run
|
|
Args: string hookName, vararg args
|
|
Desc: Calls hooks associated with the hook name.
|
|
-----------------------------------------------------------]]
|
|
local currentGM
|
|
|
|
function Run( name, ... )
|
|
if ( !currentGM ) then
|
|
currentGM = gmod and gmod.GetGamemode() or nil
|
|
end
|
|
|
|
return Call( name, currentGM, ... )
|
|
end
|
|
|
|
|
|
--[[---------------------------------------------------------
|
|
Name: Run
|
|
Args: string hookName, table gamemodeTable, vararg args
|
|
Desc: Calls hooks associated with the hook name.
|
|
-----------------------------------------------------------]]
|
|
function Call( name, gm, ... )
|
|
|
|
--
|
|
-- Run hooks
|
|
--
|
|
local HookTable = Hooks[ name ]
|
|
if ( HookTable != nil ) then
|
|
|
|
local a, b, c, d, e, f;
|
|
|
|
for k, v in pairs( HookTable ) do
|
|
|
|
if ( isstring( k ) ) then
|
|
|
|
--
|
|
-- If it's a string, it's cool
|
|
--
|
|
a, b, c, d, e, f = v( ... )
|
|
|
|
else
|
|
|
|
--
|
|
-- If the key isn't a string - we assume it to be an entity
|
|
-- Or panel, or something else that IsValid works on.
|
|
--
|
|
if ( IsValid( k ) ) then
|
|
--
|
|
-- If the object is valid - pass it as the first argument (self)
|
|
--
|
|
a, b, c, d, e, f = v( k, ... )
|
|
else
|
|
--
|
|
-- If the object has become invalid - remove it
|
|
--
|
|
HookTable[ k ] = nil
|
|
end
|
|
end
|
|
|
|
--
|
|
-- Hook returned a value - it overrides the gamemode function
|
|
--
|
|
if ( a != nil ) then
|
|
return a, b, c, d, e, f
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
--
|
|
-- Call the gamemode function
|
|
--
|
|
if ( !gm ) then return end
|
|
|
|
local GamemodeFunction = gm[ name ]
|
|
if ( GamemodeFunction == nil ) then return end
|
|
|
|
return GamemodeFunction( gm, ... )
|
|
|
|
end
|