mirror of
https://github.com/fortressforever/fortressforever-scripts.git
synced 2024-11-29 15:51:42 +00:00
dd72eaa6fb
Added DEFENDERS_OBJECTIVE_ONCAP, _ONFLAG, AND _ONCARRIER globals to allow for different objectives on D Added UpdateDefendersObjective() function - makes it easier to change objective and removes some redundancy
855 lines
30 KiB
Lua
855 lines
30 KiB
Lua
-- base_ad.lua
|
|
-- Attack / Defend gametype
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- includes
|
|
-----------------------------------------------------------------------------
|
|
IncludeScript("base_teamplay")
|
|
|
|
-----------------------------------------------------------------------------
|
|
-- globals
|
|
-----------------------------------------------------------------------------
|
|
if NUM_PHASES == nil then NUM_PHASES = 3; end
|
|
if INITIAL_ROUND_LENGTH == nil then INITIAL_ROUND_LENGTH = 90
|
|
POINTS_PER_CAPTURE = 25
|
|
POINTS_PER_PERIOD = 1
|
|
POSTCAP_TIMER = 2
|
|
|
|
if ATTACKERS == nil then ATTACKERS = Team.kBlue; end
|
|
if DEFENDERS == nil then DEFENDERS = Team.kRed; end
|
|
--if MAP_LENGTH == nil then MAP_LENGTH = 1436; end -- 23 minutes 56 seconds, 4 seconds less than the default timelimit of 24 minutes.
|
|
|
|
if ATTACKERS_OBJECTIVE_ENTITY == nil then ATTACKERS_OBJECTIVE_ENTITY = nil end
|
|
if DEFENDERS_OBJECTIVE_ENTITY == nil then DEFENDERS_OBJECTIVE_ENTITY = nil end
|
|
-- _ONCAP set to true; Defenders should always point to cap
|
|
if DEFENDERS_OBJECTIVE_ONCAP == nil then DEFENDERS_OBJECTIVE_ONCAP = true end
|
|
-- _OBJECTIVE_ONCARRIER and _ONFLAG set to false to keep objective on cap
|
|
if DEFENDERS_OBJECTIVE_ONFLAG == nil then DEFENDERS_OBJECTIVE_ONFLAG = false end
|
|
if DEFENDERS_OBJECTIVE_ONCARRIER == nil then DEFENDERS_OBJECTIVE_ONCARRIER = false end
|
|
|
|
INITIAL_FUSE_TIMER = 80
|
|
BLOW_CP1_ROUTE_TIMER = 300
|
|
BLOW_CP2_ROUTE_TIMER = 780
|
|
|
|
allow_win = true
|
|
phase = 1
|
|
current_timer = 0
|
|
carried_by = nil
|
|
|
|
function startup( )
|
|
|
|
SetGameDescription( "Attack Defend" )
|
|
|
|
-- 4 seconds less than mp_timelimit, just as was the case when it was fixed (I assume it always takes 4 seconds to initialise?)
|
|
MAP_LENGTH = (60 * GetConvar( "mp_timelimit" )) - 4;
|
|
PERIOD_TIME = MAP_LENGTH * POINTS_PER_PERIOD / 100;
|
|
|
|
-- set up team limit
|
|
-- disable all teams
|
|
for i = Team.kBlue, Team.kGreen do
|
|
local team = GetTeam( i )
|
|
if i then
|
|
team:SetPlayerLimit( -1 )
|
|
end
|
|
end
|
|
|
|
-- then re-enable attackers/defenders
|
|
local team = GetTeam( ATTACKERS )
|
|
team:SetPlayerLimit( 0 )
|
|
team:SetClassLimit( Player.kCivilian, -1 )
|
|
|
|
local team = GetTeam( DEFENDERS )
|
|
team:SetPlayerLimit( 0 )
|
|
team:SetClassLimit( Player.kCivilian, -1 )
|
|
team:SetClassLimit(Player.kScout, -1)
|
|
|
|
-- Should this be map specific?
|
|
SetTeamName( ATTACKERS, "#FF_Attackers")
|
|
SetTeamName( DEFENDERS, "#FF_Defenders" )
|
|
|
|
-- start the timer for the points
|
|
AddScheduleRepeating( "addpoints", PERIOD_TIME, addpoints )
|
|
|
|
setup_door_timer( "cp1_gate", INITIAL_ROUND_LENGTH )
|
|
setup_map_timers()
|
|
|
|
allow_win = true
|
|
|
|
cp1_flag.enabled = true
|
|
cp1_flag.team = ATTACKERS
|
|
for i,v in ipairs({"cp1_flag", "cp2_flag", "cp3_flag"}) do
|
|
local flag = GetInfoScriptByName(v)
|
|
if flag then
|
|
flag:SetModel(_G[v].model)
|
|
flag:SetSkin(teamskins[ATTACKERS])
|
|
if i == 1 then
|
|
flag:Restore()
|
|
else
|
|
flag:Remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Remove future phase flags
|
|
flag_remove( "cp2_flag" )
|
|
flag_remove( "cp3_flag" )
|
|
|
|
-- add map initialise stuff. Needs to be done via lua for synchronisation
|
|
AddSchedule("blow_first_gate", INITIAL_FUSE_TIMER, blow_first_gate )
|
|
AddSchedule("blow_cp1_extra_route", BLOW_CP1_ROUTE_TIMER, blow_cp1_extra_route )
|
|
AddSchedule("blow_cp2_extra_route", BLOW_CP2_ROUTE_TIMER, blow_cp2_extra_route )
|
|
|
|
ATTACKERS_OBJECTIVE_ENTITY = GetEntityByName( "cp"..phase.."_flag" )
|
|
UpdateDefendersObjective()
|
|
UpdateTeamObjectiveIcon( GetTeam(ATTACKERS), ATTACKERS_OBJECTIVE_ENTITY )
|
|
end
|
|
|
|
function blow_first_gate( )
|
|
OutputEvent( "fuse01", "StartForward" ) -- delay of 80 secs
|
|
end
|
|
|
|
function blow_cp1_extra_route( )
|
|
OutputEvent( "cp1_extraroute", "Break" ) -- delay of 300 secs
|
|
end
|
|
|
|
function blow_cp2_extra_route( )
|
|
OutputEvent( "cp2_extraroute", "Break" ) -- delay of 780 secs
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
-- Remove a flag by name
|
|
-----------------------------------------
|
|
function flag_remove( flag_name )
|
|
local flag = GetInfoScriptByName( flag_name )
|
|
if flag then
|
|
flag:Remove()
|
|
_G[flag_name].enabled = false
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
-- Restore a flag by name
|
|
-----------------------------------------
|
|
function flag_restore( flag_name )
|
|
local flag = GetInfoScriptByName( flag_name )
|
|
if flag then
|
|
flag:Restore()
|
|
_G[flag_name].enabled = true
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
--
|
|
-----------------------------------------
|
|
function player_spawn( player_entity )
|
|
local player = CastToPlayer( player_entity )
|
|
player:AddHealth( 400 )
|
|
player:AddArmor( 400 )
|
|
|
|
-- Remove stuff
|
|
player:RemoveAmmo( Ammo.kNails, 400 )
|
|
player:RemoveAmmo( Ammo.kShells, 400 )
|
|
player:RemoveAmmo( Ammo.kRockets, 400 )
|
|
player:RemoveAmmo( Ammo.kCells, 400 )
|
|
player:RemoveAmmo( Ammo.kGren2, 4 )
|
|
|
|
-- Add items (similar to both teams)
|
|
player:AddAmmo( Ammo.kShells, 200 )
|
|
player:AddAmmo( Ammo.kRockets, 30 )
|
|
player:AddAmmo( Ammo.kNails, 200 )
|
|
|
|
-- Defenders get...
|
|
if player:GetTeamId() == DEFENDERS then
|
|
-- Player is at full armor now, so we can
|
|
-- easily reduce by some percent
|
|
-- but were not going to because
|
|
-- theres no reason to do so
|
|
-- player:RemoveArmor( ( player:GetArmor() * .25 ) )
|
|
|
|
player:RemoveAmmo( Ammo.kGren1, 4 )
|
|
player:AddAmmo( Ammo.kCells, 200 )
|
|
elseif player:GetTeamId() == ATTACKERS then
|
|
-- Attackers get...
|
|
player:AddAmmo( Ammo.kCells, 200 )
|
|
end
|
|
|
|
if player:GetTeamId() == ATTACKERS then
|
|
UpdateObjectiveIcon( player, ATTACKERS_OBJECTIVE_ENTITY )
|
|
elseif player:GetTeamId() == DEFENDERS then
|
|
UpdateObjectiveIcon( player, DEFENDERS_OBJECTIVE_ENTITY )
|
|
end
|
|
end
|
|
|
|
function addpoints( )
|
|
local team = GetTeam( DEFENDERS )
|
|
team:AddScore( POINTS_PER_PERIOD )
|
|
end
|
|
|
|
-----------------------------------------
|
|
-- base flag
|
|
-----------------------------------------
|
|
-- default
|
|
base_ad_flag = baseflag:new({
|
|
modelskin = teamskins[ATTACKERS],
|
|
name = "base_ad_flag",
|
|
team = ATTACKERS,
|
|
phase = 1,
|
|
hudicon = team_hudicons[ATTACKERS],
|
|
touchflags = {AllowFlags.kOnlyPlayers, AllowFlags.kBlue, AllowFlags.kGreen, AllowFlags.kYellow}
|
|
})
|
|
|
|
-- if ATTACKERS == Team.kRed then
|
|
-- ConsoleToAll("Setting up RED ATTACKERS FLAG")
|
|
-- base_ad_flag.hudicon = "hud_flag_red.vtf"
|
|
-- base_ad_flag.touchflags = {AllowFlags.kOnlyPlayers, AllowFlags.kRed}
|
|
-- elseif ATTACKERS == Team.kGreen then
|
|
-- ConsoleToAll("Setting up GREEN ATTACKERS FLAG")
|
|
-- base_ad_flag.hudicon = "hud_flag_green.vtf"
|
|
-- base_ad_flag.touchflags = {AllowFlags.kOnlyPlayers, AllowFlags.kGreen}
|
|
-- elseif ATTACKERS == Team.kBlue then
|
|
-- ConsoleToAll("Setting up BLUE ATTACKERS FLAG")
|
|
-- base_ad_flag.hudicon = "hud_flag_blue.vtf"
|
|
-- base_ad_flag.touchflags = {AllowFlags.kOnlyPlayers, AllowFlags.kBlue}
|
|
-- elseif ATTACKERS == Team.kYellow then
|
|
-- ConsoleToAll("Setting up Yellow ATTACKERS FLAG")
|
|
-- base_ad_flag.hudicon = "hud_flag_yellow.vtf"
|
|
-- base_ad_flag.touchflags = {AllowFlags.kOnlyPlayers, AllowFlags.kYellow}
|
|
-- end
|
|
end
|
|
|
|
function base_ad_flag:dropitemcmd( owner_entity )
|
|
-- DO NOTHING!
|
|
-- -- throw the flag
|
|
-- local flag = CastToInfoScript(entity)
|
|
-- flag:Drop(FLAG_RETURN_TIME, FLAG_THROW_SPEED)
|
|
--
|
|
-- if IsPlayer( owner_entity ) then
|
|
-- local player = CastToPlayer( owner_entity )
|
|
-- player:RemoveEffect( EF.kSpeedlua1 )
|
|
--
|
|
-- -- Remove any hud icons with identifier "base_ad_flag"
|
|
-- RemoveHudItem( player, "base_ad_flag" )
|
|
-- end
|
|
end
|
|
|
|
|
|
function base_ad_flag:touch( touch_entity )
|
|
-- should only respond to players
|
|
if (IsPlayer(touch_entity) == false) then
|
|
return
|
|
end
|
|
|
|
local player = CastToPlayer(touch_entity)
|
|
local teamId = player:GetTeamId()
|
|
|
|
-- pickup if they can
|
|
if self.notouch then
|
|
if self.notouch[player:GetId()] then return; end
|
|
end
|
|
|
|
if teamId == ATTACKERS and phase == self.phase then
|
|
if phase == 1 then
|
|
--BroadCastMessageToPlayer(player, "#FF_AD_TAKE1")
|
|
SmartMessage(player, "#FF_AD_TAKE1", "#FF_TEAMPICKUP", "#FF_OTHERTEAMPICKUP", Color.kGreen, Color.kGreen, Color.kRed)
|
|
elseif phase == 2 then
|
|
--BroadCastMessageToPlayer(player, "#FF_AD_TAKE2")
|
|
SmartMessage(player, "#FF_AD_TAKE2", "#FF_TEAMPICKUP", "#FF_OTHERTEAMPICKUP", Color.kGreen, Color.kGreen, Color.kRed)
|
|
else
|
|
--BroadCastMessageToPlayer(player, "#FF_AD_TAKE3")
|
|
SmartMessage(player, "#FF_AD_TAKE3", "#FF_TEAMPICKUP", "#FF_OTHERTEAMPICKUP", Color.kGreen, Color.kGreen, Color.kRed)
|
|
end
|
|
|
|
SmartSound(player, "yourteam.flagstolen", "yourteam.flagstolen", "otherteam.flagstolen")
|
|
RandomFlagTouchSpeak( player )
|
|
|
|
-- have player pick up the flag and lose his disguise (for spy class)
|
|
local flag = CastToInfoScript( entity )
|
|
if flag ~= nil then
|
|
flag:Pickup( player)
|
|
player:AddEffect( EF.kSpeedlua1, -1, 0, 0.65 )
|
|
player:SetDisguisable( false )
|
|
-- if the player is a spy, then force him to lose his cloak
|
|
player:SetCloakable( false )
|
|
|
|
self.hudicon = team_hudicons[ATTACKERS]
|
|
-- Add hud icon to show we're carrying the flag
|
|
AddHudIcon( player, self.hudicon, flag:GetName(), self.hudx, self.hudy, self.hudstatusiconw, self.hudstatusiconh, self.hudalign )
|
|
|
|
-- change objective icons
|
|
ATTACKERS_OBJECTIVE_ENTITY = player
|
|
UpdateDefendersObjective()
|
|
UpdateTeamObjectiveIcon( GetTeam(ATTACKERS), ATTACKERS_OBJECTIVE_ENTITY )
|
|
UpdateObjectiveIcon( player, GetEntityByName( "cp"..self.phase.."_cap" ) )
|
|
|
|
LogLuaEvent(player:GetId(), 0, "flag_touch", "flag_name", flag:GetName(), "player_origin", (string.format("%0.2f",player:GetOrigin().x) .. ", " .. string.format("%0.2f",player:GetOrigin().y) .. ", " .. string.format("%0.1f",player:GetOrigin().z) ), "player_health", "" .. player:GetHealth());
|
|
-- show on the deathnotice board
|
|
--ObjectiveNotice( player, "grabbed the flag" )
|
|
|
|
carried_by = player:GetName()
|
|
destroy_return_timer()
|
|
update_hud()
|
|
end
|
|
end
|
|
end
|
|
|
|
function base_ad_flag:onownerdie( owner_entity )
|
|
if IsPlayer( owner_entity ) then
|
|
local player = CastToPlayer( owner_entity )
|
|
player:RemoveEffect( EF.kSpeedlua1 )
|
|
|
|
player:SetDisguisable( true )
|
|
player:SetCloakable( true )
|
|
|
|
-- Remove any hud icons with identifier "base_ad_flag"
|
|
RemoveHudItem( player, "base_ad_flag" )
|
|
|
|
-- drop the flag
|
|
local flag = CastToInfoScript(entity)
|
|
flag:Drop(FLAG_RETURN_TIME, 0.0)
|
|
|
|
-- change objective icon
|
|
ATTACKERS_OBJECTIVE_ENTITY = flag
|
|
UpdateDefendersObjective()
|
|
UpdateObjectiveIcon( player, nil )
|
|
UpdateTeamObjectiveIcon( GetTeam(ATTACKERS), ATTACKERS_OBJECTIVE_ENTITY )
|
|
|
|
-- remove flag icon from hud
|
|
RemoveHudItem( player, flag:GetName() )
|
|
RemoveHudItemFromAll( flag:GetName() .. "_c" )
|
|
AddHudIconToAll( self.hudstatusicondropped, ( flag:GetName() .. "_d" ), self.hudstatusiconx, self.hudstatusicony, self.hudstatusiconw, self.hudstatusiconh, self.hudstatusiconalign )
|
|
self.status = 2
|
|
|
|
setup_return_timer()
|
|
update_hud()
|
|
end
|
|
end
|
|
|
|
function base_ad_flag:onreturn( )
|
|
-- let the teams know that the flag was returned
|
|
local team = GetTeam( self.team )
|
|
SmartTeamMessage(team, "#FF_TEAMRETURN", "#FF_OTHERTEAMRETURN", Color.kYellow, Color.kYellow)
|
|
SmartTeamSound(team, "yourteam.flagreturn", "otherteam.flagreturn")
|
|
SmartTeamSpeak(team, "CTF_FLAGBACK", "CTF_EFLAGBACK")
|
|
local flag = CastToInfoScript( entity )
|
|
|
|
RemoveHudItemFromAll( flag:GetName() .. "_d" )
|
|
RemoveHudItemFromAll( flag:GetName() .. "_c" )
|
|
AddHudIconToAll( self.hudstatusiconhome, ( flag:GetName() .. "_h" ), self.hudstatusiconx, self.hudstatusicony, self.hudstatusiconw, self.hudstatusiconh, self.hudstatusiconalign )
|
|
self.status = 0
|
|
|
|
-- change objective icon
|
|
ATTACKERS_OBJECTIVE_ENTITY = flag
|
|
UpdateDefendersObjective()
|
|
UpdateTeamObjectiveIcon( GetTeam(ATTACKERS), ATTACKERS_OBJECTIVE_ENTITY )
|
|
|
|
LogLuaEvent(0, 0, "flag_returned","flag_name",flag:GetName());
|
|
|
|
destroy_return_timer()
|
|
update_hud()
|
|
end
|
|
|
|
-----------------------------------------
|
|
-- base capture point
|
|
-----------------------------------------
|
|
base_ad_cap = basecap:new({
|
|
phase = 0,
|
|
doorname = "cp2_gate",
|
|
duration = 90,
|
|
team = ATTACKERS
|
|
})
|
|
|
|
function base_ad_cap:allowed ( allowed_entity )
|
|
if phase ~= self.phase then
|
|
return false
|
|
end
|
|
|
|
-- only respond to players
|
|
if ( IsPlayer( allowed_entity ) == false ) then
|
|
return false
|
|
end
|
|
|
|
if allow_win == false then
|
|
return false
|
|
end
|
|
|
|
local player = CastToPlayer( allowed_entity )
|
|
|
|
-- check if the player has the flag
|
|
for i,v in ipairs( self.item ) do
|
|
if player:HasItem( v ) then
|
|
player:RemoveEffect( EF.kSpeedlua1 )
|
|
|
|
-- Remove any hud icons with identifier "base_ad_flag"
|
|
RemoveHudItem( player, "base_ad_flag" )
|
|
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function base_ad_cap:oncapture( player, item )
|
|
|
|
if phase == 1 then
|
|
map_cap1()
|
|
elseif phase == 2 then
|
|
map_cap2()
|
|
else
|
|
allow_win = false
|
|
map_attackers_win()
|
|
end
|
|
|
|
player:AddFortPoints(500, "#FF_FORTPOINTS_CAPTUREPOINT")
|
|
|
|
if self.closedoor then
|
|
CloseDoor(self.closedoor)
|
|
end
|
|
|
|
-- remove objective icon
|
|
ATTACKERS_OBJECTIVE_ENTITY = nil
|
|
DEFENDERS_OBJECTIVE_ENTITY = nil
|
|
UpdateTeamObjectiveIcon( GetTeam(ATTACKERS), ATTACKERS_OBJECTIVE_ENTITY )
|
|
UpdateTeamObjectiveIcon( GetTeam(DEFENDERS), DEFENDERS_OBJECTIVE_ENTITY )
|
|
|
|
-- Remove previous phase flag
|
|
flag_remove( item )
|
|
|
|
-- Delay for a couple seconds after the cap
|
|
AddSchedule( "cap_delay_timer", POSTCAP_TIMER, cap_delay_timer, self )
|
|
end
|
|
|
|
-----------------------------------------
|
|
-- waste a couple seconds before respawning/ending
|
|
-----------------------------------------
|
|
function cap_delay_timer( cap )
|
|
if phase == NUM_PHASES then
|
|
-- it's the last round. end and stuff
|
|
GoToIntermission()
|
|
RemoveSchedule( "addpoints" )
|
|
else
|
|
phase = phase + 1
|
|
|
|
-- setup double cap points for the last round
|
|
if phase == NUM_PHASES then
|
|
POINTS_PER_CAPTURE = POINTS_PER_CAPTURE * 2
|
|
end
|
|
|
|
-- Restore next flag
|
|
if phase == 2 then
|
|
flag_restore( "cp2_flag" )
|
|
elseif phase == 3 then
|
|
flag_restore( "cp3_flag" )
|
|
end
|
|
|
|
-- update objective icon
|
|
ATTACKERS_OBJECTIVE_ENTITY = GetEntityByName( "cp"..phase.."_flag" )
|
|
UpdateDefendersObjective()
|
|
|
|
setup_door_timer( cap.doorname, cap.duration)
|
|
ApplyToAll( { AT.kRemovePacks, AT.kRemoveProjectiles, AT.kRespawnPlayers, AT.kRemoveBuildables, AT.kRemoveRagdolls, AT.kStopPrimedGrens, AT.kReloadClips } )
|
|
end
|
|
end
|
|
|
|
function setup_door_timer( doorname, duration )
|
|
AddSchedule( "round_start", duration, round_start, doorname )
|
|
if duration > 65 then AddSchedule( "round_60secwarn", duration-60, round_60secwarn ) end
|
|
if duration > 35 then AddSchedule( "round_30secwarn", duration-30, round_30secwarn ) end
|
|
if duration > 15 then AddSchedule( "round_10secwarn", duration-10, round_10secwarn ) end
|
|
end
|
|
|
|
function round_start( doorname )
|
|
BroadCastMessage( "#FF_AD_GATESOPEN" )
|
|
BroadCastSound( "otherteam.flagstolen" )
|
|
SpeakAll( "AD_GATESOPEN" )
|
|
OpenDoor( doorname )
|
|
end
|
|
|
|
function round_60secwarn( )
|
|
BroadCastMessage( "#FF_ROUND_60SECWARN" )
|
|
end
|
|
|
|
function round_30secwarn( )
|
|
BroadCastMessage( "#FF_ROUND_30SECWARN" )
|
|
end
|
|
|
|
function round_10secwarn( )
|
|
BroadCastMessage( "#FF_ROUND_10SECWARN" )
|
|
end
|
|
|
|
|
|
----------------
|
|
-- map timers --
|
|
----------------
|
|
|
|
function setup_map_timers( )
|
|
local timelimit = MAP_LENGTH
|
|
|
|
AddSchedule( "map_10mintimer", timelimit-600, map_timewarn, 600 )
|
|
AddSchedule( "map_5mintimer", timelimit-300, map_timewarn, 300 )
|
|
AddSchedule( "map_2mintimer", timelimit-120, map_timewarn, 120 )
|
|
AddSchedule( "map_60sectimer", timelimit-60, map_timewarn, 60 )
|
|
AddSchedule( "map_30sectimer", timelimit-30, map_timewarn, 30 )
|
|
AddSchedule( "map_10sectimer", timelimit-10, map_timewarn, 10 )
|
|
AddSchedule( "map_9sectimer", timelimit-9, map_timewarn, 9 )
|
|
AddSchedule( "map_8sectimer", timelimit-8, map_timewarn, 8 )
|
|
AddSchedule( "map_7sectimer", timelimit-7, map_timewarn, 7 )
|
|
AddSchedule( "map_6sectimer", timelimit-6, map_timewarn, 6 )
|
|
AddSchedule( "map_5sectimer", timelimit-5, map_timewarn, 5 )
|
|
AddSchedule( "map_4sectimer", timelimit-4, map_timewarn, 4 )
|
|
AddSchedule( "map_3sectimer", timelimit-3, map_timewarn, 3 )
|
|
AddSchedule( "map_2sectimer", timelimit-2, map_timewarn, 2 )
|
|
AddSchedule( "map_1sectimer", timelimit-1, map_timewarn, 1 )
|
|
AddSchedule( "map_timer", timelimit, map_defenders_win )
|
|
end
|
|
|
|
function map_attackers_win( )
|
|
RemoveSchedule( "map_10mintimer" )
|
|
RemoveSchedule( "map_5mintimer" )
|
|
RemoveSchedule( "map_2mintimer" )
|
|
RemoveSchedule( "map_60sectimer" )
|
|
RemoveSchedule( "map_30sectimer" )
|
|
RemoveSchedule( "map_10sectimer" )
|
|
RemoveSchedule( "map_9sectimer" )
|
|
RemoveSchedule( "map_8sectimer" )
|
|
RemoveSchedule( "map_7sectimer" )
|
|
RemoveSchedule( "map_6sectimer" )
|
|
RemoveSchedule( "map_5sectimer" )
|
|
RemoveSchedule( "map_4sectimer" )
|
|
RemoveSchedule( "map_3sectimer" )
|
|
RemoveSchedule( "map_2sectimer" )
|
|
RemoveSchedule( "map_1sectimer" )
|
|
RemoveSchedule( "map_timer" )
|
|
BroadCastSound( "yourteam.flagcap" )
|
|
--BroadCastMessage("#FF_AD_" .. TeamName(ATTACKERS) .. "#FF_WIN")
|
|
BroadCastMessage( "#FF_AD_BLUEWIN" )
|
|
--SpeakAll( "AD_" .. TeamName( ATTACKERS ) .. "CAP".. TeamName( DEFENDERS ) )
|
|
SpeakAll( "AD_CAP" )
|
|
end
|
|
|
|
function map_defenders_win( )
|
|
if allow_win == false then
|
|
return false
|
|
end
|
|
|
|
--BroadCastSound("yourteam.flagcap")
|
|
BroadCastMessage("#FF_AD_REDWIN")
|
|
--SpeakAll( "AD_HOLD_" .. TeamName(DEFENDERS) )
|
|
SpeakAll( "AD_HOLD" )
|
|
allow_win = false
|
|
--Defenders wins, call Intermission!
|
|
phase = NUM_PHASES
|
|
RemoveSchedule( "addpoints" )
|
|
addpoints()
|
|
AddSchedule( "cap_delay_timer", POSTCAP_TIMER, cap_delay_timer, self )
|
|
end
|
|
|
|
function map_timewarn( time )
|
|
BroadCastMessage( "#FF_MAP_" .. time .. "SECWARN" )
|
|
SpeakAll( "AD_" .. time .. "SEC" )
|
|
end
|
|
|
|
function map_cap1( )
|
|
BroadCastSound( "yourteam.flagcap" )
|
|
BroadCastMessage( "#FF_AD_CAP1" )
|
|
SpeakAll( "AD_CP1" )
|
|
--SpeakAll("AD_CP1_" .. TeamName(ATTACKERS))
|
|
end
|
|
|
|
function map_cap2( )
|
|
BroadCastSound( "yourteam.flagcap" )
|
|
BroadCastMessage( "#FF_AD_CAP2" )
|
|
SpeakAll( "AD_CP2" )
|
|
--SpeakAll("AD_CP2_" .. TeamName(ATTACKERS))
|
|
end
|
|
|
|
function timer_schedule()
|
|
current_timer = current_timer -1
|
|
end
|
|
|
|
function setup_return_timer()
|
|
RemoveSchedule( "timer_tobase_schedule" )
|
|
current_timer = FLAG_RETURN_TIME
|
|
|
|
AddScheduleRepeatingNotInfinitely( "timer_return_schedule", 1, timer_schedule, current_timer)
|
|
end
|
|
|
|
function destroy_return_timer()
|
|
RemoveSchedule( "timer_return_schedule" )
|
|
end
|
|
|
|
-----------------------------------------
|
|
-- spawn info stuffs
|
|
-----------------------------------------
|
|
function start_allowedmethod( self, player_entity )
|
|
|
|
if ( IsPlayer( player_entity ) == false ) then
|
|
return false
|
|
end
|
|
|
|
local player = CastToPlayer( player_entity )
|
|
local teamId = player:GetTeamId( )
|
|
|
|
return (teamId == ATTACKERS and phase == 1)
|
|
end
|
|
|
|
function alpha_allowedmethod( self, player_entity )
|
|
if ( IsPlayer( player_entity ) == false ) then
|
|
return false
|
|
end
|
|
|
|
local player = CastToPlayer( player_entity )
|
|
local teamId = player:GetTeamId( )
|
|
|
|
return (teamId == ATTACKERS and phase == 2)
|
|
or (teamId == DEFENDERS and phase == 1)
|
|
end
|
|
|
|
function beta_allowedmethod( self, player_entity )
|
|
if ( IsPlayer( player_entity ) == false ) then
|
|
return false
|
|
end
|
|
|
|
local player = CastToPlayer( player_entity )
|
|
local teamId = player:GetTeamId( )
|
|
|
|
return (teamId == ATTACKERS and phase == 3)
|
|
or (teamId == DEFENDERS and phase == 2)
|
|
end
|
|
|
|
function final_allowedmethod( self, player_entity )
|
|
if ( IsPlayer( player_entity ) == false ) then
|
|
return false
|
|
end
|
|
|
|
local player = CastToPlayer( player_entity )
|
|
local teamId = player:GetTeamId( )
|
|
|
|
return (teamId == DEFENDERS and phase == 3)
|
|
end
|
|
|
|
function UpdateDefendersObjective()
|
|
-- Check to see what Defenders should be focused on and update
|
|
local flag = GetInfoScriptByName("cp"..phase.."_flag")
|
|
local carried = flag:IsCarried()
|
|
if (not carried and DEFENDERS_OBJECTIVE_ONFLAG) or (carried and DEFENDERS_OBJECTIVE_ONCARRIER) then
|
|
DEFENDERS_OBJECTIVE_ENTITY = flag
|
|
elseif DEFENDERS_OBJECTIVE_ONCAP then
|
|
DEFENDERS_OBJECTIVE_ENTITY = GetEntityByName("cp"..phase.."_cap")
|
|
else
|
|
DEFENDERS_OBJECTIVE_ENTITY = nil
|
|
end
|
|
UpdateTeamObjectiveIcon( GetTeam(defenders), DEFENDERS_OBJECTIVE_ENTITY )
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
-- instanciate everything
|
|
-----------------------------------------
|
|
cp1_flag = base_ad_flag:new({ phase = 1 })
|
|
cp2_flag = base_ad_flag:new({ phase = 2 })
|
|
cp3_flag = base_ad_flag:new({ phase = 3 })
|
|
|
|
cp1_cap = base_ad_cap:new({ item={"cp1_flag"}, phase = 1, doorname = "cp2_gate", closedoor = "cp1_exit"})
|
|
cp2_cap = base_ad_cap:new({ item={"cp2_flag"}, phase = 2, doorname = "cp3_gate", closedoor = "cp2_exit"})
|
|
cp3_cap = base_ad_cap:new({ item={"cp3_flag"}, phase = 3, doorname = "", closedoor = "cp3_exit"})
|
|
|
|
start_door = respawndoor:new({allowed = start_allowedmethod})
|
|
start_spawn = {validspawn = start_allowedmethod}
|
|
alpha_door = respawndoor:new({allowed = alpha_allowedmethod})
|
|
alpha_spawn = {validspawn = alpha_allowedmethod}
|
|
beta_door = respawndoor:new({allowed = beta_allowedmethod})
|
|
beta_spawn = {validspawn = beta_allowedmethod}
|
|
final_door = respawndoor:new({allowed = final_allowedmethod})
|
|
final_spawn = {validspawn = final_allowedmethod}
|
|
|
|
|
|
------------------------------------------------
|
|
-- hud info
|
|
------------------------------------------------
|
|
function flaginfo( player_entity )
|
|
|
|
local player = CastToPlayer( player_entity )
|
|
|
|
local flag = GetInfoScriptByName("cp"..phase.."_flag")
|
|
local flagname = flag:GetName()
|
|
|
|
attackers = ATTACKERS
|
|
defenders = DEFENDERS
|
|
|
|
--RemoveHudItemFromAll( "background" )
|
|
--AddHudIconToAll( "hud_statusbar_256_128.vtf", "background", -64, 32, 128, 70, 3 )
|
|
|
|
RemoveHudItem( player, "cp_flag_c" )
|
|
RemoveHudItem( player, "cp_flag_d" )
|
|
RemoveHudItem( player, "cp_flag_h" )
|
|
RemoveHudItem( player, "flag_tobase_timer" )
|
|
RemoveHudItem( player, "flag_tobase_text" )
|
|
RemoveHudItem( player, "flag_return_timer" )
|
|
RemoveHudItem( player, "flag_return_text" )
|
|
RemoveHudItem( player, "flag_carried_by" )
|
|
RemoveHudItem( player, "flag_carried_by2" )
|
|
RemoveHudItem( player, "flag_athome" )
|
|
RemoveHudItem( player, "flag_athome2" )
|
|
|
|
if attackers == Team.kBlue then
|
|
hudstatusicondropped = "hud_flag_dropped_blue.vtf"
|
|
hudstatusiconhome = "hud_flag_home_blue.vtf"
|
|
hudstatusiconcarried = "hud_flag_carried_blue.vtf"
|
|
hudstatusicontobase = "hud_flag_home_l.vtf"
|
|
elseif attackers == Team.kRed then
|
|
hudstatusicondropped = "hud_flag_dropped_red.vtf"
|
|
hudstatusiconhome = "hud_flag_home_red.vtf"
|
|
hudstatusiconcarried = "hud_flag_carried_red.vtf"
|
|
hudstatusicontobase = "hud_flag_home_r.vtf"
|
|
elseif attackers == Team.kYellow then
|
|
hudstatusicondropped = "hud_flag_dropped_yellow.vtf"
|
|
hudstatusiconhome = "hud_flag_home_yellow.vtf"
|
|
hudstatusiconcarried = "hud_flag_carried_yellow.vtf"
|
|
hudstatusicontobase = "hud_flag_home_l.vtf"
|
|
elseif attackers == Team.kGreen then
|
|
hudstatusicondropped = "hud_flag_dropped_green.vtf"
|
|
hudstatusiconhome = "hud_flag_home_green.vtf"
|
|
hudstatusiconcarried = "hud_flag_carried_green.vtf"
|
|
hudstatusicontobase = "hud_flag_home_r.vtf"
|
|
end
|
|
|
|
flag_hudstatusiconx = 4
|
|
flag_hudstatusicony = 42
|
|
flag_hudstatusiconw = 15
|
|
flag_hudstatusiconh = 15
|
|
flag_hudstatusiconalign = 3
|
|
text_hudstatusx = 0
|
|
text_hudstatusy = flag_hudstatusicony + 24
|
|
text_hudstatusalign = 4
|
|
|
|
if _G[flagname].enabled == true then
|
|
if flag:IsCarried() then
|
|
AddHudText(player, "flag_carried_by", "#AD_FlagCarriedBy", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
|
AddHudText(player, "flag_carried_by2", carried_by, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0)
|
|
AddHudIcon(player, hudstatusiconcarried, ( "cp_flag_c" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
|
elseif flag:IsDropped() and _G[flagname].status == 2 then
|
|
AddHudText(player, "flag_return_text", "#AD_FlagReturn", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
|
AddHudTimer(player, "flag_return_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
|
AddHudIcon(player, hudstatusicondropped, ( "cp_flag_d" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
|
elseif _G[flagname].status == 0 then
|
|
AddHudText(player, "flag_athome", "#AD_FlagIsAt", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
|
AddHudText(player, "flag_athome2", "#AD_ASpawn", text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0)
|
|
AddHudIcon(player, hudstatusiconhome, ( "cp_flag_h" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
|
end
|
|
end
|
|
|
|
RemoveHudItem( player, "Zone_Team"..attackers )
|
|
RemoveHudItem( player, "Zone_Team"..defenders )
|
|
RemoveHudItem( player, "Zone_Phase"..attackers )
|
|
RemoveHudItem( player, "Zone_Phase"..defenders )
|
|
|
|
od_hudstatusiconx = -28
|
|
od_hudstatusicony = 38
|
|
od_hudstatusiconw = 24
|
|
od_hudstatusiconh = 24
|
|
od_hudstatusiconalign = 3
|
|
|
|
if player:GetTeamId() == attackers then
|
|
AddHudIcon( player, "hud_offense.vtf", "Zone_Team"..attackers, od_hudstatusiconx, od_hudstatusicony, od_hudstatusiconw, od_hudstatusiconh, od_hudstatusiconalign )
|
|
AddHudIcon( player, "hud_cp_"..phase..".vtf", "Zone_Phase"..attackers, od_hudstatusiconx + 2, od_hudstatusicony + 2, 20, 20, od_hudstatusiconalign )
|
|
else
|
|
AddHudIcon( player, "hud_defense.vtf", "Zone_Team"..defenders, od_hudstatusiconx, od_hudstatusicony, od_hudstatusiconw, od_hudstatusiconh, od_hudstatusiconalign )
|
|
AddHudIcon( player, "hud_cp_"..phase..".vtf", "Zone_Phase"..defenders, od_hudstatusiconx + 2, od_hudstatusicony + 2, 20, 20, od_hudstatusiconalign )
|
|
end
|
|
|
|
end
|
|
|
|
function update_hud()
|
|
|
|
local flag = GetInfoScriptByName("cp"..phase.."_flag")
|
|
local flagname = flag:GetName()
|
|
|
|
attackers = ATTACKERS
|
|
defenders = DEFENDERS
|
|
|
|
--RemoveHudItemFromAll( "background" )
|
|
--AddHudIconToAll( "hud_statusbar_256_128.vtf", "background", -64, 32, 128, 70, 3 )
|
|
|
|
RemoveHudItemFromAll( "cp_flag_c" )
|
|
RemoveHudItemFromAll( "cp_flag_d" )
|
|
RemoveHudItemFromAll( "cp_flag_h" )
|
|
RemoveHudItemFromAll( "flag_tobase_timer" )
|
|
RemoveHudItemFromAll( "flag_tobase_text" )
|
|
RemoveHudItemFromAll( "flag_return_timer" )
|
|
RemoveHudItemFromAll( "flag_return_text" )
|
|
RemoveHudItemFromAll( "flag_carried_by" )
|
|
RemoveHudItemFromAll( "flag_carried_by2" )
|
|
RemoveHudItemFromAll( "flag_athome" )
|
|
RemoveHudItemFromAll( "flag_athome2" )
|
|
|
|
if attackers == Team.kBlue then
|
|
hudstatusicondropped = "hud_flag_dropped_blue.vtf"
|
|
hudstatusiconhome = "hud_flag_home_blue.vtf"
|
|
hudstatusiconcarried = "hud_flag_carried_blue.vtf"
|
|
hudstatusicontobase = "hud_flag_home_l.vtf"
|
|
elseif attackers == Team.kRed then
|
|
hudstatusicondropped = "hud_flag_dropped_red.vtf"
|
|
hudstatusiconhome = "hud_flag_home_red.vtf"
|
|
hudstatusiconcarried = "hud_flag_carried_red.vtf"
|
|
hudstatusicontobase = "hud_flag_home_r.vtf"
|
|
elseif attackers == Team.kYellow then
|
|
hudstatusicondropped = "hud_flag_dropped_yellow.vtf"
|
|
hudstatusiconhome = "hud_flag_home_yellow.vtf"
|
|
hudstatusiconcarried = "hud_flag_carried_yellow.vtf"
|
|
hudstatusicontobase = "hud_flag_home_l.vtf"
|
|
elseif attackers == Team.kGreen then
|
|
hudstatusicondropped = "hud_flag_dropped_green.vtf"
|
|
hudstatusiconhome = "hud_flag_home_green.vtf"
|
|
hudstatusiconcarried = "hud_flag_carried_green.vtf"
|
|
hudstatusicontobase = "hud_flag_home_r.vtf"
|
|
end
|
|
|
|
flag_hudstatusiconx = 4
|
|
flag_hudstatusicony = 42
|
|
flag_hudstatusiconw = 15
|
|
flag_hudstatusiconh = 15
|
|
flag_hudstatusiconalign = 3
|
|
text_hudstatusx = 0
|
|
text_hudstatusy = flag_hudstatusicony + 24
|
|
text_hudstatusalign = 4
|
|
|
|
if _G[flagname].enabled == true then
|
|
if flag:IsCarried() then
|
|
AddHudTextToAll("flag_carried_by", "#AD_FlagCarriedBy", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
|
AddHudTextToAll("flag_carried_by2", carried_by, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0)
|
|
AddHudIconToAll( hudstatusiconcarried, ( "cp_flag_c" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
|
elseif flag:IsDropped() and _G[flagname].status == 2 then
|
|
AddHudTextToAll("flag_return_text", "#AD_FlagReturn", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
|
AddHudTimerToAll("flag_return_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
|
AddHudIconToAll( hudstatusicondropped, ( "cp_flag_d" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
|
elseif _G[flagname].status == 0 then
|
|
AddHudTextToAll("flag_athome", "#AD_FlagIsAt", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
|
AddHudTextToAll("flag_athome2", "#AD_ASpawn", text_hudstatusx, text_hudstatusy+8, text_hudstatusalign, 0)
|
|
AddHudIconToAll( hudstatusiconhome, ( "cp_flag_h" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
|
end
|
|
else
|
|
AddHudTextToAll("flag_tobase_text", "#AD_FlagReturnBase", text_hudstatusx, text_hudstatusy, text_hudstatusalign, 0)
|
|
AddHudTimerToAll("flag_tobase_timer", current_timer + 1, -1, text_hudstatusx, text_hudstatusy+8, text_hudstatusalign)
|
|
AddHudIconToAll(hudstatusicontobase, ( "cp_flag_h" ), flag_hudstatusiconx, flag_hudstatusicony, flag_hudstatusiconw, flag_hudstatusiconh, flag_hudstatusiconalign )
|
|
end
|
|
|
|
RemoveHudItemFromAll( "Zone_Team"..attackers )
|
|
RemoveHudItemFromAll( "Zone_Team"..defenders )
|
|
RemoveHudItemFromAll( "Zone_Phase"..attackers )
|
|
RemoveHudItemFromAll( "Zone_Phase"..defenders )
|
|
|
|
od_hudstatusiconx = -28
|
|
od_hudstatusicony = 38
|
|
od_hudstatusiconw = 24
|
|
od_hudstatusiconh = 24
|
|
od_hudstatusiconalign = 3
|
|
|
|
AddHudIconToTeam( GetTeam(attackers), "hud_offense.vtf", "Zone_Team"..attackers, od_hudstatusiconx, od_hudstatusicony, od_hudstatusiconw, od_hudstatusiconh, od_hudstatusiconalign )
|
|
AddHudIconToTeam( GetTeam(attackers), "hud_cp_"..phase..".vtf", "Zone_Phase"..attackers, od_hudstatusiconx + 2, od_hudstatusicony + 2, 20, 20, od_hudstatusiconalign )
|
|
|
|
AddHudIconToTeam( GetTeam(defenders), "hud_defense.vtf", "Zone_Team"..defenders, od_hudstatusiconx, od_hudstatusicony, od_hudstatusiconw, od_hudstatusiconh, od_hudstatusiconalign )
|
|
AddHudIconToTeam( GetTeam(defenders), "hud_cp_"..phase..".vtf", "Zone_Phase"..defenders, od_hudstatusiconx + 2, od_hudstatusicony + 2, 20, 20, od_hudstatusiconalign )
|
|
|
|
end
|