#base robot_standard.pop #base robot_giant.pop WaveSchedule { StartingCurrency 800 CanBotsAttackWhileInSpawnRoom no RespawnWaveTimeBlue 5 ReverseWinConditions 1 AllowJoinTeamBlueMax 6 AllowJoinTeamBlue 1 HumansMustJoinTeam Blue SetCreditTeam 3 SniperAllowHeadshots 1 //sniper and amby un-exist without this ImprovedAirblast 1 SendBotsToSpectatorImmediately 1 //keeps the populator less clogged, bot projectiles vanish on death + causes weird killcams RobotLimit 27 //going higher will eat player slots FlagCarrierMovementPenalty 1 // (default: 0.5) BotTeleportUberDuration 1 BluHumanTeleportOnSpawn 1 BluHumanBotTeleporter 1 PrecacheModel "models\props_mvm\mvm_upgrade_blu_center.mdl" PrecacheModel "models\props_mvm\mvm_upgrade_blu_tools.mdl" PointTemplates { corelogic //all the things we want to automatically run when the popfile reloads. Use this the most to avoid spaghetti { NoFixup 1 logic_auto { "origin" "0 0 0" "targetname" "mainrelay" //delete as much unnecessary/unwanted stuff as you can from your map of choice. //you probably won't risk crashes on simpler/smaller mvm maps, but the further away from the edict limit you can be the better //out-of-bounds decorations, ropes, unreachable easter egg room ents, etc. //"OnMapSpawn" "filter_blue_bombhat,Kill,,0,-1" //gatebot maps will need their capture filter deleted for players to cap //"OnMapSpawn" "gate1_alarm*,Kill,,0,-1" //gets spammed by both red and blu team //"OnMapSpawn" "bot_stun_*,Kill,,0,-1" //some gates may stun players //"OnMapSpawn" "item_ammopack*,Kill,,0,-1" //might want to comment this out if players have limited ammo //"OnMapSpawn" "Barricade*,Kill,,0,-1" //rottenburg specific, deletes front tank barricade //if there is no targetname for wasteful ents, you can also delete them by classname //deleting these decoration ropes frees up nearly 100 edicts on mvm_yiresa_rc5 //"OnMapSpawn" "move_rope,Kill,,0,-1" //"OnMapSpawn" "keyframe_rope,Kill,,0,-1" // "OnMapSpawn" "filter_redteam,Kill,,0,-1" //red team filters might cause problems, deleting them might cause more problems // "OnMapSpawn" "trigger_push,Disable,,0,-1" //some maps use trigger_pushes intended to un-stick bots //AddOutput can be used to modify existing map logic and automate certain tasks //basically, we can use it to connect the maps logic with our own home-brewed point templates like so: "OnMapSpawn" "wave_start_relay*,AddOutput,OnTrigger spawnbarrierA*:Disable:0:-1" "OnMapSpawn" "wave_finished_relay*,AddOutput,OnTrigger spawnbarrierA*:Enable:0:-1" "OnMapSpawn" "wave_finished_relay*,AddOutput,OnTrigger barrierB*:Enable:0:-1" //What we're doing: //"wave_start_relay*,AddOutput, //most entities accept the input 'AddOutput', letting us daisy-chain them together. // * will trigger our relay alongside any others with wave_start_relay in the name (i.e. wave_start_relay_classic or wave_start_relay_endurance), this only works for suffixes (*_start_relay* will not work) //OnTrigger spawnbarrier*:Disable:0:-1" //When wave_start_relay_classic/endurance triggers, it will trigger Disable on 'spawnbarrierA' and 'spawnbarrierA1' with a 0 second delay, -1 means this relay can be triggered an infinite amount of times. //We can also use AddOutput to change logic rather than just latch onto it: "OnMapSpawn" "hint,AddOutput,display_text test,10,-1" //change annotation text to test 10s after map spawn "OnMapSpawn" "wave_start_relay_classic,AddOutput,OnTrigger hint:Show:0:-1" "OnMapSpawn" "tankpath1_1,AddOutput,OnPass red_tank_relay:Trigger:0:-1" } NoFixup 1 logic_relay //trigger this to kill all players and buildings { "targetname" "kill_relay" "OnTrigger" "obj_dispenser,RemoveHealth,5000,0,-1" "OnTrigger" "obj_sentrygun,RemoveHealth,5000,0,-1" "OnTrigger" "obj_teleporter,RemoveHealth,5000,0,-1" "OnTrigger" "player,SetHealth,-10000,0,-1" } NoFixup 1 logic_relay //trigger this to lose { "origin" "0 0 0" "targetname" "redwin_relay" "OnTrigger" "bots_win_red,RoundWin,,0,-1" "OnTrigger" "pit_explosion_wav,PlaySound,,0,-1" //map dependent "OnTrigger" "failuresound,PlaySound,,0,-1" //map dependent } NoFixup 1 game_round_win //do not interact with this { "origin" "0 0 0" "TeamNum" "2" "targetname" "bots_win_red" "switch_teams" "0" "force_map_reset" "1" "classname" "game_round_win" } func_nav_prerequisite //repeated for hatch { "targetname" "hatchnav" "mins" "-100 -100 -100" "maxs" "100 100 100" "Entity" "hatchspawn" "filtername" "filter_hatch" "origin" "1542.488770 739.029175 -143.968689" "spawnflags" "1" "start_disabled" "0" "StartDisabled" "0" "Task" "2" "Value" "-1" } filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "bot_hatch" "targetname" "filter_hatch" } NoFixup 1 logic_relay { "targetname" "red_tank_relay" "OnTrigger" "tankbossred,Setteam,2,0.25,-1" "OnTrigger" "tankbossred,AddCaptureDestroyPostfix,destroy_mvm_cactus_valley3,0.5,-1" //cool explodey effect, doesn't work :( } NoFixup 1 trigger_multiple { "targetname" "thirdperson" "StartDisabled" "1" "spawnflags" "3" "origin" "1542.488770 739.029175 -143.968689" "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" } NoFixup 1 ambient_generic { "targetname" "failuresound" "health" "10" "message" "vo\announcer_failure.mp3" "pitch" "100" "pitchstart" "100" "radius" "20000" "spawnflags" "49" "origin" "0 0 0" } } barriers //spawn blocker { NoFixup 1 func_forcefield { "disablereceiveshadows" "0" "origin" "0 0 0" "renderamt" "255" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "spawnbarrierA1" "parentname" "spawnbarrierA" "mins" "-300 -100 -300" "maxs" "300 100 1100" "StartDisabled" "0" } NoFixup 1 prop_dynamic //prop for show { "targetname" "spawnbarrierA" "angles" "0 0 0" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "ExplodeDamage" "0" "ExplodeRadius" "0" "fademaxdist" "0" "fademindist" "-1" "fadescale" "1" "MaxAnimTime" "10" "maxdxlevel" "0" "MinAnimTime" "5" "mindxlevel" "0" "modelscale" "1.5" "PerformanceMode" "0" "pressuredelay" "0" "RandomAnimation" "0" "renderamt" "0" "renderfx" "16" //hologram effect, see renderfx section on the developer wiki for more "rendermode" "0" "SetBodyGroup" "0" "skin" "0" //set to 1 for red traincar, many props separate different variants this way "CollisionGroup" "0" "solid" "0" "spawnflags" "0" "StartDisabled" "0" "origin" "0 0 0" } } barriers2 //tunnel blocker { NoFixup 1 func_forcefield //what actually blocks players { "disablereceiveshadows" "0" "origin" "0 0 0" "renderamt" "255" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "barrierB1" "parentname" "barrierB" "mins" "-100 -100 -100" "maxs" "300 200 100" "StartDisabled" "0" } NoFixup 1 prop_dynamic //prop for show { "targetname" "barrierB" "angles" "0 0 0" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "ExplodeDamage" "0" "ExplodeRadius" "0" "fademaxdist" "0" "fademindist" "-1" "fadescale" "1" "MaxAnimTime" "10" "maxdxlevel" "0" "MinAnimTime" "5" "mindxlevel" "0" "modelscale" "1.5" "PerformanceMode" "0" "pressuredelay" "0" "RandomAnimation" "0" "renderamt" "0" "renderfx" "16" //hologram "rendermode" "0" "SetBodyGroup" "0" "skin" "0" "CollisionGroup" "0" "solid" "0" "spawnflags" "0" "StartDisabled" "0" "origin" "0 0 0" } NoFixup 1 logic_relay { "targetname" "barrierB_relay" "OnTrigger" "barrierB*,Disable,0,-1" "OnTrigger" "bombbot_rest_ONE,Disable,0,-1" "OnTrigger" "bombbot_rest_TWO,Enable,0,-1" } } station //all-in-one upgrade station template { func_upgradestation { "mins" "-105 -100 0" "maxs" "105 100 242" "solid" "0" } NoFixup 1 prop_dynamic { "targetname" "upgradestation" "angles" "0 0 0" "DisableBoneFollowers" "0" "disablereceiveshadows" "0" "disableshadows" "1" "ExplodeDamage" "0" "ExplodeRadius" "0" "fademaxdist" "0" "fademindist" "-1" "fadescale" "1" "MaxAnimTime" "10" "maxdxlevel" "0" "MinAnimTime" "5" "mindxlevel" "0" "model" "models\props_mvm\mvm_upgrade_blu_center.mdl" "modelscale" "1" "PerformanceMode" "0" "pressuredelay" "0" "RandomAnimation" "0" "renderamt" "255" "renderfx" "0" "rendermode" "0" "SetBodyGroup" "0" "skin" "0" "solid" "0" "spawnflags" "0" "origin" "0 0 0" } NoFixup 1 prop_dynamic { "targetname" "upgradestation1" "angles" "0 0 0" "DisableBoneFollowers" "0" "disablereceiveshadows" "0" "disableshadows" "1" "ExplodeDamage" "0" "ExplodeRadius" "0" "fademaxdist" "0" "fademindist" "-1" "fadescale" "1" "MaxAnimTime" "10" "maxdxlevel" "0" "MinAnimTime" "5" "mindxlevel" "0" "model" "models\props_mvm\mvm_upgrade_blu_tools.mdl" "modelscale" "1" "PerformanceMode" "0" "pressuredelay" "0" "RandomAnimation" "0" "renderamt" "255" "renderfx" "0" "rendermode" "0" "SetBodyGroup" "0" "skin" "0" "solid" "0" "spawnflags" "0" "origin" "0 0 0" } func_upgradestation { "mins" "-100 -100 0" "maxs" "90 60 100" "parentname" "upgradestation" } // NoFixup 1 // prop_dynamic // { // "targetname" "idiot" // "parentname" "upgradestation" // "angles" "0 0 0" // "DisableBoneFollowers" "1" // "disablereceiveshadows" "0" // "disableshadows" "1" // "ExplodeDamage" "0" // "ExplodeRadius" "0" // "fademaxdist" "0" // "fademindist" "-1" // "fadescale" "1" // "MaxAnimTime" "10" // "maxdxlevel" "0" // "MinAnimTime" "5" // "mindxlevel" "0" // "model" "models/bots/bot_worker/bot_worker_a.mdl" // "modelscale" "1" // "PerformanceMode" "0" // "pressuredelay" "0" // "RandomAnimation" "0" // "DefaultAnim" "idle" // "renderamt" "255" // "renderfx" "0" // "rendermode" "0" // "SetBodyGroup" "2" // "skin" "1" // "solid" "0" // "spawnflags" "0" // "origin" "-65 50 0" // } NoFixup 1 prop_dynamic { "targetname" "shopcollision" "angles" "0 -90 0" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "ExplodeDamage" "0" "ExplodeRadius" "0" "fademaxdist" "0" "fademindist" "-1" "fadescale" "1" "MaxAnimTime" "10" "maxdxlevel" "0" "MinAnimTime" "5" "mindxlevel" "0" "modelscale" "1" "PerformanceMode" "0" "pressuredelay" "0" "RandomAnimation" "0" "renderamt" "0" "renderfx" "0" "rendermode" "10" "SetBodyGroup" "0" "skin" "0" "CollisionGroup" "5" "solid" "6" "spawnflags" "0" "StartDisabled" "0" "origin" "0 0 0" } } blocker //giant building for blocking stuff { NoFixup 1 prop_dynamic { "id" "3" "targetname" "barrierinvis" "classname" "prop_dynamic" "angles" "0 0 0" "DisableBoneFollowers" "0" "disablereceiveshadows" "0" "disableshadows" "1" "ExplodeDamage" "0" "ExplodeRadius" "0" "fademaxdist" "0" "fademindist" "-1" "fadescale" "1" "MaxAnimTime" "10" "maxdxlevel" "0" "MinAnimTime" "5" "mindxlevel" "0" "model" "models\props_buildings\building_002a.mdl" "modelscale" "1" "PerformanceMode" "0" "pressuredelay" "0" "RandomAnimation" "0" "renderamt" "255" "renderfx" "0" "rendermode" "0" // "rendermode" "10" un-comment this and comment rendermode 0 to make it invisible "SetBodyGroup" "0" "skin" "0" "solid" "6" "spawnflags" "0" "origin" "0 0 0" } } bombbottemplate { NoFixup 1 func_nav_prerequisite { "targetname" "bombbot_rest_ONE" "mins" "-100 -100 -100" "maxs" "100 100 100" "filtername" "filter_bombbot" "origin" "699.7 -1697.6 -443.0" "spawnflags" "1" "start_disabled" "0" "StartDisabled" "0" "Task" "2" "Value" "-1" } NoFixup 1 func_nav_prerequisite { "targetname" "bombbot_rest_TWO" "mins" "-100 -100 -100" "maxs" "100 100 100" "filtername" "filter_bombbot" "origin" "1516.6 380.9 -347.3" "spawnflags" "1" "StartDisabled" "1" "Task" "2" "Value" "-1" } NoFixup 1 func_nav_prerequisite { "targetname" "bombbot_rest_THREE" "mins" "-100 -100 -1000" "maxs" "100 100 1000" "filtername" "filter_bombbot" "origin" "1058.0 1674.3 -172.8" "spawnflags" "1" "StartDisabled" "1" "Task" "2" "Value" "-1" } NoFixup 1 func_nav_prerequisite { "targetname" "bombbot_rest_FOUR" "mins" "-100 -100 -100" "maxs" "100 100 100" "filtername" "filter_bombbot" "origin" "-585.6 1145.1 -190.8" "spawnflags" "1" "StartDisabled" "1" "Task" "2" "Value" "-1" } NoFixup 1 func_nav_prerequisite { "targetname" "bombbot_rest_FOUR" "mins" "-100 -100 -100" "maxs" "100 100 100" "filtername" "filter_bombbot" "origin" "-585.6 1145.1 -190.8" "spawnflags" "1" "StartDisabled" "1" "Task" "2" "Value" "-1" } Nofixup 1 filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "bot_bombcarrier" "targetname" "filter_bombbot" } } } SpawnTemplate "corelogic" SpawnTemplate "bombbottemplate" SpawnTemplate //specify origin/angles here for templates we use multiple times { Name "station" "origin" "2924.840088 -3275.968750 -161.96868" "angles" "0 90 0" } SpawnTemplate { Name "station" "origin" "1325.108643 -3090.374756 -50.714088" "angles" "0 -190 0" } SpawnTemplate { Name "barriers" //use these if your map has no spawn door "origin" "2724.365479 -2303.941650 -143.139458" "angles" "0 90 0" } SpawnTemplate { Name "barriers" "origin" "381.125824 -2462.805176 -125.37920" "angles" "0 0 0" } SpawnTemplate //comented out due to a collision bug on potato servers, otherwise works { Name "barriers2" "origin" "1526.642578 -19.171825 -425.004791" "angles" "0 0 0" } SpawnTemplate { Name "barriers2" "origin" "1726.642578 -19.171825 -425.004791" "angles" "0 0 0" } ExtraSpawnPoint { Name "tunnelspawn" TeamNum 2 //2 for red 3 for blu X "1530" Y "199" Z "-340" } ExtraSpawnPoint { Name "towerspawn" TeamNum 2 X "1534.326782" Y "770.423157" Z "-143.968689" } ExtraSpawnPoint //bots will randomly select between identically named spawns, use RandomSpawn 1 to split spawns evenly { Name "towerspawn" TeamNum 2 X "1535.212036" Y "1306.657837" Z "-143.968689" } ExtraSpawnPoint { Name "hatchspawn" TeamNum 2 X "-1377.705200" Y "1534.423157" Z "-90.968689" } ExtraSpawnPoint { Name "RedSpawn_giant" //giants can't fit out of bot spawn TeamNum 2 X "-1231" Y "2213.423157" Z "-60.968689" } Templates {} Wave // Wave 1 { StartWaveOutput { Target wave_start_relay_classic Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } Explanation { Line "Welcome to Rottenburg." Line "Your job is a bit different today." Line "You will be attacking the robotic RED forces." Line "You must escort your bomb bot to the hatch to beat the wave." Line "Good luck." } WaveSpawn { Name "BOMBBOTW1" Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 DoneOutput { Target redwin_relay Action Trigger } TFBot { Class Sniper Name "Bomb Lugger" ClassIcon agentbomb Attributes "UseBossHealthBar" Health 10000 Scale 1.3 Tag bot_bombcarrier WeaponRestrictions SecondaryOnly Attributes UseBossHealthBar Attributes MiniBoss Skill Expert Tag bot_giant MaxVisionRange 1000 CharacterAttributes { "damage force reduction" 0.0001 "airblast vulnerability multiplier" 0.0001 "airblast vertical vulnerability multiplier" 0.0001 "afterburn immunity" 1 "cannot be backstabbed" 1 "head scale" 0.1 "hand scale" 2 "torso scale" 0.1 "rage giving scale" 0.01 "wet immunity" 1 "cannot be sapped" 1 } ItemAttributes { Itemname "TF_WEAPON_SMG" "fire rate bonus" 0.7 "clip size bonus" 2.0 } } } WaveSpawn { Name "1a" Where tunnelspawn TotalCount 16 MaxActive 8 SpawnCount 4 WaitBeforeStarting 0 WaitBetweenSpawns 2 DoneOutput { Target barrierB_relay Action Trigger } TotalCurrency 50 TFBot { Class Soldier Skill Normal Action Mobber AddCond { Name TF_COND_REPROGRAMMED } } } WaveSpawn { Name "1a1" Where tunnelspawn TotalCount 12 MaxActive 4 SpawnCount 2 WaitBeforeStarting 0 WaitBetweenSpawns 4 TotalCurrency 50 TFBot { Template T_TFBot_Demoman_Knight Action Mobber AddCond { Name TF_COND_REPROGRAMMED } } } } }