--[[----------------+ ENEMIES +------------------]]-- ENEMY_STUCK_RESOLVE_TIME = 60 ENEMY_STUCK_RESOLVE_TIME_NOSPAWNING = 60 ENEMY_MAX_COUNT_MULT = 1 ENEMY_BASE_COUNT = 15 ENEMY_BASE_MAXACTIVE_COUNT = 40 * ENEMY_MAX_COUNT_MULT -- used to be 60, now at 40 unless Swarms flex ENEMY_SUMMONED_COUNT = 0 ENEMY_BASE_HEALTH_SCALER = 1.06 -- was 1.2 pre dmg scaling, was 1.1. Now it's 1.05, ze flesh is veak! ENEMY_BASE_HEALTH_SCALER_PER_PLAYER = 0.025 -- was 0.025 ENEMY_BASE_DAMAGE_SCALER = 0.1 -- was 0.2 pre dmg scaling ENEMY_BASE_DAMAGE_SCALER_LOOP = 0.025 -- after each elite fight, testing 1.15 first, then 1.1. now it's 0.15, keep nerfing it, now it's 0.02. I'm going crazy, also now after each fight. bumped up to 0.025 ENEMY_BASE_DAMAGE_SCALER_PER_PLAYER = 0.025 -- after each elite fight, testing 0.025 first ENEMY_BASE_DAMAGE_SCALER_DROP_OFF = 0.35 -- lower = more is carried over, how much to drop enemy damage scale by when starting next loop ENEMY_BASE_DAMAGE_SCALER_RANGED_COEF = 0.75 ENEMY_MAX_DAMAGE_PER_LOOP = 1 ENEMY_MAX_COUNT_PER_SET = 1 ENEMY_BASE_COUNT_SCALER = 2.5 ENEMY_BASE_COUNT_DROP_OFF = 0.4 -- lower = more is carried over ENEMY_BASE_HEALTH = 25 ENEMY_BASE_CASH = 40 ENEMY_CURRENT_NUMBER_OF_GIANTS = 0 ENEMY_CURRENT_NUMBER_OF_MINIGIANTS = 0 ENEMY_BUILDER_MAX_SUMMONS = 12 ENEMY_BASE_KBRES_SCALER = 1.1 ENEMY_BASE_SPEED_SCALER = 0.05 -- After every elite fight ENEMY_BASE_SPEED_SCALER_MINIGIANT = 0.025 -- After every elite fight ENEMY_BASE_SPEED_SCALER_GIANT = 0.0125 -- After every elite fight ENEMY_DEFAULT_MAX_MINIGIANTS = 3 ENEMY_DEFAULT_MAX_GIANTS = 2 ENEMY_NEW_MINIGIANT_EVERY_X = 20 ENEMY_NEW_GIANT_EVERY_X = 40 ENEMY_VARIANT_MIN_WAVE = 8 DRONE_STATE_FOLLOW_OWNER = 0 DRONE_STATE_FOLLOW_ENEMY = 1 DRONE_STATE_HOVER = 2 DRONE_STATE_FOLLOW_WRANGLER = 3 DRONE_STATE_HOVER_IDLE = 4 DRONE_STATE_FOLLOW_ENEMY_GUIDED = 5 ATTR_REMOVE_ON_DEATH = 1 << 0 ATTR_AGGRESSIVE = 1 << 1 -- Push Behavior ATTR_IS_NPC = 1 << 2 ATTR_SUPPRESS_FIRE = 1 << 3 -- Don't shoot ATTR_DISABLE_DODGE = 1 << 4 -- Disable Dodge ATTR_BECOME_SPECTATOR_ON_DEATH = 1 << 5 -- Send to Spec instantly ATTR_QUOTA_MANANGED = 1 << 6 ATTR_RETAIN_BUILDINGS = 1 << 7 -- Keep buildings ATTR_SPAWN_WITH_FULL_CHARGE = 1 << 8 -- Spawn with full charge on meter items ATTR_ALWAYS_CRIT = 1 << 9 -- Always crit ATTR_IGNORE_ENEMIES = 1 << 10 ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD = 1 << 11 -- Fully reload first ATTR_PRIORITIZE_DEFENSE = 1 << 12 ATTR_ALWAYS_FIRE_WEAPON = 1 << 13 -- Always shoot ATTR_TELEPORT_TO_HINT = 1 << 14 -- Teleport to engie hint (dependent on bomb pos) ATTR_MINIBOSS = 1 << 15 -- Giant ATTR_USE_BOSS_HEALTH_BAR = 1 << 16 -- Healthbar ATTR_IGNORE_FLAG = 1 << 17 -- Ignore bomb ATTR_AUTO_JUMP = 1 << 18 -- Auto jump (Doesn't work on it's own) ATTR_AIR_CHARGE_ONLY = 1 << 19 -- Only charge in the air ATTR_PREFER_VACCINATOR_BULLETS = 1 << 20 -- Sets vacc to bullet ATTR_PREFER_VACCINATOR_BLAST = 1 << 21 -- Sets vacc to blast ATTR_PREFER_VACCINATOR_FIRE = 1 << 22 -- Sets vacc to fire ATTR_BULLET_IMMUNE = 1 << 23 -- Fully immune to bullets ATTR_BLAST_IMMUNE = 1 << 24 -- Fully immune to blast ATTR_FIRE_IMMUNE = 1 << 25 -- Fully immune to fire ATTR_PARACHUTE = 1 << 26 -- Use parachute when falling for a while ATTR_PROJECTILE_SHIELD = 1 << 27 -- Use proj shield WEPRST_ANY_WEAPON = 0 WEPRST_MELEE_ONLY = 1 WEPRST_PRIMARY_ONLY = 2 WEPRST_SECONDARY_ONLY = 4 AI_EASY = 0 AI_NORMAL = 1 AI_HARD = 2 AI_EXPERT = 3 ENEMY_TYPE_COMMON = 1 ENEMY_TYPE_MINIGIANT = 2 ENEMY_TYPE_GIANT = 3 ENEMY_TYPE_BOSS = 4 ENEMY_TYPE_CHANCE_MULT = { [ENEMY_TYPE_COMMON] = 1, [ENEMY_TYPE_MINIGIANT] = 1, [ENEMY_TYPE_GIANT] = 1, [ENEMY_TYPE_BOSS] = 0, } ENEMY_TYPE_CHANCE_SCALE_MULT = { [1] = { [ENEMY_TYPE_COMMON] = 1, [ENEMY_TYPE_MINIGIANT] = 0, [ENEMY_TYPE_GIANT] = 0, [ENEMY_TYPE_BOSS] = 1, }, [2] = { [ENEMY_TYPE_COMMON] = 1, [ENEMY_TYPE_MINIGIANT] = 0.75, [ENEMY_TYPE_GIANT] = 0, [ENEMY_TYPE_BOSS] = 1, }, [3] = { [ENEMY_TYPE_COMMON] = 1, [ENEMY_TYPE_MINIGIANT] = 1.5, [ENEMY_TYPE_GIANT] = 1, [ENEMY_TYPE_BOSS] = 1, }, [4] = { [ENEMY_TYPE_COMMON] = 1, [ENEMY_TYPE_MINIGIANT] = 2.25, [ENEMY_TYPE_GIANT] = 2, [ENEMY_TYPE_BOSS] = 1, }, [5] = { [ENEMY_TYPE_COMMON] = 1, [ENEMY_TYPE_MINIGIANT] = 3, [ENEMY_TYPE_GIANT] = 3, [ENEMY_TYPE_BOSS] = 1, }, [6] = { [ENEMY_TYPE_COMMON] = 0, [ENEMY_TYPE_MINIGIANT] = 0, [ENEMY_TYPE_GIANT] = 0, [ENEMY_TYPE_BOSS] = 1, }, [7] = { [ENEMY_TYPE_COMMON] = 1, [ENEMY_TYPE_MINIGIANT] = 1, [ENEMY_TYPE_GIANT] = 1, [ENEMY_TYPE_BOSS] = 1, }, [0] = { [ENEMY_TYPE_COMMON] = 1, [ENEMY_TYPE_MINIGIANT] = 1, [ENEMY_TYPE_GIANT] = 1, [ENEMY_TYPE_BOSS] = 1, }, } ENEMY_MODEL_TABLE = { [0] = { -- COMMONS [TF_CLASS_DEMOMAN] = "models/bots/demo/bot_demo.mdl", [TF_CLASS_CIVILIAN] = "models/bots/engineer/bot_engineer.mdl", [TF_CLASS_ENGINEER] = "models/bots/engineer/bot_engineer.mdl", [TF_CLASS_HEAVYWEAPONS] = "models/bots/heavy/bot_heavy.mdl", [TF_CLASS_MEDIC] = "models/bots/medic/bot_medic.mdl", [TF_CLASS_PYRO] = "models/bots/pyro/bot_pyro.mdl", [TF_CLASS_SCOUT] = "models/bots/scout/bot_scout.mdl", [TF_CLASS_SNIPER] = "models/bots/sniper/bot_sniper.mdl", [TF_CLASS_SOLDIER] = "models/bots/soldier/bot_soldier.mdl", [TF_CLASS_SPY] = "models/bots/spy/bot_spy.mdl", }, [1] = { -- GIANTS [TF_CLASS_DEMOMAN] = "models/bots/demo_boss/bot_demo_boss.mdl", [TF_CLASS_CIVILIAN] = "models/bots/engineer/bot_engineer.mdl", [TF_CLASS_ENGINEER] = "models/bots/engineer/bot_engineer.mdl", [TF_CLASS_HEAVYWEAPONS] = "models/bots/heavy_boss/bot_heavy_boss.mdl", [TF_CLASS_MEDIC] = "models/bots/medic/bot_medic.mdl", [TF_CLASS_PYRO] = "models/bots/pyro_boss/bot_pyro_boss.mdl", [TF_CLASS_SCOUT] = "models/bots/scout_boss/bot_scout_boss.mdl", [TF_CLASS_SNIPER] = "models/bots/sniper/bot_sniper.mdl", [TF_CLASS_SOLDIER] = "models/bots/soldier_boss/bot_soldier_boss.mdl", [TF_CLASS_SPY] = "models/bots/spy/bot_spy.mdl", } } ENEMY_TEMPLATES = { -- The true giga table ["T_TFBot_Enemy_Basic"] = { Weight = 1, Name = "Basic", Type = ENEMY_TYPE_COMMON, WeaponRestrictions = WEPRST_MELEE_ONLY, Skill = AI_EXPERT, Class = "Scout", Action = "Mobber", Health = ENEMY_BASE_HEALTH, DefaultSlot = LOADOUT_POSITION_MELEE, Attributes = { ATTR_DISABLE_DODGE , ATTR_IGNORE_FLAG }, Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed penalty"] = 0.75 }, Scale = 1, BaseCashMult = 1, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 1, }, { Append_Name = "Marking ", Items = {"The Fan O'War"}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 0.6, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.5, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Blocker"] = { Weight = 0.65, Name = "Blocker", Type = ENEMY_TYPE_COMMON, WeaponRestrictions = WEPRST_MELEE_ONLY, Skill = AI_EXPERT, Class = "Scout", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 2, DefaultSlot = LOADOUT_POSITION_MELEE, Attributes = { ATTR_IGNORE_FLAG }, Items = { "TF_WEAPON_FISTS" }, ItemAttributes = {}, CharacterAttributes = { ["move speed penalty"] = 0.575 }, Scale = 1, BaseCashMult = 1, AddConds = {}, VisionRange = -1, OverrideModel = "models/bots/heavy/bot_heavy.mdl", LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Punchie ", Items = {"The Killing Gloves of Boxing"}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.5, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Knight"] = { Weight = 0.25, Name = "Knight", Type = ENEMY_TYPE_COMMON, WeaponRestrictions = WEPRST_MELEE_ONLY, Skill = AI_EXPERT, Class = "Demoman", Action = "Mobber", Health = ENEMY_BASE_HEALTH, DefaultSlot = LOADOUT_POSITION_MELEE, Attributes = {ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE}, Items = { "Ali Baba's Wee Booties", "The Chargin' Targe", "The Half-Zatoichi" }, ItemAttributes = {}, CharacterAttributes = {}, Scale = 1, BaseCashMult = 1, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5, ["mult charging move speed"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Charging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["charge recharge rate increased"] = 2, ["charge time increased"] = 0.5 }, AddConds = { TF_COND_SHIELD_CHARGE }, Weight = 0.75, }, { Append_Name = "Enraged ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["fire rate bonus"] = 0.8, ["always crit"] = 1 }, AddConds = { TF_COND_CRITBOOSTED }, Weight = 0.5, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 1, }, { Append_Name = "Caber", Items = { "The Ullapool Caber" }, ItemAttributes = { [2] = { ["regenerate stickbomb"] = 1 } }, CharacterAttributes = {}, AddConds = {}, Weight = 0.6, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.5, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Medic"] = { Weight = 0.1, Name = "Uber Medic", Type = ENEMY_TYPE_COMMON, WeaponRestrictions = WEPRST_SECONDARY_ONLY, Skill = AI_EXPERT, Class = "Medic", Action = "Medic", Health = ENEMY_BASE_HEALTH * 2.4, DefaultSlot = LOADOUT_POSITION_SECONDARY, Attributes = { ATTR_IGNORE_FLAG, ATTR_DISABLE_DODGE , ATTR_SPAWN_WITH_FULL_CHARGE}, Items = { "tf_weapon_syringegun_medic", "tf_weapon_medigun" }, ItemAttributes = {}, CharacterAttributes = { ["ubercharge rate bonus"] = 5, ["heal rate bonus"] = 0.1, ["uber duration bonus"] = -3}, Scale = 1, BaseCashMult = 1, AddConds = {}, VisionRange = -1, LogicFunc = function( botSpawn, data ) -- Passes botSpawn, data local alivebots = #ents.GetAllAliveNonMedicBots() local switched if switched == nil then switched = false end if alivebots <= 0 then if switched == false then botSpawn:BotCommand( "switch_action Mobber" ) botSpawn:AcceptInput("$BotCommand","switch_action Mobber") botSpawn:RunScriptCode( "activator.ClearAllWeaponRestrictions()", botSpawn, botSpawn ) botSpawn:WeaponStripSlot( 1 ) botSpawn:SetActivePlayerWeapon( botSpawn:GetPlayerItemBySlot( 0 ) ) timer.Simple( 0.5, function() switched = false end) end end if string.match( botSpawn.m_szNetname, "AoE Healing" ) then for _, bots in pairs( ents.FindInSphere( botSpawn:GetAbsOrigin(), 350, "player" ) ) do if bots:IsBot() and bots ~= botSpawn then bots:AddCond( TF_COND_RADIUSHEAL, 0.15, botSpawn ) bots:AddHealth( math.max( ( bots.MaxHealth or 25 * GetEnemyHealthMult() ) * 0.01, 10 ), false ) end end end end, SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 0.5, }, { Append_Name = "Bigheal ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["ubercharge rate bonus"] = 0.1, ["heal rate bonus"] = 10 }, AddConds = {}, Weight = 1, }, { Append_Name = "Kritz ", Items = {}, ItemAttributes = {}, CharacterAttributes = {["ubercharge rate bonus"] = 100, ["uber duration bonus"] = 10000, ["effect cond override"] = 34, ["bot medic uber health threshold"] = SIGNED_INT_LIMIT }, AddConds = {}, Weight = 1, }, { Append_Name = "AoE Healing ", Items = {}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 0.85, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.5, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Shotgunner"] = { Weight = 0.075, Name = "Shotgunner", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_SECONDARY_ONLY, Skill = AI_EXPERT, Class = "Heavyweapons", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 5, DefaultSlot = LOADOUT_POSITION_SECONDARY, Attributes = { ATTR_IGNORE_FLAG , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD , ATTR_DISABLE_DODGE}, Items = { "TF_WEAPON_SHOTGUN_HWG" }, ItemAttributes = { [1] = { ["Fire rate penalty"] = 2, ["Damage bonus"] = 1.25, ["Spread Penalty"] = 1.5, } }, CharacterAttributes = { ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 }, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = 350, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [1] = { ["Fire rate bonus"] = 0.5, ["reload time increased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.8, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Grenadier"] = { Weight = 0.05, Name = "Grenader", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, Skill = AI_EXPERT, Class = "Demoman", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 4, DefaultSlot = LOADOUT_POSITION_PRIMARY, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE}, Items = {"Magnum Opus"}, ItemAttributes = {}, CharacterAttributes = { ["fire rate penalty"] = 2, ["reload time increased"] = 1.5, ["projectile speed increased hidden"] = 0.67, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 }, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["Fire rate bonus"] = 0.5, ["reload time increased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.8, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Baseballer"] = { Weight = 0.075, Name = "Baseballer", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_MELEE_ONLY, DefaultSlot = LOADOUT_POSITION_MELEE, Skill = AI_EXPERT, Class = "Scout", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 4, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE}, Items = {"The Sandman", "Batter's Helmet", "Batter's Bracers"}, ItemAttributes = { [2] = { ["effect bar recharge rate increased"] = 0.15, } }, CharacterAttributes = { ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 }, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Major League ", Items = {}, ItemAttributes = { [2] = { ["effect bar recharge rate increased"] = 0.05, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Ornament ", Items = { "The Wrap Assassin" }, ItemAttributes = { [2] = { ["effect bar recharge rate increased"] = 0.25, } }, CharacterAttributes = {}, AddConds = {}, Weight = 0.85, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Launcher"] = { Weight = 0.05, Name = "Launcher", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 6, Attributes = { ATTR_IGNORE_FLAG , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD , ATTR_DISABLE_DODGE}, Items = {"Tyrantium Helmet"}, ItemAttributes = { [0] = { ["fire rate penalty"] = 3, -- ["damage bonus"] = 1.25, ["ignores other projectiles"] = 1, ["mult projectile count"] = 3, ["projectile speed decreased"] = 0.65, ["blast radius increased"] = 1.2, ["spread angle pattern"] = "0 15 0|0 0 0|0 -15 0", ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 } }, CharacterAttributes = { ["blast dmg to self increased"] = 0 }, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["Fire rate bonus"] = 0.5, ["reload time increased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Homing ", Items = {}, ItemAttributes = { [0] = { ["projectile speed decreased"] = 0.25, ["mod projectile heat seek power"] = 90, ["mod projectile heat aim error"] = 90, ["mod projectile heat aim time"] = 6, ["mod projectile heat no predict target speed"] = 1, ["mod projectile heat aim start time"] = 1, ["projectile trail particle"] = "eyeboss_projectile", } }, CharacterAttributes = {}, AddConds = {}, Weight = 0.75, }, { Append_Name = "Accelerating ", Items = {}, ItemAttributes = { [0] = { ["projectile speed decreased"] = 0.1, ["projectile acceleration"] = 2200, ["projectile acceleration time"] = 0.75, ["projectile acceleration start time"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 0.75, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.8, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Buffer"] = { Weight = 0.06, Name = "Buffer", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_MELEE_ONLY, DefaultSlot = LOADOUT_POSITION_SECONDARY, UseMeleeScaling = true, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 4, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLED_DODGE}, Items = {"The Buff Banner", "TF_WEAPON_SHOVEL"}, ItemAttributes = {}, CharacterAttributes = { ["increase buff duration"] = 10, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 }, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = function( botSpawn, data ) local self = botSpawn local cond = TF_COND_OFFENSEBUFF local radius = 450 * 1.5 if string.match( self.m_szNetname, "Conch" ) then cond = TF_COND_REGENONDAMAGEBUFF elseif string.match( self.m_szNetname, "Battalion" ) then cond = TF_COND_DEFENSEBUFF end for _, player in pairs( ents.FindInSphere( self:GetAbsOrigin(), radius, "player" ) ) do if IsValid( player ) and player:IsAlive() and ( player:GetTeam() == self:GetTeam() ) then player:AddCond( cond, 0.2 ) end end end, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) local self = botSpawn local snd = "Weapon_BuffBanner.HornBlue" if string.match( self.m_szNetname, "Conch" ) then snd = "Samurai.Conch" elseif string.match( self.m_szNetname, "Battalion" ) then snd = "Weapon_BattalionsBackup.HornBlue" end self:PlaySound( snd ) end, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, { Append_Name = "Conch ", Items = {"The Concheror"}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Battalion ", Items = {"The Battalion's Backup"}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Enemy_Stomper"] = { Weight = 0.065, Name = "Stomper", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_MELEE_ONLY, DefaultSlot = LOADOUT_POSITION_MELEE, Skill = AI_EXPERT, Class = "Pyro", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 5, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_AUTO_JUMP}, Items = { "The Mantreads" }, ItemAttributes = { [2] = { ["no_attack"] = 1 }, }, CharacterAttributes = { ["kb fall min velocity"] = 600, ["kb fall radius"] = 300, ["kb fall stun time"] = -5, ["kb fall force"] = 400, ["kb fall damage"] = 25, ["increased jump height"] = 5, ["cancel falling damage"] = 1, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 }, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) botSpawn:AcceptInput( "RunScriptCode", "activator.SetAutoJump( 4, 4 )", botSpawn, botSpawn ) end, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, { Append_Name = "Stun ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["kb fall stun time"] = 3, }, CharacterAttributes = {}, AddConds = {}, Weight = 0.75, }, { Append_Name = "Enraged ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["kb fall damage"] = 75, ["always crit"] = 1 }, CharacterAttributes = {}, AddConds = { TF_COND_CRITBOOSTED }, Weight = 1, }, }, }, ["T_TFBot_Enemy_Flamer"] = { Weight = 0.06, Name = "Flamer", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, UseMeleeScaling = true, Skill = AI_EXPERT, Class = "Pyro", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 6, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_ALWAYS_FIRE_WEAPON}, Items = {}, ItemAttributes = {[0] = { ["damage bonus"] = 2, ["flame_drag"] = 10, }}, CharacterAttributes = {["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6, ["move speed penalty"] = 0.85}, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.275 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Cannoneer"] = { Weight = 0.06, Name = "Cannoneer", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Demoman", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 6, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD}, Items = {"TF_WEAPON_GRENADELAUNCHER", "Treasure Hat 1", "The Bearded Bombardier"}, ItemAttributes = {[0] = { ["Projectile speed increased"] = 1.25, ["grenade launcher mortar mode"] = nil, ["damage blast push"] = 25, ["override projectile type"] = 17, ["grenade not explode on impact"] = 1, ["cannonball push back"] = 1, ["fire rate penalty"] = 2, ["projectile lifetime"] = 0.9, ["custom item model"] = "models/workshop/weapons/c_models/c_demo_cannon/c_demo_cannon.mdl", }}, CharacterAttributes = {["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6}, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) timer.Simple( 1, function() botSpawn:GetPlayerItemBySlot(1):SetAttributeValue( "custom item model", "models/workshop/weapons/c_models/c_demo_cannon/c_demo_cannon.mdl" ) end) end, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.5, ["reload time increased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.8, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Protector"] = { Weight = 0.05, Name = "Protector", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_SECONDARY_ONLY, DefaultSlot = LOADOUT_POSITION_SECONDARY, Skill = AI_EXPERT, Class = "Medic", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 7, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLED_DODGE}, Items = {"Jarate"}, ItemAttributes = {[1] = { ["custom item model"] = "models/workshop/weapons/c_models/c_quadball/c_quadball_grenade.mdl", ["custom projectile model"] = "models/workshop/weapons/c_models/c_quadball/c_quadball_grenade.mdl", ["override projectile type"] = 3, ["effect bar recharge rate increased"] = 0.375, ["effect cond override"] = 12, ["explosion particle"] = "ExplosionCore_sapperdestroyed", ["explosion particle on direct hit"] = "ExplosionCore_sapperdestroyed", ["Projectile speed increased"] = 1.5, ["fire input on attack"] = "popscript^$ProptectorGrenade^", }}, CharacterAttributes = {["use original class player animations"] = 1, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6}, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) timer.Simple( 1, function() botSpawn:GetPlayerItemBySlot(1):SetAttributeValue( "custom item model", "models/workshop/weapons/c_models/c_quadball/c_quadball_grenade.mdl" ) botSpawn:SetAttributeValue( "use original class player animations", 1 ) end) end, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [1] = { ["effect bar recharge rate increased"] = 0.1875, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Sniper"] = { Weight = 0.04, Name = "Sniper", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Sniper", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 3, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_ALWAYS_FIRE_WEAPON}, Items = {"TF_WEAPON_SNIPERRIFLE", "Preventative Measure", "The Aimframe"}, ItemAttributes = {[0] = { ["custom projectile model"] = "models/weapons/w_models/w_rocketbullet.mdl", ["override projectile type"] = 2, ["projectile trail particle"] = "~drg_bison_projectile", -- ["Projectile speed increased"] = 2.72, ["Projectile speed increased"] = 2.27, ["projectile radius damage"] = 60, ["projectile radius damage time"] = 0.015, ["projectile radius damage radius"] = 40, ["projectile radius damage hit limit"] = 1, ["projectile radius knockback radius"] = 40, ["projectile radius knockback"] = 500, ["projectile radius knockback hit limit"] = 1, ["projectile radius knockback time"] = 0.015, ["custom projectile size"] = 2, ["blast radius decreased"] = 0, ["explosion particle"] = "sapper_flyingembers", ["explosion particle on direct hit"] = "sapper_flyingembers", ["projectile lifetime"] = 3, ["fire rate penalty"] = 2, ["gesture speed increase"] = 0.5, ["mod projectile heat seek power"] = 69420, ["mod projectile heat aim error"] = 30, ["mod projectile heat aim time"] = 0.05, ["mod projectile heat no predict target speed"] = 0, ["custom kill icon"] = "sniperrifle", ["add attributes on hit"] = "cancel falling damage|1|0.5", }}, CharacterAttributes = {["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6}, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = function( botSpawn, data) botSpawn:AddCond( TF_COND_ZOOMED ) end, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) timer.Simple( 2.1, function() LaserOnAim( botSpawn, botSpawn ) end) end, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 0.85, }, { Append_Name = "Triple Tap ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.05, ["burst fire count"] = 3, ["burst fire rate mult"] = 40, ["custom item model"] = "models/workshop/weapons/c_models/c_chimera/c_pro_rifle.mdl", ["Projectile speed increased"] = 1.81, } }, CharacterAttributes = {}, AddConds = {}, Weight = 0.5, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.6, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 1, }, }, }, ["T_TFBot_Enemy_Harpooner"] = { Weight = 0.05, Name = "Harpooner", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Sniper", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 3, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLED_DODGE}, Items = {"The Fortified Compound", "The Lone Star", "The Birdman of Australiacatraz"}, ItemAttributes = {[0] = { ["projectile trail particle"] = "raygun_projectile_blue_crit_trail", ["override projectile type"] = 26, ["Projectile speed increased"] = 1, ["mult grappling hook speed"] = 0, ["projectile radius damage"] = 0.1, ["projectile radius damage time"] = 0, ["projectile radius damage radius"] = 50, ["apply look velocity on damage"] = -200, ["apply z velocity on damage"] = -300, ["add attributes on hit"] = "cancel falling damage|1|0.1|no_jump|1|0.1", ["projectile detonate time"] = 3, ["fire rate penalty"] = 3, ["gesture speed increase"] = 0.5, ["mod projectile heat seek power"] = 69420, ["mod projectile heat aim error"] = 15, ["mod projectile heat aim time"] = 0.05, ["mod projectile heat no predict target speed"] = 0, }}, CharacterAttributes = {["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6}, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Snaring-", Items = {}, ItemAttributes = { [0] = { ["stun on hit"] = 5, ["stun on hit type"] = "movement", ["stun on hit slow"] = 0.85, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Spooking-", Items = {}, ItemAttributes = { [0] = { ["stun on hit"] = 0.5, ["stun on hit type"] = "ghost", ["stun on hit slow"] = 0, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Energy_Wave"] = { Weight = 0.06, Name = "High Energy Wave", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_SECONDARY_ONLY, DefaultSlot = LOADOUT_POSITION_SECONDARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 6, Attributes = { ATTR_IGNORE_FLAG , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD , ATTR_DISABLE_DODGE}, Items = {"The Righteous Bison"}, ItemAttributes = { [1] = { ["fire rate bonus"] = 0.1, ["no damage falloff"] = 1, ["hold fire until full reload"] = 1, ["clip size bonus upgrade"] = 2.5, ["reload time decreased"] = 1.5, ["spread offset pattern"] = "0 -32 0|0 -16 0|0 0 0|0 16 0|0 32 0", ["dmg penalty vs players"] = 0.5, ["projectile speed increased"] = 0.5, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 } }, CharacterAttributes = {}, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["Fire rate bonus"] = 0.5, ["reload time increased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.8, }, { Append_Name = "Beaming ", Items = {}, ItemAttributes = { [1] = { ["fire rate bonus"] = 0.1, ["no damage falloff"] = 1, ["hold fire until full reload"] = 1, ["clip size bonus upgrade"] = 2.5, ["reload time decreased"] = 1.5, ["spread offset pattern"] = nil, ["dmg penalty vs players"] = 0.6, ["projectile speed increased"] = 0.5, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Enemy_Tank"] = { Weight = 0.075, Name = "Tank", Type = ENEMY_TYPE_MINIGIANT, WeaponRestrictions = WEPRST_MELEE_ONLY, DefaultSlot = LOADOUT_POSITION_MELEE, Skill = AI_EXPERT, Class = "Heavyweapons", Action = "Mobber", Health = ENEMY_BASE_HEALTH * 8, Attributes = { ATTR_IGNORE_FLAG , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD , ATTR_DISABLE_DODGE}, Items = {"Fists of Steel"}, ItemAttributes = {}, CharacterAttributes = {}, -- CharacterAttributes = { ["move speed penalty"] = 0.8}, Scale = 1.5, BaseCashMult = 1.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["Fire rate bonus"] = 0.5, ["reload time increased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.8, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.85, }, }, }, ["T_TFBot_Giant_Enemy_Flak"] = { Weight = 0.01, Name = "Giant Flak Cannon", Type = ENEMY_TYPE_GIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Heavyweapons", Action = "Mobber", Tags = { "bot_giant" }, Health = ENEMY_BASE_HEALTH * 20, -- 500 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_ALWAYS_FIRE_WEAPON}, Items = {"TF_WEAPON_MINIGUN", "Air Exchanger", "Pyro Helm"}, ItemAttributes = {[0] = { ["custom item model"] = "models/weapons/c_models/c_baikal_boar/c_baikal_boar.mdl", -- ["projectile trail particle"] = "~tranq_distortion_trail", ["override projectile type"] = 2, ["Projectile speed increased"] = 2.5, ["projectile detonate time"] = 0.218, ["proximity bomb"] = 1, ["mult projectile count"] = 2, ["ignores other projectiles"] = 1, ["weapon always gib"] = 1, ["projectile spread angle penalty"] = 12.5, ["explosion particle"] = "ExplosionCore_MidAir", ["explosion particle on direct hit"] = "ExplosionCore_MidAir", ["mod mini-crit airborne"] = 1, -- ["damage penalty"] = 0.75, ["damage bonus"] = 1.5, ["minigun full movement"] = 1, }}, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0.1, ["airblast vulnerability multiplier"] = 0.1, ["override footstep sound set"] = 2}, Scale = 1.75, BaseCashMult = 2.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_Orb"] = { Weight = 0.015, Name = "Giant Orb Caster", Type = ENEMY_TYPE_GIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Scout", Action = "Mobber", Tags = { "bot_giant" }, Health = ENEMY_BASE_HEALTH * 15, -- 375 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS}, Items = {"Orb Caster", "The Cross-Comm Crash Helmet"}, ItemAttributes = {[0]={["damage bonus"] = 2, ["reload time increased"] = 2}}, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0.1, ["airblast vulnerability multiplier"] = 0.1, ["override footstep sound set"] = 5}, Scale = 1.75, BaseCashMult = 2.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_Burst"] = { Weight = 0.0125, Name = "Giant Burst Fire Soldier", Type = ENEMY_TYPE_GIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Tags = { "bot_giant" }, Health = ENEMY_BASE_HEALTH * 16, -- 400 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD}, Items = {"tf_weapon_rocketlauncer", "The Conquistador"}, ItemAttributes = {[0] = { ["faster reload rate"] = 0.4, ["fire rate bonus"] = 0.1, ["clip size upgrade atomic"] = 6, ["Projectile speed increased"] = 0.65, ["mod projectile heat seek power"] = 69420, ["mod projectile heat aim error"] = 15, ["mod projectile heat aim time"] = 0.05, ["mod projectile heat no predict target speed"] = 0, }}, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0.1, ["airblast vulnerability multiplier"] = 0.1, ["override footstep sound set"] = 3}, Scale = 1.75, BaseCashMult = 2.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.5, ["reload time decreased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Enraged ", Items = {}, ItemAttributes = {}, CharacterAttributes = {["always crit"] = 1}, AddConds = { TF_COND_CRITBOOSTED }, Weight = 1, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.8, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_FlarePunch"] = { Weight = 0.015, Name = "Giant Flare Punch Pyro", Type = ENEMY_TYPE_GIANT, WeaponRestrictions = WEPRST_SECONDARY_ONLY, UseMeleeScaling = true, DefaultSlot = LOADOUT_POSITION_SECONDARY, Skill = AI_EXPERT, Class = "Pyro", Action = "Mobber", Tags = { "bot_giant" }, Health = ENEMY_BASE_HEALTH * 20, -- 500 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_ALWAYS_FIRE_WEAPON}, Items = {"TF_WEAPON_FLAMETHROWER", "TF_WEAPON_SHOTGUN_PYRO", "Dead Heat", "Bushi-Dou"}, ItemAttributes = {[0] = { ["damage bonus"] = 3, ["flame_drag"] = 4, ["is_passive_weapon"] = 1, },[1] = { ["crit vs burning players"] = 1, ["damage bonus"] = 3, ["fire rate bonus"] = 0.1, ["override projectile type"] = 6, ["mult projectile count"] = 3, ["projectile spread angle penalty"] = 4, ["remove damage type"] = 16777216, ["projectile speed decreased"] = 0.1, ["projectile acceleration"] = 1800, ["projectile acceleration time"] = 1, ["hold fire until full reload"] = 2, }}, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0.1, ["airblast vulnerability multiplier"] = 0.1, ["override footstep sound set"] = 6}, Scale = 1.75, BaseCashMult = 2.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [1] = { ["fire rate bonus"] = 0.5, ["reload time decreased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Scorching ", Items = {}, ItemAttributes = {[1] = { ["crits_become_minicrits"] = 1, ["mod flaregun fires pellets with knockback"] = 3, }}, CharacterAttributes = {}, AddConds = {}, Weight = 0.9, }, { Append_Name = "Damaging ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg penalty vs players"] = 1.5 }, AddConds = {}, Weight = 0.8, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_Rammer"] = { Weight = 0.015, Name = "Giant Rammer Demoman", Type = ENEMY_TYPE_GIANT, WeaponRestrictions = WEPRST_MELEE_ONLY, DefaultSlot = LOADOUT_POSITION_MELEE, Skill = AI_EXPERT, Class = "Demoman", Action = "Mobber", Tags = { "bot_giant" }, Health = ENEMY_BASE_HEALTH * 25, -- 625 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS}, Items = {"Ali Baba's Wee Booties", "The Splendid Screen", "War Head", "Bone-Cut Belt", "Road Rage"}, ItemAttributes = {[1] = { ["Attack not cancel charge"] = 1, ["item style override"] = 1 },[2] = { ["fire rate penalty"] = 69420, ["damage penalty"] = 0 }}, CharacterAttributes = { ["is miniboss"] = 1, ["Attack not cancel charge"] = 1, ["charge time increased"] = 0.5, ["charge impact damage increased"] = 2, ["charge recharge rate increased"] = 5, ["move speed bonus"] = 0.5, ["mult charging move speed"] = 1.5, ["mult stun resistance"] = 0, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0, ["override footstep sound set"] = 4, ["stomp building damage"] = 100, ["stomp player damage"] = 50, ["stomp player time"] = 0.1, ["stomp player force"] = 300, }, Scale = 1.75, BaseCashMult = 2.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75, ["mult charging move speed"] = 2.25 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = {}, CharacterAttributes = {["charge recharge rate increased"] = 69420}, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_Ranged_Repair"] = { Weight = 0.0125, Name = "Giant Ranged Repair", Type = ENEMY_TYPE_GIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Medic", Action = "Mobber", Tags = { "bot_giant" }, Health = ENEMY_BASE_HEALTH * 20, -- 500 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD}, Items = {"Festive Crusader's Crossbow", "The Crosslinker's Coil", "Practitioner's Processing Mask", "Hazardous Environment Vest"}, ItemAttributes = {[0] = { ["faster reload rate"] = 0.2, ["clip size upgrade atomic"] = 14, ["dmg penalty vs players"] = 0.25, ["dmg penalty vs buildings"] = 0.25, ["fire rate bonus"] = 0.2, ["projectile penetration"] = 1, -- ["override projectile type"] = 8, -- ["allow friendly fire"] = 1, -- ["fire input on hit ally"] = "popscript^$HealAlly^", }}, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0.1, ["airblast vulnerability multiplier"] = 0.1}, Scale = 1.75, BaseCashMult = 2.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Summonable = true, -- Master Builder summons Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.5, ["reload time decreased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Healing ", Items = {}, ItemAttributes = { [0] = { ["damage bonus"] = 2.5, ["dmg penalty vs players"] = 0.1, ["dmg penalty vs buildings"] = 0.1, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_Explosive_Hunter"] = { Weight = 0.01, Name = "Giant Explosive Hunter", Type = ENEMY_TYPE_GIANT, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Sniper", Action = "Mobber", Tags = { "bot_giant" }, Health = ENEMY_BASE_HEALTH * 15, -- 375 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS}, Items = {"Festive Huntsman", "Fused Plates"}, ItemAttributes = {[0] = { ["fire input on attack"] = "popscript^$ExplosiveArrows^", ["faster reload rate"] = 2, ["gesture speed increase"] = 0.5, ["arrow hit kill time"] = 2.15, ["mult projectile count"] = 9, ["damage bonus"] = 1.25, ["spread angle pattern"] = "0 0 0|0 5 0|0 -5 0|0 10 0|0 -10 0|0 15 0|0 -15 0|0 20 0|0 -20 0", }}, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0.1, ["airblast vulnerability multiplier"] = 0.1}, Scale = 1.75, BaseCashMult = 2.5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.5, ["reload time decreased"] = 0.5, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_Constructor"] = { Weight = 0.01, Name = "Giant Drone Constructor", Type = ENEMY_TYPE_GIANT, WeaponRestrictions = WEPRST_MELEE_ONLY, DefaultSlot = LOADOUT_POSITION_MELEE, Skill = AI_EXPERT, Class = "Scout", Action = "Mobber", OverrideModel = "models/bots/engineer/bot_engineer.mdl", Tags = { "bot_giant" }, Health = ENEMY_BASE_HEALTH * 15, -- 375 base UseMeleeScaling = true, Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS}, Items = {"Lo-Fi Longwave", "Deadwave Communicator", "The Gunslinger", "The Wrangler"}, ItemAttributes = { [1] = { ["disable wrangler shield"] = 1, } }, CharacterAttributes = {["no_attack"] = 1,["is miniboss"] = 1, ["move speed bonus"] = 0.375, ["damage force reduction"] = 0.1, ["airblast vulnerability multiplier"] = 0.1, ["engy sentry damage bonus"] = 0.5, ["engy sentry radius increased"] = 0.5}, Scale = 1.75, BaseCashMult = 2.5, AddConds = {}, VisionRange = -1, LogicFunc = function( botSpawn, data) -- if not botSpawn.DroneBuildDelay then botSpawn.DroneBuildDelay = CurTime() + 1 end -- if not botSpawn.Drones then botSpawn.Drones = {} end local eye_ang = botSpawn:GetEyeAngles() if CurTime() >= botSpawn.DroneBuildDelay then botSpawn.DroneBuildDelay = CurTime() + 20 if ( botSpawn.DronesOnEnemies >= botSpawn.DroneMaxEach ) then goto next end local info = { TeamNum = 3, SolidToPlayer = 0, spawnflags = 8|64} local drone = ents.CreateWithKeys( "obj_sentrygun", info, true, true ) local offset = ( Vector( 96, 96, 0 ) * ( botSpawn:GetEyeAngles():Rotate( Vector( 90, 0, 0 ) ):ToAngles():GetForward() ) ) + Vector( 0, 0, 48 ) drone:SetAbsOrigin( botSpawn:GetAbsOrigin() + offset ) drone.m_flPercentageConstructed = 0 drone.m_bMiniBuilding = 1 drone.m_iState = 0 drone.m_bBuilding = 1 drone.m_hBuilder = botSpawn drone.m_hOwnerEntity = botSpawn drone:SetHealth( 50 * GetEnemyHealthMult() ) drone:SetModelOverride( "models/rcat/rcat_level2.mdl" ) drone:Skin( 1 ) Drone( DRONE_STATE_FOLLOW_WRANGLER, drone ) table.insert( botSpawn.Drones, drone ) botSpawn.DronesOnEnemies = botSpawn.DronesOnEnemies + 1 drone:AddCallback( ON_DEATH, function( ent ) botSpawn.DronesOnEnemies = botSpawn.DronesOnEnemies - 1 end) drone:AddCallback( ON_REMOVE, function( ent ) botSpawn.DronesOnEnemies = botSpawn.DronesOnEnemies - 1 end) if ( botSpawn.DronesOnEnemies >= botSpawn.DroneMaxEach ) then goto next end drone = ents.CreateWithKeys( "obj_sentrygun", info, true, true ) offset = ( Vector( -96, -96, 0 ) * ( botSpawn:GetEyeAngles():Rotate( Vector( 90, 0, 0 ) ):ToAngles():GetForward() ) ) + Vector( 0, 0, 48 ) drone:SetAbsOrigin( botSpawn:GetAbsOrigin() + offset ) drone.m_flPercentageConstructed = 0 drone.m_bMiniBuilding = 1 drone.m_iState = 0 drone.m_bBuilding = 1 drone.m_hBuilder = botSpawn drone.m_hOwnerEntity = botSpawn drone:SetHealth( 50 * GetEnemyHealthMult() ) drone:SetModelOverride( "models/rcat/rcat_level2.mdl" ) drone:Skin( 1 ) Drone( DRONE_STATE_FOLLOW_WRANGLER, drone ) table.insert( botSpawn.Drones, drone ) botSpawn.DronesOnEnemies = botSpawn.DronesOnEnemies + 1 drone:AddCallback( ON_DEATH, function( ent ) botSpawn.DronesOnEnemies = botSpawn.DronesOnEnemies - 1 end) drone:AddCallback( ON_REMOVE, function( ent ) botSpawn.DronesOnEnemies = botSpawn.DronesOnEnemies - 1 end) end ::next:: if ( botSpawn.DroneBuildDelay - CurTime() ) <= 4 then if ( botSpawn.DronesOnEnemies < botSpawn.DroneMaxEach ) then botSpawn.WarningDronePositive:SetAbsOrigin( botSpawn:GetAbsOrigin() + ( Vector( 96, 96, 0 ) * ( botSpawn:GetEyeAngles():Rotate( Vector( 90, 0, 0 ) ):ToAngles():GetForward() ) ) + Vector( 0, 0, 48 ) ) botSpawn.WarningDroneNegative:SetAbsOrigin( botSpawn:GetAbsOrigin() + ( Vector( -96, -96, 0 ) * ( botSpawn:GetEyeAngles():Rotate( Vector( 90, 0, 0 ) ):ToAngles():GetForward() ) ) + Vector( 0, 0, 48 ) ) botSpawn.WarningDronePositive:SetAbsAngles( Vector( 0, eye_ang[2], 0 ) ) botSpawn.WarningDroneNegative:SetAbsAngles( Vector( 0, eye_ang[2], 0 ) ) botSpawn.WarningDronePositive:Enable() botSpawn.WarningDroneNegative:Enable() else botSpawn.DroneBuildDelay = CurTime() + 4 end else botSpawn.WarningDronePositive:Disable() botSpawn.WarningDroneNegative:Disable() end for _, drone in pairs( botSpawn.Drones ) do if IsValid( drone ) and ( drone:GetTeam() == botSpawn:GetTeam() ) and ( drone:GetBuilder() == botSpawn ) then if drone.m_iHealth > (50*GetEnemyHealthMult()) then drone:SetHealth( 50 * GetEnemyHealthMult() ) end else table.remove( botSpawn.Drones, drone ) end end end, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) botSpawn.DroneBuildDelay = CurTime() + 3 botSpawn.SummonDelay = CurTime() + 5 botSpawn.Drones = {} botSpawn.DronesOnEnemies = 0 botSpawn.DroneMaxEach = 2 local info = { model = "models/buildables/sentry1_blueprint.mdl", modelscale = 0.75, solid = 0, DisableBoneFollowers = 1, DisableShadows = 1, } botSpawn.WarningDronePositive = ents.CreateWithKeys( "prop_dynamic", info, true, true ) botSpawn.WarningDroneNegative = ents.CreateWithKeys( "prop_dynamic", info, true, true ) botSpawn.WarningDronePositive:Disable() botSpawn.WarningDroneNegative:Disable() end, -- Passes botSpawn, data DeathFunc = function( botSpawn ) if IsValid( botSpawn.WarningDronePositive ) then botSpawn.WarningDronePositive:Remove() end if IsValid( botSpawn.WarningDroneNegative ) then botSpawn.WarningDroneNegative:Remove() end for _, drone in pairs( botSpawn.Drones ) do if IsValid( drone ) and ( drone:GetTeam() == botSpawn:GetTeam() ) and ( drone:GetBuilder() == botSpawn ) then drone.State = DRONE_STATE_HOVER_IDLE end end botSpawn.Drones = nil end, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_Corrupted_Launcher"] = { Weight = 1, Name = "Elite Corrupted Launcher", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 50, -- 1250 base Attributes = { ATTR_IGNORE_FLAG , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD , ATTR_DISABLE_DODGE , ATTR_MINIBOSS}, Items = {"Spine-Chilling Skull 2011 Style 3"}, ItemAttributes = { [0] = { ["fire rate penalty"] = 2, ["reload time increased"] = 1.33, -- ["damage bonus"] = 1.33, ["ignores other projectiles"] = 1, -- ["mult projectile count"] = 5, ["mult projectile count"] = 3, ["projectile speed decreased"] = 0.5, ["blast radius increased"] = 1.33, -- ["spread angle pattern"] = "0 7.5 0|0 0 0|0 -7.5 0|0 15 0|0 -15 0", ["spread angle pattern"] = "0 0 0|0 15 0|0 -15 0", ["projectile trail particle"] = "raygun_projectile_blue", ["explosion particle"] = "bombinomicon_burningdebris_halloween", ["explosion particle on direct hit"] = "bombinomicon_burningdebris_halloween", ["add attributes on hit"] = "dmg taken increased|1.5|5|healing received penalty|0.5|5|reduced_healing_from_medics|0.001337|5|move speed penalty|0.8|5|is suicide counter|0|5|hud overlay|yiresahud/antiheal|5", } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0,}, Scale = 2, BaseCashMult = 5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) for i=0, 10 do if IsValid( botSpawn:GetPlayerItemBySlot(i) ) then if botSpawn:GetPlayerItemBySlot(i):GetItemName() == "Spine-Chilling Skull 2011 Style 3" then botSpawn:GetPlayerItemBySlot(i):SetAttributeValue( "attach particle effect", 258 ) end end end end, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Barrage ", Items = {}, ItemAttributes = { [0] = { ["fire rate bonus"] = 0.25, ["mult projectile count"] = 1, ["clip size bonus"] = 3, ["reload time decreased"] = 0.2, ["projectile speed decreased"] = 0.35, ["spread angle pattern"] = nil } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Nuke ", Items = {}, ItemAttributes = { [0] = { ["blast radius increased"] = 2.5, ["mult projectile scale"] = 1.5, ["projectile speed decreased"] = 0.4, ["explosion particle"] = "skull_island_explosion", ["explosion particle on direct hit"] = "skull_island_explosion" } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Rapid-Fire ", Items = {}, ItemAttributes = { [0] = { ["mult projectile count"] = 1, ["fire rate bonus"] = 0.25, ["mod max primary clip override"] = -1, } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Plagued ", Items = {}, ItemAttributes = { [0] = { ["add attributes on hit"] = "healing received penalty|0.001337|5|hud overlay|yiresahud/antiheal|5", } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, }, }, ["T_TFBot_Giant_Enemy_Corrupted_Minigunner"] = { Weight = 0.85, Name = "Elite Corrupted Minigunner", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Heavyweapons", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 60, -- 1.5k base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS}, Items = {"Spine-Chilling Skull 2011 Style 3"}, ItemAttributes = { [0] = { ["custom projectile model"] = "models/weapons/w_models/w_rocketbullet.mdl", ["override projectile type"] = 2, ["Projectile speed increased"] = 1, ["projectile radius damage"] = 8, ["projectile radius damage time"] = 0, ["projectile radius damage radius"] = 36, ["projectile radius damage hit limit"] = 1, ["custom projectile size"] = 2, ["blast radius decreased"] = 0, ["explosion particle"] = "sapper_flyingembers", ["explosion particle on direct hit"] = "sapper_flyingembers", ["projectile lifetime"] = 3, ["minigun full movement"] = 1, ["projectile trail particle"] = "~raygun_projectile_blue", ["add attributes on hit"] = "dmg taken increased|1.5|2|healing received penalty|0.5|2|reduced_healing_from_medics|0.001337|2|move speed penalty|0.8|2|is suicide counter|0|2|hud overlay|yiresahud/antiheal|2", } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0}, Scale = 2, BaseCashMult = 5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) for i=0, 10 do if IsValid( botSpawn:GetPlayerItemBySlot(i) ) then if botSpawn:GetPlayerItemBySlot(i):GetItemName() == "Spine-Chilling Skull 2011 Style 3" then botSpawn:GetPlayerItemBySlot(i):SetAttributeValue( "attach particle effect", 258 ) end end end end, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedshot ", Items = {}, ItemAttributes = {[0] = { ["Projectile speed increased"] = 2, }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Enrage ", Items = {}, ItemAttributes = {[0] = { ["always crit"] = 1, ["projectile radius damage"] = 24, }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Plagued ", Items = {}, ItemAttributes = { [0] = { ["add attributes on hit"] = "healing received penalty|0.001337|5|hud overlay|yiresahud/antiheal|5", } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, }, }, ["T_TFBot_Giant_Enemy_Corrupted_Sniper"] = { Weight = 0.5, Name = "Elite Corrupted Sniper", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Sniper", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 35, -- 875 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_ALWAYS_FIRE_WEAPON}, Items = {"Spine-Chilling Skull 2011 Style 3"}, ItemAttributes = { [0] = { ["custom projectile model"] = "models/weapons/w_models/w_rocketbullet.mdl", ["override projectile type"] = 2, ["projectile trail particle"] = "~drg_bison_projectile", ["Projectile speed increased"] = 2.72, ["projectile radius damage"] = 75, ["projectile radius damage time"] = 0, ["projectile radius damage radius"] = 48, ["projectile radius damage hit limit"] = 1, ["projectile radius knockback radius"] = 48, ["projectile radius knockback"] = 1000, ["projectile radius knockback hit limit"] = 1, ["projectile radius knockback time"] = 0, ["custom projectile size"] = 2, ["blast radius decreased"] = 0, ["explosion particle"] = "sapper_flyingembers", ["explosion particle on direct hit"] = "sapper_flyingembers", ["projectile lifetime"] = 3, ["fire rate penalty"] = 3, ["gesture speed increase"] = 0.33, ["mod projectile heat seek power"] = 69420, ["mod projectile heat aim error"] = 30, ["mod projectile heat aim time"] = 0.05, ["mod projectile heat no predict target speed"] = 0, ["add cond when active"] = TF_COND_AIMING, ["add attributes on hit"] = "dmg taken increased|1.5|6|healing received penalty|0.5|6|reduced_healing_from_medics|0.001337|6|move speed penalty|0.8|6|is suicide counter|0|6|hud overlay|yiresahud/antiheal|6|cancel falling damage|1|0.5", } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0}, Scale = 2, BaseCashMult = 5, AddConds = {}, VisionRange = -1, LogicFunc = function( botSpawn, data) botSpawn:AddCond( TF_COND_ZOOMED ) end, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data ) for i=0, 10 do if IsValid( botSpawn:GetPlayerItemBySlot(i) ) then if botSpawn:GetPlayerItemBySlot(i):GetItemName() == "Spine-Chilling Skull 2011 Style 3" then botSpawn:GetPlayerItemBySlot(i):SetAttributeValue( "attach particle effect", 258 ) end end end timer.Simple( 2.1, function() LaserOnAim( botSpawn, botSpawn ) end) end, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Frenzied ", Items = {}, ItemAttributes = {[0] = { ["fire rate bonus"] = 0.5, ["gesture speed increase"] = 2, }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Plagued ", Items = {}, ItemAttributes = { [0] = { ["add attributes on hit"] = "healing received penalty|0.001337|5|hud overlay|yiresahud/antiheal|5|cancel falling damage|1|0.5", } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, }, }, ["T_TFBot_Giant_Enemy_Fire_Spreader"] = { Weight = 0.85, Name = "Elite Fire Spreader", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_SECONDARY_ONLY, DefaultSlot = LOADOUT_POSITION_SECONDARY, Skill = AI_EXPERT, Class = "Pyro", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 55, -- 1375 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS }, Items = {"The Flare Gun", "Hellscape", "Demonic Dome"}, ItemAttributes = { [1] = { ["burst fire count"] = 3, ["burst fire rate mult"] = 9, ["faster reload rate"] = 0.33, ["spread angle pattern"] = "0 10 0|0 0 0|0 -10 0", ["proj attribute pattern"] = "projectile speed increased|0.5&projectile speed increased|0.5&projectile speed increased|0.5&projectile speed increased|0.75&projectile speed increased|0.75&projectile speed increased|0.75&projectile speed increased|1.2&projectile speed increased|1.2&projectile speed increased|1.2", ["shoot pattern reset time"] = 1, ["crits_become_minicrits"] = 1, ["fire input on attack"] = "popscript^$MolotovExplode^", ["mult projectile count"] = 3, ["custom item model"] = "models/weapons/c_models/c_blaze_blast/c_blaze_blast.mdl", } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0}, Scale = 2, BaseCashMult = 5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Frenzied ", Items = {}, ItemAttributes = {[1] = { ["burst fire rate mult"] = 6, }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Scorching ", Items = { "The Scorch Shot" }, ItemAttributes = { [1] = { ["burst fire count"] = 3, ["burst fire rate mult"] = 9, ["faster reload rate"] = 0.33, ["spread angle pattern"] = "0 10 0|0 0 0|0 -10 0", ["proj attribute pattern"] = "projectile speed increased|0.5&projectile speed increased|0.5&projectile speed increased|0.5&projectile speed increased|0.75&projectile speed increased|0.75&projectile speed increased|0.75&projectile speed increased|1.2&projectile speed increased|1.2&projectile speed increased|1.2", ["shoot pattern reset time"] = 1, ["fire input on attack"] = "popscript^$MolotovExplode^", ["mult projectile count"] = 3, ["custom item model"] = "models/weapons/c_models/c_blaze_blast/c_blaze_blast.mdl", } }, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Inverted ", Items = {}, ItemAttributes = {[1] = { ["proj attribute pattern"] = "projectile speed increased|1.2&projectile speed increased|1.2&projectile speed increased|1.2&projectile speed increased|0.75&projectile speed increased|0.75&projectile speed increased|0.75&projectile speed increased|0.5&projectile speed increased|0.5&projectile speed increased|0.5", }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen } }, }, ["T_TFBot_Giant_Enemy_Rocket_Artillery"] = { Weight = 1, Name = "Elite Rocket Artillery", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 50, -- 1250 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD , ATTR_ALWAYS_FIRE_WEAPON }, Items = {"Armored Authority", "Soldier's Sparkplug", "Fancy Dress Uniform"}, ItemAttributes = { [0] = { ["clip size upgrade atomic"] = 46, ["fire rate bonus"] = 0.1, ["faster reload rate"] = 0.2, ["spread angle pattern"] = "-75 0 0", ["projectile lifetime"] = 5, ["noclip projectiles"] = 1, ["fire input on attack"] = "popscript^$OrbitalRocket^", ["projectile no deflect"] = 1, ["force fire full clip"] = 1, -- ["throwable damage"] = 1.5, } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0,}, Scale = 2, BaseCashMult = 5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Enraged ", Items = {}, ItemAttributes = {[0] = { ["always crit"] = 1, ["clip size upgrade atomic"] = 46, ["fire rate bonus"] = 0.1, ["faster reload rate"] = 0.2, ["spread angle pattern"] = "-75 0 0", ["projectile lifetime"] = 5, ["noclip projectiles"] = 1, ["fire input on attack"] = "popscript^$OrbitalRocket^", ["projectile no deflect"] = 1, ["force fire full clip"] = 1, ["throwable damage"] = 1.5, }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Frenzied ", Items = {}, ItemAttributes = {[0] = { ["reload time decreased"] = 0.5, ["fire rate penalty"] = 0.5, ["clip size upgrade atomic"] = 46, ["fire rate bonus"] = 0.1, ["faster reload rate"] = 0.2, ["spread angle pattern"] = "-75 0 0", ["projectile lifetime"] = 5, ["noclip projectiles"] = 1, ["fire input on attack"] = "popscript^$OrbitalRocket^", ["projectile no deflect"] = 1, ["force fire full clip"] = 1, ["throwable damage"] = 1.5, }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, }, }, ["T_TFBot_Giant_Enemy_Beamer"] = { Weight = 1, Name = "Elite Beamer", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_PRIMARY_ONLY, DefaultSlot = LOADOUT_POSITION_PRIMARY, Skill = AI_EXPERT, Class = "Scout", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 50, -- 1250 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD }, OverrideModel = "models/bots/engineer/bot_engineer.mdl", Items = {"The Master Mind", "Iron Lung", "Pip-Boy", "Life Support System", "Roboot", "Contaminated Carryall", "Delldozer", "The Pomson 6000"}, ItemAttributes = { [0] = { ["clip size bonus upgrade"] = 15, ["fire rate bonus"] = 0.02, ["reload time decreased"] = 0.2, ["dmg penalty vs players"] = 3, -- ["damage penalty"] = 0.001, ["dmg penalty vs buildings"] = 15, ["hold fire until full reload"] = 1, ["dmg pierces resists absorbs"] = 1, -- ["dmg max health"] = 0.15, ["mod projectile heat seek power"] = 69420, ["mod projectile heat aim error"] = 30, ["mod projectile heat aim time"] = 0.05, ["mod projectile heat no predict target speed"] = 1, ["projectile speed decreased"] = 0.65, ["projectile lifetime"] = 2.3, } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.375, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0,}, Scale = 2, BaseCashMult = 5, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn NoDamageScaling = true, Variants = { { Append_Name = "Frenzied ", Items = {}, ItemAttributes = {[0] = { ["faster reload rate"] = 0.5, }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Homing ", Items = {}, ItemAttributes = {[0] = { ["mod projectile heat aim error"] = 60, ["mod projectile heat aim time"] = 3, ["mod projectile heat no predict target speed"] = 0, ["projectile speed decreased"] = 0.35, ["projectile lifetime"] = 3, }}, CharacterAttributes = {}, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, }, }, ["T_TFBot_Giant_Enemy_Master_Builder"] = { Weight = 0.35, Name = "Master Builder", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_MELEE_ONLY, DefaultSlot = LOADOUT_POSITION_MELEE, Skill = AI_EXPERT, Class = "Scout", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 35, -- 875 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD }, OverrideModel = "models/bots/engineer/bot_engineer.mdl", Items = {"Wavefinder", "Iron Lung", "Hazard Handler", "The Gunslinger"}, ItemAttributes = { [2] = {["no_attack"] = 1} }, CharacterAttributes = {["no_attack"] = 1,["is miniboss"] = 1, ["move speed bonus"] = 0.375, ["damage force reduction"] = 0.1, ["airblast vulnerability multiplier"] = 0.1, ["engy sentry damage bonus"] = 0.5, ["engy sentry radius increased"] = 0.5}, Scale = 2, BaseCashMult = 5, AddConds = {}, VisionRange = -1, LogicFunc = function( botSpawn, data) -- if not botSpawn.DroneBuildDelay then botSpawn.DroneBuildDelay = CurTime() + 1 end -- if not botSpawn.SummonDelay then botSpawn.SummonDelay = CurTime() + 5 end -- if not botSpawn.Drones then botSpawn.Drones = {} end -- if not botSpawn.DronePairity then botSpawn.DronePairity = DRONE_STATE_FOLLOW_OWNER end local eye_ang = botSpawn:GetEyeAngles() if ( not botSpawn:IsAlive() ) or ( botSpawn:OnTeam( 1 ) ) then return end if CurTime() >= botSpawn.DroneBuildDelay then botSpawn.DroneBuildDelay = CurTime() + 5 local info = { TeamNum = 3, SolidToPlayer = 0, spawnflags = 8|64} local offset = ( Vector( 96, 96, 0 ) * ( botSpawn:GetEyeAngles():Rotate( Vector( 90, 0, 0 ) ):ToAngles():GetForward() ) ) + Vector( 0, 0, 48 ) if botSpawn.DronesOnOwner >= botSpawn.DroneMaxEach then goto next end local drone = ents.CreateWithKeys( "obj_sentrygun", info, true, true ) drone:SetAbsOrigin( botSpawn:GetAbsOrigin() + offset ) drone.m_flPercentageConstructed = 0 drone.m_bMiniBuilding = 1 drone.m_iState = 0 drone.m_bBuilding = 1 drone.m_hBuilder = botSpawn drone.m_hOwnerEntity = botSpawn drone:SetHealth( 50 * GetEnemyHealthMult() ) drone:SetModelOverride( "models/rcat/rcat_level2.mdl" ) drone:Skin( 1 ) drone.PosOffset = "positive" drone.Pairity = DRONE_STATE_FOLLOW_OWNER Drone( DRONE_STATE_FOLLOW_OWNER, drone ) table.insert( botSpawn.Drones, drone ) drone:AddCallback( ON_DEATH, function( ent ) botSpawn.DronesOnOwner = botSpawn.DronesOnOwner - 1 end) drone:AddCallback( ON_REMOVE, function( ent ) botSpawn.DronesOnOwner = botSpawn.DronesOnOwner - 1 end) botSpawn.DronesOnOwner = botSpawn.DronesOnOwner + 1 if botSpawn.DronesOnOwner >= botSpawn.DroneMaxEach then goto next end drone = ents.CreateWithKeys( "obj_sentrygun", info, true, true ) offset = ( Vector( -96, -96, 0 ) * ( botSpawn:GetEyeAngles():Rotate( Vector( 90, 0, 0 ) ):ToAngles():GetForward() ) ) + Vector( 0, 0, 48 ) drone:SetAbsOrigin( botSpawn:GetAbsOrigin() + offset ) drone.m_flPercentageConstructed = 0 drone.m_bMiniBuilding = 1 drone.m_iState = 0 drone.m_bBuilding = 1 drone.m_hBuilder = botSpawn drone.m_hOwnerEntity = botSpawn drone:SetHealth( 50 * GetEnemyHealthMult() ) drone:SetModelOverride( "models/rcat/rcat_level2.mdl" ) drone:Skin( 1 ) drone.PosOffset = "negative" drone.Pairity = DRONE_STATE_FOLLOW_OWNER Drone( DRONE_STATE_FOLLOW_OWNER, drone ) table.insert( botSpawn.Drones, drone ) drone:AddCallback( ON_DEATH, function( ent ) botSpawn.DronesOnOwner = botSpawn.DronesOnOwner - 1 end) drone:AddCallback( ON_REMOVE, function( ent ) botSpawn.DronesOnOwner = botSpawn.DronesOnOwner - 1 end) botSpawn.DronesOnOwner = botSpawn.DronesOnOwner + 1 end if ( botSpawn.DroneBuildDelay - CurTime() ) <= 5 then if botSpawn.DronesOnOwner <= 0 then botSpawn.WarningDronePositive:SetAbsOrigin( botSpawn:GetAbsOrigin() + ( Vector( 96, 96, 0 ) * ( botSpawn:GetEyeAngles():Rotate( Vector( 90, 0, 0 ) ):ToAngles():GetForward() ) ) + Vector( 0, 0, 48 ) ) botSpawn.WarningDroneNegative:SetAbsOrigin( botSpawn:GetAbsOrigin() + ( Vector( -96, -96, 0 ) * ( botSpawn:GetEyeAngles():Rotate( Vector( 90, 0, 0 ) ):ToAngles():GetForward() ) ) + Vector( 0, 0, 48 ) ) botSpawn.WarningDronePositive:SetAbsAngles( Vector( 0, eye_ang[2], 0 ) ) botSpawn.WarningDroneNegative:SetAbsAngles( Vector( 0, eye_ang[2], 0 ) ) botSpawn.WarningDronePositive:Enable() botSpawn.WarningDroneNegative:Enable() else botSpawn.WarningDronePositive:Disable() botSpawn.WarningDroneNegative:Disable() botSpawn.DroneBuildDelay = CurTime() + 5 end else botSpawn.WarningDronePositive:Disable() botSpawn.WarningDroneNegative:Disable() end ::next:: if CurTime() >= botSpawn.SummonDelay then botSpawn.SummonDelay = CurTime() + 7.5 local template = ENEMY_TEMPLATES[math.WeightedRandomEnemySummon( botSpawn.EnemySpawnTable )] local count = 1 if template.Type == ENEMY_TYPE_COMMON then count = 2 end for i = 1, count do if ENEMY_SUMMONED_COUNT >= ENEMY_BUILDER_MAX_SUMMONS then break end local bot = SpawnEnemy( template, botSpawn:GetAbsOrigin() ) bot.IsSummon = true bot.CashMult = 0 ENEMY_SUMMONED_COUNT = ENEMY_SUMMONED_COUNT + 1 end end for _, drone in pairs( botSpawn.Drones ) do if IsValid( drone ) and ( drone:GetTeam() == botSpawn:GetTeam() ) and ( drone:GetBuilder() == botSpawn ) then if drone.m_iHealth > (50*GetEnemyHealthMult()) then drone:SetHealth( 50 * GetEnemyHealthMult() ) end else table.remove( botSpawn.Drones, drone ) end end end, -- Passes botSpawn, data SpawnFunc = function( botSpawn, data) botSpawn.DroneBuildDelay = CurTime() + 1 botSpawn.SummonDelay = CurTime() + 5 botSpawn.Drones = {} botSpawn.DronesOnOwner = 0 botSpawn.DronesOnEnemies = 0 botSpawn.DroneMaxEach = 2 botSpawn:GetPlayerItemByName( "Hazard Handler" ):SetAttributeValue( "item style override", 2 ) botSpawn.EnemySpawnTable = {} for template, data in pairs( ENEMY_TEMPLATES ) do if data.Summonable and ( data.Summonable == true ) then botSpawn.EnemySpawnTable[template] = data end end local info = { model = "models/buildables/sentry1_blueprint.mdl", modelscale = 0.75, solid = 0, DisableBoneFollowers = 1, DisableShadows = 1, } botSpawn.WarningDronePositive = ents.CreateWithKeys( "prop_dynamic", info, true, true ) botSpawn.WarningDroneNegative = ents.CreateWithKeys( "prop_dynamic", info, true, true ) botSpawn.WarningDronePositive:Disable() botSpawn.WarningDroneNegative:Disable() end, -- Passes botSpawn, data DeathFunc = function( botSpawn ) if IsValid( botSpawn.WarningDronePositive ) then botSpawn.WarningDronePositive:Remove() end if IsValid( botSpawn.WarningDroneNegative ) then botSpawn.WarningDroneNegative:Remove() end for _, drone in pairs( botSpawn.Drones ) do if IsValid( drone ) and ( drone:GetTeam() == botSpawn:GetTeam() ) and ( drone:GetBuilder() == botSpawn ) then drone.State = DRONE_STATE_HOVER_IDLE end end botSpawn.Drones = nil end, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 0.75 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, ["T_TFBot_Giant_Enemy_Hydra_Main"] = { Weight = 0.8, Name = "Hydra", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_SECONDARY_ONLY, DefaultSlot = LOADOUT_POSITION_SECONDARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 48, -- 1.2k base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD }, Items = {"The Righteous Bison"}, ItemAttributes = { [1] = { ["fire rate bonus"] = 0.1, ["no damage falloff"] = 1, ["hold fire until full reload"] = 1, ["clip size bonus upgrade"] = 5, ["reload time decreased"] = 0.2, ["spread offset pattern"] = "0 -32 0|0 -16 0|0 0 0|0 16 0|0 32 0", ["dmg penalty vs players"] = 0.5, ["projectile speed increased"] = 0.5, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0,}, Scale = 2, BaseCashMult = 0, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = function( botSpawn ) if string.match( botSpawn.m_szNetname, "Hydra" ) then SpawnEnemy( ENEMY_TEMPLATES["T_TFBot_Giant_Enemy_Hydra_Split1"], botSpawn:GetAbsOrigin() ) SpawnEnemy( ENEMY_TEMPLATES["T_TFBot_Giant_Enemy_Hydra_Split1"], botSpawn:GetAbsOrigin() ) end end, -- Passes botSpawn Variants = { { Append_Name = "Enraged ", Items = {}, ItemAttributes = {}, CharacterAttributes = {["always crit"] = 1}, AddConds = { TF_COND_CRITBOOSTED }, Weight = 1, }, }, }, ["T_TFBot_Giant_Enemy_Hydra_Split1"] = { Weight = 0, Name = "Hydra", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_SECONDARY_ONLY, DefaultSlot = LOADOUT_POSITION_SECONDARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 24, -- 600 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD }, Items = {"The Righteous Bison"}, ItemAttributes = { [1] = { ["fire rate bonus"] = 0.1, ["no damage falloff"] = 1, ["hold fire until full reload"] = 1, ["clip size bonus upgrade"] = 5, ["reload time decreased"] = 0.2, ["spread offset pattern"] = "0 -32 0|0 -16 0|0 0 0|0 16 0|0 32 0", ["dmg penalty vs players"] = 0.5, ["projectile speed increased"] = 0.5, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0,}, Scale = 1.5, BaseCashMult = 0, AddConds = {}, VisionRange = -1, LogicFunc = function( botSpawn, data ) local IsBuffer = false local self = botSpawn local cond = TF_COND_OFFENSEBUFF local radius = 450 * 1.5 if string.match( self.m_szNetname, "Buffing" ) then IsBuffer = true elseif string.match( self.m_szNetname, "Concheror" ) then cond = TF_COND_REGENONDAMAGEBUFF IsBuffer = true elseif string.match( self.m_szNetname, "Battalion Leader" ) then cond = TF_COND_DEFENSEBUFF IsBuffer = true end if IsBuffer then for _, player in pairs( ents.FindInSphere( self:GetAbsOrigin(), radius, "player" ) ) do if IsValid( player ) and player:IsAlive() and ( player:GetTeam() == self:GetTeam() ) then player:AddCond( cond, 0.2 ) end end end end, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = function( botSpawn ) if string.match( botSpawn.m_szNetname, "Hydra" ) then SpawnEnemy( ENEMY_TEMPLATES["T_TFBot_Giant_Enemy_Hydra_Split2"], botSpawn:GetAbsOrigin() ) SpawnEnemy( ENEMY_TEMPLATES["T_TFBot_Giant_Enemy_Hydra_Split2"], botSpawn:GetAbsOrigin() ) end end, -- Passes botSpawn Variants = { { Append_Name = "Buffing ", Items = {}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Concheror ", Items = {}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, { Append_Name = "Battalion Leader ", Items = {}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, }, }, ["T_TFBot_Giant_Enemy_Hydra_Split2"] = { Weight = 0, Name = "Hydra", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_SECONDARY_ONLY, DefaultSlot = LOADOUT_POSITION_SECONDARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 12, -- 300 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD }, Items = {"The Righteous Bison"}, ItemAttributes = { [1] = { ["fire rate bonus"] = 0.1, ["no damage falloff"] = 1, ["hold fire until full reload"] = 1, ["clip size bonus upgrade"] = 5, ["reload time decreased"] = 0.2, ["spread offset pattern"] = "0 -32 0|0 -16 0|0 0 0|0 16 0|0 32 0", ["dmg penalty vs players"] = 0.5, ["projectile speed increased"] = 0.5, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0,}, Scale = 1, BaseCashMult = 1.25, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = function( botSpawn ) if botSpawn.m_szNetname == "Extra Split Hydra" then SpawnEnemy( ENEMY_TEMPLATES["T_TFBot_Giant_Enemy_Hydra_Split3"], botSpawn:GetAbsOrigin() ) SpawnEnemy( ENEMY_TEMPLATES["T_TFBot_Giant_Enemy_Hydra_Split3"], botSpawn:GetAbsOrigin() ) end end, -- Passes botSpawn Variants = { { Append_Name = "Extra Split ", Items = {}, ItemAttributes = {}, CharacterAttributes = {}, AddConds = {}, Weight = 1, }, }, }, ["T_TFBot_Giant_Enemy_Hydra_Split3"] = { Weight = 0, Name = "Hydra", Type = ENEMY_TYPE_BOSS, WeaponRestrictions = WEPRST_SECONDARY_ONLY, DefaultSlot = LOADOUT_POSITION_SECONDARY, Skill = AI_EXPERT, Class = "Soldier", Action = "Mobber", Tags = { "bot_boss" }, Health = ENEMY_BASE_HEALTH * 6, -- 150 base Attributes = { ATTR_IGNORE_FLAG , ATTR_DISABLE_DODGE , ATTR_MINIBOSS , ATTR_HOLD_FIRE_UNTIL_FULL_RELOAD }, Items = {"The Righteous Bison"}, ItemAttributes = { [1] = { ["fire rate bonus"] = 0.1, ["no damage falloff"] = 1, ["hold fire until full reload"] = 1, ["clip size bonus upgrade"] = 5, ["reload time decreased"] = 0.2, ["spread offset pattern"] = "0 -32 0|0 -16 0|0 0 0|0 16 0|0 32 0", ["dmg penalty vs players"] = 0.5, ["projectile speed increased"] = 0.5, ["damage force reduction"] = 0.6, ["airblast vulnerability multiplier"] = 0.6 } }, CharacterAttributes = {["is miniboss"] = 1, ["move speed bonus"] = 0.5, ["damage force reduction"] = 0, ["airblast vulnerability multiplier"] = 0,}, Scale = 0.5, BaseCashMult = 0, AddConds = {}, VisionRange = -1, LogicFunc = nil, -- Passes botSpawn, data SpawnFunc = nil, -- Passes botSpawn, data DeathFunc = nil, -- Passes botSpawn Variants = { { Append_Name = "Speedy ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["move speed bonus"] = 1.5 }, AddConds = {}, Weight = 1, -- If we roll the chance for variant, weight of this one to be chosen }, { Append_Name = "Armored ", Items = {}, ItemAttributes = {}, CharacterAttributes = { ["dmg taken increased"] = 0.67, ["damage force increase hidden"] = 0.2 }, AddConds = {}, Weight = 0.75, }, }, }, }