Difference between revisions of "Map Template:Sequential Territory Control"
m (redspawn_cp5 said blue team not red) |
|||
| (7 intermediate revisions by 5 users not shown) | |||
| Line 1: | Line 1: | ||
| − | [[Category: | + | {{Infobox manual/Header}} |
| + | =Foreword= | ||
| + | This is likely a temporary script/page until an offical Lua for this gametype is released. As such, the Lua script itself likely isn't up to the same standard as the official ones. It does work as intended, though. | ||
| + | |||
| + | It is set up to behave as close to the TFC version of warpath as I could get it, with my limited mapping experience. | ||
| + | |||
| + | <b>Last updated:</b> 12:52, 11 January 2008 (CST) | ||
| + | | ||
| + | =Introduction= | ||
| + | In this game mode, each team must capture Command Points in order (no flag, just touch the Command Point), typically the Blue team capture 1 through 5, and the Red team 5 through 1. Upon a team capturing their final point, the round is reset. | ||
| + | |||
| + | An example of this style of map is Warpath. | ||
| + | | ||
| + | =Entities= | ||
| + | ==Start Gates== | ||
| + | *<b>startgate_blue</b> (func_door): Start gate for Blue team | ||
| + | *<b>startgate_red</b> (func_door): Start gate for Red team | ||
| + | | ||
| + | ==Spawns== | ||
| + | *<b>bluespawn_cp1</b> (info_ff_teamspawn): Initial Blue team spawn | ||
| + | *<b>bluespawn_cp2</b> (info_ff_teamspawn): --\ | ||
| + | *<b>bluespawn_cp3</b> (info_ff_teamspawn): -- Progressive spawns for the Blue team. "cp#" denotes Command Point control nessecary to be active(only current cp# spawns are active) | ||
| + | *<b>bluespawn_cp4</b> (info_ff_teamspawn): --/ | ||
| + | | ||
| + | *<b>redspawn_cp5</b> (info_ff_teamspawn): Initial Red team spawn | ||
| + | *<b>redspawn_cp4</b> (info_ff_teamspawn): --\ | ||
| + | *<b>redspawn_cp3</b> (info_ff_teamspawn): -- Progressive spawns for the Red team. "cp#" denotes Command Point control nessecary to be active (only current cp# spawns are active) | ||
| + | *<b>redspawn_cp2</b> (info_ff_teamspawn): --/ | ||
| + | | ||
| + | ==Respawn Doors== | ||
| + | *<b>bluerespawn_cp2_actual</b> (func_door): --\ | ||
| + | *<b>bluerespawn_cp3_actual</b> (func_door): -- Physical door for Blue spawns. All flags should be off, opening is controlled by another entity | ||
| + | *<b>bluerespawn_cp4_actual</b> (func_door): --/ | ||
| + | | ||
| + | *<b>redrespawn_cp4_actual</b> (func_door): --\ | ||
| + | *<b>redrespawn_cp3_actual</b> (func_door): -- Physical door for Red spawns. All flags should be off, opening is controlled by another entity | ||
| + | *<b>redrespawn_cp2_actual</b> (func_door): --/ | ||
| + | | ||
| + | *<b>bluerespawn_cp2</b> (trigger_ff_script): --\ | ||
| + | *<b>bluerespawn_cp3</b> (trigger_ff_script): -- Trigger for the respawn doors above. Fires output "OnStartTouch:Open" to corresponding "_actual" door | ||
| + | *<b>bluerespawn_cp4</b> (trigger_ff_script): --/ | ||
| + | | ||
| + | *<b>bluerespawn_cp4</b> (trigger_ff_script): --\ | ||
| + | *<b>bluerespawn_cp3</b> (trigger_ff_script): -- Trigger for the respawn doors above. Fires output "OnStartTouch:Open" to corresponding "_actual" door | ||
| + | *<b>bluerespawn_cp2</b> (trigger_ff_script): --/ | ||
| + | | ||
| + | ==Command Points== | ||
| + | *<b>command_point_one</b> (trigger_ff_script): Location for Command Point One | ||
| + | *<b>command_point_two</b> (trigger_ff_script): ... and | ||
| + | *<b>command_point_three</b> (trigger_ff_script): ... so | ||
| + | *<b>command_point_four</b> (trigger_ff_script): ... on | ||
| + | *<b>command_point_five</b> (trigger_ff_script): ... etc. | ||
| + | | ||
| + | ==Flags== | ||
| + | *<b>cp1_flag</b> (prop_dynamic_override): Flag used to denote CP ownership. Cannot be picked up. | ||
| + | *<b>cp2_flag</b> (prop_dynamic_override): ... and | ||
| + | *<b>cp3_flag</b> (prop_dynamic_override): ... so | ||
| + | *<b>cp4_flag</b> (prop_dynamic_override): ... on | ||
| + | *<b>cp5_flag</b> (prop_dynamic_override): ... etc. | ||
| + | | ||
| + | ==Flag Rotators== | ||
| + | *<b>cp1_flag_rotator</b> (func_rotating): Optional entity used to rotate flag on CP. Flag entity must have this entity as parent if used. | ||
| + | *<b>cp2_flag_rotator</b> (func_rotating): ... and | ||
| + | *<b>cp3_flag_rotator</b> (func_rotating): ... so | ||
| + | *<b>cp4_flag_rotator</b> (func_rotating): ... on | ||
| + | *<b>cp5_flag_rotator</b> (func_rotating): ... etc. | ||
| + | | ||
| + | =Lua Script= | ||
| + | (NOTE: Uses a custom vgui graphic. The graphic is included in the source .vmf download linked to below the script, along with the below script) | ||
| + | <pre>------------------------------------------------ | ||
| + | -- This started as cz2.lua, along with some other bits of lua from other official files, and then altered by myself | ||
| + | -- to accomodate warpath-style gameplay. | ||
| + | -- | ||
| + | -- Pon.id | ||
| + | -- warpath_example.lua v1.00 | ||
| + | ------------------------------------------------ | ||
| + | |||
| + | |||
| + | ----------------------------------------------------------------------------- | ||
| + | -- includes | ||
| + | ----------------------------------------------------------------------------- | ||
| + | IncludeScript("base_teamplay") | ||
| + | IncludeScript("base_location") | ||
| + | IncludeScript("base_respawnturret") | ||
| + | |||
| + | ----------------------------------------------------------------------------- | ||
| + | -- globals | ||
| + | ----------------------------------------------------------------------------- | ||
| + | |||
| + | -- Scoring globals | ||
| + | NUMBER_OF_COMMAND_POINTS = 5 | ||
| + | POINTS_FOR_COMPLETE_CONTROL = 30 | ||
| + | FORTPOINTS_FOR_COMPLETE_CONTROL = 1000 | ||
| + | FORTPOINTS_FOR_CAP = 200 | ||
| + | |||
| + | |||
| + | -- Other Globals (Initial round delay used only for first round, give people time to log in) | ||
| + | |||
| + | INITIAL_ROUND_DELAY = 45 | ||
| + | NORMAL_ROUND_DELAY = 30 | ||
| + | RECAPTURE_DELAY = 15 | ||
| + | |||
| + | -- Counters for spawn validty | ||
| + | cp_blue = 1 | ||
| + | cp_red = 5 | ||
| + | |||
| + | |||
| + | -- A global table for storing some team info | ||
| + | team_info = { | ||
| + | |||
| + | [Team.kUnassigned] = { | ||
| + | team_name = "neutral", | ||
| + | color_index = 1, | ||
| + | skin = "0", | ||
| + | flag_visibility = "TurnOff" | ||
| + | }, | ||
| + | |||
| + | [Team.kBlue] = { | ||
| + | team_name = "blue", | ||
| + | color_index = 2, | ||
| + | skin = "0", | ||
| + | flag_visibility = "TurnOn" | ||
| + | }, | ||
| + | |||
| + | [Team.kRed] = { | ||
| + | team_name = "red", | ||
| + | color_index = 0, | ||
| + | skin = "1", | ||
| + | flag_visibility = "TurnOn" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | -- This table is for keeping track of which team controls which CP | ||
| + | command_points = { | ||
| + | [1] = { controlling_team = Team.kBlue, cp_number = 1, disable_capture = 0, hudstatusicon = "hud_cp_1.vtf", hudposx = -40, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 }, | ||
| + | [2] = { controlling_team = Team.kUnassigned, cp_number = 2, disable_capture = 0, hudstatusicon = "hud_cp_2.vtf", hudposx = -20, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 }, | ||
| + | [3] = { controlling_team = Team.kUnassigned, cp_number = 3, disable_capture = 0, hudstatusicon = "hud_cp_3.vtf", hudposx = 0, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 }, | ||
| + | [4] = { controlling_team = Team.kUnassigned, cp_number = 4, disable_capture = 0, hudstatusicon = "hud_cp_4.vtf", hudposx = 20, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 }, | ||
| + | [5] = { controlling_team = Team.kRed, cp_number = 5, disable_capture = 0, hudstatusicon = "hud_cp_5.vtf", hudposx = 40, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 } | ||
| + | } | ||
| + | |||
| + | icons = { | ||
| + | [Team.kBlue] = { teamicon = "hud_cp_blue.vtf", disabled = "hud_disabled.vtf" }, | ||
| + | [Team.kRed] = { teamicon = "hud_cp_red.vtf", disabled = "hud_disabled.vtf" }, | ||
| + | [Team.kUnassigned] = { teamicon = "hud_cp_neutral.vtf", disabled = "hud_disabled.vtf" } | ||
| + | } | ||
| + | |||
| + | |||
| + | function startup() | ||
| + | |||
| + | -- set up team limits | ||
| + | SetPlayerLimit( Team.kYellow, -1 ) | ||
| + | SetPlayerLimit( Team.kGreen, -1 ) | ||
| + | |||
| + | local team = GetTeam(Team.kBlue) | ||
| + | team:SetClassLimit( Player.kScout, 0 ) | ||
| + | team:SetClassLimit( Player.kSniper, 0 ) | ||
| + | team:SetClassLimit( Player.kSoldier, 0 ) | ||
| + | team:SetClassLimit( Player.kDemoman, 0 ) | ||
| + | team:SetClassLimit( Player.kMedic, 0 ) | ||
| + | team:SetClassLimit( Player.kHwguy, 0 ) | ||
| + | team:SetClassLimit( Player.kPyro, 0 ) | ||
| + | team:SetClassLimit( Player.kSpy, 0 ) | ||
| + | team:SetClassLimit( Player.kEngineer, 0 ) | ||
| + | team:SetClassLimit( Player.kCivilian, -1 ) | ||
| + | |||
| + | |||
| + | local team = GetTeam(Team.kRed) | ||
| + | team:SetClassLimit( Player.kScout, 0 ) | ||
| + | team:SetClassLimit( Player.kSniper, 0 ) | ||
| + | team:SetClassLimit( Player.kSoldier, 0 ) | ||
| + | team:SetClassLimit( Player.kDemoman, 0 ) | ||
| + | team:SetClassLimit( Player.kMedic, 0 ) | ||
| + | team:SetClassLimit( Player.kHwguy, 0 ) | ||
| + | team:SetClassLimit( Player.kPyro, 0 ) | ||
| + | team:SetClassLimit( Player.kSpy, 0 ) | ||
| + | team:SetClassLimit( Player.kEngineer, 0 ) | ||
| + | team:SetClassLimit( Player.kCivilian, -1 ) | ||
| + | |||
| + | |||
| + | -- Reset all command points | ||
| + | command_point_one:ChangeControllingTeam(Team.kBlue) | ||
| + | command_point_two:ChangeControllingTeam(Team.kUnassigned) | ||
| + | command_point_three:ChangeControllingTeam(Team.kUnassigned) | ||
| + | command_point_four:ChangeControllingTeam(Team.kUnassigned) | ||
| + | command_point_five:ChangeControllingTeam(Team.kRed) | ||
| + | |||
| + | -- Setup Doors for first round | ||
| + | |||
| + | setup_door_timer("startgate_blue", INITIAL_ROUND_DELAY) | ||
| + | setup_door_timer("startgate_red", INITIAL_ROUND_DELAY) | ||
| + | |||
| + | end | ||
| + | |||
| + | function precache() | ||
| + | -- precache sounds | ||
| + | PrecacheSound("yourteam.flagcap") | ||
| + | PrecacheSound("otherteam.flagcap") | ||
| + | PrecacheSound("otherteam.flagstolen") | ||
| + | |||
| + | |||
| + | PrecacheSound("misc.bizwarn") | ||
| + | PrecacheSound("misc.bloop") | ||
| + | PrecacheSound("misc.buzwarn") | ||
| + | PrecacheSound("misc.dadeda") | ||
| + | PrecacheSound("misc.deeoo") | ||
| + | PrecacheSound("misc.doop") | ||
| + | PrecacheSound("misc.woop") | ||
| + | |||
| + | |||
| + | |||
| + | -- Unagi Power! Unagi! | ||
| + | PrecacheSound("misc.unagi") | ||
| + | |||
| + | |||
| + | end | ||
| + | |||
| + | ----------------------------------------------------------------------------- | ||
| + | -- Round Completion | ||
| + | ----------------------------------------------------------------------------- | ||
| + | |||
| + | function complete_control_notification ( player ) | ||
| + | |||
| + | SmartSound(player, "yourteam.flagcap", "yourteam.flagcap", "otherteam.flagcap") | ||
| + | SmartMessage(player, "Your team captured ALL Command Points!", "Your team captured ALL Command Points!", "The enemy team captured ALL Command Points!") | ||
| + | |||
| + | |||
| + | end | ||
| + | |||
| + | ----------------------------------------------------------------------------- | ||
| + | -- Command Points | ||
| + | ----------------------------------------------------------------------------- | ||
| + | |||
| + | base_cp_trigger = trigger_ff_script:new({ | ||
| + | health = 100, | ||
| + | armor = 300, | ||
| + | grenades = 200, | ||
| + | nails = 200, | ||
| + | shells = 200, | ||
| + | rockets = 200, | ||
| + | cells = 200, | ||
| + | detpacks = 1, | ||
| + | gren1 = 4, | ||
| + | gren2 = 4, | ||
| + | item = "", | ||
| + | team = 0, | ||
| + | botgoaltype = Bot.kFlagCap, | ||
| + | cp_number = 0, | ||
| + | }) | ||
| + | |||
| + | function base_cp_trigger:ontrigger( trigger_entity ) | ||
| + | if IsPlayer( trigger_entity ) then | ||
| + | local player = CastToPlayer( trigger_entity ) | ||
| + | local cp = command_points[self.cp_number] | ||
| + | |||
| + | |||
| + | local new_controlling_team = player:GetTeamId() | ||
| + | local old_controlling_team = cp.controlling_team | ||
| + | local team = GetTeam(new_controlling_team) | ||
| + | |||
| + | |||
| + | -- No capping if player's team already controls this CP | ||
| + | if player:GetTeamId() == cp.controlling_team then return end | ||
| + | |||
| + | |||
| + | -- No Capping if team doesn't own preceeding point | ||
| + | if new_controlling_team == Team.kBlue then | ||
| + | local last_blue_cp = self.cp_number - 1 | ||
| + | if command_points[last_blue_cp].controlling_team ~= new_controlling_team then return end | ||
| + | elseif new_controlling_team == Team.kRed then | ||
| + | local last_red_cp = self.cp_number + 1 | ||
| + | if command_points[last_red_cp].controlling_team ~= new_controlling_team then return end | ||
| + | end | ||
| + | |||
| + | |||
| + | -- No Capping if disabled due to recent capture | ||
| + | if cp.disable_capture == 1 then return end | ||
| + | |||
| + | |||
| + | -- Find out if any team has complete control | ||
| + | local team_with_complete_control = Team.kUnassigned | ||
| + | local control_count = { [Team.kBlue] = 0, [Team.kRed] = 0 } | ||
| + | control_count[new_controlling_team] = 1 | ||
| + | for i,v in ipairs(command_points) do | ||
| + | if v.controlling_team ~= Team.kUnassigned and v.cp_number ~= self.cp_number then | ||
| + | control_count[v.controlling_team] = control_count[v.controlling_team] + 1 | ||
| + | end | ||
| + | if control_count[v.controlling_team] == NUMBER_OF_COMMAND_POINTS then | ||
| + | team_with_complete_control = v.controlling_team | ||
| + | end | ||
| + | end | ||
| + | |||
| + | -- Ends round if a team has all cp's, else just sorts out a normal cp capture. | ||
| + | if team_with_complete_control ~= Team.kUnassigned then | ||
| + | |||
| + | -- Team points for complete control, more FortPoints too | ||
| + | team:AddScore(POINTS_FOR_COMPLETE_CONTROL) | ||
| + | player:AddFortPoints(FORTPOINTS_FOR_COMPLETE_CONTROL, "Final CP Captured") | ||
| + | |||
| + | AddSchedule("complete_control_notification", 0.1, complete_control_notification, player) | ||
| + | |||
| + | -- Reset all command points | ||
| + | command_point_one:ChangeControllingTeam(Team.kBlue) | ||
| + | command_point_two:ChangeControllingTeam(Team.kUnassigned) | ||
| + | command_point_three:ChangeControllingTeam(Team.kUnassigned) | ||
| + | command_point_four:ChangeControllingTeam(Team.kUnassigned) | ||
| + | command_point_five:ChangeControllingTeam(Team.kRed) | ||
| + | |||
| + | -- Reset extended spawn areas and door | ||
| + | cp_blue = 1 | ||
| + | cp_red = 5 | ||
| + | |||
| + | -- Reset doors and set up timers for the next round | ||
| + | setup_door_timer("startgate_blue", NORMAL_ROUND_DELAY) | ||
| + | setup_door_timer("startgate_red", NORMAL_ROUND_DELAY) | ||
| + | |||
| + | -- Clean up HUD and capture disabled status for all CP's | ||
| + | for i,v in ipairs(command_points) do | ||
| + | RemoveHudItemFromAll( v.cp_number .. "-disabled-" .. Team.kRed ) | ||
| + | RemoveHudItemFromAll( v.cp_number .. "-disabled-" .. Team.kBlue ) | ||
| + | v.disable_capture = 0 | ||
| + | end | ||
| + | |||
| + | -- Respawns everyone/clean up map. Done in schedule to give delay | ||
| + | AddSchedule( "new_round_respawn", 0.1, new_round_respawn) | ||
| + | |||
| + | else | ||
| + | |||
| + | -- Give points to player for single cap | ||
| + | player:AddFortPoints(FORTPOINTS_FOR_CAP, "Captured CP" .. self.cp_number) | ||
| + | |||
| + | |||
| + | -- Set new owning team, change spawn validity, then disable capture for a bit | ||
| + | self:ChangeControllingTeam(new_controlling_team, old_controlling_team) | ||
| + | cp.disable_capture = 1 | ||
| + | AddSchedule ("cp" .. self.cp_number .. "_reenable", RECAPTURE_DELAY, cp_reenable, cp, new_controlling_team) | ||
| + | |||
| + | |||
| + | -- have to do messages here since player is here | ||
| + | -- could just pass player to ChangeControllingTeam, but fuck you | ||
| + | |||
| + | SmartMessage(player, "You captured Command Point " .. self.cp_number, "Your team captured Command Point " .. self.cp_number, "The enemy team captured Command Point " .. self.cp_number) | ||
| + | |||
| + | -- sounds will get more and more crazy | ||
| + | -- NOTE: These checks are hardcoded for 5 CPs...if you have more CPs, change how these are checked | ||
| + | |||
| + | if control_count[new_controlling_team] == 4 then | ||
| + | SmartSound(player, "misc.unagi", "misc.unagi", "misc.bizwarn") | ||
| + | elseif control_count[new_controlling_team] == 3 then | ||
| + | SmartSound(player, "misc.woop", "misc.woop", "misc.buzwarn") | ||
| + | elseif control_count[new_controlling_team] == 2 then | ||
| + | SmartSound(player, "misc.doop", "misc.doop", "misc.dadeda") | ||
| + | else | ||
| + | SmartSound(player, "misc.bloop", "misc.bloop", "misc.deeoo") | ||
| + | end | ||
| + | |||
| + | |||
| + | end | ||
| + | |||
| + | -- give player some health and armor | ||
| + | if self.health ~= nil and self.health ~= 0 then player:AddHealth( self.health ) end | ||
| + | if self.armor ~= nil and self.armor ~= 0 then player:AddArmor( self.armor ) end | ||
| + | |||
| + | -- give player ammo | ||
| + | if self.nails ~= nil and self.nails ~= 0 then player:AddAmmo(Ammo.kNails, self.nails) end | ||
| + | if self.shells ~= nil and self.shells ~= 0 then player:AddAmmo(Ammo.kShells, self.shells) end | ||
| + | if self.rockets ~= nil and self.rockets ~= 0 then player:AddAmmo(Ammo.kRockets, self.rockets) end | ||
| + | if self.cells ~= nil and self.cells ~= 0 then player:AddAmmo(Ammo.kCells, self.cells) end | ||
| + | if self.detpacks ~= nil and self.detpacks ~= 0 then player:AddAmmo(Ammo.kDetpack, self.detpacks) end | ||
| + | if self.gren1 ~= nil and self.gren1 ~= 0 then player:AddAmmo(Ammo.kGren1, self.gren1) end | ||
| + | if self.gren2 ~= nil and self.gren2 ~= 0 then player:AddAmmo(Ammo.kGren2, self.gren2) end | ||
| + | |||
| + | end | ||
| + | end | ||
| + | |||
| + | function base_cp_trigger:ChangeControllingTeam( new_controlling_team, old_controlling_team ) | ||
| + | |||
| + | |||
| + | -- Change the cap flag around | ||
| + | OutputEvent( "cp" .. self.cp_number .. "_flag", "Skin", team_info[new_controlling_team].skin ) | ||
| + | OutputEvent( "cp" .. self.cp_number .. "_flag", team_info[new_controlling_team].flag_visibility) | ||
| + | |||
| + | local cp = command_points[self.cp_number] | ||
| + | |||
| + | |||
| + | -- remove old flaginfo icons and add new ones | ||
| + | RemoveHudItemFromAll( self.cp_number .. "-background-" .. cp.controlling_team ) | ||
| + | RemoveHudItemFromAll( self.cp_number .. "-foreground-" .. cp.controlling_team ) | ||
| + | |||
| + | AddHudIconToAll( icons[ new_controlling_team ].teamicon , self.cp_number .. "-background-" .. new_controlling_team , cp.hudposx, cp.hudposy, cp.hudwidth, cp.hudheight, cp.hudalign) | ||
| + | |||
| + | AddHudIconToAll( cp.hudstatusicon, self.cp_number .. "-foreground-" .. new_controlling_team , cp.hudposx, cp.hudposy, cp.hudwidth, cp.hudheight, cp.hudalign) | ||
| + | |||
| + | -- | ||
| + | if (new_controlling_team ~= Team.kUnassigned) then | ||
| + | AddHudIconToAll( icons[ new_controlling_team ].disabled, self.cp_number .. "-disabled-" .. new_controlling_team , cp.hudposx, cp.hudposy, cp.hudwidth, cp.hudheight, cp.hudalign) | ||
| + | end | ||
| + | |||
| + | |||
| + | |||
| + | -- Change valid spawns | ||
| + | |||
| + | |||
| + | if new_controlling_team == Team.kBlue then | ||
| + | cp_blue = self.cp_number | ||
| + | if old_controlling_team == Team.kRed then | ||
| + | cp_red = self.cp_number + 1 | ||
| + | end | ||
| + | elseif new_controlling_team == Team.kRed then | ||
| + | cp_red = self.cp_number | ||
| + | if old_controlling_team == Team.kBlue then | ||
| + | cp_blue = self.cp_number - 1 | ||
| + | end | ||
| + | end | ||
| + | |||
| + | |||
| + | cp.controlling_team = new_controlling_team | ||
| + | |||
| + | end | ||
| + | |||
| + | |||
| + | command_point_one = base_cp_trigger:new({ cp_number = 1 }) | ||
| + | command_point_two = base_cp_trigger:new({ cp_number = 2 }) | ||
| + | command_point_three = base_cp_trigger:new({ cp_number = 3 }) | ||
| + | command_point_four = base_cp_trigger:new({ cp_number = 4 }) | ||
| + | command_point_five = base_cp_trigger:new({ cp_number = 5 }) | ||
| + | |||
| + | |||
| + | |||
| + | ------------------------- | ||
| + | -- Re-enable disabled CP after RECAPTURE_DELAY (default 15 seconds) | ||
| + | ------------------------- | ||
| + | |||
| + | function cp_reenable (cp, team) | ||
| + | RemoveHudItemFromAll( cp.cp_number .. "-disabled-" .. team ) | ||
| + | cp.disable_capture = 0 | ||
| + | end | ||
| + | |||
| + | function new_round_respawn() | ||
| + | ApplyToAll({ AT.kRemovePacks, AT.kRemoveProjectiles, AT.kRespawnPlayers, AT.kRemoveBuildables, AT.kRemoveRagdolls, kReloadClips }) | ||
| + | end | ||
| + | |||
| + | ------------------------------------------- | ||
| + | -- HUD information | ||
| + | ------------------------------------------- | ||
| + | |||
| + | function flaginfo( player_entity ) | ||
| + | local player = CastToPlayer( player_entity ) | ||
| + | |||
| + | for i,v in ipairs(command_points) do | ||
| + | |||
| + | AddHudIcon( player, icons[ v.controlling_team ].teamicon , v.cp_number .. "-background-" .. v.controlling_team , command_points[v.cp_number].hudposx, command_points[v.cp_number].hudposy, command_points[v.cp_number].hudwidth, command_points[v.cp_number].hudheight, command_points[v.cp_number].hudalign) | ||
| + | AddHudIcon( player, command_points[v.cp_number].hudstatusicon, v.cp_number .. "-foreground-" .. v.controlling_team , command_points[v.cp_number].hudposx, command_points[v.cp_number].hudposy, command_points[v.cp_number].hudwidth, command_points[v.cp_number].hudheight, command_points[v.cp_number].hudalign) | ||
| + | |||
| + | end | ||
| + | end | ||
| + | |||
| + | |||
| + | ------------------------------------------- | ||
| + | -- Round start functions | ||
| + | ------------------------------------------- | ||
| + | |||
| + | function setup_door_timer(doorname, duration) | ||
| + | CloseDoor(doorname) | ||
| + | AddSchedule("round_opendoor_" .. doorname, duration, round_start, doorname) | ||
| + | AddSchedule("round_10secwarn", duration-10, round_10secwarn) | ||
| + | end | ||
| + | |||
| + | function round_start(doorname) | ||
| + | BroadCastMessage("Gates are now open!") | ||
| + | BroadCastSound( "otherteam.flagstolen" ) | ||
| + | OpenDoor(doorname) | ||
| + | end | ||
| + | |||
| + | function round_10secwarn() BroadCastMessage("10 Seconds until round starts") end | ||
| + | |||
| + | |||
| + | |||
| + | ------------------------------------------- | ||
| + | -- Spawnpoints + Respawn door Stuff | ||
| + | ------------------------------------------- | ||
| + | |||
| + | -- Spawn Points | ||
| + | base_blue_spawn = info_ff_teamspawn:new({ cp = 0, validspawn = function(self,player) | ||
| + | return player:GetTeamId() == Team.kBlue and self.cp == cp_blue | ||
| + | end }) | ||
| + | base_red_spawn = info_ff_teamspawn:new({ cp = 0, validspawn = function(self,player) | ||
| + | return player:GetTeamId() == Team.kRed and self.cp == cp_red | ||
| + | end }) | ||
| + | bluespawn_cp1 = base_blue_spawn:new({cp=1}) | ||
| + | bluespawn_cp2 = base_blue_spawn:new({cp=2}) | ||
| + | bluespawn_cp3 = base_blue_spawn:new({cp=3}) | ||
| + | bluespawn_cp4 = base_blue_spawn:new({cp=4}) | ||
| + | redspawn_cp5 = base_red_spawn:new({cp=5}) | ||
| + | redspawn_cp4 = base_red_spawn:new({cp=4}) | ||
| + | redspawn_cp3 = base_red_spawn:new({cp=3}) | ||
| + | redspawn_cp2 = base_red_spawn:new({cp=2}) | ||
| + | |||
| + | |||
| + | -- Spawn Doors (base entity) | ||
| + | blue_respawn_door = trigger_ff_script:new({cp = 0}) | ||
| + | red_respawn_door = trigger_ff_script:new({cp = 0}) | ||
| + | |||
| + | -- Spawn Doors (validity checks) | ||
| + | function blue_respawn_door:allowed( allowed_entity ) | ||
| + | if IsPlayer( allowed_entity ) then | ||
| + | local player = CastToPlayer( allowed_entity ) | ||
| + | if player:GetTeamId() == Team.kBlue and self.cp <= cp_blue then | ||
| + | return EVENT_ALLOWED | ||
| + | end | ||
| + | end | ||
| + | return EVENT_DISALLOWED | ||
| + | end | ||
| + | |||
| + | function red_respawn_door:allowed( allowed_entity ) | ||
| + | if IsPlayer( allowed_entity ) then | ||
| + | local player = CastToPlayer( allowed_entity ) | ||
| + | if player:GetTeamId() == Team.kRed and self.cp >= cp_red then | ||
| + | return EVENT_ALLOWED | ||
| + | end | ||
| + | end | ||
| + | return EVENT_DISALLOWED | ||
| + | end | ||
| + | |||
| + | --Spawn Doors (Validity checks failure) | ||
| + | function blue_respawn_door:onfailtouch( touch_entity ) | ||
| + | if IsPlayer( touch_entity ) then | ||
| + | local player = CastToPlayer( touch_entity ) | ||
| + | if player:GetTeamId() == Team.kBlue then | ||
| + | BroadCastMessageToPlayer( player, "You need to capture Command Point ".. self.cp .. " before you can use this respawn!" ) | ||
| + | else | ||
| + | BroadCastMessageToPlayer( player, "Your team cannot use this respawn." ) | ||
| + | end | ||
| + | end | ||
| + | end | ||
| + | |||
| + | function red_respawn_door:onfailtouch( touch_entity ) | ||
| + | if IsPlayer( touch_entity ) then | ||
| + | local player = CastToPlayer( touch_entity ) | ||
| + | if player:GetTeamId() == Team.kRed then | ||
| + | BroadCastMessageToPlayer( player, "You need to capture Command Point ".. self.cp .." before you can use this respawn!" ) | ||
| + | else | ||
| + | BroadCastMessageToPlayer( player, "Your team cannot use this respawn." ) | ||
| + | end | ||
| + | end | ||
| + | end | ||
| + | |||
| + | |||
| + | -- Spawn Doors (actual entities with command point condition attached) | ||
| + | bluerespawn_cp2 = blue_respawn_door:new({cp=2}) | ||
| + | bluerespawn_cp3 = blue_respawn_door:new({cp=3}) | ||
| + | bluerespawn_cp4 = blue_respawn_door:new({cp=4}) | ||
| + | redrespawn_cp2 = red_respawn_door:new({cp=2}) | ||
| + | redrespawn_cp3 = red_respawn_door:new({cp=3}) | ||
| + | redrespawn_cp4 = red_respawn_door:new({cp=4}) | ||
| + | </pre> | ||
| + | | ||
| + | ==Overridable Globals== | ||
| + | (NOTE: Replace the values used in the code above with whats needed, defaults are as close to TFC Warpath as possible) | ||
| + | *<b>NUMBER_OF_COMMAND_POINTS</b> (Default: 5): Amount of command points in play. | ||
| + | *<b>POINTS_FOR_COMPLETE_CONTROL</b> (Default: 30): Team points scored for capturing all points. | ||
| + | *<b>FORTPOINTS_FOR_COMPLETE_CONTROL</b> (Default: 1000): Fortress points scored for capturing final point. | ||
| + | *<b>FORTPOINTS_FOR_CAP</b> (Default: 200): Fortress points scored for capturing a non-final point. | ||
| + | *<b>INITIAL_ROUND_DELAY</b> (Default: 45): Delay before start of first round (to give people time to log in). | ||
| + | *<b>NORMAL_ROUND_DELAY</b> (Default: 30): Delay before start of all other rounds. | ||
| + | *<b>RECAPTURE_DELAY</b> (Default: 15): Time a point is inactive for after being captured. | ||
| + | | ||
| + | =Downloads= | ||
| + | *[http://www.dcpaterson.ukfsn.org/tutorials/warpath_example/warpath_example_v1.rar Source .vmf] (Includes .vmf of an example map, the Lua Script, and a custom HUD graphic used): | ||
| + | |||
| + | |||
| + | [[Category:Map Templates]] [[Category:Mapping]] | ||
| + | {{Infobox manual/Footer}} | ||
Latest revision as of 06:42, 22 December 2009
|
ForewordThis is likely a temporary script/page until an offical Lua for this gametype is released. As such, the Lua script itself likely isn't up to the same standard as the official ones. It does work as intended, though. It is set up to behave as close to the TFC version of warpath as I could get it, with my limited mapping experience. Last updated: 12:52, 11 January 2008 (CST) IntroductionIn this game mode, each team must capture Command Points in order (no flag, just touch the Command Point), typically the Blue team capture 1 through 5, and the Red team 5 through 1. Upon a team capturing their final point, the round is reset. An example of this style of map is Warpath. EntitiesStart Gates
Spawns
Respawn Doors
Command Points
Flags
Flag Rotators
Lua Script(NOTE: Uses a custom vgui graphic. The graphic is included in the source .vmf download linked to below the script, along with the below script) ------------------------------------------------
-- This started as cz2.lua, along with some other bits of lua from other official files, and then altered by myself
-- to accomodate warpath-style gameplay.
--
-- Pon.id
-- warpath_example.lua v1.00
------------------------------------------------
-----------------------------------------------------------------------------
-- includes
-----------------------------------------------------------------------------
IncludeScript("base_teamplay")
IncludeScript("base_location")
IncludeScript("base_respawnturret")
-----------------------------------------------------------------------------
-- globals
-----------------------------------------------------------------------------
-- Scoring globals
NUMBER_OF_COMMAND_POINTS = 5
POINTS_FOR_COMPLETE_CONTROL = 30
FORTPOINTS_FOR_COMPLETE_CONTROL = 1000
FORTPOINTS_FOR_CAP = 200
-- Other Globals (Initial round delay used only for first round, give people time to log in)
INITIAL_ROUND_DELAY = 45
NORMAL_ROUND_DELAY = 30
RECAPTURE_DELAY = 15
-- Counters for spawn validty
cp_blue = 1
cp_red = 5
-- A global table for storing some team info
team_info = {
[Team.kUnassigned] = {
team_name = "neutral",
color_index = 1,
skin = "0",
flag_visibility = "TurnOff"
},
[Team.kBlue] = {
team_name = "blue",
color_index = 2,
skin = "0",
flag_visibility = "TurnOn"
},
[Team.kRed] = {
team_name = "red",
color_index = 0,
skin = "1",
flag_visibility = "TurnOn"
}
}
-- This table is for keeping track of which team controls which CP
command_points = {
[1] = { controlling_team = Team.kBlue, cp_number = 1, disable_capture = 0, hudstatusicon = "hud_cp_1.vtf", hudposx = -40, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 },
[2] = { controlling_team = Team.kUnassigned, cp_number = 2, disable_capture = 0, hudstatusicon = "hud_cp_2.vtf", hudposx = -20, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 },
[3] = { controlling_team = Team.kUnassigned, cp_number = 3, disable_capture = 0, hudstatusicon = "hud_cp_3.vtf", hudposx = 0, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 },
[4] = { controlling_team = Team.kUnassigned, cp_number = 4, disable_capture = 0, hudstatusicon = "hud_cp_4.vtf", hudposx = 20, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 },
[5] = { controlling_team = Team.kRed, cp_number = 5, disable_capture = 0, hudstatusicon = "hud_cp_5.vtf", hudposx = 40, hudposy = 36, hudalign = 4, hudwidth = 16, hudheight = 16 }
}
icons = {
[Team.kBlue] = { teamicon = "hud_cp_blue.vtf", disabled = "hud_disabled.vtf" },
[Team.kRed] = { teamicon = "hud_cp_red.vtf", disabled = "hud_disabled.vtf" },
[Team.kUnassigned] = { teamicon = "hud_cp_neutral.vtf", disabled = "hud_disabled.vtf" }
}
function startup()
-- set up team limits
SetPlayerLimit( Team.kYellow, -1 )
SetPlayerLimit( Team.kGreen, -1 )
local team = GetTeam(Team.kBlue)
team:SetClassLimit( Player.kScout, 0 )
team:SetClassLimit( Player.kSniper, 0 )
team:SetClassLimit( Player.kSoldier, 0 )
team:SetClassLimit( Player.kDemoman, 0 )
team:SetClassLimit( Player.kMedic, 0 )
team:SetClassLimit( Player.kHwguy, 0 )
team:SetClassLimit( Player.kPyro, 0 )
team:SetClassLimit( Player.kSpy, 0 )
team:SetClassLimit( Player.kEngineer, 0 )
team:SetClassLimit( Player.kCivilian, -1 )
local team = GetTeam(Team.kRed)
team:SetClassLimit( Player.kScout, 0 )
team:SetClassLimit( Player.kSniper, 0 )
team:SetClassLimit( Player.kSoldier, 0 )
team:SetClassLimit( Player.kDemoman, 0 )
team:SetClassLimit( Player.kMedic, 0 )
team:SetClassLimit( Player.kHwguy, 0 )
team:SetClassLimit( Player.kPyro, 0 )
team:SetClassLimit( Player.kSpy, 0 )
team:SetClassLimit( Player.kEngineer, 0 )
team:SetClassLimit( Player.kCivilian, -1 )
-- Reset all command points
command_point_one:ChangeControllingTeam(Team.kBlue)
command_point_two:ChangeControllingTeam(Team.kUnassigned)
command_point_three:ChangeControllingTeam(Team.kUnassigned)
command_point_four:ChangeControllingTeam(Team.kUnassigned)
command_point_five:ChangeControllingTeam(Team.kRed)
-- Setup Doors for first round
setup_door_timer("startgate_blue", INITIAL_ROUND_DELAY)
setup_door_timer("startgate_red", INITIAL_ROUND_DELAY)
end
function precache()
-- precache sounds
PrecacheSound("yourteam.flagcap")
PrecacheSound("otherteam.flagcap")
PrecacheSound("otherteam.flagstolen")
PrecacheSound("misc.bizwarn")
PrecacheSound("misc.bloop")
PrecacheSound("misc.buzwarn")
PrecacheSound("misc.dadeda")
PrecacheSound("misc.deeoo")
PrecacheSound("misc.doop")
PrecacheSound("misc.woop")
-- Unagi Power! Unagi!
PrecacheSound("misc.unagi")
end
-----------------------------------------------------------------------------
-- Round Completion
-----------------------------------------------------------------------------
function complete_control_notification ( player )
SmartSound(player, "yourteam.flagcap", "yourteam.flagcap", "otherteam.flagcap")
SmartMessage(player, "Your team captured ALL Command Points!", "Your team captured ALL Command Points!", "The enemy team captured ALL Command Points!")
end
-----------------------------------------------------------------------------
-- Command Points
-----------------------------------------------------------------------------
base_cp_trigger = trigger_ff_script:new({
health = 100,
armor = 300,
grenades = 200,
nails = 200,
shells = 200,
rockets = 200,
cells = 200,
detpacks = 1,
gren1 = 4,
gren2 = 4,
item = "",
team = 0,
botgoaltype = Bot.kFlagCap,
cp_number = 0,
})
function base_cp_trigger:ontrigger( trigger_entity )
if IsPlayer( trigger_entity ) then
local player = CastToPlayer( trigger_entity )
local cp = command_points[self.cp_number]
local new_controlling_team = player:GetTeamId()
local old_controlling_team = cp.controlling_team
local team = GetTeam(new_controlling_team)
-- No capping if player's team already controls this CP
if player:GetTeamId() == cp.controlling_team then return end
-- No Capping if team doesn't own preceeding point
if new_controlling_team == Team.kBlue then
local last_blue_cp = self.cp_number - 1
if command_points[last_blue_cp].controlling_team ~= new_controlling_team then return end
elseif new_controlling_team == Team.kRed then
local last_red_cp = self.cp_number + 1
if command_points[last_red_cp].controlling_team ~= new_controlling_team then return end
end
-- No Capping if disabled due to recent capture
if cp.disable_capture == 1 then return end
-- Find out if any team has complete control
local team_with_complete_control = Team.kUnassigned
local control_count = { [Team.kBlue] = 0, [Team.kRed] = 0 }
control_count[new_controlling_team] = 1
for i,v in ipairs(command_points) do
if v.controlling_team ~= Team.kUnassigned and v.cp_number ~= self.cp_number then
control_count[v.controlling_team] = control_count[v.controlling_team] + 1
end
if control_count[v.controlling_team] == NUMBER_OF_COMMAND_POINTS then
team_with_complete_control = v.controlling_team
end
end
-- Ends round if a team has all cp's, else just sorts out a normal cp capture.
if team_with_complete_control ~= Team.kUnassigned then
-- Team points for complete control, more FortPoints too
team:AddScore(POINTS_FOR_COMPLETE_CONTROL)
player:AddFortPoints(FORTPOINTS_FOR_COMPLETE_CONTROL, "Final CP Captured")
AddSchedule("complete_control_notification", 0.1, complete_control_notification, player)
-- Reset all command points
command_point_one:ChangeControllingTeam(Team.kBlue)
command_point_two:ChangeControllingTeam(Team.kUnassigned)
command_point_three:ChangeControllingTeam(Team.kUnassigned)
command_point_four:ChangeControllingTeam(Team.kUnassigned)
command_point_five:ChangeControllingTeam(Team.kRed)
-- Reset extended spawn areas and door
cp_blue = 1
cp_red = 5
-- Reset doors and set up timers for the next round
setup_door_timer("startgate_blue", NORMAL_ROUND_DELAY)
setup_door_timer("startgate_red", NORMAL_ROUND_DELAY)
-- Clean up HUD and capture disabled status for all CP's
for i,v in ipairs(command_points) do
RemoveHudItemFromAll( v.cp_number .. "-disabled-" .. Team.kRed )
RemoveHudItemFromAll( v.cp_number .. "-disabled-" .. Team.kBlue )
v.disable_capture = 0
end
-- Respawns everyone/clean up map. Done in schedule to give delay
AddSchedule( "new_round_respawn", 0.1, new_round_respawn)
else
-- Give points to player for single cap
player:AddFortPoints(FORTPOINTS_FOR_CAP, "Captured CP" .. self.cp_number)
-- Set new owning team, change spawn validity, then disable capture for a bit
self:ChangeControllingTeam(new_controlling_team, old_controlling_team)
cp.disable_capture = 1
AddSchedule ("cp" .. self.cp_number .. "_reenable", RECAPTURE_DELAY, cp_reenable, cp, new_controlling_team)
-- have to do messages here since player is here
-- could just pass player to ChangeControllingTeam, but fuck you
SmartMessage(player, "You captured Command Point " .. self.cp_number, "Your team captured Command Point " .. self.cp_number, "The enemy team captured Command Point " .. self.cp_number)
-- sounds will get more and more crazy
-- NOTE: These checks are hardcoded for 5 CPs...if you have more CPs, change how these are checked
if control_count[new_controlling_team] == 4 then
SmartSound(player, "misc.unagi", "misc.unagi", "misc.bizwarn")
elseif control_count[new_controlling_team] == 3 then
SmartSound(player, "misc.woop", "misc.woop", "misc.buzwarn")
elseif control_count[new_controlling_team] == 2 then
SmartSound(player, "misc.doop", "misc.doop", "misc.dadeda")
else
SmartSound(player, "misc.bloop", "misc.bloop", "misc.deeoo")
end
end
-- give player some health and armor
if self.health ~= nil and self.health ~= 0 then player:AddHealth( self.health ) end
if self.armor ~= nil and self.armor ~= 0 then player:AddArmor( self.armor ) end
-- give player ammo
if self.nails ~= nil and self.nails ~= 0 then player:AddAmmo(Ammo.kNails, self.nails) end
if self.shells ~= nil and self.shells ~= 0 then player:AddAmmo(Ammo.kShells, self.shells) end
if self.rockets ~= nil and self.rockets ~= 0 then player:AddAmmo(Ammo.kRockets, self.rockets) end
if self.cells ~= nil and self.cells ~= 0 then player:AddAmmo(Ammo.kCells, self.cells) end
if self.detpacks ~= nil and self.detpacks ~= 0 then player:AddAmmo(Ammo.kDetpack, self.detpacks) end
if self.gren1 ~= nil and self.gren1 ~= 0 then player:AddAmmo(Ammo.kGren1, self.gren1) end
if self.gren2 ~= nil and self.gren2 ~= 0 then player:AddAmmo(Ammo.kGren2, self.gren2) end
end
end
function base_cp_trigger:ChangeControllingTeam( new_controlling_team, old_controlling_team )
-- Change the cap flag around
OutputEvent( "cp" .. self.cp_number .. "_flag", "Skin", team_info[new_controlling_team].skin )
OutputEvent( "cp" .. self.cp_number .. "_flag", team_info[new_controlling_team].flag_visibility)
local cp = command_points[self.cp_number]
-- remove old flaginfo icons and add new ones
RemoveHudItemFromAll( self.cp_number .. "-background-" .. cp.controlling_team )
RemoveHudItemFromAll( self.cp_number .. "-foreground-" .. cp.controlling_team )
AddHudIconToAll( icons[ new_controlling_team ].teamicon , self.cp_number .. "-background-" .. new_controlling_team , cp.hudposx, cp.hudposy, cp.hudwidth, cp.hudheight, cp.hudalign)
AddHudIconToAll( cp.hudstatusicon, self.cp_number .. "-foreground-" .. new_controlling_team , cp.hudposx, cp.hudposy, cp.hudwidth, cp.hudheight, cp.hudalign)
--
if (new_controlling_team ~= Team.kUnassigned) then
AddHudIconToAll( icons[ new_controlling_team ].disabled, self.cp_number .. "-disabled-" .. new_controlling_team , cp.hudposx, cp.hudposy, cp.hudwidth, cp.hudheight, cp.hudalign)
end
-- Change valid spawns
if new_controlling_team == Team.kBlue then
cp_blue = self.cp_number
if old_controlling_team == Team.kRed then
cp_red = self.cp_number + 1
end
elseif new_controlling_team == Team.kRed then
cp_red = self.cp_number
if old_controlling_team == Team.kBlue then
cp_blue = self.cp_number - 1
end
end
cp.controlling_team = new_controlling_team
end
command_point_one = base_cp_trigger:new({ cp_number = 1 })
command_point_two = base_cp_trigger:new({ cp_number = 2 })
command_point_three = base_cp_trigger:new({ cp_number = 3 })
command_point_four = base_cp_trigger:new({ cp_number = 4 })
command_point_five = base_cp_trigger:new({ cp_number = 5 })
-------------------------
-- Re-enable disabled CP after RECAPTURE_DELAY (default 15 seconds)
-------------------------
function cp_reenable (cp, team)
RemoveHudItemFromAll( cp.cp_number .. "-disabled-" .. team )
cp.disable_capture = 0
end
function new_round_respawn()
ApplyToAll({ AT.kRemovePacks, AT.kRemoveProjectiles, AT.kRespawnPlayers, AT.kRemoveBuildables, AT.kRemoveRagdolls, kReloadClips })
end
-------------------------------------------
-- HUD information
-------------------------------------------
function flaginfo( player_entity )
local player = CastToPlayer( player_entity )
for i,v in ipairs(command_points) do
AddHudIcon( player, icons[ v.controlling_team ].teamicon , v.cp_number .. "-background-" .. v.controlling_team , command_points[v.cp_number].hudposx, command_points[v.cp_number].hudposy, command_points[v.cp_number].hudwidth, command_points[v.cp_number].hudheight, command_points[v.cp_number].hudalign)
AddHudIcon( player, command_points[v.cp_number].hudstatusicon, v.cp_number .. "-foreground-" .. v.controlling_team , command_points[v.cp_number].hudposx, command_points[v.cp_number].hudposy, command_points[v.cp_number].hudwidth, command_points[v.cp_number].hudheight, command_points[v.cp_number].hudalign)
end
end
-------------------------------------------
-- Round start functions
-------------------------------------------
function setup_door_timer(doorname, duration)
CloseDoor(doorname)
AddSchedule("round_opendoor_" .. doorname, duration, round_start, doorname)
AddSchedule("round_10secwarn", duration-10, round_10secwarn)
end
function round_start(doorname)
BroadCastMessage("Gates are now open!")
BroadCastSound( "otherteam.flagstolen" )
OpenDoor(doorname)
end
function round_10secwarn() BroadCastMessage("10 Seconds until round starts") end
-------------------------------------------
-- Spawnpoints + Respawn door Stuff
-------------------------------------------
-- Spawn Points
base_blue_spawn = info_ff_teamspawn:new({ cp = 0, validspawn = function(self,player)
return player:GetTeamId() == Team.kBlue and self.cp == cp_blue
end })
base_red_spawn = info_ff_teamspawn:new({ cp = 0, validspawn = function(self,player)
return player:GetTeamId() == Team.kRed and self.cp == cp_red
end })
bluespawn_cp1 = base_blue_spawn:new({cp=1})
bluespawn_cp2 = base_blue_spawn:new({cp=2})
bluespawn_cp3 = base_blue_spawn:new({cp=3})
bluespawn_cp4 = base_blue_spawn:new({cp=4})
redspawn_cp5 = base_red_spawn:new({cp=5})
redspawn_cp4 = base_red_spawn:new({cp=4})
redspawn_cp3 = base_red_spawn:new({cp=3})
redspawn_cp2 = base_red_spawn:new({cp=2})
-- Spawn Doors (base entity)
blue_respawn_door = trigger_ff_script:new({cp = 0})
red_respawn_door = trigger_ff_script:new({cp = 0})
-- Spawn Doors (validity checks)
function blue_respawn_door:allowed( allowed_entity )
if IsPlayer( allowed_entity ) then
local player = CastToPlayer( allowed_entity )
if player:GetTeamId() == Team.kBlue and self.cp <= cp_blue then
return EVENT_ALLOWED
end
end
return EVENT_DISALLOWED
end
function red_respawn_door:allowed( allowed_entity )
if IsPlayer( allowed_entity ) then
local player = CastToPlayer( allowed_entity )
if player:GetTeamId() == Team.kRed and self.cp >= cp_red then
return EVENT_ALLOWED
end
end
return EVENT_DISALLOWED
end
--Spawn Doors (Validity checks failure)
function blue_respawn_door:onfailtouch( touch_entity )
if IsPlayer( touch_entity ) then
local player = CastToPlayer( touch_entity )
if player:GetTeamId() == Team.kBlue then
BroadCastMessageToPlayer( player, "You need to capture Command Point ".. self.cp .. " before you can use this respawn!" )
else
BroadCastMessageToPlayer( player, "Your team cannot use this respawn." )
end
end
end
function red_respawn_door:onfailtouch( touch_entity )
if IsPlayer( touch_entity ) then
local player = CastToPlayer( touch_entity )
if player:GetTeamId() == Team.kRed then
BroadCastMessageToPlayer( player, "You need to capture Command Point ".. self.cp .." before you can use this respawn!" )
else
BroadCastMessageToPlayer( player, "Your team cannot use this respawn." )
end
end
end
-- Spawn Doors (actual entities with command point condition attached)
bluerespawn_cp2 = blue_respawn_door:new({cp=2})
bluerespawn_cp3 = blue_respawn_door:new({cp=3})
bluerespawn_cp4 = blue_respawn_door:new({cp=4})
redrespawn_cp2 = red_respawn_door:new({cp=2})
redrespawn_cp3 = red_respawn_door:new({cp=3})
redrespawn_cp4 = red_respawn_door:new({cp=4})
Overridable Globals(NOTE: Replace the values used in the code above with whats needed, defaults are as close to TFC Warpath as possible)
Downloads
|