#base robot_giant.pop #base robot_standard.pop ClassLimit //Limits the number of specified classes { Pyro 0 } WaveSchedule { StartingCurrency 0 RespawnWaveTime 6 CanBotsAttackWhileInSpawnRoom no Mission { Objective DestroySentries InitialCooldown 10 Where spawnbot BeginAtWave 2 RunForThisManyWaves 6 CooldownTime 20 TFBot { Template T_TFBot_SentryBuster } } Wave { StartWaveOutput { Target wave_start_relay_table Action Trigger } DoneOutput { Target wave_finished_relay_table Action Trigger } WaveSpawn { Name "stage1" Where spawnbot TotalCount 1 SpawnCount 1 WaitBeforeStarting 3 TotalCurrency 601 TFBot { Class Scout Skill Expert WeaponRestrictions MeleeOnly Name "Serj Tankian" Item "Class Crown" Item "The Holy Mackerel" ClassIcon serj } } } Wave { StartWaveOutput { Target wave_start_relay_2 Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } WaveSpawn { Name "stage1" Where spawnbot TotalCount 50 MaxActive 20 SpawnCount 5 WaitBeforeStarting 20 WaitBetweenSpawns 4 TotalCurrency 50 TFBot { Class Scout Skill Expert WeaponRestrictions MeleeOnly Name "Table" Item "The Holy Mackerel" ClassIcon table } } WaveSpawn { Name "stage1" Where spawnbot TotalCount 2 MaxActive 2 SpawnCount 1 WaitBeforeStarting 26 WaitBetweenSpawns 20 TotalCurrency 50 TFBot { Template T_TFBot_Giant_Scout Skill Expert WeaponRestrictions MeleeOnly Name "Table" Item "The Holy Mackerel" ClassIcon table1 } } WaveSpawn { Name "stage2" WaitForAllDead "stage1" Where spawnbot Where spawnbot_flanker TotalCount 20 MaxActive 18 SpawnCount 6 WaitBeforeStarting 4 WaitBetweenSpawns 4 TotalCurrency 40 RandomChoice { TFBot { Class Demoman Skill Expert WeaponRestrictions PrimaryOnly Name "Table" Item "The Loose Cannon" ClassIcon table2 ItemAttributes { ItemName "The Loose Cannon" "grenade launcher mortar mode" 0 } } TFBot { Class Demoman Skill Expert WeaponRestrictions PrimaryOnly Name "Table" Item "The Loose Cannon" ClassIcon table2 Tag flanker ItemAttributes { ItemName "The Loose Cannon" "grenade launcher mortar mode" 0 } } } } WaveSpawn { Name "stage2" WaitForAllDead "stage1" Where spawnbot Where spawnbot_flanker TotalCount 15 MaxActive 6 SpawnCount 2 WaitBeforeStarting 15 WaitBetweenSpawns 3 TotalCurrency 40 RandomChoice { TFBot { Template T_TFBot_Heavyweapons_Shotgun Skill Expert Name "Table" ClassIcon table3 ItemAttributes { ItemName "TF_WEAPON_SHOTGUN_HWG" "fire rate bonus" 1.5 } } TFBot { Class Soldier Skill Expert WeaponRestrictions SecondaryOnly Name "Table" ClassIcon table3 Item "Shotgun" ItemAttributes { ItemName "Shotgun" "faster reload rate" 0.1 "fire rate bonus" 1.5 "bullets per shot bonus" 3 "damage bonus" 0.33 } } TFBot { Class Pyro Skill Expert WeaponRestrictions SecondaryOnly Name "Table" ClassIcon table3 Item "Shotgun" ItemAttributes { ItemName "Shotgun" "faster reload rate" 0.1 "fire rate bonus" 1.5 "bullets per shot bonus" 3 "damage bonus" 0.33 } } } } WaveSpawn { Name "stage3" WaitForAllDead "stage2" Where spawnbot TotalCount 42 MaxActive 18 SpawnCount 9 WaitBeforeStarting 6 WaitBetweenSpawns 10 TotalCurrency 90 TFBot { Class Heavyweapons Name "Table" Skill Expert ClassIcon table4 WeaponRestrictions MeleeOnly Attributes AlwaysCrit Item "The Holiday Punch" CharacterAttributes { "move speed bonus" 1.5 } } } WaveSpawn { Name "stage3" WaitForAllDead "stage2" Where spawnbot TotalCount 2 MaxActive 2 SpawnCount 1 WaitBeforeStarting 20 WaitBetweenSpawns 30 TotalCurrency 60 TFBot { Template T_TFBot_Giant_Heavyweapons Name "Table" ClassIcon table5 WeaponRestrictions MeleeOnly Attributes AlwaysCrit Item "The Holiday Punch" Health 2500 ItemAttributes { ItemName "The Holiday Punch" "damage bonus" 1 } CharacterAttributes { "move speed bonus" 0.5 "damage force reduction" 0.3 "airblast vulnerability multiplier" 0.3 "override footstep sound set" 2 } } } WaveSpawn { Name "stage3" WaitForAllDead "stage2" Where spawnbot TotalCount 20 MaxActive 6 SpawnCount 2 WaitBeforeStarting 20 WaitBetweenSpawns 5 TotalCurrency 50 TFBot { Class Soldier Skill Expert WeaponRestrictions PrimaryOnly Item "The Liberty Launcher" Name "Table" ClassIcon table6 ItemAttributes { ItemName "The Liberty Launcher" "damage causes airblast" 1 "fire rate bonus" 0.8 } } } WaveSpawn { Name "stage4" WaitForAllDead "stage3" Where spawnbot Where spawnbot_flanker TotalCount 25 MaxActive 15 SpawnCount 3 WaitBeforeStarting 5 WaitBetweenSpawns 6 TotalCurrency 50 Support Limited RandomChoice { TFBot { Class Soldier Name "Table" Skill Expert ClassIcon table7 Attributes SpawnWithFullCharge Item "The Buff Banner" ItemAttributes { ItemName "The Buff Banner" "effect bar recharge rate increased" 0.5 } CharacterAttributes { "increase buff duration" -0.25 } } TFBot { Class Soldier Name "Table" Skill Expert ClassIcon table7 Attributes SpawnWithFullCharge Item "The Concheror" ItemAttributes { ItemName "The Concheror" "effect bar recharge rate increased" 0.5 } CharacterAttributes { "increase buff duration" -0.25 "effect bar recharge rate increased" 0.5 } } TFBot { Class Soldier Name "Table" Skill Expert ClassIcon table7 Attributes SpawnWithFullCharge Item "The Battalion's Backup" ItemAttributes { ItemName "The Battalion's Backup" "effect bar recharge rate increased" 0.5 } CharacterAttributes { "increase buff duration" -0.25 "effect bar recharge rate increased" 0.5 } } } } WaveSpawn { Name "stage4" WaitForAllDead "stage3" Where spawnbot TotalCount 10 MaxActive 10 SpawnCount 5 WaitBeforeStarting 15 WaitBetweenSpawns 30 TotalCurrency 160 Squad { TFBot { Template T_TFBot_Giant_Soldier Skill Expert WeaponRestrictions PrimaryOnly Name "Table" ClassIcon table8 } TFBot { Template T_TFBot_Medic Name "Table" ClassIcon table9 } TFBot { Template T_TFBot_Medic Name "Table" ClassIcon table9 } TFBot { Template T_TFBot_Medic Name "Table" ClassIcon table9 } TFBot { Template T_TFBot_Medic Name "Table" ClassIcon table9 } } } } Wave { InitWaveOutput { Target gamerules Action RunScriptCode param " IncludeScript(`popextensions_main.nut`) // Add event hooks for tanks with specifed Name, also supports wildcard suffix PopExt.AddTankName(`tankboss*`, { // Use custom tank icon Icon = { name = `table`, isCrit = false, isBoss = false}, // Use custom tank model, can be either a string or a table of strings // TankModel = `models/corona/table_tank.mdl`, TankModel = { Default = `models/corona/table_tank.mdl`, Damage1 = `models/corona/table_tank.mdl`, Damage2 = `models/corona/table_tank.mdl`, Damage3 = `models/corona/table_tank.mdl`, LeftTrack = `models/bots/boss_bot/tankred_track_l.mdl`, RightTrack = `models/bots/boss_bot/tankred_track_r.mdl`, Bomb = `models/bots/boss_bot/bombblue_mechanism.mdl`, } DisableTracks = true, // Disable track models DisableBomb = true, // Disable bomb model // Called when the tank is spawned OnSpawn = function(tank, name) { } }) // Set custom wave icons inside this function PopExt.SetWaveIconsFunction(function() { // Use custom icon for a tank, first remove the regular tank icon PopExt.SetWaveIconSpawnCount(`tank`, MVM_CLASS_FLAG_MINIBOSS | MVM_CLASS_FLAG_NORMAL, 0) // Add our custom tank icon PopExt.SetWaveIconSpawnCount(`table`, MVM_CLASS_FLAG_MINIBOSS | MVM_CLASS_FLAG_NORMAL, 1) }) // Add event hooks for tanks with specified Name PopExt.AddTankName(`tankboss`, { OnDeath = function(tank, params) { // Decrement custom tank icon when killed PopExt.DecrementWaveIconSpawnCount(`table`, MVM_CLASS_FLAG_MINIBOSS | MVM_CLASS_FLAG_NORMAL, 1) } })" } StartWaveOutput { Target wave_start_relay_3 Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } WaveSpawn { Name "stage1" Where spawnbot Where spawnbot_flanker TotalCount 30 MaxActive 10 SpawnCount 2 WaitBeforeStarting 20 WaitBetweenSpawns 4 TotalCurrency 50 Squad { TFBot { Class Medic WeaponRestrictions PrimaryOnly Skill Expert Name "Table" ClassIcon table } TFBot { Template T_TFBot_Medic_QuickUber WeaponRestrictions SecondaryOnly Skill Expert Name "Table" ClassIcon table } } } WaveSpawn { Name "stage1" Where spawnbot Where spawnbot_flanker TotalCount 20 MaxActive 20 SpawnCount 10 WaitBeforeStarting 28 WaitBetweenSpawns 8 TotalCurrency 50 RandomChoice { TFBot { Class Pyro Skill Expert WeaponRestrictions MeleeOnly Item "The Sharpened Volcano Fragment" Name "Table" ClassIcon table1 } TFBot { Class Pyro Skill Expert WeaponRestrictions MeleeOnly Item "The Sharpened Volcano Fragment" Name "Table" ClassIcon table1 Tag flanker } } } WaveSpawn { Name "stage2" WaitForAllDead "stage1" Where spawnbot Where spawnbot_flanker TotalCount 3 MaxActive 3 SpawnCount 3 WaitBeforeStarting 2 TotalCurrency 60 Squad { TFBot { Template T_TFBot_Giant_Pyro Attributes AlwaysFireWeapon Name "Table" ClassIcon table2 } TFBot { Template T_TFBot_Medic_QuickUber Name "Table" ClassIcon table Skill Expert } TFBot { Template T_TFBot_Medic_QuickUber Name "Table" ClassIcon table Skill Expert } } } WaveSpawn { Name "stage2" WaitForAllDead "stage1" Where spawnbot Where spawnbot_flanker TotalCount 10 MaxActive 10 SpawnCount 2 WaitBeforeStarting 8 WaitBetweenSpawns 5 TotalCurrency 40 TFBot { Template T_TFBot_Engineer_Sentry_Teleporter Name "Table" ClassIcon table3 Skill Expert } } WaveSpawn { Name "stage2" WaitForAllDead "stage1" Where spawnbot Where spawnbot_flanker TotalCount 20 MaxActive 15 SpawnCount 5 WaitBeforeStarting 13 WaitBetweenSpawns 6 TotalCurrency 40 TFBot { Template T_TFBot_Demo_Burst Name "Table" ClassIcon table4 Skill Expert Item "The Iron Bomber" ItemAttributes { ItemName "The Iron Bomber" "faster reload rate" 0.75 "fire rate bonus" 0.05 "projectile spread angle penalty" 3 "Projectile speed increased" 1.25 } } } WaveSpawn { Name "stage2" WaitForAllDead "stage1" Where spawnbot Where spawnbot_flanker TotalCount 4 MaxActive 4 SpawnCount 1 WaitBeforeStarting 30 WaitBetweenSpawns 1 TotalCurrency 20 TFBot { Template T_TFBot_Demoman_Samurai Name "Table" ClassIcon table5 Skill Expert } } WaveSpawn { Name "stage3" WaitForAllDead "stage2" Where spawnbot Where spawnbot_flanker TotalCount 30 MaxActive 15 SpawnCount 5 WaitBeforeStarting 3 WaitBetweenSpawns 3 TotalCurrency 30 TFBot { Template T_TFBot_Heavyweapons_Heavyweight_Champ Name "Table" ClassIcon table6 Skill Expert Attributes AlwaysCrit Tag flanker CharacterAttributes { "move speed bonus" 2 } } } WaveSpawn { Name "stage3" WaitForAllDead "stage2" Where spawnbot Where spawnbot_flanker TotalCount 20 MaxActive 15 SpawnCount 5 WaitBeforeStarting 7 WaitBetweenSpawns 3 TotalCurrency 20 TFBot { Class Sniper WeaponRestrictions SecondaryOnly Name "Table" ClassIcon table7 Skill Expert } } WaveSpawn { Name "stage3" WaitForAllDead "stage2" Where spawnbot Where spawnbot_flanker TotalCount 1 MaxActive 1 SpawnCount 1 WaitBeforeStarting 20 WaitBetweenSpawns 10 TotalCurrency 90 TFBot { Template T_TFBot_Heavyweapons_Heater Name "Table" ClassIcon table8 } } WaveSpawn { Name "stage4" WaitForAllDead "stage3" Where spawnbot Where spawnbot_flanker TotalCount 20 MaxActive 20 SpawnCount 6 WaitBeforeStarting 5 WaitBetweenSpawns 5 TotalCurrency 50 Squad { TFBot { Class Scout Name "Table" ClassIcon table9 WeaponRestrictions SecondaryOnly } TFBot { Class Scout Name "Table" ClassIcon table10 WeaponRestrictions SecondaryOnly Item "Mad Milk" ItemAttributes { ItemName "Mad Milk" "effect bar recharge rate increased" 0.5 "fire rate penalty" 4 } } } } WaveSpawn { Name "stage5" WaitForAllDead "stage4" Where spawnbot Where spawnbot_flanker TotalCount 2 MaxActive 20 SpawnCount 6 WaitBeforeStarting 5 WaitBetweenSpawns 5 Support 1 Squad { TFBot { Class Scout Name "Table" ClassIcon table11 WeaponRestrictions SecondaryOnly Tag flanker } TFBot { Class Scout Name "Table" ClassIcon table12 WeaponRestrictions SecondaryOnly Item "Mad Milk" Tag flanker ItemAttributes { ItemName "Mad Milk" "effect bar recharge rate increased" 0.5 "fire rate penalty" 4 } } } } WaveSpawn { Name "stage5" WaitForAllDead "stage4" Where spawnbot Where spawnbot_flanker TotalCount 2 MaxActive 2 SpawnCount 2 WaitBeforeStarting 1 TotalCurrency 50 TFBot { Template T_TFBot_Giant_Scout_Fast Name "Table" ClassIcon table13 } } } Wave { InitWaveOutput { Target wave_start_relay_4 Action runscriptcode param " ::rt<-function(){local s=self,a,n,o=s.GetOrigin(),r=s.GetAbsAngles(),k=r.Forward(),b=s.GetTeam(),c,d=1e9,e,p,h,x,y,g=360.0,q,m=g/2,z=atan2,f=57.3;for(;p=Entities.FindByClassname(p,`player`);){if(p&&p.GetTeam()!=b&&p.IsAlive()&&(e=p.GetCenter()-o,h=e.Norm(),h=0.866))c=p,d=h;}if(t&&!t.IsValid())t=0;if(c)t=c;if(t){n=@(t)t>m?t-g:(t< -m?t+g:t);a=@(t,v,s)(t=n(t%g),v=n(v%g),d=n(t-v),d>s?v+s:(d< -s?v-s:t));d = t.GetCenter()-o;d.Norm();if(!d.y&&!d.x){y=q;x=d.z>q?g-90:g/4;}else{y=z(d.y, d.x)*f;if(y