Files
wnsrc/lua/includes/modules/weapons.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

196 lines
4.4 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/
--]]
module( "weapons", package.seeall )
local WeaponList = {}
--[[---------------------------------------------------------
Name: TableInherit( t, base )
Desc: Copies any missing data from base to t
-----------------------------------------------------------]]
local function TableInherit( t, base )
for k, v in pairs( base ) do
if ( t[ k ] == nil ) then
t[ k ] = v
elseif ( k != "BaseClass" && istable( t[ k ] ) && istable( v ) ) then
TableInherit( t[ k ], v )
end
end
t[ "BaseClass" ] = base
return t
end
--[[---------------------------------------------------------
Name: IsBasedOn( name, base )
Desc: Checks if name is based on base
-----------------------------------------------------------]]
function IsBasedOn( name, base )
local t = GetStored( name )
if ( !t ) then return false end
if ( t.Base == name ) then return false end
if ( t.Base == base ) then return true end
return IsBasedOn( t.Base, base )
end
--[[---------------------------------------------------------
Name: Register( table, string, bool )
Desc: Used to register your SWEP with the engine
-----------------------------------------------------------]]
function Register( t, name )
if ( hook.Run( "PreRegisterSWEP", t, name ) == false ) then return end
if ( isstring( t.ClassNameOverride ) ) then name = t.ClassNameOverride end
local old = WeaponList[ name ]
t.ClassName = name
WeaponList[ name ] = t
--baseclass.Set( name, t )
list.Set( "Weapon", name, {
ClassName = name,
PrintName = t.PrintName or name,
Category = t.Category or "Other",
Spawnable = t.Spawnable,
AdminOnly = t.AdminOnly,
ScriptedEntityType = t.ScriptedEntityType,
IconOverride = t.IconOverride
} )
-- Allow all SWEPS to be duplicated, unless specified
if ( !t.DisableDuplicator ) then
duplicator.Allow( name )
end
--
-- If we're reloading this entity class
-- then refresh all the existing entities.
--
if ( old != nil ) then
-- Update SWEP table of entities that are based on this SWEP
for _, e in ipairs( ents.GetAll() ) do
local class = e:GetClass()
if ( class == name ) then
--
-- Replace the contents with this entity table
--
table.Merge( e, t )
--
-- Call OnReloaded hook (if it has one)
--
if ( e.OnReloaded ) then
e:OnReloaded()
end
end
if ( IsBasedOn( class, name ) ) then
table.Merge( e, Get( class ) )
if ( e.OnReloaded ) then
e:OnReloaded()
end
end
end
end
end
--
-- All scripts have been loaded...
--
function OnLoaded()
--
-- Once all the scripts are loaded we can set up the baseclass
-- - we have to wait until they're all setup because load order
-- could cause some entities to load before their bases!
--
for k, v in pairs( WeaponList ) do
baseclass.Set( k, Get( k ) )
end
end
--[[---------------------------------------------------------
Name: Get( string )
Desc: Get a weapon by name.
-----------------------------------------------------------]]
function Get( name, retval )
local Stored = GetStored( name )
if ( !Stored ) then return nil end
-- Create/copy a new table
local retval = retval or {}
for k, v in pairs( Stored ) do
if ( istable( v ) ) then
retval[ k ] = table.Copy( v )
else
retval[ k ] = v
end
end
retval.Base = retval.Base or "weapon_base"
-- If we're not derived from ourselves (a base weapon)
-- then derive from our 'Base' weapon.
if ( retval.Base != name ) then
local base = Get( retval.Base )
if ( !base ) then
Msg( "ERROR: Trying to derive weapon " .. tostring( name ) .. " from non existant SWEP " .. tostring( retval.Base ) .. "!\n" )
else
retval = TableInherit( retval, base )
end
end
return retval
end
--[[---------------------------------------------------------
Name: GetStored( string )
Desc: Gets the REAL weapon table, not a copy
-----------------------------------------------------------]]
function GetStored( name )
return WeaponList[ name ]
end
--[[---------------------------------------------------------
Name: GetList( string )
Desc: Get a list of all the registered SWEPs
-----------------------------------------------------------]]
function GetList()
local result = {}
for k, v in pairs( WeaponList ) do
table.insert( result, v )
end
return result
end