mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
196 lines
4.4 KiB
Lua
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
|