eb3b7f3aef
This feature allows Hiders to easily tell which prop they will turn into if they press Use. As always, it can be fully configured and even turned off. By default it is enabled and set to Approximate mode. In Approximate mode, the client is responsible for guessing the best match to the Use key, but does not have any actual influence on what they will really turn into. This will in most cases be enough, as the internal Use test relies on the forward vector, which is checked by this mode. For those requiring more accuracy, there is the Accurate mode. In Accurate mode, the server is responsible for exactly knowing the best match to the Use key and sending this to the user. This has a server performance impact that scales with the player base and the rate at which these updates are performed can be configured. This mode is affected by lag and packet loss, so only really useful for high performance LAN servers or testing.
541 lines
28 KiB
Lua
541 lines
28 KiB
Lua
--[[
|
|
The MIT License (MIT)
|
|
|
|
Copyright (c) 2015 Xaymar
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
--]]
|
|
|
|
--! Initialize configuration table.
|
|
GM.Config = { }
|
|
GM.Config.ConVars = {}
|
|
|
|
function CreateConVarIfNotExists(name, value, flags, helptext)
|
|
cv = GetConVar(name)
|
|
if (cv == nil) then
|
|
cv = CreateConVar(name, value, flags, helptext)
|
|
-- else
|
|
-- ncv = CreateConVar(name, value, flags, helptext)
|
|
end
|
|
return cv
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Debug Settings
|
|
-- ------------------------------------------------------------------------- --
|
|
-- Debug Mode
|
|
GM.Config.ConVars.Debug = CreateConVarIfNotExists("ph_debug", "0", FCVAR_CHEAT + FCVAR_REPLICATED, "Prop Hunt: Enable Debug Mode")
|
|
function GM.Config:Debug()
|
|
return self.ConVars.Debug:GetBool()
|
|
end
|
|
|
|
-- Debug Log
|
|
GM.Config.ConVars.DebugLog = CreateConVarIfNotExists("ph_debug_log", "0", FCVAR_REPLICATED, "Prop Hunt: Enable Debug Logging")
|
|
function GM.Config:DebugLog()
|
|
return self.ConVars.DebugLog:GetBool()
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Basic Settings
|
|
-- ------------------------------------------------------------------------- --
|
|
-- Game Mode (See sh_init.lua)
|
|
GM.Config.ConVars.GameType = CreateConVarIfNotExists("ph_gametype", GM.Types.Original, FCVAR_REPLICATED, "Prop Hunt: Which Game Type should be played? ("..GM.Types.Original.." = Original Prop Hunt, "..GM.Types.TheDeadHunt.." = The Dead Hunt Mode)")
|
|
function GM.Config:GameType()
|
|
return self.ConVars.GameType:GetInt()
|
|
end
|
|
|
|
-- Timelimit in minutes
|
|
GM.Config.ConVars.TimeLimit = CreateConVarIfNotExists("mp_timelimit", "20", FCVAR_REPLICATED, "Map Time Limit (in Minutes)")
|
|
function GM.Config:TimeLimit()
|
|
return self.ConVars.TimeLimit:GetFloat()
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Round Settings
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.Round = {}
|
|
GM.Config.Round.ConVars = {}
|
|
|
|
-- How many rounds should the GM attempt to fit into the map timelimit, if there is any?
|
|
GM.Config.Round.ConVars.Limit = CreateConVarIfNotExists("ph_round_limit", "10", FCVAR_REPLICATED, "Round Manager: Maximum Rounds to Play on a single Map")
|
|
function GM.Config.Round:Limit()
|
|
return self.ConVars.Limit:GetInt()
|
|
end
|
|
|
|
-- Round Time Limit (Seconds, Default 3 minutes)
|
|
GM.Config.Round.ConVars.Time = CreateConVarIfNotExists("ph_round_timelimit", "180", FCVAR_REPLICATED, "Round Manager: Time Limit per Round (in Seconds)")
|
|
function GM.Config.Round:Time()
|
|
return math.max(self.ConVars.Time:GetFloat() - math.min(self:BlindTime(),0),0)
|
|
end
|
|
|
|
-- For how many seconds are the Seekers blinded? (Seconds)
|
|
GM.Config.Round.ConVars.BlindTime = CreateConVarIfNotExists("ph_round_blindtime", "-30", FCVAR_REPLICATED, "Round Manager: Blind Time for Seekers (in Seconds, positive takes away from ph_round_timelimit, negative adds extra time to ph_round_timelimit)")
|
|
function GM.Config.Round:BlindTime()
|
|
return self.ConVars.BlindTime:GetFloat()
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Team Settings
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.Teams = {}
|
|
GM.Config.Teams.ConVars = {}
|
|
|
|
-- Should teams be ranomized each round?
|
|
GM.Config.Teams.ConVars.Randomize = CreateConVarIfNotExists("ph_teams_randomize", "0", FCVAR_REPLICATED, "Teams: Randomize Teams instead of swapping each round")
|
|
function GM.Config.Teams:Randomize()
|
|
return self.ConVars.Randomize:GetBool()
|
|
end
|
|
|
|
-- Should teams be using weighted randomization?
|
|
-- Weighted randomization works by using a score calculated over the entire session.
|
|
-- * Round Start: Adjust Score towards the other Team by 1 (Positive = Seeker, Negative = Hider)
|
|
-- * Round Win: Adjust score by how many players are still alive on the winning team towards the other team.
|
|
-- * Alive players get double the score.
|
|
GM.Config.Teams.ConVars.Weighted = CreateConVarIfNotExists("ph_teams_weighted", "1", FCVAR_REPLICATED, "Teams: Use Weighted Randomization")
|
|
function GM.Config.Teams:Weighted()
|
|
return self.ConVars.Weighted:GetBool()
|
|
end
|
|
|
|
-- The Dead Hunt: Percent of players to assign to seeker.
|
|
GM.Config.Teams.ConVars.SeekerPercentage = CreateConVarIfNotExists("ph_teams_seekerpct", "25", FCVAR_REPLICATED, "Teams: Initial percentage of Seekers in Dead Hunt Game Type")
|
|
function GM.Config.Teams:SeekerPercentage()
|
|
return self.ConVars.Teams:GetFloat() / 100
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Seeker Settings
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.Seeker = {}
|
|
GM.Config.Seeker.ConVars = {}
|
|
|
|
GM.Config.Seeker.ConVars.Health = CreateConVarIfNotExists("ph_seeker_health", "100", FCVAR_REPLICATED, "Seekers: Initial Health")
|
|
function GM.Config.Seeker:Health()
|
|
return self.ConVars.Health:GetInt()
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.HealthMax = CreateConVarIfNotExists("ph_seeker_health_max", "100", FCVAR_REPLICATED, "Seekers: Maximum Health")
|
|
function GM.Config.Seeker:HealthMax()
|
|
return self.ConVars.HealthMax:GetInt()
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.HealthBonus = CreateConVarIfNotExists("ph_seeker_health_bonus", "20", FCVAR_REPLICATED, "Seekers: Health Bonus per Kill")
|
|
function GM.Config.Seeker:HealthBonus()
|
|
return self.ConVars.HealthBonus:GetInt()
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.HealthPenalty = CreateConVarIfNotExists("ph_seeker_health_penalty", "5", FCVAR_REPLICATED, "Seekers: Health Penalty per wrong Shot")
|
|
function GM.Config.Seeker:HealthPenalty()
|
|
return self.ConVars.HealthPenalty:GetInt()
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.Weapons = CreateConVarIfNotExists("ph_seeker_weapons", "weapon_crowbar,weapon_pistol,weapon_ph_smg,weapon_shotgun", FCVAR_REPLICATED, "Seekers: Initial Weapons (Weapon,Weapon,...)")
|
|
function GM.Config.Seeker:Weapons()
|
|
return string.Split(self.ConVars.Weapons:GetString(), ",")
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.Ammo = CreateConVarIfNotExists("ph_seeker_ammo", "Pistol:100,SMG1:300,SMG1_Grenade:1,Buckshot:64", FCVAR_REPLICATED, "Seekers: Initial Ammo (Ammo:Amount,Ammo:Amount,...)")
|
|
function GM.Config.Seeker:Ammo()
|
|
return string.Split(self.ConVars.Ammo:GetString(), ",")
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.WalkSpeed = CreateConVarIfNotExists("ph_seeker_walk_speed", "250", 0, "Seekers: Walk Speed")
|
|
function GM.Config.Seeker:WalkSpeed()
|
|
return self.ConVars.WalkSpeed:GetFloat()
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.Sprint = CreateConVarIfNotExists("ph_seeker_sprint", "1", FCVAR_REPLICATED, "Seekers: Allow Sprinting")
|
|
function GM.Config.Seeker:Sprint()
|
|
return self.ConVars.Sprint:GetBool()
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.SprintSpeed = CreateConVarIfNotExists("ph_seeker_sprint_speed", "500", 0, "Seekers: Sprint Speed")
|
|
function GM.Config.Seeker:SprintSpeed()
|
|
return self.ConVars.SprintSpeed:GetFloat()
|
|
end
|
|
|
|
GM.Config.Seeker.ConVars.JumpPower = CreateConVarIfNotExists("ph_seeker_jump_power", "200", 0, "Seekers: Jump Power")
|
|
function GM.Config.Seeker:JumpPower()
|
|
return self.ConVars.JumpPower:GetFloat()
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Hider Settings
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.Hider = {}
|
|
GM.Config.Hider.ConVars = {}
|
|
|
|
GM.Config.Hider.ConVars.Health = CreateConVarIfNotExists("ph_hider_health", "100", FCVAR_REPLICATED, "Hiders: Initial Health")
|
|
function GM.Config.Hider:Health()
|
|
return self.ConVars.Health:GetInt()
|
|
end
|
|
|
|
GM.Config.Hider.ConVars.HealthMax = CreateConVarIfNotExists("ph_hider_health_max", "100", FCVAR_REPLICATED, "Hiders: Maximum Health")
|
|
function GM.Config.Hider:HealthMax()
|
|
return self.ConVars.HealthMax:GetInt()
|
|
end
|
|
|
|
GM.Config.Hider.ConVars.HealthScaling = CreateConVarIfNotExists("ph_hider_health_scaling", "1", FCVAR_REPLICATED, "Hiders: Enable Health Scaling")
|
|
function GM.Config.Hider:HealthScaling()
|
|
return self.ConVars.HealthScaling:GetBool()
|
|
end
|
|
|
|
GM.Config.Hider.ConVars.HealthScalingMax = CreateConVarIfNotExists("ph_hider_health_scaling_max", "200", FCVAR_REPLICATED, "Hiders: Maximum scaled Health")
|
|
function GM.Config.Hider:HealthScalingMax()
|
|
return self.ConVars.HealthScalingMax:GetInt()
|
|
end
|
|
|
|
GM.Config.Hider.ConVars.AllowFullRotation = CreateConVarIfNotExists("ph_hider_allow_full_rotation", "0", FCVAR_REPLICATED, "Hiders: Enable full 3D Rotation")
|
|
function GM.Config.Hider:AllowFullRotation()
|
|
return self.ConVars.AllowFullRotation:GetBool()
|
|
end
|
|
|
|
GM.Config.Hider.ConVars.WalkSpeed = CreateConVarIfNotExists("ph_hider_walk_speed", "250", 0, "Hiders: Walk Speed")
|
|
function GM.Config.Hider:WalkSpeed()
|
|
return self.ConVars.WalkSpeed:GetFloat()
|
|
end
|
|
|
|
GM.Config.Hider.ConVars.Sprint = CreateConVarIfNotExists("ph_hider_sprint", "0", FCVAR_REPLICATED, "Hiders: Allow Sprinting")
|
|
function GM.Config.Hider:Sprint()
|
|
return self.ConVars.Sprint:GetBool()
|
|
end
|
|
|
|
GM.Config.Hider.ConVars.SprintSpeed = CreateConVarIfNotExists("ph_hider_sprint_speed", "500", 0, "Hiders: Sprint Speed")
|
|
function GM.Config.Hider:SprintSpeed()
|
|
return self.ConVars.SprintSpeed:GetFloat()
|
|
end
|
|
|
|
GM.Config.Hider.ConVars.JumpPower = CreateConVarIfNotExists("ph_hider_jump_power", "200", 0, "Hiders: Jump Power")
|
|
function GM.Config.Hider:JumpPower()
|
|
return self.ConVars.JumpPower:GetFloat()
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Whitelist & Blacklist
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.Lists = {}
|
|
GM.Config.Lists.ConVars = {}
|
|
|
|
-- Class Whitelist
|
|
GM.Config.Lists.ConVars.ClassWhitelist = CreateConVarIfNotExists("ph_list_class_whitelist", "prop_physics,prop_physics_multiplayer,prop_physics_respawnable", FCVAR_REPLICATED, "Anti-Cheat: Whitelisted Hider Classes")
|
|
function GM.Config.Lists:ClassWhitelist()
|
|
local str = self.ConVars.ClassWhitelist:GetString()
|
|
if (self.ClassWhitelistCache != str) then
|
|
self.ClassWhitelistCache = str
|
|
self.ClassWhitelistCacheTbl = string.Split(self.ClassWhitelistCache, ",")
|
|
end
|
|
return self.ClassWhitelistCacheTbl
|
|
end
|
|
|
|
-- Abuse Blacklist
|
|
GM.Config.Lists.ConVars.AbuseBlacklist = CreateConVarIfNotExists("ph_list_abuse_blacklist", "func_button,func_door,func_door_rotation,prop_door_rotation,func_tracktrain,func_tanktrain,func_breakable", FCVAR_REPLICATED, "Anti-Cheat: Entity Abuse Blacklist")
|
|
function GM.Config.Lists:AbuseBlacklist()
|
|
local str = self.ConVars.AbuseBlacklist:GetString()
|
|
if (self.AbuseBlacklistCache != str) then
|
|
self.AbuseBlacklistCache = str
|
|
self.AbuseBlacklistCacheTbl = string.Split(self.AbuseBlacklistCache, ",")
|
|
end
|
|
return self.AbuseBlacklistCacheTbl
|
|
end
|
|
|
|
-- Model Blacklist
|
|
GM.Config.Lists.ConVars.ModelBlacklist = CreateConVarIfNotExists("ph_list_model_blacklist", "models/props/cs_assault/dollar.mdl,models/props/cs_assault/money.mdl,models/props/cs_office/snowman_arm.mdl,models/props/cs_office/projector_remote.mdl", FCVAR_REPLICATED, "Anti-Cheat: Model Abuse Blacklist")
|
|
function GM.Config.Lists:ModelBlacklist()
|
|
local str = self.ConVars.ModelBlacklist:GetString()
|
|
if (self.ModelBlacklistCache != str) then
|
|
self.ModelBlacklistCache = str
|
|
self.ModelBlacklistCacheTbl = string.Split(self.ModelBlacklistCache, ",")
|
|
end
|
|
return self.ModelBlacklistCacheTbl
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Taunts
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.Taunt = {}
|
|
GM.Config.Taunt.ConVars = {}
|
|
|
|
-- Cooldown (Seconds)
|
|
GM.Config.Taunt.ConVars.Cooldown = CreateConVarIfNotExists("ph_taunt_cooldown", 5, FCVAR_REPLICATED, "Prop Hunt: Cooldown between Taunts")
|
|
function GM.Config.Taunt:Cooldown()
|
|
return self.ConVars.Cooldown:GetFloat()
|
|
end
|
|
|
|
-- Seeker
|
|
GM.Config.Taunt.SeekersCache = ""
|
|
GM.Config.Taunt.SeekersCacheDynamic = nil
|
|
GM.Config.Taunt.SeekersCacheStatic = nil
|
|
GM.Config.Taunt.SeekersCacheFull = nil
|
|
GM.Config.Taunt.ConVars.Seekers = CreateConVarIfNotExists("ph_taunt_seekers", "bot/a_bunch_of_them.wav,bot/come_out_and_fight_like_a_man.wav,bot/come_out_wherever_you_are.wav,bot/come_to_papa.wav,bot/dont_worry_hell_get_it.wav,bot/hang_on_i_heard_something.wav,bot/hang_on_im_coming.wav,bot/i_dont_think_so.wav,bot/i_have_the_hostages.wav,bot/i_see_our_target.wav,bot/im_waiting_here.wav,bot/keeping_an_eye_on_the_hostages.wav,bot/nnno_sir.wav,bot/spotted_the_delivery_boy.wav,bot/target_acquired.wav,bot/target_spotted.wav,bot/you_heard_the_man_lets_go.wav", 0, "Prop Hunt: Seeker Taunts")
|
|
function GM.Config.Taunt:Seekers()
|
|
local str = self.ConVars.Seekers:GetString()
|
|
if (self.SeekersCache != str) then
|
|
self.SeekersCache = str
|
|
self.SeekersCacheDynamic = string.Split(self.SeekersCache, ",")
|
|
self.SeekersCacheFull = table.Add(self.SeekersCacheDynamic, self.SeekersCacheStatic)
|
|
for i,snd in ipairs(self.SeekersCacheFull) do
|
|
util.PrecacheSound(snd)
|
|
end
|
|
end
|
|
return self.SeekersCacheFull
|
|
end
|
|
|
|
-- Hider
|
|
GM.Config.Taunt.HidersCache = ""
|
|
GM.Config.Taunt.HidersCacheDynamic = nil
|
|
GM.Config.Taunt.HidersCacheStatic = nil
|
|
GM.Config.Taunt.HidersCacheFull = nil
|
|
GM.Config.Taunt.ConVars.Hiders = CreateConVarIfNotExists("ph_taunt_hiders", "ambient/alarms/apc_alarm_pass1.wav,ambient/alarms/manhack_alert_pass1.wav,ambient/alarms/razortrain_horn1.wav,ambient/alarms/scanner_alert_pass1.wav,ambient/alarms/train_horn2.wav,ambient/alarms/train_horn_distant1.wav,ambient/alarms/warningbell1.wav,ambient/energy/whiteflash.wav,ambient/intro/alyxremove.wav,ambient/intro/logosfx.wav,ambient/levels/launch/1stfiringwarning.wav,ambient/levels/launch/rockettakeoffblast.wav,ambient/misc/ambulance1.wav,ambient/misc/carhonk1.wav,ambient/misc/carhonk2.wav,ambient/misc/carhonk3.wav,ambient/outro/gunshipcrash.wav,ambient/3dmeagle.wav,beams/beamstart5.wav,buttons/bell1.wav,buttons/weapon_cant_buy.wav,common/bass.wav,common/bugreporter_failed.wav,common/warning.wav,doors/door_squeek1.wav,friends/friend_join.wav,friends/friend_online.wav,friends/message.wav,hostage/hunuse/comeback.wav,hostage/hunuse/dontleaveme.wav,hostage/hunuse/yeahillstay.wav,items/gift_drop.wav,music/radio1.mp3,phx/eggcrack.wav,plats/elevbell1.wav,player/headshot1.wav,player/headshot2.wav,player/sprayer.wav,radio/enemydown.wav,radio/go.wav,radio/locknload.wav,radio/negative.wav,radio/rounddraw.wav,radio/takepoint.wav,resource/warning.wav,ui/achievement_earned.wav,ui/freeze_cam.wav,vehicles/junker/radar_ping_friendly1.wav,weapons/c4/c4_beep1.wav,weapons/c4/c4_click.wav,weapons/awp/awp1.wav,vo/canals/female01/gunboat_giveemhell.wav,vo/canals/female01/gunboat_justintime.wav,vo/canals/female01/stn6_incoming.wav,vo/canals/male01/gunboat_giveemhell.wav,vo/canals/male01/gunboat_justintime.wav,vo/canals/male01/stn6_incoming.wav,vo/canals/al_radio_stn6.wav,vo/canals/arrest_getgoing.wav,vo/canals/arrest_helpme.wav,vo/canals/arrest_lookingforyou.wav,vo/canals/boxcar_lethimhelp.wav,vo/canals/matt_closecall.wav,vo/canals/premassacre.wav,vo/ravenholm/aimforhead.wav,vo/ravenholm/bucket_patience.wav,vo/ravenholm/madlaugh01.wav,vo/ravenholm/madlaugh02.wav,vo/ravenholm/madlaugh03.wav,vo/ravenholm/madlaugh04.wav,weapons/strider_buster/ol12_stickybombcreator.wav,weapons/c4/c4_explode1.wav,weapons/357/357_fire2.wav,weapons/357/357_fire3.wav,weapons/scout/scout_fire-1.wav,weapons/smokegrenade/sg_explode.wav,weapons/grenade_launcher1.wav,weapons/explode3.wav,weapons/underwater_explode3.wav,items/nvg_on.wav,hostage/huse/letsdoit.wav,hostage/huse/illfollow.wav,hostage/huse/getouttahere.wav,doors/door_screen_move1.wav,doors/heavy_metal_stop1.wav,doors/default_move.wav,common/stuck2.wav,ambient/water_splash1.wav,ambient/water_splash2.wav,ambient/water_splash3.wav,ambient/weather/thunder1.wav,ambient/weather/thunder2.wav,ambient/weather/thunder3.wav,ambient/weather/thunder4.wav,ambient/weather/thunder5.wav,ambient/weather/thunder6.wav,ambient/outro/thunder7.wav,ambient/voices/crying_loop1.wav,ambient/voices/playground_memory.wav,ambient/voices/f_scream1.wav,ambient/voices/m_scream1.wav,ambient/voices/cough1.wav,ambient/voices/cough2.wav,ambient/voices/cough3.wav,ambient/voices/cough4.wav,ambient/overhead/plane1.wav,ambient/overhead/plane2.wav,ambient/overhead/plane3.wav,ambient/overhead/hel1.wav,ambient/overhead/hel2.wav,ambient/misc/truck_backup1.wav,ambient/misc/truck_drive1.wav,ambient/misc/truck_drive2.wav,ambient/machines/pneumatic_drill_1.wav,ambient/machines/pneumatic_drill_2.wav,ambient/machines/pneumatic_drill_3.wav,ambient/machines/pneumatic_drill_4.wav,ambient/machines/station_train_squeel.wav,ambient/machines/ticktock.wav,ambient/creatures/teddy.wav,ambient/creatures/town_child_scream1.wav,ambient/creatures/town_moan1.wav,ambient/creatures/town_muffled_cry1.wav,ambient/creatures/town_scared_breathing1.wav,ambient/creatures/town_scared_breathing2.wav,ambient/creatures/town_scared_sob1.wav,ambient/creatures/town_scared_sob2.wav,ambient/creatures/town_zombie_call1.wav", 0, "Prop Hunt: Hider Taunts")
|
|
function GM.Config.Taunt:Hiders()
|
|
local str = self.ConVars.Hiders:GetString()
|
|
if (self.HidersCacheDynamic == nil)
|
|
|| (self.HidersCache != str) then
|
|
self.HidersCache = str
|
|
self.HidersCacheDynamic = string.Split(self.HidersCache, ",")
|
|
self.HidersCacheFull = table.Add(self.HidersCacheDynamic, self.HidersCacheStatic)
|
|
for i,snd in ipairs(self.HidersCacheFull) do
|
|
util.PrecacheSound(snd)
|
|
end
|
|
end
|
|
return self.HidersCacheFull
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Announcers
|
|
-- ------------------------------------------------------------------------- --
|
|
|
|
-- --! Announcers (Round Start, Unblind, Win, Loss)
|
|
-- GM.Config.Announcers = {
|
|
-- Start = { },
|
|
-- Unblind = { },
|
|
-- Win = { },
|
|
-- Loss = { }
|
|
-- }
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Camera
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.Camera = {}
|
|
GM.Config.Camera.ConVars = {}
|
|
|
|
-- Allow Camera No Clip
|
|
GM.Config.Camera.ConVars.AllowNoClip = CreateConVarIfNotExists("ph_camera_allow_noclip", "0", FCVAR_REPLICATED, "Camera: Allow clients to disable camera collision.")
|
|
function GM.Config.Camera:AllowNoClip()
|
|
return self.ConVars.AllowNoClip:GetBool()
|
|
end
|
|
|
|
-- Camera Distance Maximum
|
|
GM.Config.Camera.ConVars.DistanceMax = CreateConVarIfNotExists("ph_camera_distance_max", "150", FCVAR_REPLICATED, "Camera: Maximum allowed distance to player.")
|
|
function GM.Config.Camera:DistanceMax()
|
|
return self.ConVars.DistanceMax:GetFloat()
|
|
end
|
|
|
|
-- Camera Distance Minimum
|
|
GM.Config.Camera.ConVars.DistanceMin = CreateConVarIfNotExists("ph_camera_distance_min", "30", FCVAR_REPLICATED, "Camera: Minimum allowed distance to player.")
|
|
function GM.Config.Camera:DistanceMin()
|
|
return self.ConVars.DistanceMin:GetFloat()
|
|
end
|
|
|
|
-- Camera Distance Right Maximum
|
|
GM.Config.Camera.ConVars.DistanceRightRange = CreateConVarIfNotExists("ph_camera_distance_right_range", "20", FCVAR_REPLICATED, "Camera: Horizontal allowed camera distance range.")
|
|
function GM.Config.Camera:DistanceRightRange()
|
|
return self.ConVars.DistanceRightRange:GetFloat()
|
|
end
|
|
|
|
-- Camera Distance Up Maximum
|
|
GM.Config.Camera.ConVars.DistanceUpRange = CreateConVarIfNotExists("ph_camera_distance_up_range", "20", FCVAR_REPLICATED, "Camera: Vertical allowed camera distance range.")
|
|
function GM.Config.Camera:DistanceUpRange()
|
|
return self.ConVars.DistanceUpRange:GetFloat()
|
|
end
|
|
|
|
-- Lag Minimum
|
|
GM.Config.Camera.ConVars.LagMinimum = CreateConVarIfNotExists("ph_camera_lag_min", "0.01", FCVAR_REPLICATED, "Camera: Minimum Camera Lag.")
|
|
function GM.Config.Camera:LagMinimum()
|
|
return self.ConVars.LagMinimum:GetFloat()
|
|
end
|
|
|
|
-- Lag Maximum
|
|
GM.Config.Camera.ConVars.LagMaximum = CreateConVarIfNotExists("ph_camera_lag_max", "0.95", FCVAR_REPLICATED, "Camera: Maximum Camera Lag.")
|
|
function GM.Config.Camera:LagMaximum()
|
|
return self.ConVars.LagMaximum:GetFloat()
|
|
end
|
|
|
|
if CLIENT then
|
|
-- Collisions
|
|
GM.Config.Camera.ConVars.Collisions = CreateConVarIfNotExists("ph_camera_collisions", "1", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Camera: Enable collisions with the world and objects in it.")
|
|
function GM.Config.Camera:Collisions()
|
|
if self:AllowNoClip() then
|
|
return self.ConVars.Collisions:GetBool()
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
|
|
-- Distance
|
|
GM.Config.Camera.ConVars.Distance = CreateConVarIfNotExists("ph_camera_distance", "100", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Camera: Ideal Distance to player.")
|
|
function GM.Config.Camera:Distance()
|
|
return math.Clamp(self.ConVars.Distance:GetFloat(), self:DistanceMin(), self:DistanceMax())
|
|
end
|
|
|
|
-- Distance Right
|
|
GM.Config.Camera.ConVars.DistanceRight = CreateConVarIfNotExists("ph_camera_distance_right", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Camera: Ideal Distance to player horizontally.")
|
|
function GM.Config.Camera:DistanceRight()
|
|
return math.Clamp(self.ConVars.DistanceRight:GetFloat(), -self:DistanceRightRange(), self:DistanceRightRange())
|
|
end
|
|
|
|
-- Distance Up
|
|
GM.Config.Camera.ConVars.DistanceUp = CreateConVarIfNotExists("ph_camera_distance_up", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Camera: Ideal Distance to player vertically.")
|
|
function GM.Config.Camera:DistanceUp()
|
|
return math.Clamp(self.ConVars.DistanceUp:GetFloat(), -self:DistanceUpRange(), self:DistanceUpRange())
|
|
end
|
|
|
|
-- Lag
|
|
GM.Config.Camera.ConVars.Lag = CreateConVarIfNotExists("ph_camera_lag", "0.95", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Camera: Percentage of camera lag (higher = slower, lower = faster).")
|
|
function GM.Config.Camera:Lag()
|
|
return math.Clamp(self.ConVars.Lag:GetFloat(), self:LagMinimum(), self:LagMaximum())
|
|
end
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Name Plates
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.NamePlates = {}
|
|
GM.Config.NamePlates.ConVars = {}
|
|
|
|
if CLIENT then
|
|
-- Show
|
|
GM.Config.NamePlates.ConVars.Show = CreateConVarIfNotExists("ph_nameplates_show", "1", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Nameplates: Show a name plate above each player in your team (or all players if spectating).")
|
|
function GM.Config.NamePlates:Show()
|
|
return self.ConVars.Show:GetBool()
|
|
end
|
|
|
|
-- Scale
|
|
GM.Config.NamePlates.ConVars.Scale = CreateConVarIfNotExists("ph_nameplates_scale", "0.05", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Nameplates: World scale of name plate, a setting of 1 means 1px = 1unit.")
|
|
function GM.Config.NamePlates:Scale()
|
|
return self.ConVars.Scale:GetFloat()
|
|
end
|
|
|
|
-- Height
|
|
GM.Config.NamePlates.ConVars.Height = CreateConVarIfNotExists("ph_nameplates_height", "10", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Nameplates: Height above player.")
|
|
function GM.Config.NamePlates:Height()
|
|
return self.ConVars.Height:GetFloat()
|
|
end
|
|
|
|
-- Tint Color
|
|
GM.Config.NamePlates.ConVars.TintHue = CreateConVarIfNotExists("ph_nameplates_tint_hue", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Nameplates: Tint hue.")
|
|
function GM.Config.NamePlates:TintHue()
|
|
return self.ConVars.TintHue:GetFloat()
|
|
end
|
|
GM.Config.NamePlates.ConVars.TintSaturation = CreateConVarIfNotExists("ph_nameplates_tint_saturation", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Nameplates: Tint saturation.")
|
|
function GM.Config.NamePlates:TintSaturation()
|
|
return self.ConVars.TintSaturation:GetFloat()
|
|
end
|
|
GM.Config.NamePlates.ConVars.TintValue = CreateConVarIfNotExists("ph_nameplates_tint_value", "1", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Nameplates: Tint value.")
|
|
function GM.Config.NamePlates:TintValue()
|
|
return self.ConVars.TintValue:GetFloat()
|
|
end
|
|
|
|
-- Tint By Health
|
|
GM.Config.NamePlates.ConVars.TintHealth = CreateConVarIfNotExists("ph_nameplates_tint_health", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Nameplates: Tint the nameplate using their health percent.")
|
|
function GM.Config.NamePlates:TintHealth()
|
|
return self.ConVars.TintHealth:GetBool()
|
|
end
|
|
|
|
-- Tint By Team
|
|
GM.Config.NamePlates.ConVars.TintTeam = CreateConVarIfNotExists("ph_nameplates_tint_team", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Nameplates: Tint the nameplate with the team colors.")
|
|
function GM.Config.NamePlates:TintTeam()
|
|
return self.ConVars.TintTeam:GetBool()
|
|
end
|
|
end
|
|
|
|
-- ------------------------------------------------------------------------- --
|
|
--! Selection Halo
|
|
-- ------------------------------------------------------------------------- --
|
|
GM.Config.SelectionHalo = {}
|
|
GM.Config.SelectionHalo.ConVars = {}
|
|
|
|
-- Allow
|
|
GM.Config.SelectionHalo.ConVars.Allow = CreateConVarIfNotExists("ph_selectionhalo_allow", "1", FCVAR_REPLICATED, "Selection Halo: Allow clients to enable halo around the currently looked at prop?")
|
|
function GM.Config.SelectionHalo:Allow()
|
|
return self.ConVars.Allow:GetBool()
|
|
end
|
|
|
|
-- Approximate
|
|
GM.Config.SelectionHalo.ConVars.Approximate = CreateConVarIfNotExists("ph_selectionhalo_approximate", "1", FCVAR_REPLICATED, "Selection Halo: Enable approximate selection halo, which only checks the forward vector on the client.")
|
|
function GM.Config.SelectionHalo:Approximate()
|
|
return self.ConVars.Approximate:GetBool()
|
|
end
|
|
|
|
if SERVER then
|
|
-- Update Interval
|
|
GM.Config.SelectionHalo.ConVars.Interval = CreateConVarIfNotExists("ph_selectionhalo_interval", "0.05", FCVAR_ARCHIVE, "Selection Halo: Interval for updates of the accuracte selection halo in seconds.")
|
|
function GM.Config.SelectionHalo:Interval()
|
|
return self.ConVars.Interval:GetFloat()
|
|
end
|
|
end
|
|
|
|
if CLIENT then
|
|
-- Enabled
|
|
GM.Config.SelectionHalo.ConVars.Enabled = CreateConVarIfNotExists("ph_selectionhalo_enabled", "1", FCVAR_ARCHIVE, "Selection Halo: Enable halo around prop you might become.")
|
|
function GM.Config.SelectionHalo:Enabled()
|
|
if (self:Allow()) then
|
|
return self.ConVars.Enabled:GetBool()
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- Settings
|
|
GM.Config.SelectionHalo.ConVars.Passes = CreateConVarIfNotExists("ph_selectionhalo_passes", "1", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Selection Halo: Passes")
|
|
function GM.Config.SelectionHalo:Passes()
|
|
return self.ConVars.Passes:GetInt()
|
|
end
|
|
GM.Config.SelectionHalo.ConVars.Additive = CreateConVarIfNotExists("ph_selectionhalo_additive", "1", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Selection Halo: Additive")
|
|
function GM.Config.SelectionHalo:Additive()
|
|
return self.ConVars.Additive:GetBool()
|
|
end
|
|
GM.Config.SelectionHalo.ConVars.IgnoreZ = CreateConVarIfNotExists("ph_selectionhalo_ignorez", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Selection Halo: Ignore Z")
|
|
function GM.Config.SelectionHalo:IgnoreZ()
|
|
return self.ConVars.IgnoreZ:GetBool()
|
|
end
|
|
|
|
-- Blur
|
|
GM.Config.SelectionHalo.ConVars.BlurX = CreateConVarIfNotExists("ph_selectionhalo_blur_x", "2", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Selection Halo: Blur X")
|
|
function GM.Config.SelectionHalo:BlurX()
|
|
return self.ConVars.BlurX:GetFloat()
|
|
end
|
|
GM.Config.SelectionHalo.ConVars.BlurY = CreateConVarIfNotExists("ph_selectionhalo_blur_y", "2", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Selection Halo: Blur Y")
|
|
function GM.Config.SelectionHalo:BlurY()
|
|
return self.ConVars.BlurY:GetFloat()
|
|
end
|
|
|
|
-- Tint Color
|
|
GM.Config.SelectionHalo.ConVars.TintHue = CreateConVarIfNotExists("ph_selectionhalo_tint_hue", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Selection Halo: Tint Hue")
|
|
function GM.Config.SelectionHalo:TintHue()
|
|
return self.ConVars.TintHue:GetFloat()
|
|
end
|
|
GM.Config.SelectionHalo.ConVars.TintSaturation = CreateConVarIfNotExists("ph_selectionhalo_tint_saturation", "0", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Selection Halo: Tint Saturation")
|
|
function GM.Config.SelectionHalo:TintSaturation()
|
|
return self.ConVars.TintSaturation:GetFloat()
|
|
end
|
|
GM.Config.SelectionHalo.ConVars.TintValue = CreateConVarIfNotExists("ph_selectionhalo_tint_value", "1", FCVAR_ARCHIVE + FCVAR_CLIENTDLL, "Selection Halo: Tint Value")
|
|
function GM.Config.SelectionHalo:TintValue()
|
|
return self.ConVars.TintValue:GetFloat()
|
|
end
|
|
end
|