2014-10-02 08:49:54 +08:00
AddCSLuaFile ( " cl_zombieescape.lua " )
AddCSLuaFile ( " sh_zombieescape.lua " )
include ( " sh_zombieescape.lua " )
if not GM.ZombieEscape then return end
table.insert ( GM.CleanupFilter , " func_brush " )
table.insert ( GM.CleanupFilter , " env_global " )
2014-12-10 09:53:32 +08:00
table.insert ( GM.CleanupFilter , " info_player_terrorist " )
table.insert ( GM.CleanupFilter , " info_player_counterterrorist " )
2014-10-02 08:49:54 +08:00
-- We need to fix these important entities.
hook.Add ( " EntityKeyValue " , " zombieescape " , function ( ent , key , value )
-- The teamid for Terrorist and Counter Terrorist is different than Zombie and Human in ZS.
if ent : GetClass ( ) == " filter_activator_team " and not ent.ZEFix then
if string.lower ( key ) == " filterteam " then
if value == " 2 " then
ent.ZEFix = tostring ( TEAM_UNDEAD )
elseif value == " 3 " then
ent.ZEFix = tostring ( TEAM_HUMAN )
end
end
return true
end
-- Some maps have brushes that regenerate or set health to dumb values. We don't want them. Although this can break maps I can't think of a way to remove the output instead.
if ( ent : GetClass ( ) == " trigger_multiple " or ent : GetClass ( ) == " trigger_once " ) and string.find ( string.lower ( value ) , " %!.*%,.+%,health " ) then
ent.ZEDelete = true
end
end )
hook.Add ( " InitPostEntityMap " , " zombieescape " , function ( fromze )
for _ , ent in pairs ( ents.FindByClass ( " filter_activator_team " ) ) do
if ent.ZEFix then
ent : SetKeyValue ( " filterteam " , ent.ZEFix )
end
end
for _ , ent in pairs ( ents.GetAll ( ) ) do
2014-11-19 22:07:50 +08:00
if ent and ent.ZEDelete and ent : IsValid ( ) then
2014-10-02 08:49:54 +08:00
ent : Remove ( )
end
end
-- Forced dynamic spawning.
-- It'd be pretty damn boring for the zombies with it off since there's only one spawn usually.
GAMEMODE.DynamicSpawning = true
if not fromze then
GAMEMODE : SetRedeemBrains ( 0 )
if GAMEMODE.CurrentRound <= 1 then
GAMEMODE : SetWaveStart ( CurTime ( ) + GAMEMODE.WaveZeroLength + 30 ) -- 30 extra seconds for late joiners
else
GAMEMODE : SetWaveStart ( CurTime ( ) + GAMEMODE.ZE_FreezeTime + 5 )
end
end
end )
hook.Add ( " PlayerSpawn " , " zombieescape " , function ( pl )
timer.Simple ( 0 , function ( )
if not pl : IsValid ( ) then return end
2015-03-10 01:45:47 +08:00
if GAMEMODE : GetWave ( ) == 0 and not GAMEMODE : GetWaveActive ( ) and ( pl : Team ( ) == TEAM_UNDEAD or pl : Team ( ) == TEAM_HUMAN and CurTime ( ) < GAMEMODE : GetWaveStart ( ) - GAMEMODE.ZE_FreezeTime ) then
2014-10-02 08:49:54 +08:00
pl.ZEFreeze = true
pl : Freeze ( true )
pl : GodEnable ( )
end
end )
end )
-- In ze_ the winning condition is when all players on the zombie team are dead at the exact same time.
-- Usually set on by a trigger_hurt that takes over the entire map.
-- So if all living zombies get killed at the same time from a trigger_hurt that did massive damage, we end the round in favor of the humans.
-- But in order to do that we have to force zombies to spawn. Which is shitty.
hook.Add ( " OnWaveStateChanged " , " zombieescape " , function ( )
if GAMEMODE : GetWave ( ) == 1 and GAMEMODE : GetWaveActive ( ) then
for _ , pl in pairs ( player.GetAll ( ) ) do
pl : Freeze ( false )
pl : GodDisable ( )
end
end
end )
local CheckTime
local FreezeTime = true
local NextDamage = 0
hook.Add ( " Think " , " zombieescape " , function ( )
if GAMEMODE : GetWave ( ) == 0 then
if FreezeTime and CurTime ( ) >= GAMEMODE : GetWaveStart ( ) - GAMEMODE.ZE_FreezeTime then
FreezeTime = false
game.CleanUpMap ( false , GAMEMODE.CleanupFilter )
gamemode.Call ( " InitPostEntityMap " , true )
for _ , pl in pairs ( team.GetPlayers ( TEAM_HUMAN ) ) do
pl.ZEFreeze = nil
pl : Freeze ( false )
pl : GodDisable ( )
local ent = GAMEMODE : PlayerSelectSpawn ( pl )
if IsValid ( ent ) then
pl : SetPos ( ent : GetPos ( ) )
end
end
end
return
end
FreezeTime = true
if CurTime ( ) >= GAMEMODE : GetWaveStart ( ) + GAMEMODE.ZE_TimeLimit and CurTime ( ) >= NextDamage then
NextDamage = CurTime ( ) + 1
for _ , pl in pairs ( team.GetPlayers ( TEAM_HUMAN ) ) do
pl : TakeDamage ( 5 )
end
end
local undead = team.GetPlayers ( TEAM_UNDEAD )
if # undead == 0 then return end
for _ , pl in pairs ( undead ) do
if not pl.KilledByTriggerHurt or CurTime ( ) > pl.KilledByTriggerHurt + 12 then
CheckTime = nil
return
end
end
CheckTime = CheckTime or ( CurTime ( ) + 2.5 )
if CheckTime and CurTime ( ) >= CheckTime then
gamemode.Call ( " EndRound " , TEAM_HUMAN )
end
end )
hook.Add ( " DoPlayerDeath " , " zombieescape " , function ( pl , attacker , dmginfo )
pl.KilledPos = pl : GetPos ( )
if pl : Team ( ) == TEAM_UNDEAD then
if attacker : IsValid ( ) and attacker : GetClass ( ) == " trigger_hurt " --[[and dmginfo:GetDamage() >= 1000]] then
pl.KilledByTriggerHurt = CurTime ( )
pl.NextSpawnTime = CurTime ( ) + 10
elseif GAMEMODE.RoundEnded then
pl.NextSpawnTime = CurTime ( ) + 9999
else
pl.NextSpawnTime = CurTime ( ) + 5
end
end
end )