//Arbitrary Aggrievocation, by Seelpit //Extra credits: //- lite and washy: various PointTemplates, such as the capture points //- Eve: custom capture area model and general PointTemplates inspiration //- PigPig: originally made the map //- Braindawg: majority of logic to make the map suited for reverse //- Hellblade: boss inspiration and advice, + being super cute //Somewhat difficult? //An extremely dumb expert that is actually a normal mission with global weapon nerfs. //haha just kidding it's an engie-only reverse mission yeehaw //Main gimmicks: //- Engie-only. Custom upgrades only. //- Each wave gets a different objective, or a slight twist on it //wave 1: standard bomb deploy; you escort weak bots -- START: blue side gate //wave 2: capture a point, then escort fast giants -- START: blue side gate //wave 3: The Tank Wave(tm); tank can receive repairs, slows down with health down. -- START: red side //wave 4: kill a specific boss + players (busters!) -- START: red side gate //wave 5: protect a boss...as red bots! -- START: red spawn! //spawnbot names: //spawnbot: "front" random //spawnbot_front_left: "blue" side, front //spawnbot_right: blue side //spawnbot_front_right: "red" side, front //spawnbot_left: red side //yes this is dumb //relay names: //wave_finished_nextwave_random ; finished relay + set path to == random //wave_finished_nextwave_random_consistent ; "" + set path to == "", and be consistent after wave fail //wave_finished_nextwave_right ; "" + set path to == blue side //wave_finished_nextwave_left ; "" + set path to == red side //required tags: //bomb_carrier ; for bomb-aimed bots, aka all blue bots //nav_prefer_gate_flank ; for gatebots //extra things //- engiebots at fake locs; spawn a sentry, then InterruptAction the engies to target it. They'll revert to base behavior w/o sentry, so make them mobber! //- sniper bots at fake locs; force them to go to target, prevent jump, force a mouse2 input, -100% aim move speed, use Focus w inf duration to stay scoped, target closest player. //TODO //Testing notes: //- Add notif about no building unless you have an upgrade //- Find some way to make the blueprints thing work, please!!! //W1 //- //W2 //- Add glow to point, if possible //- Add notif about timer going down after point cap #base robot_standard.pop #base robot_giant.pop #base robot_gatebot.pop #base robot_giant_red.pop //Braindawg-made, RED variants of Valve bots #base robot_standard_red.pop //Usage: T_TFBot_Red_Template_Name #base robot_gatebot_red.pop //f.e. T_TFBot_Red_Soldier (NOTE: uses UseBestWeapon) //alternatively, add Template RedBot to it - adds on Action Mobber and the reprogram addcond popuwashyon { StartingCurrency 200 CanBotsAttackWhileInSpawnRoom Yes RespawnWaveTimeBlue 4 FixedRespawnWaveTimeBlue 1 TextPrintTime 0 BonusRatioHalf 1.1 BonusRatioFull 1.1 //Copied from Braindawg's reverse; "fixes". NoMvMDeathTune 1 SniperAllowHeadshots 1 //change if required SentryBusterFriendlyFire 0 ImprovedAirblast 0 //NO!!!! SendBotsToSpectatorImmediately 1 //Player mods NoReanimators 1 ReverseWinConditions 1 BluHumanFlagCapture 0 //engies don't cap flags, dummy BluHumanFlagPickup 0 AllowJoinTeamBlueMax 6 AllowJoinTeamBlue 1 HumansMustJoinTeam blue BluPlayersAreRobots 1 SetCreditTeam 3 BluHumanInfiniteAmmo 0 //give dispensers more reason to exist BluHumanSpawnNoShoot 0 //lets you test yer guns MaxTotalPlayers 6 //ya RobotLimit 26 //yes yes yes BluHumanBotTeleporter 0 //perhaps restrict to only Eureka? BotsUsePlayerTeleporters 0 //prevent weirdness FlagEscortCountOffset 10 //adds onto it, from 4 AllowFlagCarrierToFight 1 //thonk? ExtendedUpgradesOnly 1 //a very [specil] deal //Announcer sounds disabled //All dead; DisableSound "Announcer.MVM_All_Dead" //Bomb responses; DisableSound "Announcer.MVM_Bomb_Alert_Entered" DisableSound "Announcer.MVM_Bomb_Alert_Near_Hatch" DisableSound "Announcer.MVM_Bomb_Alert_Deploying" //Tank responses; DisableSound "Announcer.MVM_Tank_Planted" DisableSound "Announcer.MVM_Tank_Alert_Spawn" DisableSound "Announcer.MVM_Tank_Alert_Another" DisableSound "Announcer.MVM_Tank_Alert_Multiple" DisableSound "Announcer.MVM_Tank_Alert_Halfway" DisableSound "Announcer.MVM_Tank_Alert_Halfway_Multiple" DisableSound "Announcer.MVM_Tank_Alert_Near_Hatch" DisableSound "Announcer.MVM_Tank_Alert_Deploying" //cool models PrecacheModel "models/props_mvm/mvm_upgrade_blu_center.mdl" PrecacheModel "models/props_mvm/mvm_upgrade_blu_tools.mdl" PrecacheModel "models/props_mvm/no_entry.mdl" PrecacheModel "models/bots/sniper_boss/bot_sniper_boss.mdl" PrecacheModel "models/props_gameplay/cap_square_256.mdl" PrecacheModel "models/props_gameplay/cap_square_512.mdl" // "OnTrigger" "!parent,AddOutput,OnHealthBelow90Percent !self:SetSpeed:85:0:-1,0,-1" // apparently you can do this ^ with triggers, for addoutput // Seems to be "Output Target:Action:Param:Time:Repeats" // bluesidedoor_0 thru 2: front // 3 thru 5: leads from factory to hatch bridge PointTemplates { //Taken directly from Braindawg, edited as seen fit. corelogic { NoFixup 1 //win logic game_round_win { "targetname" "bots_win_red" "origin" "-1611.31 4748.55 169.35" "TeamNum" "2" "switch_teams" "0" "force_map_reset" "1" "classname" "game_round_win" } //trigger this relay to make red win logic_relay { "targetname" "redwin_relay" "origin" "266.305756 514.122192 103.214890" "OnTrigger" "bots_win_red,RoundWin,,0,-1" "OnTrigger" "pit_explosion_wav,PlaySound,,0,-1" "OnTrigger" "player,setforcedtauntcam,1,0.1,-1" } logic_auto { "targetname" "mainrelay" //Disable the spy spawns, set their team to red, re-enable them "OnMapSpawn" "spawnbot_mission_spy*,Disable,,0,-1" //switch bad spawns to red "OnMapSpawn" "spawnbot_mission_spy*,SetTeam,2,0.01,-1" "OnMapSpawn" "spawnbot_mission_spy*,Enable,,10,-1" "OnMapSpawn" "func_tfbot_hint,Disable,,0.1,-1" // Remove filters for bombhat and red team // Remove alarm of gatecap, radiowaves, and the gatecap stun // Disables ALL trigger pushes // Remove thing that keeps closing doors // "OnMapSpawn" "filter_blue_bombhat,Kill,,0,-1" "OnMapSpawn" "filter_redteam,Kill,,0,-1" //kill jump-pad and grinder filter "OnMapSpawn" "gate1_alarm,Kill,,0,-1" "OnMapSpawn" "robot_radio_waves_beep,Kill,,0,-1" "OnMapSpawn" "bot_stun_reprogram,Kill,,0,-1" "OnMapSpawn" "trigger_push,Disable,,0,-1" //this map loves anti exploit trigger_pushes "OnMapSpawn" "logic_timer,Kill,,0,-1" //keeps closing doors // Removal of decorations "OnMapSpawn" "upgradedoor*,Kill,,0,-1" "OnMapSpawn" "Secretroom*,Kill,,0,-1" "OnMapSpawn" "music*,Kill,,0,-1" "OnMapSpawn" "forward_resupply_music*,Kill,,0,-1" "OnMapSpawn" "resupply_music,Kill,,0,-1" "OnMapSpawn" "grinder*,Kill,,0,-1" "OnMapSpawn" "roof_chimneys,Kill,,0,-1" //these 3 alone are ~100 edicts "OnMapSpawn" "move_rope,Kill,,0,-1" "OnMapSpawn" "keyframe_rope,Kill,,0,-1" //Disable stuff related to gateA "OnMapSpawn" "gateA*,Disable,,0,-1" //OnCapTeam2 of left cap: enable gateAleft; close tank door; open red door; //disable bot blocker; disable bombpath arrows; play sound; enable intel_new "OnMapSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 gateAleft:Enable:0:-1" //gate spawns "OnMapSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 closetankdoor:Trigger:0:-1" //close front tank gate on A cap "OnMapSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 redsidedoor*:Open:0:-1" "OnMapSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 LeftSide_Door_blockbots:Disable:0:-1" //bot blocker normally persists until stun ends "OnMapSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 bombpath_arrows_left_left:Disable:5:-1" "OnMapSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 Free_robot_Sound:PlaySound:5:-1" "OnMapSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 intel_new:Enable:0:-1" //OnCapTeam2 of right cap: enable gateAright. Disable bot blocker. //Enable intel_new2 // "OnMapSpawn" "gate_right_capturezone,AddOutput,OnCapTeam2 gateAright:Enable:0:-1" // "OnMapSpawn" "gate_right_capturezone,AddOutput,OnCapTeam2 RightSide_Door_blockbots:Disable:0:-1" // "OnMapSpawn" "gate_right_capturezone,AddOutput,OnCapTeam2 intel_new2:Enable:0:-1" // "OnMapSpawn" "RightSide_Door,AddOutput,OnOpen endright:Trigger:0:-1" //don't laugh "OnMapSpawn" "LeftSide_Door,AddOutput,OnOpen endleft:Trigger:0:-1" "OnMapSpawn" "RightSide_Door,AddOutput,OnOpen shopcollision:DisableCollision:0:-1" //nocollide the upgrade station on right gate //If intel is picked up: unpause bot spawning. //Set team to 0. If red team picks it up: reset the intel. "OnMapSpawn" "intel_new*,AddOutput,OnPickupTeam2 point_populator_interface:UnpauseBotSpawning:0:-1" "OnMapSpawn" "intel_new*,AddOutput,OnPickupTeam2 intel_new*:SetTeam:0:0:-1" //fixes 2 compasses pointing to the same bomb "OnMapSpawn" "intel*,AddOutput,OnPickupTeam1 intel*:ForceDrop:0:-1" //red shouldn't have that //On wave start: close blue/red side doors. Disable bluspawntele. //On wave done: re-enable bluspawntele. //Disabled bluspawntele (changed names, not used), //Disabled closing blue doors (required) "OnMapSpawn" "wave_start_relay,AddOutput,OnTrigger barrier*:DisableCollision:0:-1" "OnMapSpawn" "wave_start_relay,AddOutput,OnTrigger barrier*:Disable:0:-1" // "OnMapSpawn" "wave_start_relay,AddOutput,OnTrigger bluesidedoor*:Close:0:-1" "OnMapSpawn" "wave_start_relay,AddOutput,OnTrigger redsidedoor*:Close:0:-1" // "OnMapSpawn" "wave_start_relay,AddOutput,OnTrigger bluspawntele:Disable:0:-1" // "OnMapSpawn" "wave_finished_relay,AddOutput,OnTrigger bluspawntele:Enable:0:-1" //If right side is picked: disable leftspawns. Disable left nav. "OnMapSpawn" "bot_bombpath_rightSidePick,AddOutput,OnTrigger leftspawn*:Disable:0:-1" //switch spawns based on path "OnMapSpawn" "bot_bombpath_rightSidePick,AddOutput,OnTrigger rightspawn*:Enable:0:-1" "OnMapSpawn" "bot_bombpath_rightSidePick,AddOutput,OnTrigger defendnavleft:Disable:0:-1" //If left side is picked: disable rightspawns. Disable right nav. "OnMapSpawn" "bot_bombpath_leftSidePick,AddOutput,OnTrigger rightspawn*:Disable:0:-1" "OnMapSpawn" "bot_bombpath_leftSidePick,AddOutput,OnTrigger leftspawn*:Enable:0:-1" "OnMapSpawn" "bot_bombpath_leftSidePick,AddOutput,OnTrigger defendnavright:Disable:0:-1" } logic_relay { "targetname" "lefttele" "OnTrigger" "blueside_teleport_out,AddOutput,target leftspawngatedefender2,0,-1" } logic_relay { "targetname" "righttele" "OnTrigger" "redside_teleport_out,AddOutput,target rightspawngatedefender2,0,-1" } trigger_multiple { "targetname" "thirdperson" "StartDisabled" "1" "spawnflags" "3" "origin" "268 510 49" "maxs" "50 50 50" "mins" "-50 -50 -50" "filtername" "filter_blue" "OnStartTouch" "!activator,setforcedtauntcam,1,0.1,-1" "OnStartTouch" "!activator,SetHUDVisibility,0,0.1,-1" "OnStartTouch" "!activator,DisableDamageForces,,0,-1" //doesn't work? "OnEndTouch" "!activator,setforcedtauntcam,0,0,-1" "OnEndTouch" "!activator,SetHUDVisibility,1,0,-1" "OnEndTouch" "!activator,EnableDamageForces,,0,-1" } trigger_multiple { "targetname" "opengateright" "StartDisabled" "1" "spawnflags" "3" "origin" "-3995.271484 -2841.066162 36.031250" "maxs" "50 50 50" "mins" "-50 -50 -50" "filtername" "filter_blue" "OnStartTouch" "RightSide_Door,Open,1,0.1,-1" "OnEndTouch" "RightSide_Door,Open,1,0.1,-1" } trigger_multiple { "targetname" "opengateleft" "StartDisabled" "1" "spawnflags" "3" "origin" "-2966.143066 3305.273926 132.031250" "maxs" "50 50 50" "mins" "-50 -50 -50" "filtername" "filter_blue" "OnStartTouch" "LeftSide_Door,Open,1,0.1,-1" "OnEndTouchTouch" "LeftSide_Door,Open,1,0.1,-1" } // Caps the left point, red side // logic_relay // { // "origin" "-1611.31 4748.55 169.35" // "targetname" "forcecapleft" // "OnTrigger" "gate_capturepoint,SetOwner,3,0.15,-1" // "OnTrigger" "gate_capturepoint,SetOwner,3,0.1,-1" // "OnTrigger" "gate_capturepoint,SetOwner,3,0,-1" // "OnTrigger" "gate_prerequisite_door_left,Disable,,0.15,-1" // "OnTrigger" "wave_start_relay,AddOutput,OnTrigger opengateleft:Enable:0.1:-1" // "OnTrigger" "playerspawn,Disable,,0.1,-1" // "OnTrigger" "spawnbot*,Disable,,0.1,-1" // "OnTrigger" "barrierteleleft,Disable,,0,-1" // "OnTrigger" "LeftSide_Door,Open,,0.15,-1" // "OnTrigger" "point_populator_interface,ChangeBotAttributes,RevertGateBotsBehavior,0.15,-1" // "OnTrigger" "point_populator_interface,ChangeDefaultEventAttributes,RevertGateBotsBehavior,0.15,-1" // "OnTrigger" "movespawns_left,Trigger,,0,-1" // "OnTrigger" "intel_new2,Enable,,0,-1" // "OnTrigger" "intel*,ForceReset,,0.5,-1" // "OnTrigger" "bombpath_arrows_left_left,Enable,,0,-1" // "OnTrigger" "bombpath_arrows_left_left,Disable,,22,-1" // "OnTrigger" "redside_engineer_pastpoint,Enable,,0,-1" // "OnTrigger" "redside_engineer,Disable,,0,-1" // "OnTrigger" "LeftSide_Door_blockbots,Disable,,5,-1" // "OnTrigger" "wave_finished_relay,CancelPending,,0,-1" // } //Caps the right point, blue side logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "forcecapright" "OnTrigger" "gate_capturepoint,SetOwner,3,0.15,-1" "OnTrigger" "gate_capturepoint,SetOwner,3,0.1,-1" "OnTrigger" "gate_capturepoint,SetOwner,3,0,-1" "OnTrigger" "gate_prerequisite_door_right,Disable,,0.15,-1" "OnTrigger" "wave_start_relay,AddOutput,OnTrigger opengateright:Enable:0.1:-1" "OnTrigger" "playerspawn,Disable,,0.1,-1" "OnTrigger" "spawnbot*,Disable,,0.2,-1" // "OnTrigger" "barrierteleright,Disable,,0,-1" "OnTrigger" "RightSide_Door,Open,,0.15,-1" "OnTrigger" "point_populator_interface,ChangeBotAttributes,RevertGateBotsBehavior,0.15,-1" "OnTrigger" "point_populator_interface,ChangeDefaultEventAttributes,RevertGateBotsBehavior,0.15,-1" "OnTrigger" "movespawns_right,Trigger,,0,-1" "OnTrigger" "intel_new2,Enable,,0,-1" "OnTrigger" "intel*,ForceReset,,0.5,-1" "OnTrigger" "bombpath_arrows_right_right,Enable,,0,-1" "OnTrigger" "bombpath_arrows_right_right,Disable,,22,-1" "OnTrigger" "blueside_engineer_pastpoint,Enable,,0,-1" "OnTrigger" "blueside_engineer,Disable,,0,-1" "OnTrigger" "RightSide_Door_blockbots,Disable,,5,-1" "OnTrigger" "wave_finished_relay,CancelPending,,0,-1" } //Forces right path logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "forceright" "OnTrigger" "defendnavleft,Disable,,0,-1" "OnTrigger" "defendnavright,Enable,,0.01,-1" "OnTrigger" "leftspawn*,Disable,,0,-1" "OnTrigger" "rightspawn*,Enable,,0.01,-1" "OnTrigger" "blueside_teleport_out,AddOutput,target rightspawngatedefender,0,-1" "OnTrigger" "blueside_teleport_out,Enable,,1,-1" "OnTrigger" "bluesidedoor_*,Close,,1,-1" "OnTrigger" "bot_bombpath_rightSidePick,Trigger,,1,-1" } // logic_relay // { // "origin" "-1611.31 4748.55 169.35" // "targetname" "forceleft" // "OnTrigger" "defendnavright,Disable,,0,-1" // "OnTrigger" "defendnavleft,Enable,,0.01,-1" // "OnTrigger" "rightspawn*,Disable,,0,-1" // "OnTrigger" "leftspawn*,Enable,,0.01,-1" // "OnTrigger" "blueside_teleport_out,AddOutput,target leftspawngatedefender2,0,-1" // "OnTrigger" "blueside_teleport_out,Enable,,1,-1" // "OnTrigger" "bluesidedoor_*,Close,,1,-1" // "OnTrigger" "bot_bombpath_leftSidePick,Trigger,,1,-1" // } logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "endright" "OnTrigger" "blueside_teleport_out,Disable,,0,-1" "OnTrigger" "bluedoors_trigger,Disable,,0,-1" "OnTrigger" "tf_point_nav_interface,RecomputeBlockers,,1,-1" "OnTrigger" "game_player*,Kill,,0,-1" "OnTrigger" "bluesidedoor_2,Open,,1,-1" "OnTrigger" "bluesidedoor_1,Open,,1.1,-1" "OnTrigger" "bluesidedoor_0,Open,,1.2,-1" "OnTrigger" "blueside_nobuild,Disable,,0,-1" } logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "endleft" "OnTrigger" "redside_teleport_out,Disable,,0,-1" "OnTrigger" "reddoors_trigger,Disable,,0,-1" "OnTrigger" "tf_point_nav_interface,RecomputeBlockers,,3,-1" "OnTrigger" "game_player*,Kill,,0,-1" "OnTrigger" "redsidedoor*,Open,,1,-1" "OnTrigger" "redside_nobuild,Disable,,0,-1" } logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "secondbarrier" "OnTrigger" "tempbarrierB*,Disable,,0,-1" "OnTrigger" "tankcapdoor_opener,Open,,0,-1" "OnTrigger" "left_tankdoor,Open,,0,-1" "OnTrigger" "right_tankdoor,Open,,0,-1" } //Opens red and tankdoors logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "opentankdoors" "OnTrigger" "frontline_tankdoor_clock,Kill,,0,-1" "OnTrigger" "opentankdoor_frontline*,Trigger,,0.01,-1" "OnTrigger" "opentankdoor_frontline*,Trigger,,0.01,-1" "OnTrigger" "redsidedoor*,Open,,0.01,-1" "OnTrigger" "frontspawn,Disable,,10,-1" "OnTrigger" "righttele,Trigger,,0,-1" "OnTrigger" "lefttele,Trigger,,0,-1" } //Closes blue side doors logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "closerightdoors" "OnTrigger" "game_playerkill,Enable,,0.1,-1" "OnTrigger" "bluesidedoor_*,Close,,0.1,-1" } //Opens blue side doors and tank doors logic_relay { "origin" "0 0 0" "targetname" "openrightdoors" "OnTrigger" "bluesidedoor_*,Open,,1,-1" "OnTrigger" "game_player*,Kill,,0,-1" "OnTrigger" "_leftrrrfrontline_tankdoor,Open,,1,-1" "OnTrigger" "tankcapdoor_opener,Open,,0.1,-1" } //Close tank doors; set the skin of alarm to "off". logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "closetankdoors" "OnTrigger" "frontline_tankdoor,Close,,0,-1" "OnTrigger" "gatealarm_fartted,StopSound,,0,-1" "OnTrigger" "Tankdoor_prop_frontline,SetAnimation,1,0,-1" "OnTrigger" "Tankdoor_prop_frontline,Skin,1,0,-1" "OnTrigger" "tempbarrierA*,Enable,,0.01,-1" } //caps a random gate. logic_case { "origin" "-6305.17 96 192" "targetname" "forcecaprandom" "Case02" "Right" "Case01" "Left" "classname" "logic_case" "OnCase01" "forcecapleft,Trigger,,1.15,-1" "OnCase02" "forcecapright,Trigger,,1.15,-1" } //New flag item_teamflag { "origin" "-3323.152344 3538.447998 72.031311" "trail_effect" "2" "TeamNum" "0" "targetname" "intel_new" "StartDisabled" "1" "ScoringType" "0" "ReturnTime" "35" "ReturnBetweenWaves" "1" "GameType" "3" "NeutralType" "2" "flag_trail" "flagtrail" "flag_paper" "player_intel_papertrail" "flag_model" "models/props_td/atom_bomb.mdl" "flag_icon" "../hud/objectives_flagpanel_carried" "angles" "0 270 0" } //New flag, 2 item_teamflag { "origin" " -3650.518311 -3368.843262 0" "trail_effect" "2" "TeamNum" "0" "targetname" "intel_new2" "StartDisabled" "1" "ScoringType" "0" "ReturnTime" "35" "ReturnBetweenWaves" "1" "GameType" "3" "NeutralType" "2" "flag_trail" "flagtrail" "flag_paper" "player_intel_papertrail" "flag_model" "models/props_td/atom_bomb.mdl" "flag_icon" "../hud/objectives_flagpanel_carried" "angles" "0 270 0" } //Cover of hatch; might not bee needed? // prop_dynamic // { // "targetname" "hatchcover" // "DisableBoneFollowers" "1" // "disablereceiveshadows" "1" // "model" "models/props_hydro/water_machinery2.mdl" // "disableshadows" "1" // "fademaxdist" "0" // "fademindist" "1024" // "fadescale" "0.75" // "modelscale" "1.0" // "renderamt" "254" // "rendercolor" "100 100 255" // "renderfx" "9" // "rendermode" "0" // "CollisionGroup" "1" // "solid" "0" // "StartDisabled" "0" // "origin" "268 510 49" // } //Collision for hatch // func_forcefield // { // "origin" "268 510 69" // "rendercolor" "255 255 255" // "renderfx" "0" // "rendermode" "10" // "TeamNum" "2" // "targetname" "hatchcovercollision" // "parentname" "hatchcover" // "mins" "-100 -120 -100" // "maxs" "100 120 100" // "StartDisabled" "0" // } //Removes hatch blocker logic_relay { "targetname" "unblockhatch" "OnTrigger" "hatchcover*,Disable,,0,-1" "OnTrigger" "hatchcover*,DisableCollision,,0.01,-1" "OnTrigger" "hatchopen,Show,,0,-1" "OnTrigger" "thirdperson,Enable,,0,-1" } //Nav towards hatch func_nav_prerequisite { "targetname" "hatchnav" "mins" "-8000 -8000 -8000" "maxs" "8000 8000 8000" "Entity" "hatchspawn" "filtername" "filter_hatchspawn" "origin" "268 510 129" "spawnflags" "1" "start_disabled" "0" "StartDisabled" "0" "Task" "2" "Value" "-1" } //Nav to the blue "gate defender" spawnpoint (seperate spawnpoint not in logic!) func_nav_prerequisite { "targetname" "defendnavright" "mins" "-2000 -2000 -2000" "maxs" "2000 2000 2000" "Entity" "rightspawngatedefender2" "filtername" "filter_defendingr" "origin" "-3918.257568 2068.090820 112.171120" "spawnflags" "1" "Task" "2" "Value" "-1" } //Nav to the red "gate defender" spawnpoint func_nav_prerequisite { "targetname" "defendnavleft" "mins" "-2000 -2000 -2000" "maxs" "2000 2000 2000" "Entity" "leftspawngatedefender2" "filtername" "filter_defendingl" "origin" "-3851 -1252 228" "spawnflags" "1" "Task" "2" "Value" "-1" } filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "bot_hatchspawn" "targetname" "filter_hatchspawn" } filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "bot_periodic" "targetname" "filter_periodic" } filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "bot_defender_r" "targetname" "filter_defendingr" } filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "bot_defender_l" "targetname" "filter_defendingl" } // Teleports to blue side spawn, from inside blue gate // trigger_teleport // { // "targetname" "barrierteleright" // "spawnflags" "3" // "target" "spawnbot_front_left" // "origin" "-3632.000000 -3405.209961 66.618073" // "mins" "-100 -100 -100" // "maxs" "100 100 100" // } // Teleports to blue side spawn, from inside red gate // trigger_teleport // { // "targetname" "barrierteleleft" // "spawnflags" "3" // "target" "spawnbot_front_left" // "origin" "-3431.968750 3529.504639 70" // "mins" "-200 -200 -200" // "maxs" "200 200 200" // } //Teleports to blue side spawn, from red side spawn trigger_teleport { "targetname" "tele_red_to_blue" "StartDisabled" "1" "spawnflags" "3" "target" "spawnbot_front_left" //blue side "origin" "-8800 336 70" //red side "mins" "-200 -200 -200" "maxs" "200 200 200" } //Teleports to red side spawn, from blue side spawn trigger_teleport { "targetname" "tele_blue_to_red" "StartDisabled" "1" "spawnflags" "3" "target" "spawnbot_front_right" //red side "origin" "-6388 -2592 4" //blue side "mins" "-200 -200 -200" "maxs" "200 200 200" } // Teleports to blue side spawn, from red & blue gate. trigger_teleport { "targetname" "tele_redgate_to_blue" "StartDisabled" "1" "target" "spawnbot_front_left" "spawnflags" "3" "origin" "-3260.709961 3534.000000 129.031311" "mins" "-1010 -1010 -1010" "maxs" "1010 1010 1010" } trigger_teleport { "targetname" "tele_bluegate_to_blue" "StartDisabled" "1" "target" "spawnbot_front_left" "spawnflags" "3" "origin" "-3632.000000 -3405.209961 33.031311" "mins" "-1010 -1010 -1010" "maxs" "1010 1010 1010" } // Teleports to red side spawn, from red & blue gate. trigger_teleport { "targetname" "tele_redgate_to_red" "StartDisabled" "1" "target" "spawnbot_front_right" "spawnflags" "3" "origin" "-3260.709961 3534.000000 129.031311" "mins" "-1010 -1010 -1010" "maxs" "1010 1010 1010" } trigger_teleport { "targetname" "tele_bluegate_to_red" "StartDisabled" "1" "target" "spawnbot_front_right" "spawnflags" "3" "origin" "-3632.000000 -3405.209961 33.031311" "mins" "-1010 -1010 -1010" "maxs" "1010 1010 1010" } // Teleport to blue gate, from red & blue side trigger_teleport { "targetname" "tele_red_to_bluegate" "StartDisabled" "0" "spawnflags" "3" "target" "spawnbot_right" //blue gate "origin" "-8800 336 70" //red side "mins" "-200 -200 -200" "maxs" "200 200 200" } trigger_teleport { "targetname" "tele_blue_to_bluegate" "StartDisabled" "0" "spawnflags" "3" "target" "spawnbot_right" //blue gate "origin" "-6388 -2592 4" //blue side "mins" "-300 -300 -200" "maxs" "300 300 200" } //Moves spawns, enables teleports. //From blue gate to blue: logic_relay { "targetname" "movespawns_bluegate_to_blue" "OnTrigger" "spawnbot_front_left,Enable,,0.01,-1" //Front Left is blue... "OnTrigger" "spawnbot_right,Disable,,0.01,-1" //but Right is blue gate...weird. //Disable tp's to bluegate. "OnTrigger" "tele_blue_to_bluegate,Disable,,0.01,-1" "OnTrigger" "tele_red_to_bluegate,Disable,,0.01,-1" //Enable tp from bluegate, to blue. "OnTrigger" "tele_bluegate_to_blue,Enable,,0.01,-1" } //From blue to red: logic_relay { "targetname" "movespawns_blue_to_red" "OnTrigger" "spawnbot_front_right,Enable,,0.01,-1" //Front Left is blue... "OnTrigger" "spawnbot_front_left,Disable,,0.01,-1" //but Right is blue gate...weird. //Disable tp's to blue. "OnTrigger" "tele_bluegate_to_blue,Disable,,0.01,-1" "OnTrigger" "tele_red_to_blue,Disable,,0.01,-1" //Enable tp from bluegate, to blue. "OnTrigger" "tele_blue_to_red,Enable,,0.01,-1" } //Near the side blue path of hatch, in the air info_teleport_destination { "targetname" "teleexit" "origin" "134.408783 -1182.439575 919.223816" } //Near the side red path of hatch, in the air info_teleport_destination { "targetname" "teleexit1" "origin" "51.621315 1428.493896 564.094727" } //Blue side spawn info_teleport_destination { "targetname" "teleexit2" "origin" "-6387.819824 -2592.000000 1.031315" } //Logic for the hudhint per wave! //wave_start_relay enable the hint; it gets hidden after 10s, then unhidden after 30s //wave_finished_relay then disables the hint. logic_relay //objective display { "targetname" "hudhintloop" "OnTrigger" "hudhint,ShowHudHint,,2,-1" "OnTrigger" "hudhint,HideHudHint,,10,-1" "OnTrigger" "hudhintloop,Trigger,,30,-1" } logic_relay { "targetname" "hudhintloop2" "OnTrigger" "hudhintloop,Trigger,,0,-1" "OnSpawn" "wave_start_relay,AddOutput,OnTrigger hudhintloop:Trigger:1:-1,1,-1" "OnSpawn" "wave_finished_relay,AddOutput,OnTrigger hudhintloop:CancelPending:0:-1,0,-1" } env_hudhint { "targetname" "hudhint" "message" "OBJECTIVE: Escort your bomb carrier to the hatch to win!" "spawnflags" "1" } //Blue gate respawnroom extension. //Stretches from -4125, -3410, -40 // to -3500, -3550, 40 //diff is 625, 140, 80 //become 313, -313; 70, -70; 40, -40 //into -3813, -3480, 0 func_respawnroom { "targetname" "bluegate_resproom" "mins" "-313 -120 -40" "maxs" "313 70 40" "origin" "-3813 -3480 0" "TeamNum" "3" } prop_dynamic { "targetname" "resupply_prop_bluegate" "origin" "-4073 -3404 -34" "angles" "0 0 0" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "fadescale" "0" "maxanimtime" "10" "minanimtime" "5" "model" "models/props_gameplay/resupply_locker.mdl" "pressuredelay" "0" "randomanimation" "0" "renderamt" "255" "rendercolor" "255 255 255" "skin" "0" "solid" "6" "spawnflags" "0" "StartDisabled" "0" } //floor is at 36 - 68 = -32, put at -32 + 56 = 24 func_regenerate { "targetname" "resupply_bluegate" "associatedmodel" "resupply_prop_bluegate" "TeamNum" "3" "origin" "-4072 -3380 24" "mins" "-40 -48 -56" "maxs" "40 48 56" } } controlpoint { NoFixup 1 OnSpawnOutput { Target "cap_base" Action "$SetProp$m_bGlowEnabled" Delay 0 Param "1" } prop_dynamic { "model" "models/props_gameplay/cap_point_base.mdl" "targetname" "cap_base" "solid" "6" "skin" "1" //set to 0 for neutral, 1 for red, 2 for blu "angles" "0 0 2.5" } prop_dynamic { "model" "models/props_gameplay/cap_square_512.mdl" "targetname" "cap_base2" "solid" "6" "skin" "1" //set to 0 for neutral, 1 for red, 2 for blu "angles" "0 0 2.5" "origin" "0 0 10" } trigger_capture_area { "targetname" "cap_area" "classname" "trigger_capture_area" "area_cap_point" "cap_point" "area_time_to_cap" "20" //multiply this number by 2 to get the capture duration in seconds, raising "team_numcap_3" and "team_numcap_2" will also increase the time taken by a factor of the value (e.g. raising it to 2 will multiply the duration by 2) "StartDisabled" "0" "team_cancap_2" "0" //setting this number to 0 disables red team from recapturing, 1 enables red team to recapture "team_cancap_3" "1" //1 enables blu team to cap "team_numcap_2" "1" //changing this number will change the number of red players required to stand on the point to finish capturing "team_numcap_3" "1" //changing this number will change the number of blu players required to stand on the point to finish capturing "team_spawn_2" "0" "team_spawn_3" "0" "team_startcap_2" "1" //changing this number will change the number of red players required to stand on the point to begin capturing "team_startcap_3" "1" //changing this number will change the number of blu players required to stand on the point to begin capturing "mins" "-256 -256 -256" "maxs" "256 256 256" "origin" "0 0 256" "spawnflags" "1" "OnCapTeam1" "cap_base,Skin,1,0,-1" //set the first number to 0 for neutral, 1 for red, 2 for blu "OnCapTeam2" "cap_base,Skin,2,0,-1" //set the first number to 0 for neutral, 1 for red, 2 for blu ////////////////////////////////////////////editable outputs//////////////////////////////////////////// OnStartTeam1,OnBreakTeam1,OnCapTeam1,OnStartTeam2,OnBreakTeam2.OnCapTeam2,OnStartCap,OnBreakCap,OnEndCap,OnNumCappersChanged,OnNumCappersChanged2 //add your outputs here using "OnCapTeam2" for blu team capture, or "OnCapTeam1" for red team capture "OnCapTeam2" "cap_base2,Skin,2,0,-1" //set the first number to 0 for neutral, 1 for red, 2 for blu "OnCapTeam2" "spawnbot_right_w2,Enable,,0,-1" "OnCapTeam2" "tp,Show,,0.01,-1" "OnCapTeam2" "tp,Enable,,0.05,-1" "OnCapTeam2" "spawnbot_hatch_def,Enable,,0,-1" "OnCapTeam2" "spawnbot_hatch_alt,Enable,,0,-1" "OnCapTeam2" "spawnbot_front_w2_blu,Disable,,0,-1" "OnCapTeam2" "spawnbot_front_w2_red,Disable,,0,-1" "OnCapTeam2" "realtimer,CancelPending,,0,-1" } team_control_point { "targetname" "cap_point" "classname" "team_control_point" "angles" "0 0 0" "point_default_owner" "2" //this is the team that the control point will spawn in, set this number to 0 for neutral, 2 for red, 3 for blu "point_group" "0" "point_index" "4" //if you plan on having multiple control points at once, you must give each one a unique "point_index", spawning more than 8 control points on the map will crash the server "point_printname" "Entrance" //this is the name of the control point that will show up in the kill feed "point_start_locked" "0" "point_warn_on_cap" "0" "point_warn_sound" "ControlPoint.CaptureWarn" "random_owner_on_restart" "0" "spawnflags" "4" "team_bodygroup_0" "3" "team_bodygroup_2" "1" "team_bodygroup_3" "1" "team_icon_0" "sprites/obj_icons/icon_obj_neutral" //this is the image shown on the hud icon "team_icon_2" "sprites/obj_icons/icon_obj_red" "team_icon_3" "sprites/obj_icons/icon_obj_blu_mannhattan" "team_model_0" "models/effects/cappoint_hologram.mdl" //this is the model of the hologram that appears above the control point "team_model_2" "models/effects/cappoint_hologram.mdl" "team_model_3" "models/effects/cappoint_hologram.mdl" "team_previouspoint_3_0" "cap_point" //if you want to create a sequence of control points similar to an attack/defense map, this keyvalue determines the order in which they can be captured //it represents the names of the previous control points that must be owned by blu team before this point can be unlocked, if this is the first control point on the map, it must refer to itself or else it will be locked //"team_previouspoint_3_1" "0" //"team_previouspoint_3_2" "0" //"team_previouspoint_2_0" "cap_point" //this allows red to recapture if "team_cancap_2" is set to 1 in the trigger_capture_area //"team_previouspoint_2_1" "0" //"team_previouspoint_2_2" "0" "team_timedpoints_2" "0" "team_timedpoints_3" "0" "origin" "0 0 4" } team_control_point_master { "classname" "team_control_point_master" "cpm_restrict_team_cap_win" "1" //this makes it so the wave does not end when all the points are owned by a team, set this to 0 for neither team (this will end the wave on capture), 1 to restrict both teams, 2 to restrict red team winning, and 3 to restrict blu team winning "custom_position_x" "0.4" //you can change the number here to move the control points on the hud if something is blocking it, accepted values are from 0 to 1 and is expressed as a percentage of the screen from left to right, 0.5 or "-1" will center the hud "custom_position_y" "-1" "partial_cap_points_rate" "0" //this gives points on the scoreboard for partially capturing a point, it has nothing to do with the rate at which the control point is captured "play_all_rounds" "0" "score_style" "0" "StartDisabled" "0" "switch_teams" "0" "targetname" "cap_master" "team_base_icon_2" "sprites/obj_icons/icon_base_red" "team_base_icon_3" "sprites/obj_icons/icon_base_blu" } training_annotation { "targetname" "cap_text" "display_text" "Capture the control point!" "lifetime" "10" "origin" "0 0 50" } OnSpawnOutput //very important to keep this output otherwise the control point will not function { Target cap_area Action SetControlPoint Param cap_point } OnSpawnOutput //i believe this output is optional but it is kept here for debugging purposes, if you do not restrict a team from winning and the control point spawned owned by red or blu, it will automatically end the wave so make sure you set the restriction { Target cap_master Action RoundSpawn } } //Custom sniper spots! Start out disabled. Re-enable them mid-wave! sniperspots { NoFixup 1 func_tfbot_hint { "targetname" "sniper_blu_front" "hint" "0" //0 - sniper spot, 1 - sentry gun spot "TeamNum" "2" "StartDisabled" "1" "origin" "-4440 545 140" } func_tfbot_hint { "targetname" "sniper_red_front" "hint" "0" //0 - sniper spot, 1 - sentry gun spot "TeamNum" "2" "StartDisabled" "1" "origin" "-5800 1100 -30" } func_tfbot_hint { "targetname" "sniper_blu_mid" "hint" "0" "TeamNum" "2" "StartDisabled" "0" "origin" "-490 -2400 -30" } func_tfbot_hint { "targetname" "sniper_blu_mid2" "hint" "0" "TeamNum" "2" "StartDisabled" "0" "origin" "-1740 -2470 180" } func_tfbot_hint { "targetname" "sniper_red_mid" "hint" "0" "TeamNum" "2" "StartDisabled" "1" "origin" "-3550 2000 135" } func_tfbot_hint { "targetname" "sniper_blu_base" "hint" "0" "TeamNum" "2" "StartDisabled" "0" "origin" "385 -195 116" } func_tfbot_hint { "targetname" "sniper_red_base" "hint" "0" "TeamNum" "2" "StartDisabled" "1" "origin" "-600 1400 196" } } engiespot { bot_hint_engineer_nest {} bot_hint_sentrygun {} bot_hint_teleporter_exit {} } //Dimensions are measured "from this side, to this side". // 0-------- 80 -------0 <- // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 117 // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0-------- 80 -------0 <- // and 180 high. //Tank dimensions: X (front-back): 117; Y (left-right): 80; Z (bottom-top): 180 tank_hints { NoFixup 1 info_target { "targetname" "tank_def_front" "origin" "70 0 0" } info_target { "targetname" "tank_def_back" "origin" "-70 0 0" } info_target { "targetname" "tank_def_side" "origin" "0 60 0" } info_target { "targetname" "tank_def_side" "origin" "0 -60 0" } } //Timer for 6 mins, by lite! textualtimer_6mins { OnSpawnOutput { Param 5 // change the value for minutes Target minutehand Action SetValue } OnSpawnOutput { Param 60 // change the value for seconds Target secondhand Action SetValue } logic_relay { "targetname" "loserelay" "startdisabled" "1" "ontrigger" "redwin_relay,Trigger,,2,-1" "ontrigger" "realtimer,cancelpending,,2,-1" "onspawn" "wave_start*,addoutput,ontrigger realtimer:trigger::0:-1,0,-1" "onspawn" "wave_finish*,addoutput,ontrigger realtimer:cancelpending::0:-1,0,-1" "onspawn" "wave_finish*,addoutput,ontrigger loserelay:cancelpending::0:-1,0,-1" } NoFixup 1 math_counter { "targetname" "minutehand" "max" "9999" "outvalue" "timerformat,$setkey$case01,,0,-1" "onhitmin" "loserelay,enable,,1,-1" } math_counter { "targetname" "secondhand" "max" "60" "outvalue" "timerformat,$setkey$case02,,0,-1" "outvalue" "zerocompare,setvaluecompare,,0,-1" "onhitmin" "loserelay,trigger,,0,-1" "onhitmin" "!self,setvalue,60,1,-1" "onhitmin" "minutehand,subtract,1,1,-1" } logic_compare { "targetname" "zerocompare" "comparevalue" "9" "onequalto" "timerformat,$setkey$case16,%:0%,0,-1" "ongreaterthan" "timerformat,$setkey$case16,%:%,0,-1" } logic_case { "targetname" "timerformat" "case16" "%:%" "ondefault" "timertext,$setkey$message,,0,-1" "ondefault" "timertext,display,0,0,-1" } game_text { "targetname" "timertext" "color" "65 155 255" "holdtime" "2" "spawnflags" "1" "x" "0.1" "y" "0.2" } logic_relay { "targetname" "realtimer" "spawnflags" "2" "ontrigger" "timerformat,$format,,0.01,-1" "ontrigger" "secondhand,subtract,1,0,-1" "ontrigger" "!self,trigger,,1,-1" } } lastbotlogic { //TODO: //- Add HUD text -> done //- Add sound to play -> to wavespawn NoFixup 1 OnSpawnOutput { Target "lastbot_text" Action Show Delay 0.1 } training_annotation { "targetname" "lastbot_text" "display_text" "This is your last bot! Deploy the bomb, or lose!" "lifetime" "4" "origin" "0 0 0" } //Why do this when you can have FirstSpawnWarningSound // ambient_generic // { // "targetname" "lastbot_sound" // "message" "misc/doomsday_lift_warning.wav" // "radius" "4000" // "health" "5" // "spawnflags" "48" // "OnUser1" "!self,PlaySound,,1,-1" // "OnUser1" "!self,Kill,,3,-1" // } // game_text // { // "origin" "999 999 999" // "targetname" "lb_text" // "message" "This is your last bot! Deploy the bomb or lose!" // "x" "-1" // "y" "0.4" // "spawnflags" "1" // "effect" "2" // "channel" "2" // "color" "255 255 255" // "fxtime" "0.2" // "fadeout" "1" // "fadein" "0" // "holdtime" "5" // } } //TODO: //- Cover up holes around blue gate spawn //- Add prop to weird clipping part in blue gate, next to upgrade station //- Add push to weird clipping part in blue gate //- Add resupply locker wave1logic { NoFixup 1 logic_relay { "targetname" "wave1_spawner" // "OnSpawn" "forcecapright,Trigger,,0.15,-1" //OnSpawn, trigger immediately: //SetOwner of gates to blue "OnSpawn" "gate_capturepoint,SetOwner,3,0.15,-1" "OnSpawn" "gate_capturepoint,SetOwner,3,0.1,-1" "OnSpawn" "gate_capturepoint,SetOwner,3,0,-1" //Disable all non-gate spawnpoints "OnSpawn" "movespawns_right,Trigger,,0.01,-1" "OnSpawn" "spawnbot_front_right,Disable,,0.01,-1" "OnSpawn" "tele_blue_to_bluegate,Enable,,0.01,-1" "OnSpawn" "tele_red_to_bluegate,Enable,,0.01,-1" //OnTrigger, trigger once wave has started //disable nav to gate "OnTrigger" "gate_prerequisite_door_right,Disable,,0.15,-1" "OnTrigger" "RightSide_Door,Open,,0.15,-1" "OnTrigger" "RightSide_Door_blockbots,Disable,,1.15,-1" //Enable "new" intel // "OnTrigger" "intel*,Disable,,0,-1" // "OnTrigger" "intel_new2,Enable,,0,-1" //TESTING ONLY // "OnSpawn" "stuffworks,Show,,0.01,-1" // "OnTrigger" "stuffworks2,Show,,0.01,-1" //OnTrigger, triggered at the start of wave 1 //Close all doors that would lead to the first area "OnTrigger" "bluesidedoor_0,Close,,0.01,-1" "OnTrigger" "bluesidedoor_1,Close,,0.01,-1" "OnTrigger" "bluesidedoor_2,Close,,0.01,-1" } } //InitWaveOutput disables red path wave2logic { NoFixup 1 logic_relay { "targetname" "wave2_spawner" "OnSpawn" "gate_capturepoint,SetOwner,3,0.15,-1" "OnSpawn" "gate_capturepoint,SetOwner,3,0.1,-1" "OnSpawn" "gate_capturepoint,SetOwner,3,0,-1" "OnSpawn" "movespawns_right,Trigger,,0.01,-1" "OnSpawn" "spawnbot_front_right,Disable,,0.01,-1" "OnSpawn" "hudhint,$SetKey$message,OBJECTIVE: Secure the control point!,0,-1" "OnSpawn" "realtimer,Trigger,,0.1,-1" //Doors near tank doors "OnSpawn" "bluesidedoor_3,Close,,0.01,-1" "OnSpawn" "bluesidedoor_5,Close,,0.01,-1" //OnTrigger, trigger once wave has started //disable nav to gate "OnTrigger" "gate_prerequisite_door_right,Disable,,0.15,-1" "OnTrigger" "RightSide_Door,Open,,0.15,-1" "OnTrigger" "RightSide_Door_blockbots,Disable,,1.15,-1" "OnTrigger" "cap_text,Show,,0,-1" "OnTrigger" "spawnbot_hatch_def,Disable,,0.1,-1" //Already enabled. // "OnSpawn" "tele_blue_to_bluegate,Enable,,0.01,-1" // "OnSpawn" "tele_red_to_bluegate,Enable,,0.01,-1" //TESTING ONLY // "OnSpawn" "stuffworks,Show,,0.01,-1" } //Initial barriers: large entrance. func_forcefield { "targetname" "w2blockers_large" "mins" "-60 -180 -230" "maxs" "60 220 230" "origin" "-2968 -1626 230" "TeamNum" "2" "disablereceiveshadows" "0" "renderamt" "255" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" //Don't render. "StartDisabled" "0" } //Large container prop_dynamic { "targetname" "w2blockers_large" "model" "models/props_vehicles/train_flatcar_container.mdl" "origin" "-2950 -1626 96" "angles" "0 90 0" "skin" "1" //0 = blue container, 1 = red "CollisionGroup" "1" //How its collision works. 0 = none, 1 = debris (world/static props only). "solid" "0" //Method of collision. 0 = none, 1 = model, 2-4 bounding box, 6 vphysics. // "modelscale" "0.7" "fademaxdist" "0" "fademindist" "-1" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "disableshadows" "1" "StartDisabled" "0" // "renderamt" "0" Transparency. 0 = invisible. // "renderfx" "16" Specific value for some effect. In this case, "hologram". // "rendermode" "0" How to render the prop. In this case, "normal". } func_nobuild { "targetname" "w2blockers_large" "mins" "-120 -150 -230" "maxs" "120 150 230" "origin" "-2968 -1626 230" "TeamNum" "3" } prop_dynamic { "targetname" "w2blockers_large" "origin" "-3028 -1606 190" "angles" "0 180 0" "modelscale" "0.85" "fademindist" "128" "fademaxdist" "512" "disablereceiveshadows" "1" "model" "models/props_mvm/no_entry.mdl" "disableshadows" "1" "solid" "0" "StartDisabled" "0" } //"Stop" hand sign prop_dynamic { "targetname" "w2blockers_large" "origin" "-3095 -1168 200" "angles" "0 90 0" "modelscale" "0.7" "fademaxdist" "0" "fademindist" "-1" "disablereceiveshadows" "1" "model" "models/props_urban/urban_hand_sign_medium.mdl" "disableshadows" "1" "solid" "0" "StartDisabled" "0" } //Small entrance. func_forcefield { "targetname" "w2blockers_small" "mins" "-60 -96 -230" "maxs" "60 96 230" "origin" "-3095 -1128 190" "TeamNum" "2" "disablereceiveshadows" "0" "renderamt" "255" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "StartDisabled" "0" } func_nobuild { "targetname" "w2blockers_small" "mins" "-120 -120 -230" "maxs" "120 120 230" "origin" "-3095 -1128 190" "TeamNum" "3" } //No entry overlay kinda thing prop_dynamic { "targetname" "w2blockers_small" "origin" "-3095 -1168 200" "angles" "0 180 0" "modelscale" "0.7" "fademindist" "128" "fademaxdist" "1024" "disablereceiveshadows" "1" "model" "models/props_mvm/no_entry.mdl" "disableshadows" "1" "solid" "0" "StartDisabled" "0" } //Smaller container prop_dynamic { "targetname" "w2blockers_small" "model" "models/props_urban/urban_shipping_container01.mdl" "origin" "-3064 -1168 96" "angles" "0 90 0" "skin" "1" //0 = blue container, 1 = red "CollisionGroup" "1" //How its collision works. 0 = none, 1 = debris (world/static props only). "solid" "0" //Method of collision. 0 = none, 1 = model, 2-4 bounding box, 6 vphysics. "modelscale" "0.8" "fademaxdist" "0" "fademindist" "-1" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "disableshadows" "1" "StartDisabled" "0" // "renderamt" "0" Transparency. 0 = invisible. // "renderfx" "16" Specific value for some effect. In this case, "hologram". // "rendermode" "0" How to render the prop. In this case, "normal". } //Opens blue side's tank doors logic_relay { "origin" "0 0 0" "targetname" "w2_opentankdoors" //Open the doors, play the light's animation and set its skin: "OnTrigger" "_bigboypantsopentankdoor_frontline_left,Trigger,,0.1,-1" "OnTrigger" "right_tankdoor,Open,,0.1,-1" //The door parts actually close themselves after some time, //so I set the wait to -1 to never happen. //Could also Kill them instead. "OnTrigger" "_leftrrrfrontline_tankdoor*,$SetKey$wait,-1,2,-1" // "OnTrigger" "_bigboypantsgatealarm_fartted,PlaySound,,0,-1" //why is it named that // "OnTrigger" "_bigboypantstankdoor_prop_frontline,AddOutput,skin 2,0,-1" // "OnTrigger" "_bigboypantstankdoor_prop_frontline,SetAnimation,Spin,0,-1" //And shut off the light, anim, and sound afterwards. "OnTrigger" "_bigboypantsgatealarm_fartted,StopSound,,4,-1" "OnTrigger" "_bigboypantstankdoor_prop_frontline,AddOutput,skin 1,10,-1" "OnTrigger" "_bigboypantstankdoor_prop_frontline,SetAnimation,Idle,10,-1" "OnTrigger" "tankdoors_blu_text,Show,,0.01,-1" } //Close tank doors; set the skin of alarm to "off". logic_relay { "origin" "0 0 0" "targetname" "w2_closetankdoors" "OnTrigger" "_leftrrrfrontline_tankdoor,Close,,1,-1" } training_annotation { "targetname" "tankdoors_blu_text" "display_text" "The tank doors have opened! Get ready!" "lifetime" "4" "origin" "-3060 -780 285" } prop_dynamic { "targetname" "spawnpointprops" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-7060 680 -112" "defaultanim" "idle" "disableshadows" "1" "skin" "0" // Skin 0 for Red, Skin 1 for Blue, Skin 2 for Gray, and Skin 3 to disable the hologram } prop_dynamic { "targetname" "spawnpointprops" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-5737 -1100 -96" "defaultanim" "idle" "disableshadows" "1" "skin" "0" // Skin 0 for Red, Skin 1 for Blue, Skin 2 for Gray, and Skin 3 to disable the hologram } } //TODO: //- Switch spawns properly // - Disable existing spawns // - Enable proper spawns // - Force respawn at start of wave? // - TEST: does it automatically get changed with finished_relay? //- Double-check barrier // - Copy existing logic //- Disable logic that sets gate as capped (standard?) //- wave3logic { NoFixup 1 logic_relay { "targetname" "wave3_spawner" //Anyone in blue (gate) spawn will be teleported to red spawn. Disable blue spawn. "OnTrigger" "tele_red_to_blue,Enable,,0.01,-1" "OnTrigger" "tele_bluegate_to_blue,Enable,,0.01,-1" "OnTrigger" "tele_blue_to_bluegate,Disable,,0.01,-1" "OnTrigger" "tele_red_to_bluegate,Disable,,0.01,-1" "OnTrigger" "spawnbot_front_left,Enable,,0.01,-1" "OnTrigger" "spawnbot_right,Disable,,0.01,-1" "OnTrigger" "spawnbot_front_right,Disable,,0.01,-1" //Tank things! "OnTrigger" "boss_path_11,AddOutput,OnPass tankstopper:Trigger::0:-1,0,-1" "OnTrigger" "boss_path_15,AddOutput,OnPass spawnbot_w3_boxesdoor:Disable::0:-1,0,-1" "OnTrigger" "boss_path_15,AddOutput,OnPass spawnbot_hatch_alt:Enable::0:-1,0,-1" "OnTrigger" "tankcapdoor_opener,AddOutput,OnOpen left_tankdoor:Open::0:-1,0,-1" "OnTrigger" "boss_path_branch2,AddOutput,OnPass tankdoor_silencer:Trigger::4:-1,0,-1" } logic_relay { "targetname" "tankstopper" "OnTrigger" "tankboss,SetSpeed,0,5,-1" } logic_relay { "targetname" "tankdoor_silencer" "OnTrigger" "gatealarm_fartted,StopSound,,0,-1" "OnTrigger" "Tankdoor_prop_frontline,SetAnimation,1,0,-1" "OnTrigger" "Tankdoor_prop_frontline,Skin,1,0,-1" } } wave4logic { NoFixup 1 } wave5logic { NoFixup 1 } wave6logic { NoFixup 1 } tempbarriers { func_forcefield { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "tempbarrierA1" "parentname" "tempbarrierA" "mins" "-300 -100 -3000" "maxs" "300 100 3000" "StartDisabled" "0" } prop_dynamic { "targetname" "tempbarrierA" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "modelscale" "1.5" "renderamt" "0" "renderfx" "16" //"rendermode" "0" "skin" "1" "CollisionGroup" "1" "solid" "0" "StartDisabled" "0" "origin" "0 0 0" } } doorcloseomatic { NoFixup 1 //stay the fuck closed trigger_brush { "origin" "-596 -232 34" "targetname" "game_playerkill" "StartDisabled" "0" "OnUse" "bluesidedoor*,Close,0,-1" "OnUse" "redsidedoor*,Close,0,-1" } } doorcloseomatic2 { NoFixup 1 trigger_brush { "origin" "-596 -232 34" "targetname" "game_playerdie" "StartDisabled" "0" "OnUse" "bluesidedoor_3,Close,0,-1" "OnUse" "bluesidedoor_4,Close,0,-1" "OnUse" "bluesidedoor_5,Close,0,-1" "OnUse" "redsidedoor*,Close,0,-1" } } tempbarriers2 { NoFixup 1 func_forcefield { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "tempbarrierB1" "parentname" "tempbarrierB" "mins" "-300 -100 -300" "maxs" "300 100 300" "StartDisabled" "0" } prop_dynamic { "targetname" "tempbarrierB" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "modelscale" "1.5" "renderamt" "0" "renderfx" "16" //"rendermode" "0" "skin" "1" "CollisionGroup" "1" "solid" "0" "StartDisabled" "0" "origin" "0 0 0" } } station { NoFixup 1 func_upgradestation //upgrade station entity { "mins" "-105 -100 0" "maxs" "105 100 242" "solid" "0" } prop_dynamic { "angles" "0 0 0" "model" "models\props_mvm\mvm_upgrade_blu.mdl" "modelscale" "1.0" "rendercolor" "255 255 255" "solid" "2" "targetname" "station" "origin" "0 0 0" } // prop_dynamic // { // "targetname" "idiot" // "parentname" "upgradestation" // "DisableBoneFollowers" "1" // "disableshadows" "1" // "fademaxdist" "0" // "fademindist" "-1" // "model" "models/bots/bot_worker/bot_worker_a.mdl" // "DefaultAnim" "idle" // "renderfx" "0" // "rendermode" "0" // "SetBodyGroup" "2" // "skin" "1" // "solid" "0" // "origin" "-65 50 0" // } // prop_dynamic // { // "targetname" "shopcollision" // "angles" "0 -90 0" // "DisableBoneFollowers" "1" // "disablereceiveshadows" "1" // "model" "models/props_vehicles/train_flatcar_container.mdl" // "disableshadows" "1" // "fademaxdist" "0" // "fademindist" "-1" // "renderamt" "0" // "renderfx" "0" // "rendermode" "10" // "CollisionGroup" "5" // "solid" "6" // "StartDisabled" "0" // "origin" "0 0 0" // } } station_rotated_90n { NoFixup 1 func_upgradestation //upgrade station entity { "mins" "-105 -100 0" "maxs" "105 100 242" "solid" "0" } func_forcefield //because solid options are just really...funky. { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "station_clip_90n" "maxs" "115 80 242" "mins" "-115 -80 0" "StartDisabled" "0" } prop_dynamic { "model" "models\props_mvm\mvm_upgrade_blu.mdl" "modelscale" "1.0" "rendercolor" "255 255 255" "solid" "0" "targetname" "station_90n" "origin" "0 0 0" "angles" "0 -90 0" } } station_rotated_65 { NoFixup 1 func_upgradestation //upgrade station entity { "mins" "-105 -100 0" "maxs" "105 100 242" "solid" "0" } prop_dynamic //because func_forcefield is funky. { "targetname" "station_clip_60" "origin" "0 80 0" "angles" "0 65 0" // "modelscale" "1.4" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence01.mdl" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "15" "solid" "1" } prop_dynamic { "model" "models\props_mvm\mvm_upgrade_blu.mdl" "modelscale" "1.0" "rendercolor" "255 255 255" "solid" "0" "targetname" "station_65" "origin" "0 0 0" "angles" "0 65 0" } } W2_precapbarriers { NoFixup 1 func_forcefield { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "tempbarrierB1" "parentname" "tempbarrierB" "mins" "-300 -100 -300" "maxs" "300 100 300" "StartDisabled" "0" } prop_dynamic { "targetname" "tempbarrierB" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "modelscale" "1.5" "renderamt" "0" "renderfx" "16" //"rendermode" "0" "skin" "1" "CollisionGroup" "1" "solid" "1" "StartDisabled" "0" "origin" "0 0 0" } } W3_barriers_bluside { NoFixup 1 OnSpawnOutput { Target "tf_point_nav_interface" Action "RecomputeBlockers" Delay 1 } func_forcefield { //-5590 -220 -90 //-5580 640 1450 //Diff: //10 860 1540 //5 430 770 "origin" "-5585 210 680" "mins" "-5 -430 -770" "maxs" "5 430 770" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "0" "targetname" "tempbarrierB1" "parentname" "tempbarrierB" "StartDisabled" "0" } prop_dynamic { "targetname" "tempbarrierB" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "modelscale" "1.5" "renderamt" "0" "renderfx" "16" //"rendermode" "0" "skin" "1" "CollisionGroup" "1" "solid" "1" "StartDisabled" "0" "origin" "-5575 30 -27" } } ramps { NoFixup 1 prop_dynamic //carrier tank ramp { "targetname" "ramp" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence01.mdl" "renderfx" "0" "rendermode" "10" "solid" "6" "origin" "0 0 0" } } barrier { NoFixup 1 prop_dynamic { "targetname" "barrierbuilding" "disableshadows" "1" "fademaxdist" "0" "fademindist" "0.0001" "model" "models\props_buildings\building_002a.mdl" "renderfx" "1" "rendermode" "0" "solid" "6" "origin" "0 0 0" } } decoration2 { NoFixup 1 prop_dynamic { "targetname" "rocc" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" // "fademindist" "0.0001" "model" "models\bots\boss_bot\boss_tank_part1_destruction.mdl" "renderfx" "0" //"rendermode" "0" "solid" "6" "origin" "0 0 0" } } decoration { NoFixup 1 prop_dynamic { "targetname" "rocc" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models\bots\tw2\boss_bot\boss_tank_part1_destruction.mdl" "renderfx" "0" //"rendermode" "0" "solid" "6" "origin" "0 0 0" } } barrierfence { NoFixup 1 prop_dynamic { "targetname" "barrier1" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence01.mdl" "renderfx" "0" //"rendermode" "0" "solid" "6" "origin" "0 0 0" } prop_dynamic { "targetname" "barrier2" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence02.mdl" "RandomAnimation" "1" "renderfx" "0" //"rendermode" "0" "solid" "6" "origin" "0 0 0" } } annotation { NoFixup 1 training_annotation { "targetname" "stuffworks" "parentname" "spawnbot" "display_text" "Test message!" "lifetime" "4" "origin" "-6185 -2775 -15" } training_annotation { "targetname" "stuffworks2" "parentname" "spawnbot" "display_text" "Test message 2, the cooler one!" "lifetime" "4" "origin" "-6185 -2775 -15" } training_annotation { "targetname" "destroygianthint" "parentname" "spawnbot" "display_text" "Destroy all outlined giants!" "lifetime" "10" "origin" "268 510 129" } training_annotation { "targetname" "checkweapons" "parentname" "spawnbot" "display_text" "Many upgrades and weapon/player stats have been changed! inspect them here" "lifetime" "10" "origin" "-6448.904297 -2945.212402 21.101023" } training_annotation { "targetname" "escorttogate" "parentname" "intel*" "display_text" "Capture the gate to deliver the bomb!" "lifetime" "10" "origin" "-6336 -2625.02 -32" } training_annotation { "targetname" "hatchopen" "display_text" "The bomb can now be deployed!" "lifetime" "10" "origin" "268 510 129" } } AirTeleport { NoFixup 1 filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "airtp" //add this tag to the bot you want to teleport "targetname" "filter_airtp" } trigger_teleport { "origin" "700 1275 200" //locate this where the bot will spawn: spawnbot "mins" "-500 -500 -200" "maxs" "500 500 200" "spawnflags" "1" "filtername" "filter_airtp" "target" "destination" //Where to teleport the bot to } info_target //Will serve as the destination { "targetname" "destination" "origin" "-6680 -600 1050" //Where the bot goes } } annotation_airdrop { NoFixup 1 OnSpawnOutput { Target "airdropped" Action Show Delay 0.5 } training_annotation { "targetname" "airdropped" "display_text" "An aerial attack! Look up!" "lifetime" "5" "origin" "0 0 0" } } annotation_tank_req { NoFixup 1 OnSpawnOutput { Target "airdropped" Action Show Delay 0.5 } training_annotation { "targetname" "tankmessage" "display_text" "Kill the glowing giant to progress!" "lifetime" "5" "origin" "0 0 0" } } Teleporter_Blu { NoFixup 1 OnSpawnOutput //make teleporter non solid, otherwise the bots might get stuck on it { Target "tp" Action "addoutput" Param "solid 0" Delay 0.1 } OnSpawnOutput //hide it, can't have anything targeting this. { Target "tp" Action "Hide" Delay 0.00 } obj_teleporter { "targetname" "tp" "spawnflags" "2" "teamnum" "3" "TeleportWhere" "spawnbot_right_w2" "origin" "0 0 0" } } // Tank related repairtank { NoFixup 1 // OnSpawnOutput // { // Target "trigger_repair" // Action "SetParent" // Param "!activator" // } // OnSpawnOutput // { // Target panictank_init_relay // Action Trigger // } // OnSpawnOutput // { // Target "tankboss" // Action SetHealth // Param 10 // } info_target { "targetname" "tankshere" } filter_tf_bot_has_tag { "targetname" "filter_tankrepair" "tags" "bot_repair" "require_all_tags" "1" "Negated" "0" } // filter_tf_bot_has_tag // { // "targetname" "filter_tankspeed" // "tags" "bot_speedup" // "require_all_tags" "1" // "Negated" "0" // } trigger_multiple { "targetname" "trigger_repair" "mins" "-119 -100 -150" "maxs" "119 100 150" "filtername" "filter_tankrepair" "OnStartTouch" "tankboss*,AddHealth,100,0.02,-1" "OnStartTouch" "tankdamage_relay,Trigger,,0.04,-1" "OnStartTouch" "!activator,SetHealth,-1,0.2,-1" //kill the activator "spawnflags" 64 } // trigger_multiple // { // "targetname" "trigger_speed" // "mins" "-119 -100 -150" // "maxs" "119 100 150" // "filtername" "filter_tankspeed" // "OnStartTouch" "!activator,SetHealth,-1,0,-1" //kill the activator // "OnStartTouch" "tankboss,SetSpeed,75,0,-1" // "spawnflags" 64 // } } //Deals 1 damage to tank tankdamage { logic_relay { "targetname" "tankdamage_relay" "OnTrigger" "tankboss*,$TakeDamageFromActivator,1,0,-1" } } //tankspeed relays, by lite tankspeed_1 { //Set the max hit points logic_relay { "onspawn" "!parent,$getkey$health,healthcounter_high|sethitmax|0,0,-1" "onspawn" "!parent,$getkey$health,healthcounter_high|setvalue|0,0.01,-1" "onspawn" "!parent,$getkey$health,healthcounter_low|sethitmax|0,0,-1" "onspawn" "!parent,$getkey$health,healthcounter_low|setvalue|0,0.01,-1" } //70% logic_relay { "onspawn" "healthcounter_high,multiply,0.7,0.02,-1" } math_counter { "targetname" "healthcounter_high" "outvalue" "tankcompare_high,setcomparevalue,,0,-1" } logic_timer { "refiretime" "0.1" "ontimer" "!parent,$getdata$m_iHealth,tankcompare_high|setvaluecompare|0,0,-1" } logic_compare { "targetname" "tankcompare_high" "ongreaterthan" "!parent,setspeed,75,0,-1" "onlessthan" "!parent,$getdata$m_iHealth,tankcompare_low|setvaluecompare|0,0,-1" } //40% logic_relay { "onspawn" "healthcounter_low,multiply,0.4,0.02,-1" } math_counter { "targetname" "healthcounter_low" "outvalue" "tankcompare_low,setcomparevalue,,0,-1" } logic_compare { "targetname" "tankcompare_low" "ongreaterthan" "!parent,setspeed,50,0,-1" "onlessthan" "!parent,setspeed,15,0,-1" } // logic_timer // { // "refiretime" "0.1" // "ontimer" "!parent,$getdata$m_iHealth,tankcompare_low|setvaluecompare|0,0,-1" // } } ApplyCondIfCond { NoFixup 1 //Test if this works, if you wanna use this. OnSpawnOutput { Target filter_hascond Action SetParent Param !activator } filter_tf_condition { "targetname" "filter_hascond" "condition" 11 "Negated" 0 "OnFail" "!parent,$RemoveCond,113,0,-1" "OnPass" "!parent,$AddCond,113,0,-1" } logic_relay { "targetname" "applycond" "OnTrigger" "applycond,Trigger,,0.2,-1" //checks every 0.2 seconds "OnTrigger" "filter_hascond,TestActivator,!parent,0,-1" //Tests filter on the parent } } //I shamelessly stole this from royal //thank you tomboy enjoyer Combo_Pyro { NoFixup 1 logic_relay { "targetname" "combo_primary_to_secondary" "spawnflags" "2" "OnTrigger" "!self,EnableRefire,,0,-1" "OnTrigger" "!activator,$RemoveItemAttribute,fire input on hit|0,0,-1" "OnTrigger" "!activator,$WeaponSwitchSlot,1,0,-1" "OnTrigger" "!activator,$AddPlayerAttribute,disable weapon switch|1,0.01,-1" "OnTrigger" "!activator,$RemovePlayerAttribute,disable weapon switch,0.6,-1" "OnTrigger" "!activator,$WeaponSwitchSlot,0,0.61,-1" "OnTrigger" "!activator,$AddItemAttribute,fire input on hit|combo_primary_to_secondary^Trigger^|0,0.62,-1" } } Carbinewacka { NoFixup 1 OnSpawnOutput { Target filter_hascond Action SetParent Param !activator } OnSpawnOutput { Target combo_secondary_to_melee Action Trigger } filter_tf_condition { "targetname" "filter_minicrits" "condition" 19 //minicrits from Carbine effect "Negated" 0 "OnPass" "!parent,$WeaponSwitchSlot,2,0,-1" "OnPass" "!parent,$AddPlayerAttribute,disable weapon switch|1,0.01,-1" "OnFail" "!parent,$RemovePlayerAttribute,disable weapon switch,0,-1" "OnFail" "!parent,$WeaponSwitchSlot,1,0.01,-1" } logic_relay { "targetname" "combo_secondary_to_melee" "OnTrigger" "!self,Trigger,,0.2,-1" //checks every 0.2 seconds "OnTrigger" "filter_minicrits,TestActivator,!parent,0,-1" //Tests filter on the parent } } //Teleports to the front door. W1_TeleToFront { NoFixup 1 trigger_teleport { "targetname" "w1tele" "filtername" "filter_w1tele" "Origin" "0 0 0" "spawnflags" "64" "target" "target_blu_front" "StartDisabled" "0" "mins" "-100 -100 -100" "maxs" "100 100 100" } filter_tf_bot_has_tag { "targetname" "filter_w1tele" "tags" "w1tele_front" "require_all_tags" "1" "Negated" "0" } OnSpawnOutput { Target "w1tele" Action "Disable" Delay 0.5 } } //Attribute changer attribute_changer { NoFixup 1 point_populator_interface { "targetname" "pop_interface_seel" } //Defensive positioning logic_relay { "targetname" "bot_attr_mid" "OnTrigger" "pop_interface_seel,ChangeBotAttributes,Mid,0.1,-1" "OnTrigger" "pop_interface_seel,ChangeDefaultEventAttributes,Mid,0.1,-1" } logic_relay { "targetname" "bot_attr_base" "OnTrigger" "pop_interface_seel,ChangeBotAttributes,Base,0.1,-1" "OnTrigger" "pop_interface_seel,ChangeDefaultEventAttributes,Base,0.1,-1" } //Offensive change logic_relay { "targetname" "bot_attr_attack" "OnTrigger" "pop_interface_seel,ChangeBotAttributes,Attack,0.1,-1" "OnTrigger" "pop_interface_seel,ChangeDefaultEventAttributes,Attack,0.1,-1" } } //Points used for defensive positioning. //Origin must be specified seperately due to multiple things being spawned. defendpoints_blu { NoFixup 1 //Up the stairs info_target { "targetname" "target_blu_front" "origin" "-3330 -1570 170" } //Underneath indoor bridge info_target { "targetname" "target_blu_mid" "origin" "-1580 -2350 -28" } //At the end of outdoor bridge info_target { "targetname" "target_blu_base" "origin" "-75 -495 117" } func_flagdetectionzone //bomb is past front, go to mid { origin "-2640 -1875 125" targetname "bombdetector_blu_front" TeamNum 3 mins "-256 -32 -256" maxs "256 32 256" "OnStartTouchFlag" "bot_attr_mid,Trigger,,0,-1" "OnStartTouchFlag" "bombdetector_blu_front,Disable,,0.2,-1" "OnStartTouchFlag" "spawnbot_midcheck,Enable,,0,-1" } func_flagdetectionzone //bomb is past mid, go to base { origin "-750 -1560 125" targetname "bombdetector_blu_mid" TeamNum 3 mins "-256 -32 -256" maxs "256 32 256" "OnStartTouchFlag" "bot_attr_base,Trigger,,0,-1" "OnStartTouchFlag" "bombdetector_blu_mid,Disable,,0.2,-1" } //Bridge outdoors, blue side info_target { "targetname" "target_blu_bridge1" "origin" "-680 -1310 133" } info_target { "targetname" "target_blu_bridge1" "origin" "-940 -970 133" } } /// This works on any player, base_boss (tanks, Merasmus, HHHH, etc), and Engineer obj_* (Sentry, Dispensers, Teleporters). /// Add this to your mission if you want glows for these types of things glow { OnSpawnOutput { Target "!activator" Action "$SetProp$m_bGlowEnabled" Delay 0 Param "1" } } //Yes, I took this right from Bauernhof. //It's a good template, you know? tutorial { NoFixup 1 logic_relay { "spawnflags" "2" "targetname" "tutorial_relay" "OnTrigger" "hints_1,Show,,0,-1" "OnTrigger" "hints_2,Show,,6,-1" "OnTrigger" "hints_3,Show,,12,-1" "OnTrigger" "hints_4,Show,,18,-1" "OnTrigger" "tutorial_relay2,Trigger,,24,-1" } logic_relay { "spawnflags" "2" "targetname" "tutorial_relay2" "OnTrigger" "tutorial_relay,Trigger,,0,-1" } training_annotation { "targetname" "hints_1" "display_text" "You CANNOT build without an upgrade!" "lifetime" "6" "origin" "-4000 -2200 100" } training_annotation { "targetname" "hints_2" "display_text" "Purchase the blueprints at the upgrade station to build!" "lifetime" "6" "origin" "-3700 -3180 55" } training_annotation { "targetname" "hints_3" "display_text" "Teleporters CANNOT be built." "lifetime" "6" "origin" "-4000 -2200 100" } training_annotation { "targetname" "hints_4" "display_text" "Use !missioninfo to find extra information." "lifetime" "6" "origin" "328 -150 52" } OnSpawnOutput { Target "tutorial_relay" Action "Trigger" Delay 4 } } } SpawnTemplate "corelogic" SpawnTemplate "annotation" SpawnTemplate "attribute_changer" SpawnTemplate "defendpoints_blu" SpawnTemplate { Name "decoration" "origin" "-6195.264160 -3040.455078 -80" "angles" "0 0 20" } SpawnTemplate { Name "decoration2" "origin" "-6696.156250 -2891.279297 -80.912525" "angles" "0 75 20" } //Spawn barriers SpawnTemplate //right side { Name "barrier" "origin" "-6439.902344 -1635.442871 1062.62023" "angles" "0 0 0" } SpawnTemplate //left side { Name "barrier" "origin" "-7837.259277 605.864136 723.93450" "angles" "0 0 0" } //Fences // SpawnTemplate // { // Name "barrierfence" // "origin" "-8326.719238 698.392883 19.731293" // "angles" "0 -180 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-8326.719238 528.392883 19.731293" // "angles" "0 -180 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-8326.719238 368.392883 19.731293" // "angles" "0 -180 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-6178.697754 -2315.712158 -50.515499" // "angles" "0 -90 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-6378.697754 -2315.712158 -50.515499" // "angles" "0 -90 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-6578.697754 -2315.712158 -50.515499" // "angles" "0 -90 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-6778.697754 -2315.712158 -50.515499" // "angles" "0 -90 0" // } //Ramps SpawnTemplate { Name "ramps" "origin" "-9073.923828 170.062286 -80.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-9073.923828 -20.062286 25.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-9273.923828 90.062286 25.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-8873.923828 120.062286 -80.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-8943.923828 -70.062286 25.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-9273.923828 210.062286 -30.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-2729.177246 1452.867310 -24" "angles" "-60 -90 0" } SpawnTemplate { Name "ramps" "origin" "-928.058777 -781.182861 -229.184380" "angles" "0 45 0" } SpawnTemplate { Name "ramps" "origin" "-1708.865356 -578.729370 58.970871" "angles" "-60 45 0" } //Upgrade stations SpawnTemplate //red side (left when looking towards hatch) { Name "station_rotated_65" "origin" "-9394.505859 -494.312805 148.10629" } SpawnTemplate //blue side { Name "station" "origin" "-6461.757813 -2983.834473 -66.347286" "angles" "0 65 0" } SpawnTemplate //red gate { Name "station" "origin" "-3431.968750 3529.504639 70" "angles" "0 0 0" } SpawnTemplate //blue gate { Name "station_rotated_90n" "origin" "-3644.874512 -3163.577881 -23" "angles" "0 0 0" } ExtraSpawnPoint { Name "spawnbot_hatch" //Spawns at red spawn's "A" doorway, red side TeamNum 2 //3 is for all bots X 700 Y 1430 Z 200 } ExtraSpawnPoint { Name "spawnbot_hatch" //Spawns at red spawn's "B" doorway, red side TeamNum 2 X 730 Y 1110 Z 200 } ExtraSpawnPoint { Name "spawnbot_hatch_alt" //Spawns at red spawn's "A" doorway, red side TeamNum 2 //3 is for all bots X 700 Y 1430 Z 200 } ExtraSpawnPoint { Name "spawnbot_hatch_alt" //Spawns at red spawn's "B" doorway, red side StartDisabled 1 TeamNum 2 X 730 Y 1110 Z 200 } ExtraSpawnPoint { Name "spawnbot_hatch_tele" TeamNum 2 X 0 Y 525 Z 140 } ExtraSpawnPoint { Name "spawnbot_blugate" TeamNum 2 X -3330 Y -1570 Z 170 } ExtraSpawnPoint { Name "spawnbot_hatch_def" StartDisabled 0 TeamNum 2 X 263 Y 512 Z 140 } //Special front spawns for wave 2! ExtraSpawnPoint { Name "spawnbot_front_w2_red" TeamNum 2 X -7060 Y 680 Z -65 } ExtraSpawnPoint { Name "spawnbot_front_w2_blu" TeamNum 2 X -5737 Y -1100 Z -50 } ExtraSpawnPoint { Name "spawnbot_front_w2_mid" TeamNum 2 X -6606 Y -40 Z -110 } ExtraSpawnPoint { Name "spawnbot_front_w2_point" TeamNum 2 X -6800 Y -270 Z -100 } ExtraSpawnPoint { Name "spawnbot_right_w2" StartDisabled 1 TeamNum 2 X -6350 Y -2600 Z 5 } ExtraSpawnPoint { Name "spawnbot_w3_tankdoor" TeamNum 2 X -4280 Y 1470 Z -85 } ExtraSpawnPoint { Name "spawnbot_w3_garage" TeamNum 2 X -6350 Y 1430 Z -60 } ExtraSpawnPoint { Name "spawnbot_w3_gateboxes" TeamNum 2 X -3000 Y 1580 Z 75 } ExtraSpawnPoint { Name "spawnbot_w3_boxesdoor" TeamNum 2 X -3200 Y 1020 Z 110 } ClassLimit { Scout 0 Soldier 0 Pyro 0 Demoman 0 Heavyweapons 0 // Engineer 6 apparently this has to NOT be defined, pemsive Medic 0 Sniper 0 Spy 0 } //Base changes PlayerAttributes { Engineer { "SET BONUS: max health additive bonus" 25 "maxammo metal increased" 1.5 "mod teleporter cost" 12.02 "mod sentry cost" 10 "mod dispenser cost" 10 "ammo regen" 0.3 "max upgrade level" 1 } } //Item changes //V1: Only touch items that are going to be problematic - either OP or broken //TODO: finish this. //Wrench roles: //Stock: averages across-the-board. //Jag: fast setup. //Southern Hospitality: strong maintenance. //Eureka Effect: strong but slow? //Gunslinger: fast, shotgun-oriented. //SC: could be too strong versus projectile bots when spammed from a distance. //NEW TECH: homing makes ball stay stationary. //Role: safeguard user on the spot from projectiles; can be used vs rocket wall. //Cannot be used as a quick-switch-from, must be used with intent. ItemAttributes { ItemName "The Short Circuit" "provide on active" 1 "mod projectile heat seek power" 1 "single wep holster time increased" 2 "special item description" "Projectile does not move." } //Eureka: can't exactly use tp's consistently, so needs to be changed. //Must be something unique, not through ExtendedUpgrades. //"Power" wrench. Instant max sentry fire rate, but the slower build and metal gain will hurt. ItemAttributes { ItemName "The Eureka Effect" "alt fire teleport to spawn" 0 "special taunt" 0 "engy sentry fire rate increased" 0.5 //every 3 ticks "metal_pickup_decreased" 0.5 } //Hospitality: Provides stronger maintenance. //Sacrifices some sentry damage. ItemAttributes { ItemName "The Southern Hospitality" "mult dispenser rate" 1.4 "engy sentry damage bonus" 0.8 "dmg taken from fire increased" 1 } //TODO: finish this ExtendedUpgrades { //Body upgrades //10% move speed, cap of 40% (420 HU/s) movespeed { Name "Robo-Runner" Description "+10% move speed" //Switch speed? Attribute "move speed bonus" Cost 50 Cap 1.4 Increment 0.1 PlayerUpgrade 1 SecondaryAttributes { } } //+25/30/35 hp, cap of +50, +140, +270 (500 HP) //Limits of 2 for w1, 6 for w2, 10 for w3 healthup1 { Name "Armored Casing I" Description "+25 max health" Attribute "max health additive bonus" Cost 50 Cap 50 //2 ticks, total: 200 hp Increment 25 PlayerUpgrade 1 BeginAtWave 1 } healthup2 { Name "Armored Casing II" Description "+30 max health" Attribute "max health additive bonus" Cost 50 Cap 140 //3 ticks, total: 290 hp Increment 30 PlayerUpgrade 1 RequiredUpgrade { Upgrade "healthup1" Level 2 } BeginAtWave 2 } healthup3 { Name "Armored Casing III" Description "+35 max health" Attribute "max health additive bonus" Cost 50 Cap 260 Increment 35 PlayerUpgrade 1 RequiredUpgrade { Upgrade "healthup2" Level 3 } BeginAtWave 3 } //Crits when below % health //+10%, cap of 40% //Less knockback, passive regen kbackregen { Name "Anchor Down" Description "+20% knockback reduction, +4 health regen" Attribute "damage force reduction" Cost 50 Cap 0 Increment -0.20 PlayerUpgrade 1 BeginAtWave 2 SecondaryAttributes { "airblast vulnerability multiplier" -0.20 "health regen" 4 } } //Primary Upgrades //Total caps: 50% fire rate, 80% reload rate, 150% damage //All primaries: fire rate + damage. //Cap of 6 ups, 30% fire rate. dps { Name "Power Module" Description "+25% damage, +5% fire rate." Attribute "damage bonus" Cap 2.5 Increment 0.25 Cost 50 AllowedWeapons { Slot "Primary" } AllowedMinWave 1 SecondaryAttributes { "fire rate bonus" -0.05 } } //Not you, Widowmaker: reload rate. //Cap of 4 ups, 80% reload rate, 20% fire rate, 200% clip size bullets { Name "Restock Module" Description "+20% reload rate, +5% fire rate, +50% clip size." Attribute "faster reload rate" Cap 0.2 Increment -0.2 Cost 50 AllowedWeapons { Slot "Primary" } DisallowedWeapons { ItemName "The Widowmaker" ItemName "Ulti Wrench" } AllowedMinWave 1 SecondaryAttributes { "fire rate bonus" -0.1 "clip size bonus" 0.5 } } //Regen 20% of dmg as health, max 100% dmgregen { Name "Drain Module" Description "+20% of damage returned as health. Heal for 15% max health on kill." Attribute "damage returns as health" Cap 1 Increment 0.2 Cost 100 AllowedWeapons { Slot "Primary" Slot "Secondary" } DisallowedWeapons { ItemName "The Wrangler" } } //Penetration! Could be nice to have, eh? dmgregen { Name "Piercing Module" Description "Shots pierce through enemies." Attribute "projectile penetration" Cap 1 Increment 1 Cost 100 AllowedMinWave 2 AllowedWeapons { Slot "Primary" } DisallowedWeapons { ItemName "The Pomson 6000" } } //RR: Headshots rangerhs { Name "Headshot Module" Description "Deal crits on headshot." Attribute "can headshot" Cap 1 Increment 1 Cost 100 AllowedMinWave 2 AllowedWeapons { ItemName "The Rescue Ranger" Slot Secondary } DisallowedWeapons { ItemName "The Short Circuit" ItemName "The Wrangler" } } //Pomson: weak homing pomsonhom { Name "Heat-seeker Module" Attribute "mod projectile heat seek power" Description "Projectile homes in on enemies." Cap 50 Increment 50 Cost 50 AllowedMinWave 2 AllowedWeapons { ItemName "The Pomson 6000" } SecondaryAttributes { "mod projectile heat seek error" 15 "mod projectile heat seek time" 2 "mod projectile heat no predict target speed" 1 } } //Secondary Upgrades //Pistol: fire rate + clip + reload, damage + accuracy pistolspeed { Name "Rapid Fire Module" Attribute "fire rate bonus" Description "+10% fire and reload rate, +50% clip size." Cap 0.6 Increment -0.1 //4 ticks Cost 50 AllowedWeapons { ClassName tf_weapon_pistol } SecondaryAttributes { "clip size bonus" 0.5 //+6 clip, max 36 "faster reload rate" -0.1 } } pistolpower { Name "Power Module" Attribute "damage bonus" Description "+25% damage bonus, +10% more accurate." Cap 2.5 Increment 0.25 //6 ticks Cost 50 AllowedWeapons { ClassName tf_weapon_pistol } SecondaryAttributes { "weapon spread bonus" 0.1 //+60% } } //Wrangler: none lol //Short Circuit: damage. yeah. //Melee Upgrades //All melees: swing speed + build rate, upgrade level (lvl 2 -> w3, lvl 3 -> w5), //Gunslinger: banned? swinger { Name "Construction Expert" Attribute "melee attack rate bonus" Cap 0.6 Increment -0.1 Cost 100 Description "10% faster swing speed, +20% build rate." AllowedWeapons { Slot "Melee" } RequiredWeapons { ItemName "Ulti Wrench" } AllowedMinWave 1 SecondaryAttributes { "Construction rate increased" 0.2 } } levelup1 { Name "Laborer's Blueprints" Attribute "mod sentry cost" AllowedMinWave 1 Description "Allows you to build a Sentry and Dispenser." Cap 0.1 Increment -0.9 Cost 150 AllowedWeapons { Slot "PDA" } SecondaryAttributes { "mod dispenser cost" -0.9 } } levelup2 { Name "Operator's Blueprints" Attribute "building max level" AllowedMinWave 3 Description "Allows you to upgrade your buildings up to level 2." Cap 2 Increment 1 Cost 100 AllowedWeapons { Slot "PDA" } DisallowedWeapons { ItemName "Ulti Wrench" } RequiredUpgrade { Upgrade levelup1 Level 1 } } levelup3 { Name "Foreman's Blueprints" Attribute "building max level" AllowedMinWave 5 Description "Allows you to upgrade your buildings up to level 3." Cap 3 Increment 1 Cost 100 AllowedWeapons { Slot "PDA" } DisallowedWeapons { ItemName "Ulti Wrench" } RequiredUpgrade { Upgrade levelup1 Level 1 } RequiredUpgrade { Upgrade levelup2 Level 1 } } //+5 metal per upgrade swing: //25 -> 8 hits; 8 * 25 = 200 //35 -> 6 hits; 6 * 35 = 180 + 30 = 210 //45 -> 5 hits; 5 * 45 = 200 (+ 25) //55 -> 4 hits; 4 * 55 = 200 (+ 20) upgrader { Name "Upgrade Update" Attribute "upgrade rate decrease" AllowedMinWave 3 Cap 3.2 Increment 0.4 Cost 50 Description "+40% upgrade rate." AllowedWeapons { Slot "Melee" } DisallowedWeapons { ItemName "Ulti Wrench" } RequiredUpgrade { Upgrade "levelup2" Level 1 } } //PDA Upgrades //Sentry damage + radius //Building health //Disp rate + radius sentryexp { Name "Destruction Expert" Attribute "engy sentry damage bonus" Cap 1.6 Increment 0.15 //4 ticks Cost 100 Description "+15% sentry damage, +20% target radius." AllowedMinWave 1 SecondaryAttributes { // "mult firerocket rate" -0.1 "engy sentry radius increased" 0.2 } AllowedWeapons { Slot "PDA" } RequiredUpgrade { Upgrade levelup1 Level 1 } DisallowedWeapons { ItemName "Ulti Wrench" } } buildexp { Name "Maintenance Mastery" Attribute "engy building health bonus" Cap 3 Increment 0.5 //4 ticks Cost 100 Description "+50% building health, +25% repair rate." AllowedMinWave 1 SecondaryAttributes { "repair rate increased" 0.25 } AllowedWeapons { Slot "PDA" } RequiredUpgrade { Upgrade levelup1 Level 1 } DisallowedWeapons { ItemName "Ulti Wrench" } } dispexp { Name "Provision Proficiency" Attribute "engy dispenser radius increased" Cap 3 Increment 0.5 //4 ticks Cost 100 Description "+50% dispenser range and heal rate." //DEPRECATED: supply power (health, metal, ammo) AllowedMinWave 1 SecondaryAttributes { "mult dispenser rate" 0.5 } AllowedWeapons { Slot PDA } RequiredUpgrade { Upgrade levelup1 Level 1 } DisallowedWeapons { ItemName "Ulti Wrench" } } // pickupintel //Joke. Testing only. // { // Name "Carrier" // Attribute "cannot pick up intelligence" // Cap 0 // Increment -1 // Cost 500 // Description "You can now pick up the bomb." // } } CustomWeapon //Allows you to use an alias for items with custom attributes { "Ulti Wrench" // The name you would use in Item key in TFBot { OriginalItemName "Golden Wrench" // The item used as a base "special item description" "Magnetic: cannot use other weapons. Powers up every wave." "provide on active" 1 "is australium item" 1 "building cost reduction" 14 "disable weapon switch" 1 "critboost on kill" 1 "restore health on kill" 10 "dmg taken increased" 0.9 "damage bonus" 1.55 } } ExtraLoadoutItems // Extra loadout items available after typing !missionitems in chat { AllowEquipOutsideSpawn 0 // Allow equipping items outside spawn Engineer // Class { Melee // Item slot to use { Item "Ulti Wrench" // Item name, custom weapon names are available Cost 0 // Cost of weapon AllowedMinWave 1 //wave at which weapon is enabled (default: 1) AllowRefund 1 //Allow refunding of weapon (default: 1) // Output fired when upgrade is applied, aka: // bought, player changing classes, or weapons // Format: target,action,parameter,delay // If parameter is empty, the upgrade level is passed instead as parameter OnApply { Output "!activator,$WeaponSwitchSlot,2,0.1,-1" Output "!activator,$WeaponStripSlot,0,0.1,-1" Output "!activator,$WeaponStripSlot,1,0.1,-1" Output "!activator,$WeaponStripSlot,3,0.1,-1" Output "!activator,$WeaponStripSlot,4,0.1,-1" } } } } Templates { //////////////////////////////////////////////////////////////////////////// ///////////////////// Reusable templates //////////////////////// //////////////////////////////////////////////////////////////////////////// //Turns bots red. Nothing else. RedBot { AddCond { Name "TF_COND_REPROGRAMMED" } } //Turns bots red + adds mobber behavior. RedBot_Hunt { Attributes DisableDodge Action Mobber AddCond { Name "TF_COND_REPROGRAMMED" } } //Turns bots red; goes to bomb. RedBot_Bomb { InterruptAction { Target "intel*" Delay 0.1 Cooldown 1 Duration 1.1 } AddCond { Name "TF_COND_REPROGRAMMED" } } RedBot_DynamicPos_Blue { Attributes IgnoreFlag AddCond { Name "TF_COND_REPROGRAMMED" } EventChangeAttributes { Default { InterruptAction { Target "target_blu_front" Delay 0.1 Cooldown 1 Duration 1.1 } } Mid { InterruptAction { Target "target_blu_mid" Delay 0.1 Cooldown 1 Duration 1.1 } } Base { InterruptAction { Target "target_blu_base" Delay 0.1 Cooldown 1 Duration 1.1 } } } } RedBot_OnAttack { EventChangeAttributes { Default { InterruptAction { Target "target_blu_front" Delay 0.1 Cooldown 1 Duration 1.1 } } Attack { } } } AttackTank { InterruptAction { Target "tankboss" Cooldown 5 Duration 6 Delay 1 } } AttackTank_Only { InterruptAction { Target "tankboss" AimTarget "tankboss" KillAimTarget 1 Cooldown 5 Duration 6 Delay 3 //lets it doot } } AttackTank_Only_Side { InterruptAction { Target "tank_def_side" AimTarget "tankboss" KillAimTarget 1 Cooldown 5 Duration 6 Delay 1 } } AttackTank_Only_Back { InterruptAction { Target "tank_def_back" AimTarget "tankboss" KillAimTarget 1 Cooldown 5 Duration 6 Delay 1 } } //////////////////////////////////////////////////////////////////////////// /////////////////////// Common red bots //////////////////////// //////////////////////////////////////////////////////////////////////////// T_TFBot_Red_Soldier_Whip { Class Soldier WeaponRestrictions MeleeOnly Item "The Disciplinary Action" Item "The Mantreads" Item "Armored Authority" ClassIcon soldier_disciplinary Template RedBot_Bomb } T_TFBot_Red_Soldier_Bison { Class Soldier Name "Bison Soldier" Item "The Righteous Bison" Item "Lord Cockswain's Pith Helmet" Skill Hard ClassIcon soldier_bison WeaponRestrictions SecondaryOnly Template RedBot ItemAttributes { ItemName "The Righteous Bison" "faster reload rate" 0.6 "dmg bonus vs buildings" 5 } } T_TFBot_Red_Soldier_Bulwark_D { Template T_TFBot_Red_Soldier_RocketShotgun Name "Bulwark Box Soldier" Item "The Mantreads" Health 650 Scale 1.4 ItemAttributes { ItemName "The Black Box" "fire rate bonus" 0.7 "health on radius damage" 80 "heal on hit for rapidfire" 0 "blast radius increased" 1 "damage penalty" 1 } CharacterAttributes { "move speed bonus" 0.7 "health regen" 1 } } T_TFBot_Red_Demoman_Sticky_B { Template RedBot_Bomb Class Demoman Skill Normal Name "Stickybomb Demo" ClassIcon demo_sticky_red_daan WeaponRestrictions SecondaryOnly Item "TF_WEAPON_PIPEBOMBLAUNCHER" Item "Broadband Bonnet" ItemAttributes { ItemName "TF_WEAPON_PIPEBOMBLAUNCHER" "projectile range increased" 0.35 "stickybomb charge rate" 0.001 "max pipebombs decreased" -7 "faster reload rate" 0.1 "fire rate penalty" 1.67 } ItemAttributes { ItemName "TF_WEAPON_GRENADELAUNCHER" "is_passive_weapon" 1 "fire rate penalty" 1357 "override projectile type" 29 } } T_TFBot_Red_Demoman_Sticky_H { Template RedBot_Hunt Class Demoman Skill Normal Name "Stickybomb Demo" ClassIcon demo_sticky_red_daan WeaponRestrictions SecondaryOnly Item "TF_WEAPON_PIPEBOMBLAUNCHER" Item "Broadband Bonnet" ItemAttributes { ItemName "TF_WEAPON_PIPEBOMBLAUNCHER" "projectile range increased" 0.35 "stickybomb charge rate" 0.001 "max pipebombs decreased" -7 "faster reload rate" 0.1 "fire rate penalty" 1.67 } ItemAttributes { ItemName "TF_WEAPON_GRENADELAUNCHER" "is_passive_weapon" 1 "fire rate penalty" 1357 "override projectile type" 29 } } T_TFBot_Red_Demoman_Cannon_H { Template RedBot_Hunt Class Demoman Skill Normal Name "Loose Cannon Demo" ClassIcon demo_cannon WeaponRestrictions PrimaryOnly Item "The Loose Cannon" Item "The Bolted Bicorne" ItemAttributes { ItemName "The Loose Cannon" "grenade launcher mortar mode" 0 "faster reload rate" 0.6 "fire rate bonus" 0.6 } } T_TFBot_Red_Heavy_Champ_Steak { Template T_TFBot_Heavyweapons_Heavyweight_Champ Skill Hard Name "Buffaloweight Champ" Item "The Buffalo Steak Sandvich" ClassIcon heavy_champ_steak_red Attributes DisableDodge //Attributes AlwaysCrit //test if this may be needed Action FetchFlag // Action Mobber ItemAttributes { ItemName "The Buffalo Steak Sandvich" "alt-fire disabled" 1 //This should work with rafmod! "energy buff dmg taken multiplier" 0.75 } AddCond { Name "TF_COND_REPROGRAMMED" } } T_TFBot_Red_Heavyweight_Champ_H { Template T_TFBot_Heavyweapons_Heavyweight_Champ Skill Hard ClassIcon heavy_champ_red Attributes DisableDodge AddTemplate RedBot_Hunt } T_TFBot_Red_Engineer_A { Class Engineer Health 275 ClassIcon engineer_ally Skill Easy Action Mobber NoCrouchButtonRelease 1 // No auto release crouch when bot's on ground InterruptAction { Target "sentryhere" AimTarget "sentry_a" WaitWhenDone 1 Delay 1 Repeats 1 Cooldown 5.1 Duration 0.1 OnDoneChangeAttributes "Crouch" } Attributes IgnoreFlag CharacterAttributes { "no_jump" 1 } AddCond { Name "TF_COND_REPROGRAMMED" } EventChangeAttributes { Crouch { WeaponRestrictions MeleeOnly InterruptAction { Target "sentryhere" AimTarget "sentry_a" WaitWhenDone 1 KillAimTarget 1 Delay 0.1 Repeats 1 Cooldown 5 Duration 0.1 OnDoneChangeAttributes "Attack" } FireWeapon { Delay 0.1 Cooldown 0.1 Repeats 0 IfSeeTarget 0 Duration 0.2 Type "Crouch" } } Attack { WeaponRestrictions PrimaryOnly } } } T_TFBot_Red_Sniper_Carbine_H { Class Sniper Name "Carbine Sniper" Template RedBot_Hunt Skill Normal //best not to give them great tracking WeaponRestrictions SecondaryOnly ClassIcon sniper_carbine Item "The Cleaner's Carbine" Item "Letch's LED" FireWeapon { Type "Secondary" Cooldown 0.1 Repeats 0 Delay 1 } } //QFix Medic that always ubers. //Heals at the same rate as a fully ramped-up QFix ubercharge! //But, it only heals itself half as fast! T_TFBot_Red_Medic_Superheal { Class Medic Name "Superheal Medic" Template RedBot Skill Expert Item "The Quick-Fix" Attributes SpawnWithFullCharge ClassIcon medic_infpop ItemAttributes { ItemName "The Quick-Fix" "heal rate bonus" 4.17 //Base 300 HP/sec heals "overheal penalty" 0.001 "health from healers reduced" 0.5 //150 HP/sec selfheal "uber duration bonus" -9 //Infinite uber duration } CharacterAttributes { "bot medic uber health threshold" 160 } } //An overhealing medic! Useful for making bots super-bulky. T_TFBot_Red_Medic_Overheal { Name "Overhealer Medic" Class Medic ClassIcon medic_overheal_uber Attributes SpawnWithFullCharge Item "dec2014 Surgeon's Shako" Template RedBot ItemAttributes { ItemName tf_weapon_medigun "ubercharge rate bonus" 4 //basically 2x "uber duration bonus" -3 "bot medic uber deploy delay duration" 2 "overheal expert" 2 "heal rate bonus" 5 } } //////////////////////////////////////////////////////////////////////////// /////////////////////// Giant red bots //////////////////////// //////////////////////////////////////////////////////////////////////////// //A Giant Soldier that shoots sappers! //Succesful hits will sap sentries on hit. //Sources to make this work: // https://developer.valvesoftware.com/wiki/Obj_attachment_sapper // https://sigwiki.potato.tf/index.php/Main_Page -> custom entities, entity additions, expressions // https://raw.githubusercontent.com/powerlord/tf2-data/master/datamaps.txt // https://raw.githubusercontent.com/powerlord/tf2-data/master/netprops.txt // https://github.com/sreechar/TF2-Source-Code/blob/master/tf2_src/game/server/tf/tf_obj_sapper.h // and maybe, if the one above doesn't have it all: // https://github.com/NicknineTheEagle/TF2-Base/blob/master/src/game/server/tf/tf_obj_sapper.cpp //Plan: //- fire input on hit to apply the sapper //- fire input on hit name restrict "obj_*" should only let it target buildings //- use m_bHasSapper + $SetKey$ to say building has a sapper //- use BuildingSpawnTemplate with target for all Sappers to spawn an entity; //- said entity sets soldier as owner, or fire input on hit does that //- soldier has RTR attribute. gets applied to sapper. T_TFBot_Red_Giant_Soldier_Sapper { } //Giant Demoknight that stays near bomb //hunts players if health gets low. Can be snuck up on for 1-time massive melee damage. T_TFBot_Red_Giant_Demo_Samurai_Dynamic { Class Demoman Name "Giant Samurai Demo" ClassIcon demoknight_samurai Health 3300 Action FetchFlag Item "Demo Kabuto" Item "The Half-Zatoichi" AddCond { Name "TF_COND_REPROGRAMMED" } ChangeAttributes { Name "Attack" Delay 0.1 Cooldown 10 Repeats 0 IfHealthBelow 1650 } ChangeAttributes { Name "Default" Delay 0.1 Cooldown 10 Repeats 0 IfHealthAbove 1651 } EventChangeAttributes { Default { Skill Expert WeaponRestrictions MeleeOnly Attributes MiniBoss Attributes DisableDodge ItemAttributes { ItemName "The Half-Zatoichi" "critboost on kill" 3 "restore health on kill" 25 } CharacterAttributes { "move speed bonus" 0.5 "damage force reduction" 0.5 "airblast vulnerability multiplier" 0.5 "override footstep sound set" 4 } } Attack { Skill Expert WeaponRestrictions MeleeOnly Attributes MiniBoss Attributes DisableDodge ItemAttributes { ItemName "The Half-Zatoichi" "critboost on kill" 3 "restore health on kill" 25 } CharacterAttributes { "move speed bonus" 0.5 "damage force reduction" 0.5 "airblast vulnerability multiplier" 0.5 "override footstep sound set" 4 } InterruptAction { Target ClosestPlayer AimTarget ClosestPlayer KillAimTarget 1 Cooldown 4 Duration 5 } } } } } // Wave 1 - Intro to map, reverse, and getting used to stuff // Objective: escort a weak set of bomb carriers. // After a set amount, their "power" will increase slightly, to make things a touch easier. // Obstacle: blockades, heavy bots(?) and giants at set locations. // Path: through the blue part. No gate cap yet. // Tasks: defending engies must minimize intial horde, prevent (constant) flankers. // Attacking engies must remove nearby threats. //TODO: //- Think of a good way to balance bomb focus with hunter focus and obstacle giants. //- Add in teleporters where you can --template done - may not work? check @ sigwiki //- Fix punchies moving weirdly --done? //- Fix Heavyweapons NOT moving correctly based on bomb position //- Fix Giant Pyro not doing its thing nicely --sorta works? teleporter does NOT work. May need extra tweaks. //- Remove Red random crits //- Fix bleeding bots //Carriers: //- Lightweight Champ //- Lightweight Gauntlet (GRU minigiant) //Subwave 1: initial wave of bots; attempt to break first push. //- Hunt: Sticky Demo + Quick-Fix Medic (max 2 pairs) //- B: Heavyweight Champs, Zatoichi Demos //- Defend: Giant Pyro (attacks if all hunters are dead) //Subwave 2: bomb moved up. Send in bomb attackers. //- Bomb: Giant Samurai Demo //- B: Grenade Demos //- H: Flare Pyros //Subwave 3: bomb moved up. Station flank defenders, keep a strong bomb defense, //and some tougher attackers. //- B: Sticky Demo + Quick-Fix Medic //- H: Carbine Sniper (ranged with potential for damage) //- D: Black Box Soldiers (minigiant, 2 total) //Subwave 4: bomb nears hatch. concentrate firepower, defend bomb at all costs. //- B: Giant Bison Soldier //- B: Sticky Demos //- B: Grenade Demos //- D: Giant Pyro //- Rest support: Whip Soldiers //- Support: Snipers (near hatch or around long hall) Mission { Objective Sniper Where spawnbot_hatch BeginAtWave 1 RunForThisManyWaves 1 DesiredCount 1 InitialCooldown 10 CooldownTime 25 TFBot { Template T_TFBot_Red_Sniper Item "The Machina" ClassIcon sniper_machina_2 } } Wave { Explanation { Line "{blue}Control {FBECCB}: Attention, engie-bots! You have been REPROGRAMMED FOR MANN CO." Line "{FBECCB}After our own bots turned on us and took over the facility, we have reprogrammed the last remaining {blue}BLU {FBECCB}bots to BLOW THEM TO PIECES." Line "{FBECCB}You {red}cannot upgrade buildings{FBECCB} yet, but we'll patch that...soon." Line "{FBECCB}Now do what you were built to do: make your bots deploy that bomb!" } InitWaveOutput { Target wave_finished_nextwave_right Action Trigger } StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } SpawnTemplate wave1logic WaveSpawn { Name "wave1logic" WaitBeforeStarting 1 FirstSpawnOutput { Target wave1_spawner Action Trigger } } WaveSpawn { Name "NoEnd" WaitBeforeStarting 9999 } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon blu2_lite } } WaveSpawn { Name "Support 1" Where spawnbot_front_right Where spawnbot_right FirstSpawnOutput { Target hint_bomb_message Action FireUser1 } // WaitForAllSpawned "wave1a2" WaitBeforeStarting 0 TotalCount 1 MaxActive 1 SpawnCount 1 Support Limited TFBot { Template T_TFBot_Heavyweapons_Heavyweight_Champ_Fast Name "Lightweight Champ" Tag bomb_carrier Item "Pugilist's Protector" ItemAttributes { ItemName "Pugilist's Protector" "set item tint rgb" 15185211 //aussie jold } } } WaveSpawn { Name "Support 1" Where spawnbot_front_right Where spawnbot_right WaitBeforeStarting 14 WaitBetweenSpawns 14 TotalCount 10 MaxActive 2 SpawnCount 1 Support Limited TFBot { Template T_TFBot_Heavyweapons_Heavyweight_Champ_Fast Name "Lightweight Champ" Tag bomb_carrier Item "Pugilist's Protector" ItemAttributes { ItemName "Pugilist's Protector" "set item tint rgb" 15185211 //aussie jold } } } WaveSpawn { Name "Support 2" WaitForAllDead "Support 1" Where spawnbot_front_right Where spawnbot_right WaitBeforeStarting 10 WaitBetweenSpawns 4 TotalCount 1 MaxActive 1 SpawnCount 1 Support Limited DoneOutput { Target redwin_relay Action Trigger } TFBot { Template T_TFBot_Heavyweapons_Heavyweight_Champ_Fast Name "Giant Lightweight Champ" Health 5000 Attributes MiniBoss Tag bomb_carrier SpawnTemplate lastbotlogic Item "Pugilist's Protector" Item "The Heavy-weight Champ" ItemAttributes { ItemName "Pugilist's Protector" "set item tint rgb" 15185211 //aussie jold } CharacterAttributes { "move speed bonus" 0.5 "damage force reduction" 0.2 "override footstep sound set" 2 } } } //Subwave 1: initial wave of bots; attempt to break first push. //- Hunt: Sticky Demo + Quick-Fix Medic (max 2 pairs) //- H: Penetrating Bowman //- B: Steakweight Champs //- Defend: Giant Pyro (attacks if all hunters are dead) WaveSpawn { Name "wave1a" Where spawnbot_hatch WaitBeforeStarting 0.5 WaitBetweenSpawns 8 TotalCount 8 MaxActive 4 SpawnCount 2 Squad { TFBot { Template T_TFBot_Red_Demoman_Sticky_H } TFBot { Template T_TFBot_Red_Medic_QuickFix } } } WaveSpawn { Name "wave1a2" WaitBeforeStarting 0.5 WaitBetweenSpawns 4 Where spawnbot_hatch TotalCount 16 MaxActive 4 SpawnCount 2 TFBot { Template T_TFBot_Red_Heavy_Champ_Steak } } WaveSpawn { Name "wave1a2" WaitBeforeStarting 0.5 WaitBetweenSpawns 4 Where spawnbot_hatch TotalCount 16 MaxActive 4 SpawnCount 2 TFBot { Template T_TFBot_Red_Sniper_Huntsman Name "Penetrating Bowman" ClassIcon sniper_bow_penetrator Item "The Huntsman" ItemAttributes { ItemName "The Huntsman" "projectile penetration" 1 "damage bonus" 1 "sniper no headshots" 1 } } } WaveSpawn { Name "wave1a3" Where spawnbot_blugate TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Pyro Attributes AlwaysFireWeapon UseMeleeThreatPrioritization 1 InterruptAction { Target target_blu_front Delay 0 Cooldown 4 Duration 5 IfHealthAbove 2000 } } } //Subwave 2: bomb moved up. Send in bomb attackers. //- Bomb: Giant Samurai Demo //- B: Grenade Demos //- H: Flare Pyros //- D: Sniper WaveSpawn { Name "wave1b" WaitForAllDead "wave1a3" WaitBetweenSpawnsAfterDeath 2 Where spawnbot_hatch TotalCount 2 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Demo_Samurai_Dynamic } } WaveSpawn { Name "wave1b2" WaitForAllSpawned "wave1a2" WaitBeforeStarting 14 Where spawnbot_hatch WaitBetweenSpawns 4 TotalCount 12 MaxActive 4 SpawnCount 1 TFBot { Template T_TFBot_Red_Demoman AddTemplate RedBot_Bomb } } WaveSpawn { Name "wave1b2" WaitForAllSpawned "wave1a2" WaitBeforeStarting 16 Where spawnbot_hatch WaitBetweenSpawns 6 TotalCount 18 MaxActive 6 SpawnCount 2 TFBot { Template T_TFBot_Red_Pyro_Flaregun } } //Subwave 3: bomb moved up. Station flank defenders, keep a strong bomb defense, //and some tougher attackers. //- B: Sticky Demo + Quick-Fix Medic //- H: Giant Pyro //- H: Carbine Sniper (ranged with potential for damage) //- D: Black Box Soldiers (minigiant, 2 total) WaveSpawn { Name "wave1c" WaitForAllDead "wave1b" Where spawnbot_hatch WaitBetweenSpawns 18 TotalCount 2 MaxActive 2 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Pyro } } WaveSpawn { Name "wave1c2" WaitForAllSpawned "wave1b2" WaitForAllDead "wave1a2" Where spawnbot_hatch WaitBetweenSpawns 12 TotalCount 10 MaxActive 4 SpawnCount 2 Squad { TFBot { Template T_TFBot_Red_Demoman_Sticky_B } TFBot { Template T_TFBot_Red_Medic_QuickFix } } } WaveSpawn { Name "wave1c2" WaitForAllSpawned "wave1b2" WaitForAllDead "wave1a2" Where spawnbot_hatch WaitBetweenSpawns 6 TotalCount 30 MaxActive 6 SpawnCount 3 TFBot { Template T_TFBot_Red_Sniper_Carbine_H } } WaveSpawn { Name "wave1c3" Where spawnbot_hatch TotalCount 2 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Soldier_Bulwark_D InterruptAction { Target "-688 -1250 132" Cooldown 2 Duration 2.1 Duration 1 Repeats 0 } } } WaveSpawn { Name "wave1c3" Where spawnbot_hatch TotalCount 2 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Soldier_Bulwark_D InterruptAction { Target "-940 -965 132" Cooldown 2 Duration 2.1 Duration 1 Repeats 0 } } } //Subwave 4: bomb nears hatch. concentrate firepower, defend bomb at all costs. //- D: Giant Homing Soldier //- B: Sticky Demos //- D: Sniper //- Rest support: Whip Soldiers WaveSpawn { Name "wave1d" Where spawnbot_hatch_def TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 200 TFBot { Template T_TFBot_Giant_Soldier ClassIcon soldier_homing_nys Name "Giant Homing Soldier" Item "Upgradeable TF_WEAPON_ROCKETLAUNCHER" Attributes DisableDodge Attributes IgnoreFlag BehaviorModifiers Push NoPushAway 1 AddTemplate RedBot RocketCustomParticle "eyeboss_projectile" HomingRockets { RocketSpeed 0.4 TurnPower 65 MaxAimError 150 AimTime 5 } ItemAttributes { ItemName "Upgradeable TF_WEAPON_ROCKETLAUNCHER" "mod projectile heat no predict target speed" 1 } CharacterAttributes { "force distribute currency on death" 1 "damage force reduction" 0 } } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon red2_lite } } WaveSpawn { Name "Support" WaitForAllSpawned "wave1c2" Where spawnbot_hatch WaitBetweenSpawns 2 TotalCount 111 MaxActive 5 SpawnCount 1 TotalCurrency 0 Support 1 TFBot { Template T_TFBot_Red_Soldier_Whip } } } // Wave 2 - Move from blue gate to blue front; cap point, then hyperspeed push with giants // Objective: Capture a point, bomb deploy. // Obstacle: bots that attack, defend point, and tele-blimp? // Experiment with blimp to bring bots forward? // Path: blue side, from and towards. // LOGIC: capture point. //Subwave 1 - Bots at the point! //- D: Giant Burst Shotgun Heavy (point) //- D: Giant Direct Hit Soldier (2 sides) //- H: Combo Pyro (Degreaser/Flare Gun; close *and* longer-range) //Subwave 2 - Bots coming in to get you off that point! //- D: Giant Speed Booster Soldier (conch with only speed boost; stands on point) //- H: Roll-out Heavies (GRU, switch to minigun if spotting player) //- H: Combo Pyro //Subwave 3 - Defensive bots trying to stop the bomb! //- D: Giant Burst Shotgun Heavy + Superheal Medic (tries to block path, both tank entrance and bridge) //- B: Roll-out Heavies (this time, with Natascha using slow major for lesser slowdown) //- H: Blaster Scouts //Support: Fan O'War Scouts, Blast Soldiers (single-shot) //BLU Support: Major League Scouts () Wave { SpawnTemplate "AirTeleport" SpawnTemplate { Name "controlpoint" Origin "-6800 -270 -210" } SpawnTemplate { Name "Teleporter_Blu" Origin "-6808 -410 -215" } ItemAttributes { ItemName "Ulti Wrench" "critboost on kill" 1.2 "restore health on kill" 15 "dmg taken increased" 0.85 "move speed bonus" 1.05 } SpawnTemplate wave2logic SpawnTemplate textualtimer_6mins Explanation { Line "{blue}Control {FBECCB}: Our next target is a {red}CONTROL POINT{FBECCB}. It is located on the outer part of the facility." Line "{FBECCB}We need to capture it quickly. {red}6 MINUTES." Line "{blue}Giant support{FBECCB} will be possible, but we cannot afford to lose all of them." } InitWaveOutput { Target wave_finished_nextwave_right Action Trigger } StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_nextwave_left //This contains wave_finished_relay! Action Trigger } WaveSpawn { WaitBeforeStarting 0.2 FirstSpawnOutput { Target wave2_spawner Action Trigger } } WaveSpawn { Name "NoEnd" WaitBeforeStarting 9999 } WaveSpawn { Name "wave2a" Where spawnbot_front_w2_red TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Soldier Name "Giant Predictive Direct Soldier" Item "The Direct Hit" Item "The Virtual Viewfinder" ClassIcon soldier_dh_nys AimLeadProjectileSpeed 1800 ItemAttributes { ItemName "Virtual Viewfinder" "set item tint rgb" 8208497 "attach particle effect" 121 } InterruptAction { Target "-5980 563 -50" Delay 0 Cooldown 4 Duration 5 Repeats 0 IfHealthAbove 2400 } InterruptAction { Target "-6800 -80 -144" Delay 0 Cooldown 4 Duration 5 Repeats 0 IfHealthBelow 2400 } } } WaveSpawn { Name "wave2a" Where spawnbot_front_w2_mid TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Soldier Name "Giant Predictive Direct Soldier" Item "The Direct Hit" Item "The Virtual Viewfinder" ClassIcon soldier_dh_nys AimLeadProjectileSpeed 1800 ItemAttributes { ItemName "Virtual Viewfinder" "set item tint rgb" 8208497 "attach particle effect" 121 } InterruptAction { Target "-5980 -612 -66" Delay 0 Cooldown 4 Duration 5 Repeats 0 IfHealthAbove 2400 } InterruptAction { Target "-6800 -488 -144" Delay 0 Duration 4 Cooldown 3 Repeats 0 IfHealthBelow 2400 } } } //Test to see if this would be too much // WaveSpawn // { // Name "wave2a" // Where spawnbot_front_w2_point // TotalCount 1 // MaxActive 1 // SpawnCount 1 // TFBot // { // Template T_TFBot_Red_Giant_Heavyweapons_Shotgun // Name "Giant Burst Shotgun Heavy" // ClassIcon heavy_shotgun_red_burst // ItemAttributes // { // ItemName "TF_WEAPON_SHOTGUN_HWG" // "auto fires full clip" 1 // "auto fires when full" 1 // "fire rate bonus" 0.2 // "bullets per shot bonus" 5 // "faster reload rate" 0.4 // } // InterruptAction // { // Target "cap_point" // Duration 4 // Cooldown 3 // Repeats 0 // } // } // } WaveSpawn { Name "wave2a2" Where spawnbot_front_w2_blu Where spawnbot_front_w2_mid WaitBetweenSpawns 0.5 TotalCount 12 MaxActive 12 SpawnCount 2 TFBot { Template T_TFBot_Red_Pyro ClassIcon pyro_degreaser_flare_red Name "Puff-n-Sting Pyro" Item "The Degreaser" Item "The Flare Gun" ItemAttributes { ItemName "The Degreaser" "fire input on hit" "combo_primary_to_secondary^Trigger^" "damage penalty" 0.75 } } } //Subwave 2 - Bots coming in to get you off that point! //- D: Giant Burst Air Strike Soldier (from above) //- H: Combo Pyro (forward spawn) WaveSpawn { Name "Spawnchanger" WaitForAllDead "wave2b" FirstSpawnOutput { Target "movespawns_bluegate_to_blue" Action Trigger } } WaveSpawn { Name "wave2b" WaitForAllDead "wave2a" Where spawnbot_hatch WaitBetweenSpawnsAfterDeath 10 TotalCount 2 MaxActive 1 SpawnCount 1 TFBot { Class Soldier Name "Giant Burst Air Strike Soldier" ClassIcon soldier_airstrike_para Skill Expert Health 3800 AddCond { Name TF_COND_REPROGRAMMED } Attributes HoldFireUntilFullReload Attributes MiniBoss Attributes IgnoreFlag Item "The Air Strike" Item "The b.a.s.e. Jumper" SpawnTemplate annotation_airdrop Tag airtp ItemAttributes { ItemName "The Air Strike" "clip size upgrade atomic" 4 "clipsize increase on kill" 0 "fire rate bonus" 0.35 "faster reload rate" 0.6 "projectile spread angle penalty" 1 } CharacterAttributes { "move speed bonus" 0.5 "voice pitch scale" 0 "damage force reduction" 0 "crit mod disabled hidden" 0 "override footstep sound set" 3 "cancel falling damage" 1 } InterruptAction { Target "cap_point" Duration 4 Cooldown 3 Repeats 0 } } } WaveSpawn { Name "wave2a_both" WaitForAllDead "wave2a" } WaveSpawn { Name "wave2a_both" WaitForAllDead "wave2a2" } WaveSpawn { Name "wave2b2" WaitForAllDead "wave2a_both" Where spawnbot_front_w2_blu Where spawnbot_front_w2_red WaitBeforeStarting 15 WaitBetweenSpawns 3 TotalCount 24 MaxActive 6 SpawnCount 2 TFBot { Template T_TFBot_Red_Pyro ClassIcon pyro_degreaser_flare_red Name "Puff-n-Sting Pyro" Item "The Degreaser" Item "The Flare Gun" ItemAttributes { ItemName "The Degreaser" "fire input on hit" "combo_primary_to_secondary^Trigger^" "damage penalty" 0.75 } } } //Subwave 3 - Defensive bots trying to stop the bomb! //- D: Giant Direct Hit Soldier (tries to block path, both tank entrance and bridge) //- B: Stunner Soldier //- H: Roll-out Heavies (GRU, switch to Natascha w/slow major for lesser slowdown) //- H: Hyper League Scout WaveSpawn { Name "Spawnchanger" WaitForAllDead "wave2b" FirstSpawnOutput { Target "w2_opentankdoors" Action Trigger } } WaveSpawn { Name "wave2c" Where spawnbot_hatch WaitForAllDead "wave2b" WaitBeforeStarting 4 TotalCount 3 MaxActive 3 SpawnCount 3 Squad { TFBot { Template T_TFBot_Red_Giant_Soldier_Spammer_Reload ItemAttributes { ItemName "Virtual Viewfinder" "set item tint rgb" 8208497 "attach particle effect" 121 } //880 to 656 InterruptAction { Target "-3050 -768 132" Duration 4 Cooldown 3 Repeats 0 } } TFBot { Class Heavyweapons Template RedBot_Hunt Name "Natascha Heavy" Item "Natascha" ClassIcon heavy_natascha_nys MaxVisionRange 1200 ItemAttributes { ItemName "Natascha" "slow enemy on hit" 0 "slow enemy on hit major" 0.2 } } TFBot { Class Heavyweapons Template RedBot_Hunt Name "Natascha Heavy" Item "Natascha" ClassIcon heavy_natascha_nys MaxVisionRange 1200 ItemAttributes { ItemName "Natascha" "slow enemy on hit" 0 "slow enemy on hit major" 0.2 } } } } WaveSpawn { Name "wave2c2" Where spawnbot_hatch WaitForAllDead "wave2b2" WaitBetweenSpawns 6 TotalCount 10 MaxActive 2 SpawnCount 1 TFBot { Class Soldier Name "Stunner Soldier" Template RedBot_Bomb ClassIcon soldier_stun Item "concealedkiller_rocketlauncher_sandcannon" Attributes HoldFireUntilFullReload ItemAttributes { ItemName "concealedkiller_rocketlauncher_sandcannon" "rocket specialist" 1 } } } WaveSpawn { Name "wave2c2" Where spawnbot_hatch WaitForAllDead "wave2b2" WaitBetweenSpawns 3 TotalCount 24 MaxActive 6 SpawnCount 2 TFBot { Class Heavyweapons Template RedBot_Hunt Name "Roll-out Natascha Heavy" Item "Natascha" Item "Gloves of Running Urgently MvM" ClassIcon heavy_natascha_nys MaxVisionRange 1200 ItemAttributes { ItemName "Natascha" "slow enemy on hit" 0 "slow enemy on hit major" 0.2 } WeaponSwitch { Delay 0.1 Repeats 1 Type "Melee" } WeaponSwitch { Delay 1 Repeats 1 Type "Primary" IfSeeTarget 1 } } } WaveSpawn { Name "wave2c" Where spawnbot_hatch_def WaitForAllSpawned "wave2b" WaitBeforeStarting 4 TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 200 TFBot { Template T_TFBot_Giant_Demoman Name "Chief Milk-splosion Demo" Health 8500 Scale 1.8 ClassIcon demo_milky Item "Upgradeable TF_WEAPON_GRENADELAUNCHER" Item "The Milkman" Attributes HoldFireUntilFullReload Attributes UseBossHealthbar Attributes DisableDodge Attributes IgnoreFlag BehaviorModifiers Push NoPushAway 1 AddTemplate RedBot ItemAttributes { ItemName "Upgradeable TF_WEAPON_GRENADELAUNCHER" "paintkit_proto_def_index" 130 //bovine blazemaker bc I am very funny "set_item_texture_wear" 0 "add cond on hit" 27 "add cond on hit duration" 4 "grenade explode on impact" 1 "custom projectile model" "models\weapons\c_models\c_madmilk\c_madmilk.mdl" "explosion particle" "peejar_impact_milk" "projectile trail particle" "peejar_trail_red" "fire rate bonus" 0.1 "faster reload rate" 0.6 "clip size upgrade atomic" 11 "blast radius decreased" 0.6 } CharacterAttributes { "force distribute currency on death" 1 "health regen" 20 "damage force reduction" 0 } } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon blu2_lite } } WaveSpawn { Name "Support 1" Where spawnbot_right_w2 WaitBetweenSpawnsAfterDeath 5 TotalCount 5 MaxActive 1 SpawnCount 1 Support Limited TFBot { Template T_TFBot_Giant_Scout_Baseball Health 1200 AlwaysGlow 1 Tag bomb_carrier Action FetchFlag } } WaveSpawn { Name "Support 2" WaitForAllDead "Support 1" Where spawnbot_right_w2 WaitBeforeStarting 6 TotalCount 1 MaxActive 1 SpawnCount 1 Support Limited DoneOutput { Target redwin_relay Action Trigger } TFBot { Template T_TFBot_Giant_Scout_Baseball_Armored AlwaysGlow 1 Tag bomb_carrier Action FetchFlag SpawnTemplate lastbotlogic } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon red2_lite } } WaveSpawn { Name "Support" Where spawnbot_front_w2_blu Where spawnbot_front_w2_red Where spawnbot_hatch_alt WaitForAllDead "wave2a2" WaitBeforeStarting 5 WaitBetweenSpawns 4 TotalCount 24 MaxActive 4 SpawnCount 4 Support 1 TFBot { Template T_TFBot_Red_Scout_Sandman_FastCharge } } WaveSpawn { Name "Support" Where spawnbot_hatch WaitForAllDead "wave2b2" WaitBetweenSpawns 8 TotalCount 24 MaxActive 2 SpawnCount 1 Support 1 TFBot { Template T_TFBot_Red_Scout_Sandman_FastCharge } } } // Wave 3 - Blue side's explored, now let's win with a tank! // Objective: escort a tank to win the round. // Obstacle: blockade around the blu path. red path is 100% off-limits. // Tank-targeting bots will spawn. // Tank-healing bots will also spawn. Tank will slow down with health. // Path: blue side. // LOGIC: tank stops before trigger that opens door; kill bots to proceed. //Subwave 1: first area, before entering RED side, up to door //- Tank: Giant Backup Equalizer Soldier //- T: Carbine-wacka Snipers //- D: Giant Burst Homing Soldier (kill to proceed) //- H: Loose Cannon Demos + Superheal Medic //Subwave 2: after door, moving up to gate; //- T/H: Soda Scouts //- T/H: Minigiant Fury Pyros //- D: Chief Armored Heavy (bulky fucker); on death, restore tank health slightly //Subwave 3: last section! long stretch, excellent for... //- T: Giant Buff Bison Soldier //- Support, H: Burst Fire Soldier //- Support, T: Rapid/Burst/Crit Bison Soldier SpawnTemplate wave3logic Wave { Explanation { Line "{blue}Control {FBECCB}: Good. We have secured the robot construction facility." Line "{FBECCB}We have to stall for time. As such, we will deploying a {blue}TANK." Line "{FBECCB}However, this is the {RED}ONLY ONE{FBECCB} we have. Do not let it be destroyed!" } InitWaveOutput { Target wave3_spawner Action Trigger } StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } ItemAttributes { ItemName "Ulti Wrench" "critboost on kill" 1.4 "restore health on kill" 20 "dmg taken increased" 0.8 "move speed bonus" 1.1 } WaveSpawn { Name "BLU Tank" Where spawnbot //yeah sure whatever TotalCount 1 MaxActive 1 SpawnCount 1 WaitBeforeStarting 0.5 DoneOutput { Target redwin_relay Action Trigger } Tank { Name "tankboss" StartingPathTrackNode "boss_path_1" Health 60000 Speed 60 OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } //Subwave 1: first area, before entering RED side, up to door //- Tank: Giant Backup Equalizer Soldier //- T: Carbine-wacka Snipers //- D: Giant Burst Homing Soldier (kill to proceed) //- H: Loose Cannon Demos + Overheal Medic WaveSpawn { Name "wave3a" Where spawnbot_w3_garage WaitBetweenSpawns 18 TotalCount 2 MaxActive 2 SpawnCount 1 TFBot { Template T_TFBot_Giant_Soldier Name "Giant Battalion Equalizer Soldier" Attributes SpawnWithFullCharge WeaponRestrictions MeleeOnly ClassIcon soldier_equalizer_backup Item "The Equalizer" Item "The Battalion's Backup" Item "The Grenadier's Softcap" ItemAttributes { ItemName "The Equalizer" "fire rate bonus with reduced health" 0.6 "damage bonus" 1.5 } AddTemplate RedBot AddTemplate AttackTank_Only } } WaveSpawn { Name "wave3a2" Where spawnbot_w3_tankdoor TotalCount 20 MaxActive 10 SpawnCount 5 TFBot { Class Sniper Name "Carbine-wacka Sniper" Skill Hard Item "Professional's Panama" Item "The Cleaner's Carbine" Item "The Bushwacka" ClassIcon sniper_carbinewacka Template RedBot SpawnTemplate Carbinewacka AddTemplate AttackTank FireWeapon { Type "Secondary" Repeats 0 Cooldown 0.4 Duration 0.1 Delay 1.5 } } } WaveSpawn { Name "wave3a2" Where spawnbot_w3_garage WaitBetweenSpawns 8 TotalCount 16 MaxActive 8 SpawnCount 4 Squad { TFBot { Template T_TFBot_Red_Demoman_Cannon_H } TFBot { Template T_TFBot_Red_Medic_Overheal } } } WaveSpawn { Name "wave3a2" Where spawnbot_w3_garage Where spawnbot_w3_tankdoor WaitBetweenSpawns 3 TotalCount 15 MaxActive 5 SpawnCount 1 TFBot { Template T_TFBot_Red_Demoman_Cannon_H } } WaveSpawn { Name "wave3a3" WaitBeforeStarting 50 Where spawnbot_w3_garage TotalCount 1 MaxActive 1 SpawnCount 1 DoneOutput { Target "tankboss*" Action SetSpeed Param 60 } TFBot { Template T_TFBot_Red_Giant_Soldier_SlowBarrage Attributes DisableDodge ClassIcon soldier_barrage_homing_nys AlwaysGlow 1 SpawnTemplate annotation_tank_req RocketCustomParticle "eyeboss_projectile" HomingRockets { RocketSpeed 0.4 TurnPower 65 MaxAimError 150 AimTime 5 } InterruptAction { Target "-5800 1000 -50" Cooldown 4 Duration 5 Delay 0 } } } //Subwave 2: after door, moving up to gate; //- T/H: Soda Scouts //- T/H: Minigiant Fury Pyros //- D: Giant Heavy (bulky fucker) WaveSpawn { Name "wave3b" WaitForAllDead "wave3a3" Where spawnbot_w3_gateboxes WaitBeforeStarting 2 TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Heavyweapons Attributes DisableDodge InterruptAction { Target "-3000 1580 75" Cooldown 4 Duration 5 Delay 0 } } } WaveSpawn { Name "wave3b2" WaitForAllDead "wave3a2" Where spawnbot_w3_boxesdoor TotalCount 12 MaxActive 4 SpawnCount 2 TFBot { Template T_TFBot_Red_Pyro Health 650 Scale 1.4 Name "Furious Pyro" Item "The Dragon's Fury" Item "The Rusty Reaper" ClassIcon pyro_dragon_fury_swordstone AddTemplate AttackTank_Only_Side CharacterAttributes { "move speed penalty" 0.85 } } } WaveSpawn { Name "wave3b2" WaitForAllDead "wave3a2" WaitBeforeStarting 2 WaitBetweenSpawns 3 Where spawnbot_w3_boxesdoor Where spawnbot_hatch_alt TotalCount 24 MaxActive 6 SpawnCount 2 TFBot { Template T_TFBot_Red_Scout Name "Cola Popper Scout" Item "The Soda Popper" Item "The Crit-a-Cola" Item "Bonk Leadwear" ClassIcon scout_cola_nys AddTemplate AttackTank_Only ItemAttributes { ItemName "Crit-a-Cola" "mod_mark_attacker_for_death" 0 //I think this maybe just does nothing "effect bar recharge rate increased" 0.4 } } } WaveSpawn { Name "EMERGENCY SPATIAL SHIFT" WaitForAllDead "wave3b2" FirstSpawnOutput { Target tankcapdoor_opener Action Open } } //Subwave 3: last section! long stretch, excellent for... //- T: Giant Buff Bison Soldier //- Support, H: Burst Fire Soldier //- Support, T: Rapid/Burst/Crit Bison Soldier // WaveSpawn // { // Name "wave3c" // Where spawnbot_hatch_alt // WaitBetweenSpawns 18 // TotalCount 4 // MaxActive 2 // SpawnCount 1 // Squad // { // TFBot // { // Template T_TFBot_Red_Giant_Soldier // Name "Giant Bison Barrage Soldier" // Health 4000 // Item "The Righteous Bison" // Item "Tux" // ItemAttributes // { // ItemName "The Righteous Bison" // "auto fires when full" 1 // "auto fires full clip" 1 // "fire rate bonus" 0.2 // "faster reload rate" 0.6 // "clip size bonus" 6 // } // ItemAttributes // { // ItemName "Tux" // "attachment name" "back" // } // ItemModel // Replaces item model // { // ItemName "Tux" // Model "models/weapons/c_models/c_buffbanner/c_buffbanner.mdl" // } // CharacterAttributes // { // "max health additive bonus" 4000 // } // AddCond // { // Delay 0 // Index 16 // } // AddTemplate AttackTank // } // TFBot // { // Template T_TFBot_Red_Medic_Overheal // } // } // } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon red2_lite } } WaveSpawn { Name "Support" WaitForAllDead "wave3b2" Where spawnbot_hatch WaitBeforeStarting 6 WaitBetweenSpawns 5 TotalCount 100 MaxActive 4 SpawnCount 2 Support 1 TFBot { Template T_TFBot_Red_Soldier ClassIcon soldier_burstfire Name "Burst Fire Soldier" Item "The Liberty Launcher" Attributes HoldFireUntilFullReload ItemAttributes { ItemName "The Liberty Launcher" "fire rate bonus" 0.05 "faster reload rate" 1.5 "projectile spread angle penalty" 2 } } } WaveSpawn { Name "Support" WaitForAllDead "wave3b2" Where spawnbot_hatch WaitBetweenSpawns 2.5 TotalCount 100 MaxActive 6 SpawnCount 1 Support 1 RandomChoice { TFBot { Template T_TFBot_Red_Soldier_Bison Name "Rapid Bison Soldier" ItemAttributes { ItemName "The Righteous Bison" "fire rate bonus" 0.5 "faster reload rate" 0 } } TFBot { Template T_TFBot_Red_Soldier_Bison Name "Burst Bison Soldier" ItemAttributes { ItemName "The Righteous Bison" "fire rate penalty" 2.5 "projectile spread angle penalty" 2 "mult projectile count" 3 "faster reload rate" 0 } } TFBot { Template T_TFBot_Red_Soldier_Bison Name "Crit Bison Soldier" Attributes AlwaysCrit } } } } // Wave 4 - Time to kill some bots! // Objective: destroy giants around the map. // ALL PATHS! // Obstacle: bots around the initial choke. // Maybe cool: a "guardian" bot that lets the gate open? // Good chance for spies to start spawning! Wave { ItemAttributes { ItemName "Ulti Wrench" "critboost on kill" 1.6 "restore health on kill" 25 "dmg taken increased" 0.75 "move speed bonus" 1.15 } WaveSpawn { } } //Wave 5 - The big reversal: //- You're on Red again! Protect a Red titan! //- Start off in blue spawn, get tp'd to hatch, which is where Titan will await. //- Primarily hunt bots, with a few "offensive positioning" bots; // try to reach certain positions before firing powerful attack on boss. //- oh and busters of course Wave { ItemAttributes { ItemName "Ulti Wrench" "critboost on kill" 1.8 "restore health on kill" 30 "dmg taken increased" 0.7 "move speed bonus" 1.2 } WaveSpawn { } } // Wave 6 - Scrapped. Originally was wave 5, but I ran outta time. // Objective: capture, then defend point around original spawns. // Obstacle: defensive bots, smaller amounts of hunting bots. // Wave // { // ItemAttributes // { // ItemName "Ulti Wrench" // "critboost on kill" 2 // "restore health on kill" 35 // "dmg taken increased" 0.65 // "move speed bonus" 1.25 // } // WaveSpawn // { // } // } }