Files
wnsrc/lua/niknaks/modules/sh_util_extended.lua
lifestorm 6a58f406b1 Upload
2024-08-04 23:54:45 +03:00

159 lines
4.9 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/
--]]
-- Copyright © 2022-2072, Nak, https://steamcommunity.com/id/Nak2/
-- All Rights Reserved. Not allowed to be reuploaded.
local NikNaks = NikNaks
local tostring, tonumber, tobool, Angle, Vector, string_ToColor = tostring, tonumber, tobool, Angle, Vector, string.ToColor
-- Lua based type fix
-- TODO: Note sure if it should be added
if false then
NikNaks.oldType = type
function NikNaks.isnumber( var )
local mt = getmetatable( var )
if not mt or mt.MetaName ~= "number" then return false end
return true
end
function NikNaks.isstring( var )
local mt = getmetatable( var )
if not mt or mt.MetaName ~= "string" then return false end
return true
end
function NikNaks.istable( var )
if not getmetatable( var ) then return true end
return false
end
function NikNaks.isfunction( var )
local mt = getmetatable( var )
if not mt or mt.MetaName ~= "function" then return false end
return true
end
function NikNaks.isvector( var )
local mt = getmetatable( var )
if not mt or mt.MetaName ~= "Vector" then return false end
return true
end
function NikNaks.isangle( var )
local mt = getmetatable( var )
if not mt or mt.MetaName ~= "Angle" then return false end
return true
end
function NikNaks.isbool( var )
return var == true or var == false or false
end
function NikNaks.isplayer( var )
local mt = getmetatable( var )
if not mt or mt.MetaName ~= "Player" then return false end
return true
end
function NikNaks.isentity( var )
local mt = getmetatable( var )
if not mt or (mt.MetaName ~= "Player" and mt.MetaName ~= "Entity" ) then return false end
return true
end
local function PatchMetaName( var, str )
-- If it has a metatable.
local mt = getmetatable(var)
if mt then -- Make sure the metatable has the metaname
mt.MetaName = str
else
local tab = {["MetaName"] = str}
debug.setmetatable(var, tab)
end
end
PatchMetaName("", "string")
PatchMetaName(1, "number")
PatchMetaName(function() end, "function")
PatchMetaName(coroutine.create(function() end), "thread")
function NikNaks.type( var )
local mt = getmetatable( var )
if mt and mt.MetaName then return mt.MetaName end
return "table"
end
end
--- Same as AccessorFunc, but will make 'Set' functions return self. Allowing you to chain-call.
--- @param tab table
--- @param varname string
--- @param name string
--- @param iForce? number
function NikNaks.AccessorFuncEx( tab, varname, name, iForce )
if not tab then debug.Trace() end
tab[ "Get" .. name ] = function( self ) return self[ varname ] end
if ( iForce == FORCE_STRING ) then
tab[ "Set" .. name ] = function( self, v ) self[ varname ] = tostring( v ) return self end
return end
if ( iForce == FORCE_NUMBER ) then
tab[ "Set" .. name ] = function( self, v ) self[ varname ] = tonumber( v ) return self end
return end
if ( iForce == FORCE_BOOL ) then
tab[ "Set" .. name ] = function( self, v ) self[ varname ] = tobool( v ) return self end
return end
if ( iForce == FORCE_ANGLE ) then
tab[ "Set" .. name ] = function( self, v ) self[ varname ] = Angle( v ) return self end
return end
if ( iForce == FORCE_COLOR ) then
tab[ "Set" .. name ] = function( self, v )
if ( NikNaks.type( v ) == "Vector" ) then self[ varname ] = v:ToColor()
else self[ varname ] = string_ToColor( tostring( v ) ) end
return self
end
return end
if ( iForce == FORCE_VECTOR ) then
tab[ "Set" .. name ] = function( self, v )
if ( IsColor( v ) ) then self[ varname ] = v:ToVector()
else self[ varname ] = Vector( v ) end
return self
end
return end
tab[ "Set" .. name ] = function( self, v ) self[ varname ] = v return self end
end
NikNaks.util = {}
-- Hull
do
--- Returns a HULL_ENUM fitting the hull given.
--- @param vecMin Vector
--- @param vecMax Vector
--- @return number HULL_ENUM
function NikNaks.util.FindHull( vecMin, vecMax )
local wide = max(-vecMin.x, -vecMin.y, vecMax.x, vecMax.y)
local high = vecMax.z - vecMin.z
if wide <= 16 and high <= 8 then
return NikNaks.HULL_TINY_CENTERED
elseif wide <= 24 and high <= 24 then
return NikNaks.HULL_TINY
elseif wide <= 40 and high <= 40 then
return NikNaks.HULL_SMALL_CENTERED
elseif wide <= 36 and high <= 65 then
return NikNaks.HULL_MEDIUM
elseif wide <= 32 and high <= 73 then
return NikNaks.HULL_HUMAN
elseif wide <= 36 and high <= 100 then
return NikNaks.HULL_MEDIUM_TALL
else
return NikNaks.HULL_LARGE
end
end
--- Returns a HULL_ENUM matching the entitys hull.
--- @param entity Entity
--- @return number HULL_ENUM
function NikNaks.util.FindEntityHull( entity )
if entity.GetHull then return entity:GetHull() end
local mi, ma = entity:OBBMins(), entity:OBBMaxs()
return FindHull( mi, ma )
end
end