Revision Difference
GM:OnLuaError#523672
<function name="OnLuaError" parent="GM" type="hook">
<ishook>yes</ishook>
<description>
Called when a Lua error occurs, only works in the Menu realm.
<warning>Modify menu state Lua code at your own risk!</warning>
</description>
<realm>Menu</realm>
<predicted>No</predicted>
<file line="11">lua/menu/errors.lua</file>
<args>
<arg name="error" type="string">The error that occurred.</arg>
<arg name="realm" type="number">Where the Lua error took place</arg>
<arg name="name" type="string">Title of the addon that is creating the Lua errors</arg>
<arg name="id" type="number">Steam Workshop ID of the addon creating Lua errors, if it is an addon.</arg>
</args>
</function>
<example>
<description>Code from garrysmod/lua/menu/errors.lua</description>
<code>
local Errors = {}
hook.Add( "OnLuaError", "MenuErrorHandler", function( str, realm, addontitle, addonid )
local text = "Something is creating script errors"
--
-- This error is caused by a specific addon
--
if ( isstring( addonid ) ) then
--
-- Down Vote
--
-- steamworks.Vote( addonid, false )
--
-- Disable Naughty Addon
--
--timer.Simple( 5, function()
-- MsgN( "Disabling addon '", addontitle, "' due to lua errors" )
-- steamworks.SetShouldMountAddon( addonid, false )
-- steamworks.ApplyAddons()
--end )
text = "The addon \"" .. addontitle .. "\" is creating errors, check the console for details"
end
if ( addonid == nil ) then addonid = 0 end
if ( Errors[ addonid ] ) then
Errors[ addonid ].times = Errors[ addonid ].times + 1
Errors[ addonid ].last = SysTime()
return
end
local error = {
first = SysTime(),
last = SysTime(),
times = 1,
title = addontitle,
x = 32,
text = text
}
Errors[ addonid ] = error
end )
local matAlert = Material( "icon16/error.png" )
hook.Add( "DrawOverlay", "MenuDrawLuaErrors", function()
if ( table.IsEmpty( Errors ) ) then return end
local idealy = 32
local height = 30
local EndTime = SysTime() - 10
local Recent = SysTime() - 0.5
for k, v in SortedPairsByMemberValue( Errors, "last" ) do
surface.SetFont( "DermaDefaultBold" )
if ( v.y == nil ) then v.y = idealy end
if ( v.w == nil ) then v.w = surface.GetTextSize( v.text ) + 48 end
draw.RoundedBox( 2, v.x + 2, v.y + 2, v.w, height, Color( 40, 40, 40, 255 ) )
draw.RoundedBox( 2, v.x, v.y, v.w, height, Color( 240, 240, 240, 255 ) )
if ( v.last > Recent ) then
if ( v.last > Recent ) then
draw.RoundedBox( 2, v.x, v.y, v.w, height, Color( 255, 200, 0, ( v.last - Recent ) * 510 ) )
end
surface.SetTextColor( 90, 90, 90, 255 )
surface.SetTextPos( v.x + 34, v.y + 8 )
surface.DrawText( v.text )
surface.SetDrawColor( 255, 255, 255, 150 + math.sin( v.y + SysTime() * 30 ) * 100 )
surface.SetMaterial( matAlert )
surface.DrawTexturedRect( v.x + 6, v.y + 6, 16, 16 )
v.y = idealy
idealy = idealy + 40
if ( v.last < EndTime ) then
if ( v.last < EndTime ) then
Errors[k] = nil
end
end
end )
</code>
</example>