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

468 lines
18 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/
--]]
local ErrorNoHalt = ErrorNoHalt
local baseclass = baseclass
local setmetatable = setmetatable
local SERVER = SERVER
local string = string
local table = table
local util = util
module( "player_manager" )
-- Stores a table of valid player models
local ModelList = {}
local ModelListRev = {}
local HandNames = {}
--[[---------------------------------------------------------
Utility to add models to the acceptable model list
-----------------------------------------------------------]]
function AddValidModel( name, model )
ModelList[ name ] = model
ModelListRev[ string.lower( model ) ] = name
end
--
-- Valid hands
--
function AddValidHands( name, model, skin, body, matchBodySkin )
HandNames[ name ] = { model = model, skin = skin or 0, body = body or "0000000", matchBodySkin = matchBodySkin or false }
end
--[[---------------------------------------------------------
Return list of all valid player models
-----------------------------------------------------------]]
function AllValidModels( )
return ModelList
end
--[[---------------------------------------------------------
Translate the simple name of a model
into the full model name
-----------------------------------------------------------]]
function TranslatePlayerModel( name )
if ( ModelList[ name ] != nil ) then
return ModelList[ name ]
end
return "models/player/kleiner.mdl"
end
-- Translate from the full model name to simple model name
function TranslateToPlayerModelName( model )
model = string.lower( model )
if ( ModelListRev[ model ] != nil ) then
return ModelListRev[ model ]
end
return "kleiner"
end
--
-- Translate hands based on model
--
function TranslatePlayerHands( name )
if ( HandNames[ name ] != nil ) then
return HandNames[ name ]
end
return { model = "models/weapons/c_arms_citizen.mdl", skin = 0, body = "100000000" }
end
--[[---------------------------------------------------------
Compile a list of valid player models
-----------------------------------------------------------]]
AddValidModel( "alyx", "models/player/alyx.mdl" )
AddValidHands( "alyx", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "barney", "models/player/barney.mdl" )
AddValidHands( "barney", "models/weapons/c_arms_combine.mdl", 0, "0000000" )
AddValidModel( "breen", "models/player/breen.mdl" )
AddValidHands( "breen", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "charple", "models/player/charple.mdl" )
AddValidHands( "charple", "models/weapons/c_arms_citizen.mdl", 2, "0000000" )
AddValidModel( "chell", "models/player/p2_chell.mdl" )
AddValidHands( "chell", "models/weapons/c_arms_chell.mdl", 0, "0000000" )
AddValidModel( "corpse", "models/player/corpse1.mdl" )
AddValidHands( "corpse", "models/weapons/c_arms_citizen.mdl", 2, "0000000" )
AddValidModel( "combine", "models/player/combine_soldier.mdl" )
AddValidHands( "combine", "models/weapons/c_arms_combine.mdl", 0, "0000000" )
AddValidModel( "combineprison", "models/player/combine_soldier_prisonguard.mdl" )
AddValidHands( "combineprison", "models/weapons/c_arms_combine.mdl", 0, "0000000" )
AddValidModel( "combineelite", "models/player/combine_super_soldier.mdl" )
AddValidHands( "combineelite", "models/weapons/c_arms_combine.mdl", 0, "0000000" )
AddValidModel( "eli", "models/player/eli.mdl" )
AddValidHands( "eli", "models/weapons/c_arms_citizen.mdl", 1, "0000000" )
AddValidModel( "gman", "models/player/gman_high.mdl" )
AddValidHands( "gman", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "kleiner", "models/player/kleiner.mdl" )
AddValidHands( "kleiner", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "monk", "models/player/monk.mdl" )
AddValidHands( "monk", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "mossman", "models/player/mossman.mdl" )
AddValidHands( "mossman", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "mossmanarctic", "models/player/mossman_arctic.mdl" )
AddValidHands( "mossmanarctic", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "odessa", "models/player/odessa.mdl" )
AddValidHands( "odessa", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "police", "models/player/police.mdl" )
AddValidHands( "police", "models/weapons/c_arms_combine.mdl", 0, "0000000" )
AddValidModel( "policefem", "models/player/police_fem.mdl" )
AddValidHands( "policefem", "models/weapons/c_arms_combine.mdl", 0, "0000000" )
AddValidModel( "magnusson", "models/player/magnusson.mdl" )
AddValidHands( "magnusson", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "stripped", "models/player/soldier_stripped.mdl" )
AddValidHands( "stripped", "models/weapons/c_arms_hev.mdl", 2, "0000000" )
AddValidModel( "zombie", "models/player/zombie_classic.mdl" )
AddValidHands( "zombie", "models/weapons/c_arms_citizen.mdl", 2, "0000000" )
AddValidModel( "zombiefast", "models/player/zombie_fast.mdl" )
AddValidHands( "zombiefast", "models/weapons/c_arms_citizen.mdl", 2, "0000000" )
AddValidModel( "female01", "models/player/Group01/female_01.mdl" )
AddValidHands( "female01", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "female02", "models/player/Group01/female_02.mdl" )
AddValidHands( "female02", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "female03", "models/player/Group01/female_03.mdl" )
AddValidHands( "female03", "models/weapons/c_arms_citizen.mdl", 1, "0000000" )
AddValidModel( "female04", "models/player/Group01/female_04.mdl" )
AddValidHands( "female04", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "female05", "models/player/Group01/female_05.mdl" )
AddValidHands( "female05", "models/weapons/c_arms_citizen.mdl", 1, "0000000" )
AddValidModel( "female06", "models/player/Group01/female_06.mdl" )
AddValidHands( "female06", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "female07", "models/player/Group03/female_01.mdl" )
AddValidHands( "female07", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "female08", "models/player/Group03/female_02.mdl" )
AddValidHands( "female08", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "female09", "models/player/Group03/female_03.mdl" )
AddValidHands( "female09", "models/weapons/c_arms_refugee.mdl", 1, "0100000" )
AddValidModel( "female10", "models/player/Group03/female_04.mdl" )
AddValidHands( "female10", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "female11", "models/player/Group03/female_05.mdl" )
AddValidHands( "female11", "models/weapons/c_arms_refugee.mdl", 1, "0100000" )
AddValidModel( "female12", "models/player/Group03/female_06.mdl" )
AddValidHands( "female12", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "male01", "models/player/Group01/male_01.mdl" )
AddValidHands( "male01", "models/weapons/c_arms_citizen.mdl", 1, "0000000" )
AddValidModel( "male02", "models/player/Group01/male_02.mdl" )
AddValidHands( "male02", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "male03", "models/player/Group01/male_03.mdl" )
AddValidHands( "male03", "models/weapons/c_arms_citizen.mdl", 1, "0000000" )
AddValidModel( "male04", "models/player/Group01/male_04.mdl" )
AddValidHands( "male04", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "male05", "models/player/Group01/male_05.mdl" )
AddValidHands( "male05", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "male06", "models/player/Group01/male_06.mdl" )
AddValidHands( "male06", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "male07", "models/player/Group01/male_07.mdl" )
AddValidHands( "male07", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "male08", "models/player/Group01/male_08.mdl" )
AddValidHands( "male08", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "male09", "models/player/Group01/male_09.mdl" )
AddValidHands( "male09", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "male10", "models/player/Group03/male_01.mdl" )
AddValidHands( "male10", "models/weapons/c_arms_refugee.mdl", 1, "0100000" )
AddValidModel( "male11", "models/player/Group03/male_02.mdl" )
AddValidHands( "male11", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "male12", "models/player/Group03/male_03.mdl" )
AddValidHands( "male12", "models/weapons/c_arms_refugee.mdl", 1, "0100000" )
AddValidModel( "male13", "models/player/Group03/male_04.mdl" )
AddValidHands( "male13", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "male14", "models/player/Group03/male_05.mdl" )
AddValidHands( "male14", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "male15", "models/player/Group03/male_06.mdl" )
AddValidHands( "male15", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "male16", "models/player/Group03/male_07.mdl" )
AddValidHands( "male16", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "male17", "models/player/Group03/male_08.mdl" )
AddValidHands( "male17", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "male18", "models/player/Group03/male_09.mdl" )
AddValidHands( "male18", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "medic01", "models/player/Group03m/male_01.mdl" )
AddValidHands( "medic01", "models/weapons/c_arms_refugee.mdl", 1, "0100000" )
AddValidModel( "medic02", "models/player/Group03m/male_02.mdl" )
AddValidHands( "medic02", "models/weapons/c_arms_refugee.mdl", 0, "0000000" )
AddValidModel( "medic03", "models/player/Group03m/male_03.mdl" )
AddValidHands( "medic03", "models/weapons/c_arms_refugee.mdl", 1, "0100000" )
AddValidModel( "medic04", "models/player/Group03m/male_04.mdl" )
AddValidHands( "medic04", "models/weapons/c_arms_refugee.mdl", 0, "0000000" )
AddValidModel( "medic05", "models/player/Group03m/male_05.mdl" )
AddValidHands( "medic05", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "medic06", "models/player/Group03m/male_06.mdl" )
AddValidHands( "medic06", "models/weapons/c_arms_refugee.mdl", 0, "0000000" )
AddValidModel( "medic07", "models/player/Group03m/male_07.mdl" )
AddValidHands( "medic07", "models/weapons/c_arms_refugee.mdl", 0, "0000000" )
AddValidModel( "medic08", "models/player/Group03m/male_08.mdl" )
AddValidHands( "medic08", "models/weapons/c_arms_refugee.mdl", 0, "0000000" )
AddValidModel( "medic09", "models/player/Group03m/male_09.mdl" )
AddValidHands( "medic09", "models/weapons/c_arms_refugee.mdl", 0, "0000000" )
AddValidModel( "medic10", "models/player/Group03m/female_01.mdl" )
AddValidHands( "medic10", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "medic11", "models/player/Group03m/female_02.mdl" )
AddValidHands( "medic11", "models/weapons/c_arms_refugee.mdl", 0, "0000000" )
AddValidModel( "medic12", "models/player/Group03m/female_03.mdl" )
AddValidHands( "medic12", "models/weapons/c_arms_refugee.mdl", 1, "0000000" )
AddValidModel( "medic13", "models/player/Group03m/female_04.mdl" )
AddValidHands( "medic13", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "medic14", "models/player/Group03m/female_05.mdl" )
AddValidHands( "medic14", "models/weapons/c_arms_refugee.mdl", 0, "0100000" )
AddValidModel( "medic15", "models/player/Group03m/female_06.mdl" )
AddValidHands( "medic15", "models/weapons/c_arms_refugee.mdl", 1, "0100000" )
AddValidModel( "refugee01", "models/player/Group02/male_02.mdl" )
AddValidHands( "refugee01", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "refugee02", "models/player/Group02/male_04.mdl" )
AddValidHands( "refugee02", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "refugee03", "models/player/Group02/male_06.mdl" )
AddValidHands( "refugee03", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "refugee04", "models/player/Group02/male_08.mdl" )
AddValidHands( "refugee04", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
--
-- Game specific player models! (EP2, CSS, DOD)
-- Moving them to here since we're now shipping all required files / fallbacks
AddValidModel( "magnusson", "models/player/magnusson.mdl" )
AddValidHands( "magnusson", "models/weapons/c_arms_citizen.mdl", 0, "0000000" )
AddValidModel( "skeleton", "models/player/skeleton.mdl" )
AddValidHands( "skeleton", "models/weapons/c_arms_citizen.mdl", 2, "0000000" )
AddValidModel( "zombine", "models/player/zombie_soldier.mdl" )
AddValidHands( "zombine", "models/weapons/c_arms_combine.mdl", 0, "0000000" )
AddValidModel( "hostage01", "models/player/hostage/hostage_01.mdl" )
AddValidModel( "hostage02", "models/player/hostage/hostage_02.mdl" )
AddValidModel( "hostage03", "models/player/hostage/hostage_03.mdl" )
AddValidModel( "hostage04", "models/player/hostage/hostage_04.mdl" )
AddValidModel( "css_arctic", "models/player/arctic.mdl" )
AddValidHands( "css_arctic", "models/weapons/c_arms_cstrike.mdl", 0, "10000000" )
AddValidModel( "css_gasmask", "models/player/gasmask.mdl" )
AddValidHands( "css_gasmask", "models/weapons/c_arms_cstrike.mdl", 0, "10000000" )
AddValidModel( "css_guerilla", "models/player/guerilla.mdl" )
AddValidHands( "css_guerilla", "models/weapons/c_arms_cstrike.mdl", 0, "10000000" )
AddValidModel( "css_leet", "models/player/leet.mdl" )
AddValidHands( "css_leet", "models/weapons/c_arms_cstrike.mdl", 0, "10000000" )
AddValidModel( "css_phoenix", "models/player/phoenix.mdl" )
AddValidHands( "css_phoenix", "models/weapons/c_arms_cstrike.mdl", 0, "10000000" )
AddValidModel( "css_riot", "models/player/riot.mdl" )
AddValidHands( "css_riot", "models/weapons/c_arms_cstrike.mdl", 0, "10000000" )
AddValidModel( "css_swat", "models/player/swat.mdl" )
AddValidHands( "css_swat", "models/weapons/c_arms_cstrike.mdl", 0, "10000000" )
AddValidModel( "css_urban", "models/player/urban.mdl" )
AddValidHands( "css_urban", "models/weapons/c_arms_cstrike.mdl", 7, "10000000" )
AddValidModel( "dod_german", "models/player/dod_german.mdl" )
AddValidHands( "dod_german", "models/weapons/c_arms_dod.mdl", 0, "10000000" )
AddValidModel( "dod_american", "models/player/dod_american.mdl" )
AddValidHands( "dod_american", "models/weapons/c_arms_dod.mdl", 1, "10000000" )
--
-- Player Class Stuff
--
local Type = {}
function GetPlayerClasses()
return table.Copy( Type )
end
local function LookupPlayerClass( ply )
local id = ply:GetClassID()
if ( id == 0 ) then return end
--
-- Check the cache
--
local plyClass = ply.m_CurrentPlayerClass
if ( plyClass && plyClass.Player == ply ) then
if ( plyClass.ClassID == id && plyClass.Func ) then return plyClass end -- current class is still good, behave normally
if ( plyClass.ClassChanged ) then plyClass:ClassChanged() end -- the class id changed, remove the old class
end
--
-- No class, lets create one
--
local classname = util.NetworkIDToString( id )
if ( !classname ) then return end
--
-- Get that type. Fail if we don't have the type.
--
local t = Type[ classname ]
if ( !t ) then return end
local newClass = {
Player = ply,
ClassID = id,
Func = function() end
}
setmetatable( newClass, { __index = t } )
ply.m_CurrentPlayerClass = newClass
-- TODO: We probably want to reset previous DTVar stuff on the player
newClass.Player:InstallDataTable()
newClass:SetupDataTables()
newClass:Init()
return newClass
end
function RegisterClass( name, tab, base )
Type[ name ] = tab
--
-- If we have a base method then hook
-- it up in the meta table
--
if ( base ) then
if ( !Type[ name ] ) then ErrorNoHalt( "RegisterClass - deriving " .. name .. " from unknown class " .. base .. "!\n" ) end
setmetatable( Type[ name ], { __index = Type[ base ] } )
end
if ( SERVER ) then
util.AddNetworkString( name )
end
--
-- drive methods cooperate with the baseclass system
-- /lua/includes/modules/baseclass.lua
--
baseclass.Set( name, Type[ name ] )
end
function SetPlayerClass( ply, classname )
if ( !Type[ classname ] ) then ErrorNoHalt( "SetPlayerClass - attempt to use unknown player class " .. classname .. "!\n" ) end
local id = util.NetworkStringToID( classname )
ply:SetClassID( id )
-- Initialize the player class so the datatable and everything is set up
-- This probably could be done better
LookupPlayerClass( ply )
end
function GetPlayerClass( ply )
local id = ply:GetClassID()
if ( id == 0 ) then return end
return util.NetworkIDToString( id )
end
function GetPlayerClassTable( ply )
local id = ply:GetClassID()
if ( id == 0 ) then return end
local ct = Type[ util.NetworkIDToString( id ) ]
if ( !ct ) then return end
return table.Copy( ct )
end
function ClearPlayerClass( ply )
ply:SetClassID( 0 )
end
function RunClass( ply, funcname, ... )
local class = LookupPlayerClass( ply )
if ( !class ) then return end
local func = class[ funcname ]
if ( !func ) then ErrorNoHalt( "Function " .. funcname .. " not found on player class!\n" ) return end
return func( class, ... )
end
--
-- Should be called on spawn automatically to set the variables below
-- This is called in the base gamemode :PlayerSpawn function
--
function OnPlayerSpawn( ply, transiton )
local class = LookupPlayerClass( ply )
if ( !class ) then return end
ply:SetSlowWalkSpeed( class.SlowWalkSpeed )
ply:SetWalkSpeed( class.WalkSpeed )
ply:SetRunSpeed( class.RunSpeed )
ply:SetCrouchedWalkSpeed( class.CrouchedWalkSpeed )
ply:SetDuckSpeed( class.DuckSpeed )
ply:SetUnDuckSpeed( class.UnDuckSpeed )
ply:SetJumpPower( class.JumpPower )
ply:AllowFlashlight( class.CanUseFlashlight )
ply:ShouldDropWeapon( class.DropWeaponOnDie )
ply:SetNoCollideWithTeammates( class.TeammateNoCollide )
ply:SetAvoidPlayers( class.AvoidPlayers )
if ( !transiton ) then
ply:SetMaxHealth( class.MaxHealth )
ply:SetMaxArmor( class.MaxArmor )
ply:SetHealth( class.StartHealth )
ply:SetArmor( class.StartArmor )
end
end