Files
wnsrc/gamemodes/sandbox/entities/weapons/gmod_tool/stool.lua
lifestorm ba1fc01b16 Upload
2024-08-04 23:12:27 +03:00

282 lines
6.2 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ToolObj = {}
include( "ghostentity.lua" )
include( "object.lua" )
if ( CLIENT ) then
include( "stool_cl.lua" )
end
function ToolObj:Create()
local o = {}
setmetatable( o, self )
self.__index = self
o.Mode = nil
o.SWEP = nil
o.Owner = nil
o.ClientConVar = {}
o.ServerConVar = {}
o.Objects = {}
o.Stage = 0
o.Message = "start"
o.LastMessage = 0
o.AllowedCVar = 0
return o
end
function ToolObj:CreateConVars()
local mode = self:GetMode()
self.AllowedCVar = CreateConVar( "toolmode_allow_" .. mode, "1", { FCVAR_NOTIFY, FCVAR_REPLICATED }, "Set to 0 to disallow players being able to use the \"" .. mode .. "\" tool." )
self.ClientConVars = {}
self.ServerConVars = {}
if ( CLIENT ) then
for cvar, default in pairs( self.ClientConVar ) do
self.ClientConVars[ cvar ] = CreateClientConVar( mode .. "_" .. cvar, default, true, true, "Tool specific client setting (" .. mode .. ")" )
end
else
for cvar, default in pairs( self.ServerConVar ) do
self.ServerConVars[ cvar ] = CreateConVar( mode .. "_" .. cvar, default, FCVAR_ARCHIVE, "Tool specific server setting (" .. mode .. ")" )
end
end
end
function ToolObj:GetServerInfo( property )
if ( self.ServerConVars[ property ] and SERVER ) then
return self.ServerConVars[ property ]:GetString()
end
return GetConVarString( self:GetMode() .. "_" .. property )
end
function ToolObj:GetClientInfo( property )
if ( self.ClientConVars[ property ] and CLIENT ) then
return self.ClientConVars[ property ]:GetString()
end
return self:GetOwner():GetInfo( self:GetMode() .. "_" .. property )
end
function ToolObj:GetClientNumber( property, default )
if ( self.ClientConVars[ property ] and CLIENT ) then
return self.ClientConVars[ property ]:GetFloat()
end
return self:GetOwner():GetInfoNum( self:GetMode() .. "_" .. property, tonumber( default ) or 0 )
end
function ToolObj:GetClientBool( property, default )
if ( self.ClientConVars[ property ] and CLIENT ) then
return self.ClientConVars[ property ]:GetBool()
end
return math.floor( self:GetOwner():GetInfoNum( self:GetMode() .. "_" .. property, tonumber( default ) or 0 ) ) != 0
end
function ToolObj:BuildConVarList()
local mode = self:GetMode()
local convars = {}
for k, v in pairs( self.ClientConVar ) do convars[ mode .. "_" .. k ] = v end
return convars
end
function ToolObj:Allowed()
return self.AllowedCVar:GetBool()
end
-- Now for all the ToolObj redirects
function ToolObj:Init() end
function ToolObj:GetMode() return self.Mode end
function ToolObj:GetWeapon() return self.SWEP end
function ToolObj:GetOwner() return self:GetWeapon():GetOwner() or self.Owner end
function ToolObj:GetSWEP() return self:GetWeapon() end
function ToolObj:LeftClick() return false end
function ToolObj:RightClick() return false end
function ToolObj:Reload() self:ClearObjects() end
function ToolObj:Deploy() self:ReleaseGhostEntity() return end
function ToolObj:Holster() self:ReleaseGhostEntity() return end
function ToolObj:Think() self:ReleaseGhostEntity() end
--[[---------------------------------------------------------
Checks the objects before any action is taken
This is to make sure that the entities haven't been removed
-----------------------------------------------------------]]
function ToolObj:CheckObjects()
for k, v in pairs( self.Objects ) do
if ( !v.Ent:IsWorld() and !v.Ent:IsValid() ) then
self:ClearObjects()
end
end
end
for _, val in ipairs( file.Find( SWEP.Folder .. "/stools/*.lua", "LUA" ) ) do
local _, _, toolmode = string.find( val, "([%w_]*).lua" )
TOOL = ToolObj:Create()
TOOL.Mode = toolmode
AddCSLuaFile( "stools/" .. val )
include( "stools/" .. val )
TOOL:CreateConVars()
if ( hook.Run( "PreRegisterTOOL", TOOL, toolmode ) != false ) then
SWEP.Tool[ toolmode ] = TOOL
end
TOOL = nil
end
ToolObj = nil
if ( SERVER ) then return end
-- Keep the tool list handy
local TOOLS_LIST = SWEP.Tool
-- Add the STOOLS to the tool menu
hook.Add( "PopulateToolMenu", "AddSToolsToMenu", function()
for ToolName, tool in pairs( TOOLS_LIST ) do
if ( tool.AddToMenu != false ) then
spawnmenu.AddToolMenuOption(
tool.Tab or "Main",
tool.Category or "New Category",
ToolName,
tool.Name or "#" .. ToolName,
tool.Command or "gmod_tool " .. ToolName,
tool.ConfigName or ToolName,
tool.BuildCPanel
)
end
end
end )
--
-- Search
--
search.AddProvider( function( str )
local list = {}
for k, v in pairs( TOOLS_LIST ) do
local niceName = v.Name or "#" .. k
if ( niceName:StartsWith( "#" ) ) then niceName = language.GetPhrase( niceName:sub( 2 ) ) end
if ( !k:lower():find( str, nil, true ) and !niceName:lower():find( str, nil, true ) ) then continue end
local entry = {
text = niceName,
icon = spawnmenu.CreateContentIcon( "tool", nil, {
spawnname = k,
nicename = v.Name or "#" .. k
} ),
words = { k }
}
table.insert( list, entry )
if ( #list >= GetConVarNumber( "sbox_search_maxresults" ) / 32 ) then break end
end
return list
end )
--
-- Tool spawnmenu icon
--
spawnmenu.AddContentType( "tool", function( container, obj )
if ( !obj.spawnname ) then return end
local icon = vgui.Create( "ContentIcon", container )
icon:SetContentType( "tool" )
icon:SetSpawnName( obj.spawnname )
icon:SetName( obj.nicename or "#tool." .. obj.spawnname .. ".name" )
icon:SetMaterial( "gui/tool.png" )
icon.DoClick = function()
spawnmenu.ActivateTool( obj.spawnname )
surface.PlaySound( "ui/buttonclickrelease.wav" )
end
icon.OpenMenu = function( pnl )
-- Do not allow removal from read only panels
if ( IsValid( pnl:GetParent() ) and pnl:GetParent().GetReadOnly and pnl:GetParent():GetReadOnly() ) then return end
local menu = DermaMenu()
menu:AddOption( "#spawnmenu.menu.delete", function()
pnl:Remove()
hook.Run( "SpawnlistContentChanged" )
end ):SetIcon( "icon16/bin_closed.png" )
menu:Open()
end
if ( IsValid( container ) ) then
container:Add( icon )
end
return icon
end )