mirror of
https://github.com/fortressforever/fortressforever-scripts.git
synced 2024-11-29 07:41:43 +00:00
378 lines
13 KiB
Lua
378 lines
13 KiB
Lua
|
-----------------------------------------------------------------------------
|
||
|
-- includes
|
||
|
-----------------------------------------------------------------------------
|
||
|
|
||
|
IncludeScript("base_idzone")
|
||
|
IncludeScript("base_location")
|
||
|
IncludeScript("base_respawnturret")
|
||
|
|
||
|
-----------------------------------------------------------------------------
|
||
|
-- global overrides that you can do what you want with
|
||
|
-----------------------------------------------------------------------------
|
||
|
|
||
|
FORT_POINTS_PER_INITIAL_TOUCH = 200
|
||
|
FORT_POINTS_PER_PERIOD = 50
|
||
|
FORT_POINTS_PER_DEFEND = 100
|
||
|
|
||
|
POINTS_PER_INITIAL_TOUCH = 1
|
||
|
POINTS_PER_PERIOD = 1
|
||
|
|
||
|
DELAY_BEFORE_PERIOD_POINTS = 2
|
||
|
PERIOD_TIME = 1
|
||
|
INITIAL_ROUND_PERIOD = 60
|
||
|
ROUND_SETUP_PERIOD = 17
|
||
|
|
||
|
DEFENSE_PERIOD_TIME = 60
|
||
|
POINTS_PER_DEFENSE_PERIOD = 1
|
||
|
|
||
|
DEFAULT_POINTS_TO_CAP = 10
|
||
|
NUMBER_OF_CAP_POINTS = 3
|
||
|
DELAY_BEFORE_TEAMSWITCH = 3
|
||
|
DELAY_AFTER_CAP = 3
|
||
|
|
||
|
ZONE_COLOR = "purple"
|
||
|
|
||
|
-----------------------------------------------------------------------------
|
||
|
-- Zone-controlling outputs
|
||
|
-----------------------------------------------------------------------------
|
||
|
|
||
|
function oncap_outputs()
|
||
|
|
||
|
OutputEvent( "shake"..phase, "StartShake" )
|
||
|
OutputEvent( "shakebreak"..phase, "Playsound" )
|
||
|
AddSchedule( "Partition_On", 4, OutputEvent,"cp"..phase.."_partition", "TurnOn")
|
||
|
AddSchedule( "Partition_Enabled", 4, OutputEvent,"cp"..phase.."_partition", "Enable")
|
||
|
AddSchedule( "Partition_Door_On", 4, OutputEvent, "cp"..phase.."_partition_door", "TurnOff")
|
||
|
AddSchedule( "Partition_Door_Enable", 4, OutputEvent, "cp"..phase.."_partition_door", "Disable")
|
||
|
AddSchedule( "Areaportal_On", 4, OutputEvent, "cp"..phase.."_areaportal_door", "Open")
|
||
|
AddSchedule( "Areaportal_Partition_On", 4, OutputEvent, "cp"..phase.."_areaportal", "Close")
|
||
|
AddSchedule( "alarm_voice", 2, OutputEvent, "voice1", "PlaySound")
|
||
|
AddSchedule( "alarm_text", 2, schedulemessagetoall, "Zone Captured!")
|
||
|
AddSchedule( "stop_voice", 2.5, OutputEvent, "voice1", "StopSound")
|
||
|
AddSchedule( "alarm_voices", 2.5, OutputEvent, "voice2", "PlaySound")
|
||
|
AddSchedule( "stop_voices", 2.975, OutputEvent, "voice2", "StopSound")
|
||
|
AddSchedule( "35 second warning", 7, schedulemessagetoall, "Gate Opens in 35 seconds!")
|
||
|
AddSchedule( "35 second warning_sound" , 7 , schedulesound, "misc.bloop" )
|
||
|
AddSchedule( "dooropen5sec_sound", 37, schedulecountdown, "5")
|
||
|
AddSchedule( "dooropen4sec_sound", 38, schedulecountdown, "4")
|
||
|
AddSchedule( "dooropen3sec_sound", 39, schedulecountdown, "3")
|
||
|
AddSchedule( "dooropen2sec_sound", 40, schedulecountdown, "2")
|
||
|
AddSchedule( "dooropen1sec_sound", 41, schedulecountdown, "1")
|
||
|
AddSchedule("alarm_events", 42, OutputEvent, "breakglass"..phase, "Break")
|
||
|
AddSchedule("alarm_sounds", 42, OutputEvent, "breakalarm"..phase, "PlaySound")
|
||
|
|
||
|
|
||
|
if phase == 1 then
|
||
|
defender_door_trigger1 = id_door:new({ team = attackers, door = "defender_door1" })
|
||
|
defender_door_trigger2 = id_door:new({ team = attackers, door = "defender_door2" })
|
||
|
end
|
||
|
if phase == 2 then
|
||
|
defender_door_trigger3 = id_door:new({ team = attackers, door = "defender_door3" })
|
||
|
defender_door_trigger4 = id_door:new({ team = attackers, door = "defender_door4" })
|
||
|
end
|
||
|
end
|
||
|
function oncap_outputs_nextphase()
|
||
|
RespawnAllPlayers()
|
||
|
|
||
|
end
|
||
|
function onreset_outputs()
|
||
|
OutputEvent( "breakalarm"..phase, "Playsound" )
|
||
|
OutputEvent( "shake"..phase, "StartShake" )
|
||
|
OutputEvent( "shakebreak"..phase, "Playsound" )
|
||
|
AddSchedule( "alarm_voice", 2, OutputEvent, "voice1", "PlaySound")
|
||
|
AddSchedule( "alarm_text", 2, schedulemessagetoall, "Zone Captured!")
|
||
|
AddSchedule( "stop_voice", 2.5, OutputEvent, "voice1", "StopSound")
|
||
|
AddSchedule( "alarm_voices", 2.5, OutputEvent, "voice2", "PlaySound")
|
||
|
AddSchedule( "stop_voices", 2.97, OutputEvent, "voice2", "StopSound")
|
||
|
end
|
||
|
|
||
|
function zone_on_outputs()
|
||
|
|
||
|
-- use for entities that have two copies per zone (e.g. rotate1 and rotate2)
|
||
|
two1 = phase * 2 - 1
|
||
|
two2 = phase * 2
|
||
|
-- use for entities that have three copies per zone (e.g. rotate1, rotate2, and rotate3)
|
||
|
three1 = phase * 3 - 2
|
||
|
three2 = phase * 3 - 1
|
||
|
three3 = phase * 3
|
||
|
-- use for entities that have three copies per zone (e.g. rotate1, rotate2, rotate3 and rotate4)
|
||
|
four1 = phase * 4 - 3
|
||
|
four2 = phase * 4 - 2
|
||
|
four3 = phase * 4 - 1
|
||
|
four4 = phase * 4
|
||
|
|
||
|
-- outputs
|
||
|
OutputEvent( "alarm"..phase, "PlaySound" )
|
||
|
OutputEvent( "light"..phase, "TurnOn" )
|
||
|
OutputEvent( "spot"..phase, "LightOn" )
|
||
|
OutputEvent( "rotate"..two1, "Start" )
|
||
|
OutputEvent( "rotate"..two2, "Start" )
|
||
|
OutputEvent( "Tesla"..phase, "DoSpark" )
|
||
|
end
|
||
|
|
||
|
function zone_off_outputs()
|
||
|
|
||
|
-- use for entities that have two copies per zone (e.g. rotate1 and rotate2)
|
||
|
two1 = phase * 2 - 1
|
||
|
two2 = phase * 2
|
||
|
-- use for entities that have three copies per zone (e.g. rotate1, rotate2, and rotate3)
|
||
|
three1 = phase * 3 - 2
|
||
|
three2 = phase * 3 - 1
|
||
|
three3 = phase * 3
|
||
|
-- use for entities that have three copies per zone (e.g. rotate1, rotate2, rotate3 and rotate4)
|
||
|
four1 = phase * 4 - 3
|
||
|
four2 = phase * 4 - 2
|
||
|
four3 = phase * 4 - 1
|
||
|
four4 = phase * 4
|
||
|
|
||
|
-- outputs
|
||
|
OutputEvent( "alarm"..phase, "StopSound" )
|
||
|
OutputEvent( "light"..phase, "TurnOff" )
|
||
|
OutputEvent( "spot"..phase, "LightOff" )
|
||
|
OutputEvent( "rotate"..two1, "Stop" )
|
||
|
OutputEvent( "rotate"..two2, "Stop" )
|
||
|
end
|
||
|
|
||
|
function openstartdoor()
|
||
|
-- unlock them doors
|
||
|
attacker_door_trigger1 = id_door:new({ team = attackers, door = "attacker_door1" })
|
||
|
attacker_door_trigger2 = id_door:new({ team = attackers, door = "attacker_door2" })
|
||
|
|
||
|
-- open the first door
|
||
|
OutputEvent( "attacker_door1", "Open" )
|
||
|
OutputEvent( "attacker_door2", "Open" )
|
||
|
end
|
||
|
|
||
|
function onswitch()
|
||
|
-- reset doors to open for the right team
|
||
|
defender_door_trigger1 = id_door:new({ team = defenders, door = "defender_door1" })
|
||
|
defender_door_trigger2 = id_door:new({ team = defenders, door = "defender_door2" })
|
||
|
defender_door_trigger3 = id_door:new({ team = defenders, door = "defender_door3" })
|
||
|
defender_door_trigger4 = id_door:new({ team = defenders, door = "defender_door4" })
|
||
|
defender_door_trigger5 = id_door:new({ team = defenders, door = "defender_door5" })
|
||
|
defender_door_trigger6 = id_door:new({ team = defenders, door = "defender_door6" })
|
||
|
defender_door_trigger7 = id_door:new({ team = defenders, door = "defender_door7" })
|
||
|
defender_door_trigger8 = id_door:new({ team = defenders, door = "defender_door8" })
|
||
|
|
||
|
-- lock them doors
|
||
|
attacker_door_trigger1 = id_door:new({ team = Team.kUnassigned, door = "attacker_door1" })
|
||
|
attacker_door_trigger2 = id_door:new({ team = Team.kUnassigned, door = "attacker_door2" })
|
||
|
|
||
|
OutputEvent( "point_template", "ForceSpawn" )
|
||
|
end
|
||
|
|
||
|
function onswitch_bluetodef()
|
||
|
-- switch the lights
|
||
|
OutputEvent( "defender_light1", "TurnOff" )
|
||
|
OutputEvent( "defender_spotlight1", "LightOff" )
|
||
|
|
||
|
OutputEvent( "defender_light2", "TurnOn" )
|
||
|
OutputEvent( "defender_spotlight2", "LightOn" )
|
||
|
|
||
|
OutputEvent( "cp1_partition", "TurnOff" )
|
||
|
OutputEvent( "cp1_partition", "Disable" )
|
||
|
OutputEvent( "cp2_partition", "TurnOff" )
|
||
|
OutputEvent( "cp2_partition", "Disable" )
|
||
|
|
||
|
OutputEvent( "cp1_areaportal", "Open" )
|
||
|
OutputEvent( "cp1_areaportal_door", "Close" )
|
||
|
OutputEvent( "cp2_areaportal", "Open" )
|
||
|
OutputEvent( "cp2_areaportal_door", "Close" )
|
||
|
|
||
|
OutputEvent( "cp1_partition_door", "TurnOn")
|
||
|
OutputEvent( "cp1_partition_door", "Enable")
|
||
|
OutputEvent( "cp2_partition_door", "TurnOn")
|
||
|
OutputEvent( "cp2_partition_door", "Enable")
|
||
|
|
||
|
-- switch them packs, for real this time; this is a workaround due to how the touchflags are set in base.lua
|
||
|
local num_packs = 9
|
||
|
for i=1,num_packs do
|
||
|
entity = GetEntityByName( "gen_pack_defender"..i )
|
||
|
local info = CastToInfoScript( entity )
|
||
|
info:SetTouchFlags({ AllowFlags.kBlue})
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function onswitch_redtodef()
|
||
|
-- switch the lights
|
||
|
OutputEvent( "defender_light1", "TurnOn" )
|
||
|
OutputEvent( "defender_spotlight1", "LightOn" )
|
||
|
|
||
|
OutputEvent( "defender_light2", "TurnOff" )
|
||
|
OutputEvent( "defender_spotlight2", "LightOff" )
|
||
|
|
||
|
OutputEvent( "cp1_partition", "TurnOff" )
|
||
|
OutputEvent( "cp1_partition", "Disable" )
|
||
|
OutputEvent( "cp2_partition", "TurnOff" )
|
||
|
OutputEvent( "cp2_partition", "Disable" )
|
||
|
|
||
|
OutputEvent( "cp1_areaportal", "Open" )
|
||
|
OutputEvent( "cp1_areaportal_door", "Close" )
|
||
|
OutputEvent( "cp2_areaportal", "Open" )
|
||
|
OutputEvent( "cp2_areaportal_door", "Close" )
|
||
|
|
||
|
OutputEvent( "cp1_partition_door", "TurnOn")
|
||
|
OutputEvent( "cp1_partition_door", "Enable")
|
||
|
OutputEvent( "cp2_partition_door", "TurnOn")
|
||
|
OutputEvent( "cp2_partition_door", "Enable")
|
||
|
|
||
|
|
||
|
-- switch them packs, for real this time; this is a workaround due to how the touchflags are set in base.lua
|
||
|
local num_packs = 9
|
||
|
for i=1,num_packs do
|
||
|
entity = GetEntityByName( "gen_pack_defender"..i )
|
||
|
local info = CastToInfoScript( entity )
|
||
|
info:SetTouchFlags({ AllowFlags.kRed})
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-----------------------------------------------------------------------------
|
||
|
-- backpacks, doors, etc. etc.
|
||
|
-----------------------------------------------------------------------------
|
||
|
|
||
|
gen_pack = genericbackpack:new({
|
||
|
health = 30,
|
||
|
armor = 25,
|
||
|
grenades = 20,
|
||
|
nails = 50,
|
||
|
shells = 300,
|
||
|
rockets = 15,
|
||
|
gren1 = 1,
|
||
|
gren2 = 0,
|
||
|
cells = 120,
|
||
|
respawntime = 10,
|
||
|
model = "models/items/backpack/backpack.mdl",
|
||
|
materializesound = "Item.Materialize",
|
||
|
touchsound = "Backpack.Touch"
|
||
|
})
|
||
|
|
||
|
function gen_pack:dropatspawn() return false
|
||
|
end
|
||
|
|
||
|
gen_pack_defender1 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
gen_pack_defender2 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
gen_pack_defender3 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
gen_pack_defender4 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
gen_pack_defender5 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
gen_pack_defender6 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
gen_pack_defender7 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
gen_pack_defender8 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
gen_pack_defender9 = gen_pack:new({ touchflags = {AllowFlags.kRed} })
|
||
|
|
||
|
-----------------------------------------------------------------------------
|
||
|
-- No Fucking Annoyances
|
||
|
-----------------------------------------------------------------------------
|
||
|
noannoyances = trigger_ff_script:new({})
|
||
|
|
||
|
function noannoyances:onbuild( build_entity )
|
||
|
return EVENT_DISALLOWED
|
||
|
end
|
||
|
|
||
|
function noannoyances:onexplode( explode_entity )
|
||
|
if IsGrenade( explode_entity ) then
|
||
|
return EVENT_DISALLOWED
|
||
|
end
|
||
|
return EVENT_ALLOWED
|
||
|
end
|
||
|
|
||
|
function noannoyances:oninfect( infect_entity )
|
||
|
return EVENT_DISALLOWED
|
||
|
end
|
||
|
|
||
|
no_annoyances = noannoyances
|
||
|
spawn_protection = noannoyances
|
||
|
|
||
|
------------------------------------------------------------------
|
||
|
--Resup Doors
|
||
|
------------------------------------------------------------------
|
||
|
neutral_door_trigger1 = trigger_ff_script:new({})
|
||
|
|
||
|
function neutral_door_trigger1:ontouch( trigger_entity )
|
||
|
OutputEvent( "neutral_door1", "Open" )
|
||
|
end
|
||
|
|
||
|
id_door = trigger_ff_script:new({ team = Team.kUnassigned, door = nil })
|
||
|
|
||
|
function id_door:allowed( touch_entity )
|
||
|
if IsPlayer( touch_entity ) then
|
||
|
local player = CastToPlayer( touch_entity )
|
||
|
return player:GetTeamId() == self.team
|
||
|
end
|
||
|
|
||
|
return EVENT_DISALLOWED
|
||
|
end
|
||
|
|
||
|
function id_door:ontrigger( touch_entity )
|
||
|
if IsPlayer( touch_entity ) then
|
||
|
OutputEvent(self.door, "Open")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
attacker_door_trigger1 = id_door:new({ team = Team.kUnassigned, door = "attacker_door1" })
|
||
|
attacker_door_trigger2 = id_door:new({ team = Team.kUnassigned, door = "attacker_door2" })
|
||
|
defender_door_trigger1 = id_door:new({ team = defenders, door = "defender_door1" })
|
||
|
defender_door_trigger2 = id_door:new({ team = defenders, door = "defender_door2" })
|
||
|
defender_door_trigger3 = id_door:new({ team = defenders, door = "defender_door3" })
|
||
|
defender_door_trigger4 = id_door:new({ team = defenders, door = "defender_door4" })
|
||
|
defender_door_trigger5 = id_door:new({ team = defenders, door = "defender_door5" })
|
||
|
defender_door_trigger6 = id_door:new({ team = defenders, door = "defender_door6" })
|
||
|
|
||
|
defender_spawn = base_defender_spawn:new({phase=1})
|
||
|
defender_spawn2 = base_defender_spawn:new({phase=2})
|
||
|
defender_spawn3 = base_defender_spawn:new({phase=3})
|
||
|
attacker_spawn = base_attacker_spawn:new({phase=1})
|
||
|
attacker_spawn2 = base_attacker_spawn:new({phase=2})
|
||
|
attacker_spawn3 = base_attacker_spawn:new({phase=3})
|
||
|
|
||
|
------------------------------------------------------------------
|
||
|
--Elevator
|
||
|
------------------------------------------------------------------
|
||
|
|
||
|
-- keeps track of elevator goings on
|
||
|
local elev_collection = Collection()
|
||
|
|
||
|
elev_trigger_add = trigger_ff_script:new({ })
|
||
|
|
||
|
-- registers attackers as they hit the top
|
||
|
function elev_trigger_add:ontouch( trigger_entity )
|
||
|
if IsPlayer( trigger_entity ) then
|
||
|
local player = CastToPlayer( trigger_entity )
|
||
|
elev_collection:AddItem( player )
|
||
|
end
|
||
|
end
|
||
|
|
||
|
elev_trigger_remove = trigger_ff_script:new({ })
|
||
|
|
||
|
function elev_trigger_remove:onendtouch( trigger_entity )
|
||
|
if IsPlayer( trigger_entity ) then
|
||
|
local player = CastToPlayer( trigger_entity )
|
||
|
elev_collection:RemoveItem( player )
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function elev_trigger_remove:oninactive( trigger_entity )
|
||
|
elev_collection:RemoveAllItems()
|
||
|
end
|
||
|
|
||
|
elev_trigger = trigger_ff_script:new({ })
|
||
|
|
||
|
function elev_trigger:allowed( trigger_entity )
|
||
|
if IsPlayer( trigger_entity ) then
|
||
|
local player = CastToPlayer( trigger_entity )
|
||
|
for playerx in elev_collection.items do
|
||
|
playerx = CastToPlayer(playerx)
|
||
|
if playerx:GetId() == player:GetId() then
|
||
|
return EVENT_DISALLOWED
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return EVENT_ALLOWED
|
||
|
end
|
||
|
|
||
|
function elev_trigger:ontouch( trigger_entity )
|
||
|
if IsPlayer( trigger_entity ) then
|
||
|
--local player = CastToPlayer( trigger_entity )
|
||
|
OutputEvent( "elev2", "Open" )
|
||
|
end
|
||
|
end
|