From 7de40cc6623bd3d9715121c4d1775b433b9c8fd8 Mon Sep 17 00:00:00 2001 From: ineedbots Date: Wed, 2 Jun 2021 22:06:18 -0600 Subject: [PATCH] Move files --- .gitignore | 14 +- {maps => raw/maps}/mp/bots/_bot.gsc | 2256 +++---- {maps => raw/maps}/mp/bots/_bot_internal.gsc | 0 {maps => raw/maps}/mp/bots/_bot_script.gsc | 0 {maps => raw/maps}/mp/bots/_bot_utility.gsc | 5700 ++++++++--------- {maps => raw/maps}/mp/bots/_menu.gsc | 0 {maps => raw/maps}/mp/bots/_wp_editor.gsc | 1844 +++--- .../maps}/mp/bots/waypoints/_custom_map.gsc | 0 {maps => raw/maps}/mp/bots/waypoints/dome.gsc | 2226 +++---- .../maps}/mp/bots/waypoints/seatown.gsc | 3456 +++++----- {scripts => raw/scripts}/bots.gsc | 8 +- {scripts => raw/scripts}/bots_menu.gsc | 8 +- {scripts => raw/scripts}/bots_test.gsc | 146 +- {scripts => raw/scripts}/bots_wp_editor.gsc | 8 +- .../scripts}/damagehud/__init__.lua | 56 +- 15 files changed, 7862 insertions(+), 7860 deletions(-) rename {maps => raw/maps}/mp/bots/_bot.gsc (95%) rename {maps => raw/maps}/mp/bots/_bot_internal.gsc (100%) rename {maps => raw/maps}/mp/bots/_bot_script.gsc (100%) rename {maps => raw/maps}/mp/bots/_bot_utility.gsc (96%) rename {maps => raw/maps}/mp/bots/_menu.gsc (100%) rename {maps => raw/maps}/mp/bots/_wp_editor.gsc (96%) rename {maps => raw/maps}/mp/bots/waypoints/_custom_map.gsc (100%) rename {maps => raw/maps}/mp/bots/waypoints/dome.gsc (97%) rename {maps => raw/maps}/mp/bots/waypoints/seatown.gsc (97%) rename {scripts => raw/scripts}/bots.gsc (92%) rename {scripts => raw/scripts}/bots_menu.gsc (92%) rename {scripts => raw/scripts}/bots_test.gsc (92%) rename {scripts => raw/scripts}/bots_wp_editor.gsc (93%) rename {scripts => raw/scripts}/damagehud/__init__.lua (96%) diff --git a/.gitignore b/.gitignore index 05fdafe..09a8198 100644 --- a/.gitignore +++ b/.gitignore @@ -5,13 +5,15 @@ !/.gitignore # Folder to not ignore -!/scripts +!/raw +/raw/* +!/raw/scripts -!/maps -/maps/* -!/maps/mp/ -/maps/mp/* -!/maps/mp/bots/ +!/raw/maps +/raw/maps/* +!/raw/maps/mp/ +/raw/maps/mp/* +!/raw/maps/mp/bots/ *.zip diff --git a/maps/mp/bots/_bot.gsc b/raw/maps/mp/bots/_bot.gsc similarity index 95% rename from maps/mp/bots/_bot.gsc rename to raw/maps/mp/bots/_bot.gsc index f565027..4530cb2 100644 --- a/maps/mp/bots/_bot.gsc +++ b/raw/maps/mp/bots/_bot.gsc @@ -1,1128 +1,1128 @@ -/* - _bot - Author: INeedGames - Date: 05/07/2021 - The entry point and manager of the bots. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -/* - Initiates the whole bot scripts. -*/ -init() -{ - level.bw_VERSION = "2.0.1"; - - if(getDvar("bots_main") == "") - setDvar("bots_main", true); - - if (!getDvarInt("bots_main")) - return; - - thread load_waypoints(); - thread hook_callbacks(); - - if(getDvar("bots_main_GUIDs") == "") - setDvar("bots_main_GUIDs", "");//guids of players who will be given host powers, comma seperated - if(getDvar("bots_main_firstIsHost") == "") - setDvar("bots_main_firstIsHost", false);//first play to connect is a host - if(getDvar("bots_main_waitForHostTime") == "") - setDvar("bots_main_waitForHostTime", 10.0);//how long to wait to wait for the host player - - if(getDvar("bots_manage_add") == "") - setDvar("bots_manage_add", 0);//amount of bots to add to the game - if(getDvar("bots_manage_fill") == "") - setDvar("bots_manage_fill", 0);//amount of bots to maintain - if(getDvar("bots_manage_fill_spec") == "") - setDvar("bots_manage_fill_spec", true);//to count for fill if player is on spec team - if(getDvar("bots_manage_fill_mode") == "") - setDvar("bots_manage_fill_mode", 0);//fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 - if(getDvar("bots_manage_fill_kick") == "") - setDvar("bots_manage_fill_kick", false);//kick bots if too many - - if(getDvar("bots_team") == "") - setDvar("bots_team", "autoassign");//which team for bots to join - if(getDvar("bots_team_amount") == "") - setDvar("bots_team_amount", 0);//amount of bots on axis team - if(getDvar("bots_team_force") == "") - setDvar("bots_team_force", false);//force bots on team - if(getDvar("bots_team_mode") == "") - setDvar("bots_team_mode", 0);//counts just bots when 1 - - if(getDvar("bots_skill") == "") - setDvar("bots_skill", 0);//0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random - if(getDvar("bots_skill_axis_hard") == "") - setDvar("bots_skill_axis_hard", 0);//amount of hard bots on axis team - if(getDvar("bots_skill_axis_med") == "") - setDvar("bots_skill_axis_med", 0); - if(getDvar("bots_skill_allies_hard") == "") - setDvar("bots_skill_allies_hard", 0); - if(getDvar("bots_skill_allies_med") == "") - setDvar("bots_skill_allies_med", 0); - - if(getDvar("bots_loadout_reasonable") == "")//filter out the bad 'guns' and perks - setDvar("bots_loadout_reasonable", false); - if(getDvar("bots_loadout_allow_op") == "")//allows jug, marty and laststand - setDvar("bots_loadout_allow_op", true); - if(getDvar("bots_loadout_rank") == "")// what rank the bots should be around, -1 is around the players, 0 is all random - setDvar("bots_loadout_rank", -1); - if(getDvar("bots_loadout_prestige") == "")// what pretige the bots will be, -1 is the players, -2 is random - setDvar("bots_loadout_prestige", -1); - - if(getDvar("bots_play_move") == "")//bots move - setDvar("bots_play_move", true); - if(getDvar("bots_play_knife") == "")//bots knife - setDvar("bots_play_knife", true); - if(getDvar("bots_play_fire") == "")//bots fire - setDvar("bots_play_fire", true); - if(getDvar("bots_play_nade") == "")//bots grenade - setDvar("bots_play_nade", true); - if(getDvar("bots_play_take_carepackages") == "")//bots take carepackages - setDvar("bots_play_take_carepackages", true); - if(getDvar("bots_play_obj") == "")//bots play the obj - setDvar("bots_play_obj", true); - if(getDvar("bots_play_camp") == "")//bots camp and follow - setDvar("bots_play_camp", true); - if(getDvar("bots_play_jumpdrop") == "")//bots jump and dropshot - setDvar("bots_play_jumpdrop", true); - if(getDvar("bots_play_target_other") == "")//bot target non play ents (vehicles) - setDvar("bots_play_target_other", true); - if(getDvar("bots_play_killstreak") == "")//bot use killstreaks - setDvar("bots_play_killstreak", true); - if(getDvar("bots_play_ads") == "")//bot ads - setDvar("bots_play_ads", true); - - if(!isDefined(game["botWarfare"])) - game["botWarfare"] = true; - - level.defuseObject = undefined; - level.bots_smokeList = List(); - level.bots_fragList = List(); - - level.bots_minSprintDistance = 315; - level.bots_minSprintDistance *= level.bots_minSprintDistance; - level.bots_minGrenadeDistance = 256; - level.bots_minGrenadeDistance *= level.bots_minGrenadeDistance; - level.bots_maxGrenadeDistance = 1024; - level.bots_maxGrenadeDistance *= level.bots_maxGrenadeDistance; - level.bots_maxKnifeDistance = 80; - level.bots_maxKnifeDistance *= level.bots_maxKnifeDistance; - level.bots_goalDistance = 27.5; - level.bots_goalDistance *= level.bots_goalDistance; - level.bots_noADSDistance = 200; - level.bots_noADSDistance *= level.bots_noADSDistance; - level.bots_maxShotgunDistance = 500; - level.bots_maxShotgunDistance *= level.bots_maxShotgunDistance; - level.bots_listenDist = 100; - - level.smokeRadius = 255; - - level.bots = []; - - level.bots_fullautoguns = []; - level.bots_fullautoguns["fmg9"] = true; - level.bots_fullautoguns["skorpion"] = true; - level.bots_fullautoguns["mp9"] = true; - level.bots_fullautoguns["g18"] = true; - level.bots_fullautoguns["mp5"] = true; - level.bots_fullautoguns["m9"] = true; - level.bots_fullautoguns["p90"] = true; - level.bots_fullautoguns["pp90m1"] = true; - level.bots_fullautoguns["ump45"] = true; - level.bots_fullautoguns["mp7"] = true; - level.bots_fullautoguns["ak47"] = true; - level.bots_fullautoguns["m4"] = true; - level.bots_fullautoguns["fad"] = true; - level.bots_fullautoguns["acr"] = true; - level.bots_fullautoguns["scar"] = true; - level.bots_fullautoguns["g36c"] = true; - level.bots_fullautoguns["cm901"] = true; - level.bots_fullautoguns["aa12"] = true; - level.bots_fullautoguns["m60"] = true; - level.bots_fullautoguns["mk46"] = true; - level.bots_fullautoguns["pecheneg"] = true; - level.bots_fullautoguns["sa80"] = true; - level.bots_fullautoguns["mg36"] = true; - - level.bots_fullautoguns["ak74u"] = true; - - level.bots_fullautoguns["25mm"] = true; - level.bots_fullautoguns["40mm"] = true; - level.bots_fullautoguns["105mm"] = true; - level.bots_fullautoguns["remote"] = true; - - level thread fixGamemodes(); - - level thread onPlayerConnect(); - level thread addNotifyOnAirdrops(); - level thread watchScrabler(); - level thread watchRadar(); - level thread auditModels(); - - level thread handleBots(); - - //level thread maps\mp\bots\_bot_http::doVersionCheck(); -} - -/* - Starts the threads for bots. -*/ -handleBots() -{ - level thread teamBots(); - level thread diffBots(); - level addBots(); - - while(!level.intermission) - wait 0.05; - - setDvar("bots_manage_add", getBotArray().size); -} - -/* - The hook callback for when any player becomes damaged. -*/ -onPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) -{ - if(self is_bot()) - { - self maps\mp\bots\_bot_internal::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); - self maps\mp\bots\_bot_script::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); - } - - self [[level.prevCallbackPlayerDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); -} - -/* - The hook callback when any player gets killed. -*/ -onPlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) -{ - if(self is_bot()) - { - self maps\mp\bots\_bot_internal::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); - self maps\mp\bots\_bot_script::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); - } - - self [[level.prevCallbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); -} - -/* - Starts the callbacks. -*/ -hook_callbacks() -{ - level waittill( "prematch_over" ); // iw4madmin waits this long for some reason... - wait 0.05; // so we need to be one frame after it sets up its callbacks. - level.prevCallbackPlayerDamage = level.callbackPlayerDamage; - level.callbackPlayerDamage = ::onPlayerDamage; - - level.prevCallbackPlayerKilled = level.callbackPlayerKilled; - level.callbackPlayerKilled = ::onPlayerKilled; -} - -/* - Fixes gamemodes when level starts. -*/ -fixGamemodes() -{ - for(i=0;i<19;i++) - { - if(isDefined(level.bombZones) && level.gametype == "sd") - { - for(i = 0; i < level.bombZones.size; i++) - level.bombZones[i].onUse = ::onUsePlantObjectFix; - break; - } - - if(isDefined(level.radios) && level.gametype == "koth") - { - level thread fixKoth(); - - break; - } - - if (isDefined(level.bombZones) && level.gametype == "dd") - { - level thread fixDem(); - - break; - } - - wait 0.05; - } -} - -/* - Converts t5 dd to iw4 -*/ -fixDem() -{ - for (;;) - { - level.bombAPlanted = level.aPlanted; - level.bombBPlanted = level.bPlanted; - - for (i = 0; i < level.bombZones.size; i++) - { - if (isDefined(level.bombZones[i].trigger.trigger_off)) - level.bombZones[i].bombExploded = true; - else - level.bombZones[i].bombExploded = undefined; - } - - wait 0.05; - } -} - -/* - Fixes the king of the hill headquarters obj -*/ -fixKoth() -{ - level.radio = undefined; - - for(;;) - { - wait 0.05; - - if(!isDefined(level.radioObject)) - { - continue; - } - - for(i = level.radios.size - 1; i >= 0; i--) - { - if(level.radioObject != level.radios[i].gameobject) - continue; - - level.radio = level.radios[i]; - break; - } - - while(isDefined(level.radioObject) && level.radio.gameobject == level.radioObject) - wait 0.05; - } -} - -/* - Loop -*/ -auditModels_loop() -{ - s_models = getEntArray("script_model", "classname"); - - for (i = s_models.size - 1; i >= 0; i--) - { - model = s_models[i]; - - if (!isDefined(model)) - continue; - - if (isDefined(model.bot_audit_model)) - continue; - - if (model.model == "com_deploy_ballistic_vest_friend_world") - { - model.bot_audit_model = true; - level.vest_boxes[level.vest_boxes.size] = model; - } - } -} - -/* - Audits all the important models cause iw5 script is kek -*/ -auditModels() -{ - level.vest_boxes = []; - - for (;;) - { - wait 0.05; - - level.vest_boxes = array_removeUndefined(level.vest_boxes); - - auditModels_loop(); - } -} - -/* - Loop -*/ -watchRadar_loop() -{ - for ( i = level.players.size - 1; i >= 0; i-- ) - { - player = level.players[i]; - player.bot_isInRadar = false; - } - - for ( i = level.players.size - 1; i >= 0; i-- ) - { - grenade = level.players[i].deployedPortableRadar; - - if ( !isDefined( grenade ) ) - continue; - - if (grenade.model != "weapon_radar") - continue; - - for ( h = level.players.size - 1; h >= 0; h-- ) - { - player = level.players[h]; - - if (!isReallyAlive(player)) - continue; - - if (isDefined(grenade.owner) && grenade.owner == player) - continue; - - if(level.teamBased && grenade.team == player.team) - continue; - - if (player _hasPerk("specialty_coldblooded")) - continue; - - if (DistanceSquared(player.origin, grenade.origin) > 256*256) - continue; - - player.bot_isInRadar = true; - } - } - - for ( i = level.players.size - 1; i >= 0; i-- ) - { - if ( !isDefined( level.players[i].personalRadar ) ) - continue; - - if (!isReallyAlive(level.players[i])) - continue; - - for ( h = level.players.size - 1; h >= 0; h-- ) - { - player = level.players[h]; - - if (!isReallyAlive(player)) - continue; - - if (level.players[i] == player) - continue; - - if(level.teamBased && level.players[i].team == player.team) - continue; - - if (player _hasPerk("specialty_coldblooded")) - continue; - - if (DistanceSquared(player.origin, level.players[i].origin) > 256*256) - continue; - - player.bot_isInRadar = true; - } - } -} - -/* - Watches radars -*/ -watchRadar() -{ - for (;;) - { - wait 1; - - watchRadar_loop(); - } -} - -/* - Loop -*/ -watchScrabler_loop() -{ - for ( i = level.players.size - 1; i >= 0; i-- ) - { - player = level.players[i]; - player.bot_isScrambled = false; - } - - for (i = level.scramblers.size - 1; i >= 0; i--) - { - scrambler = level.scramblers[i]; - - if ( !isDefined( scrambler ) ) - continue; - - for ( h = level.players.size - 1; h >= 0; h-- ) - { - player = level.players[h]; - - if (!isReallyAlive(player)) - continue; - - if (isDefined(scrambler.owner) && scrambler.owner == player) - continue; - - if(level.teamBased && scrambler.team == player.team) - continue; - - if (player _hasPerk("specialty_spygame")) - continue; - - if (DistanceSquared(player.origin, scrambler.origin) > 256*256) - continue; - - player.bot_isScrambled = true; - } - } - - drones = []; - if (isDefined(level.remote_uav["axis"])) - drones[drones.size] = level.remote_uav["axis"]; - if (isDefined(level.remote_uav["allies"])) - drones[drones.size] = level.remote_uav["allies"]; - - for (i = drones.size - 1; i >= 0; i--) - { - drone = drones[i]; - - for ( h = level.players.size - 1; h >= 0; h-- ) - { - player = level.players[h]; - - if (!isReallyAlive(player)) - continue; - - if (isDefined(drone.owner) && drone.owner == player) - continue; - - if(level.teamBased && drone.team == player.team) - continue; - - if (player _hasPerk("specialty_spygame")) - continue; - - if (DistanceSquared(player.origin, drone.origin) > 256*256) - continue; - - player.bot_isScrambled = true; - } - } -} - -/* - Watches scrambler -*/ -watchScrabler() -{ - for (;;) - { - wait 1; - - watchScrabler_loop(); - } -} - -/* - Loop -*/ -addNotifyOnAirdrops_loop() -{ - dropCrates = getEntArray( "care_package", "targetname" ); - - for (i = dropCrates.size - 1; i >= 0; i--) - { - airdrop = dropCrates[i]; - - if (!isDefined(airdrop.owner)) - continue; - - if (isDefined(airdrop.doingPhysics)) - continue; - - airdrop.doingPhysics = true; - airdrop thread doNotifyOnAirdrop(); - } -} - -/* - Adds a notify when the airdrop is dropped -*/ -addNotifyOnAirdrops() -{ - for (;;) - { - wait 1; - addNotifyOnAirdrops_loop(); - } -} - -/* - Does the notify -*/ -doNotifyOnAirdrop() -{ - self endon( "death" ); - self waittill( "physics_finished" ); - - self.doingPhysics = false; - self.owner notify("crate_physics_done"); -} - -/* - Thread when any player connects. Starts the threads needed. -*/ -onPlayerConnect() -{ - for(;;) - { - level waittill("connected", player); - - player.bot_isScrambled = false; - player.bot_isInRadar = false; - - player thread onGrenadeFire(); - player thread onWeaponFired(); - - player thread connected(); - } -} - -/* - When a bot disconnects. -*/ -onDisconnect() -{ - self waittill("disconnect"); - - level.bots = array_remove(level.bots, self); -} - -/* - Called when a player connects. -*/ -connected() -{ - self endon("disconnect"); - - if (!isDefined(self.pers["bot_host"])) - self thread doHostCheck(); - - if(!self is_bot()) - return; - - if (!isDefined(self.pers["isBot"])) - { - // fast_restart occured... - self.pers["isBot"] = true; - } - - if (!isDefined(self.pers["isBotWarfare"])) - { - self.pers["isBotWarfare"] = true; - self thread added(); - } - - self thread maps\mp\bots\_bot_internal::connected(); - self thread maps\mp\bots\_bot_script::connected(); - - level.bots[level.bots.size] = self; - self thread onDisconnect(); - - level notify("bot_connected", self); -} - -/* - When a bot gets added into the game. -*/ -added() -{ - self endon("disconnect"); - - self thread maps\mp\bots\_bot_internal::added(); - self thread maps\mp\bots\_bot_script::added(); -} - -/* - Adds a bot to the game. -*/ -add_bot() -{ - bot = addTestClient(); - - if (isdefined(bot)) - { - bot.pers["isBot"] = true; - bot.pers["isBotWarfare"] = true; - bot thread added(); - } -} - -/* - Loop -*/ -diffBots_loop() -{ - var_allies_hard = getDVarInt("bots_skill_allies_hard"); - var_allies_med = getDVarInt("bots_skill_allies_med"); - var_axis_hard = getDVarInt("bots_skill_axis_hard"); - var_axis_med = getDVarInt("bots_skill_axis_med"); - var_skill = getDvarInt("bots_skill"); - - allies_hard = 0; - allies_med = 0; - axis_hard = 0; - axis_med = 0; - - if(var_skill == 8) - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == "axis") - { - if(axis_hard < var_axis_hard) - { - axis_hard++; - player.pers["bots"]["skill"]["base"] = 7; - } - else if(axis_med < var_axis_med) - { - axis_med++; - player.pers["bots"]["skill"]["base"] = 4; - } - else - player.pers["bots"]["skill"]["base"] = 1; - } - else if(player.pers["team"] == "allies") - { - if(allies_hard < var_allies_hard) - { - allies_hard++; - player.pers["bots"]["skill"]["base"] = 7; - } - else if(allies_med < var_allies_med) - { - allies_med++; - player.pers["bots"]["skill"]["base"] = 4; - } - else - player.pers["bots"]["skill"]["base"] = 1; - } - } - } - else if (var_skill != 0 && var_skill != 9) - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!player is_bot()) - continue; - - player.pers["bots"]["skill"]["base"] = var_skill; - } - } -} - -/* - A server thread for monitoring all bot's difficulty levels for custom server settings. -*/ -diffBots() -{ - for(;;) - { - wait 1.5; - - diffBots_loop(); - } -} - -/* - Loop -*/ -teamBots_loop() -{ - teamAmount = getDvarInt("bots_team_amount"); - toTeam = getDvar("bots_team"); - - alliesbots = 0; - alliesplayers = 0; - axisbots = 0; - axisplayers = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(player is_bot()) - { - if(player.pers["team"] == "allies") - alliesbots++; - else if(player.pers["team"] == "axis") - axisbots++; - } - else - { - if(player.pers["team"] == "allies") - alliesplayers++; - else if(player.pers["team"] == "axis") - axisplayers++; - } - } - - allies = alliesbots; - axis = axisbots; - - if(!getDvarInt("bots_team_mode")) - { - allies += alliesplayers; - axis += axisplayers; - } - - if(toTeam != "custom") - { - if(getDvarInt("bots_team_force")) - { - if(toTeam == "autoassign") - { - if(abs(axis - allies) > 1) - { - toTeam = "axis"; - if(axis > allies) - toTeam = "allies"; - } - } - - if(toTeam != "autoassign") - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == toTeam) - continue; - - if (toTeam == "allies") - player thread [[level.allies]](); - else if (toTeam == "axis") - player thread [[level.axis]](); - else - player thread [[level.spectator]](); - break; - } - } - } - } - else - { - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!isDefined(player.pers["team"])) - continue; - - if(!player is_bot()) - continue; - - if(player.pers["team"] == "axis") - { - if(axis > teamAmount) - { - player thread [[level.allies]](); - break; - } - } - else - { - if(axis < teamAmount) - { - player thread [[level.axis]](); - break; - } - else if(player.pers["team"] != "allies") - { - player thread [[level.allies]](); - break; - } - } - } - } -} - -/* - A server thread for monitoring all bot's teams for custom server settings. -*/ -teamBots() -{ - for(;;) - { - wait 1.5; - teamBots_loop(); - } -} - -/* - Loops -*/ -addBots_loop() -{ - botsToAdd = GetDvarInt("bots_manage_add"); - - if(botsToAdd > 0) - { - SetDvar("bots_manage_add", 0); - - if(botsToAdd > 64) - botsToAdd = 64; - - for(; botsToAdd > 0; botsToAdd--) - { - level add_bot(); - wait 0.25; - } - } - - fillMode = getDVarInt("bots_manage_fill_mode"); - - if(fillMode == 2 || fillMode == 3) - setDvar("bots_manage_fill", getGoodMapAmount()); - - fillAmount = getDvarInt("bots_manage_fill"); - - players = 0; - bots = 0; - spec = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(player is_bot()) - bots++; - else if(!isDefined(player.pers["team"]) || (player.pers["team"] != "axis" && player.pers["team"] != "allies")) - spec++; - else - players++; - } - - if (!randomInt(999)) - { - setDvar("testclients_doreload", true); - wait 0.1; - setDvar("testclients_doreload", false); - doExtraCheck(); - } - - if(fillMode == 4) - { - axisplayers = 0; - alliesplayers = 0; - - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(player is_bot()) - continue; - - if(!isDefined(player.pers["team"])) - continue; - - if(player.pers["team"] == "axis") - axisplayers++; - else if(player.pers["team"] == "allies") - alliesplayers++; - } - - result = fillAmount - abs(axisplayers - alliesplayers) + bots; - - if (players == 0) - { - if(bots < fillAmount) - result = fillAmount-1; - else if (bots > fillAmount) - result = fillAmount+1; - else - result = fillAmount; - } - - bots = result; - } - - amount = bots; - if(fillMode == 0 || fillMode == 2) - amount += players; - if(getDVarInt("bots_manage_fill_spec")) - amount += spec; - - if(amount < fillAmount) - setDvar("bots_manage_add", 1); - else if(amount > fillAmount && getDvarInt("bots_manage_fill_kick")) - { - tempBot = random(getBotArray()); - if (isDefined(tempBot)) - kick(tempBot getEntityNumber()); - } -} - -/* - A server thread for monitoring all bot's in game. Will add and kick bots according to server settings. -*/ -addBots() -{ - level endon("game_ended"); - - bot_wait_for_host(); - - for(;;) - { - wait 1.5; - - addBots_loop(); - } -} - -/* - A thread for ALL players, will monitor and grenades thrown. -*/ -onGrenadeFire() -{ - self endon("disconnect"); - for(;;) - { - self waittill ( "grenade_fire", grenade, weaponName ); - - if (!isDefined(grenade)) - continue; - - grenade.name = weaponName; - - if(weaponName == "smoke_grenade_mp") - grenade thread AddToSmokeList(); - else if (isSubStr(weaponName, "frag_")) - grenade thread AddToFragList(self); - } -} - -/* - Adds a frag grenade to the list of all frags -*/ -AddToFragList(who) -{ - grenade = spawnstruct(); - grenade.origin = self getOrigin(); - grenade.velocity = (0, 0, 0); - grenade.grenade = self; - grenade.owner = who; - grenade.team = who.team; - grenade.throwback = undefined; - - grenade thread thinkFrag(); - - level.bots_fragList ListAdd(grenade); -} - -/* - Watches while the frag exists -*/ -thinkFrag() -{ - while(isDefined(self.grenade)) - { - nowOrigin = self.grenade getOrigin(); - self.velocity = (nowOrigin - self.origin)*20; - self.origin = nowOrigin; - - wait 0.05; - } - - level.bots_fragList ListRemove(self); -} - -/* - Adds a smoke grenade to the list of smokes in the game. Used to prevent bots from seeing through smoke. -*/ -AddToSmokeList() -{ - grenade = spawnstruct(); - grenade.origin = self getOrigin(); - grenade.state = "moving"; - grenade.grenade = self; - - grenade thread thinkSmoke(); - - level.bots_smokeList ListAdd(grenade); -} - -/* - The smoke grenade logic. -*/ -thinkSmoke() -{ - while(isDefined(self.grenade)) - { - self.origin = self.grenade getOrigin(); - self.state = "moving"; - wait 0.05; - } - self.state = "smoking"; - wait 11.5; - - level.bots_smokeList ListRemove(self); -} - -/* - A thread for ALL players when they fire. -*/ -onWeaponFired() -{ - self endon("disconnect"); - self.bots_firing = false; - for(;;) - { - self waittill( "weapon_fired" ); - self thread doFiringThread(); - } -} - -/* - Lets bot's know that the player is firing. -*/ -doFiringThread() -{ - self endon("disconnect"); - self endon("weapon_fired"); - self.bots_firing = true; - wait 1; - self.bots_firing = false; -} +/* + _bot + Author: INeedGames + Date: 05/07/2021 + The entry point and manager of the bots. +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\bots\_bot_utility; + +/* + Initiates the whole bot scripts. +*/ +init() +{ + level.bw_VERSION = "2.0.1"; + + if(getDvar("bots_main") == "") + setDvar("bots_main", true); + + if (!getDvarInt("bots_main")) + return; + + thread load_waypoints(); + thread hook_callbacks(); + + if(getDvar("bots_main_GUIDs") == "") + setDvar("bots_main_GUIDs", "");//guids of players who will be given host powers, comma seperated + if(getDvar("bots_main_firstIsHost") == "") + setDvar("bots_main_firstIsHost", false);//first play to connect is a host + if(getDvar("bots_main_waitForHostTime") == "") + setDvar("bots_main_waitForHostTime", 10.0);//how long to wait to wait for the host player + + if(getDvar("bots_manage_add") == "") + setDvar("bots_manage_add", 0);//amount of bots to add to the game + if(getDvar("bots_manage_fill") == "") + setDvar("bots_manage_fill", 0);//amount of bots to maintain + if(getDvar("bots_manage_fill_spec") == "") + setDvar("bots_manage_fill_spec", true);//to count for fill if player is on spec team + if(getDvar("bots_manage_fill_mode") == "") + setDvar("bots_manage_fill_mode", 0);//fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 + if(getDvar("bots_manage_fill_kick") == "") + setDvar("bots_manage_fill_kick", false);//kick bots if too many + + if(getDvar("bots_team") == "") + setDvar("bots_team", "autoassign");//which team for bots to join + if(getDvar("bots_team_amount") == "") + setDvar("bots_team_amount", 0);//amount of bots on axis team + if(getDvar("bots_team_force") == "") + setDvar("bots_team_force", false);//force bots on team + if(getDvar("bots_team_mode") == "") + setDvar("bots_team_mode", 0);//counts just bots when 1 + + if(getDvar("bots_skill") == "") + setDvar("bots_skill", 0);//0 is random, 1 is easy 7 is hard, 8 is custom, 9 is completely random + if(getDvar("bots_skill_axis_hard") == "") + setDvar("bots_skill_axis_hard", 0);//amount of hard bots on axis team + if(getDvar("bots_skill_axis_med") == "") + setDvar("bots_skill_axis_med", 0); + if(getDvar("bots_skill_allies_hard") == "") + setDvar("bots_skill_allies_hard", 0); + if(getDvar("bots_skill_allies_med") == "") + setDvar("bots_skill_allies_med", 0); + + if(getDvar("bots_loadout_reasonable") == "")//filter out the bad 'guns' and perks + setDvar("bots_loadout_reasonable", false); + if(getDvar("bots_loadout_allow_op") == "")//allows jug, marty and laststand + setDvar("bots_loadout_allow_op", true); + if(getDvar("bots_loadout_rank") == "")// what rank the bots should be around, -1 is around the players, 0 is all random + setDvar("bots_loadout_rank", -1); + if(getDvar("bots_loadout_prestige") == "")// what pretige the bots will be, -1 is the players, -2 is random + setDvar("bots_loadout_prestige", -1); + + if(getDvar("bots_play_move") == "")//bots move + setDvar("bots_play_move", true); + if(getDvar("bots_play_knife") == "")//bots knife + setDvar("bots_play_knife", true); + if(getDvar("bots_play_fire") == "")//bots fire + setDvar("bots_play_fire", true); + if(getDvar("bots_play_nade") == "")//bots grenade + setDvar("bots_play_nade", true); + if(getDvar("bots_play_take_carepackages") == "")//bots take carepackages + setDvar("bots_play_take_carepackages", true); + if(getDvar("bots_play_obj") == "")//bots play the obj + setDvar("bots_play_obj", true); + if(getDvar("bots_play_camp") == "")//bots camp and follow + setDvar("bots_play_camp", true); + if(getDvar("bots_play_jumpdrop") == "")//bots jump and dropshot + setDvar("bots_play_jumpdrop", true); + if(getDvar("bots_play_target_other") == "")//bot target non play ents (vehicles) + setDvar("bots_play_target_other", true); + if(getDvar("bots_play_killstreak") == "")//bot use killstreaks + setDvar("bots_play_killstreak", true); + if(getDvar("bots_play_ads") == "")//bot ads + setDvar("bots_play_ads", true); + + if(!isDefined(game["botWarfare"])) + game["botWarfare"] = true; + + level.defuseObject = undefined; + level.bots_smokeList = List(); + level.bots_fragList = List(); + + level.bots_minSprintDistance = 315; + level.bots_minSprintDistance *= level.bots_minSprintDistance; + level.bots_minGrenadeDistance = 256; + level.bots_minGrenadeDistance *= level.bots_minGrenadeDistance; + level.bots_maxGrenadeDistance = 1024; + level.bots_maxGrenadeDistance *= level.bots_maxGrenadeDistance; + level.bots_maxKnifeDistance = 80; + level.bots_maxKnifeDistance *= level.bots_maxKnifeDistance; + level.bots_goalDistance = 27.5; + level.bots_goalDistance *= level.bots_goalDistance; + level.bots_noADSDistance = 200; + level.bots_noADSDistance *= level.bots_noADSDistance; + level.bots_maxShotgunDistance = 500; + level.bots_maxShotgunDistance *= level.bots_maxShotgunDistance; + level.bots_listenDist = 100; + + level.smokeRadius = 255; + + level.bots = []; + + level.bots_fullautoguns = []; + level.bots_fullautoguns["fmg9"] = true; + level.bots_fullautoguns["skorpion"] = true; + level.bots_fullautoguns["mp9"] = true; + level.bots_fullautoguns["g18"] = true; + level.bots_fullautoguns["mp5"] = true; + level.bots_fullautoguns["m9"] = true; + level.bots_fullautoguns["p90"] = true; + level.bots_fullautoguns["pp90m1"] = true; + level.bots_fullautoguns["ump45"] = true; + level.bots_fullautoguns["mp7"] = true; + level.bots_fullautoguns["ak47"] = true; + level.bots_fullautoguns["m4"] = true; + level.bots_fullautoguns["fad"] = true; + level.bots_fullautoguns["acr"] = true; + level.bots_fullautoguns["scar"] = true; + level.bots_fullautoguns["g36c"] = true; + level.bots_fullautoguns["cm901"] = true; + level.bots_fullautoguns["aa12"] = true; + level.bots_fullautoguns["m60"] = true; + level.bots_fullautoguns["mk46"] = true; + level.bots_fullautoguns["pecheneg"] = true; + level.bots_fullautoguns["sa80"] = true; + level.bots_fullautoguns["mg36"] = true; + + level.bots_fullautoguns["ak74u"] = true; + + level.bots_fullautoguns["25mm"] = true; + level.bots_fullautoguns["40mm"] = true; + level.bots_fullautoguns["105mm"] = true; + level.bots_fullautoguns["remote"] = true; + + level thread fixGamemodes(); + + level thread onPlayerConnect(); + level thread addNotifyOnAirdrops(); + level thread watchScrabler(); + level thread watchRadar(); + level thread auditModels(); + + level thread handleBots(); + + //level thread maps\mp\bots\_bot_http::doVersionCheck(); +} + +/* + Starts the threads for bots. +*/ +handleBots() +{ + level thread teamBots(); + level thread diffBots(); + level addBots(); + + while(!level.intermission) + wait 0.05; + + setDvar("bots_manage_add", getBotArray().size); +} + +/* + The hook callback for when any player becomes damaged. +*/ +onPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) +{ + if(self is_bot()) + { + self maps\mp\bots\_bot_internal::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); + self maps\mp\bots\_bot_script::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); + } + + self [[level.prevCallbackPlayerDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); +} + +/* + The hook callback when any player gets killed. +*/ +onPlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) +{ + if(self is_bot()) + { + self maps\mp\bots\_bot_internal::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); + self maps\mp\bots\_bot_script::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); + } + + self [[level.prevCallbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); +} + +/* + Starts the callbacks. +*/ +hook_callbacks() +{ + level waittill( "prematch_over" ); // iw4madmin waits this long for some reason... + wait 0.05; // so we need to be one frame after it sets up its callbacks. + level.prevCallbackPlayerDamage = level.callbackPlayerDamage; + level.callbackPlayerDamage = ::onPlayerDamage; + + level.prevCallbackPlayerKilled = level.callbackPlayerKilled; + level.callbackPlayerKilled = ::onPlayerKilled; +} + +/* + Fixes gamemodes when level starts. +*/ +fixGamemodes() +{ + for(i=0;i<19;i++) + { + if(isDefined(level.bombZones) && level.gametype == "sd") + { + for(i = 0; i < level.bombZones.size; i++) + level.bombZones[i].onUse = ::onUsePlantObjectFix; + break; + } + + if(isDefined(level.radios) && level.gametype == "koth") + { + level thread fixKoth(); + + break; + } + + if (isDefined(level.bombZones) && level.gametype == "dd") + { + level thread fixDem(); + + break; + } + + wait 0.05; + } +} + +/* + Converts t5 dd to iw4 +*/ +fixDem() +{ + for (;;) + { + level.bombAPlanted = level.aPlanted; + level.bombBPlanted = level.bPlanted; + + for (i = 0; i < level.bombZones.size; i++) + { + if (isDefined(level.bombZones[i].trigger.trigger_off)) + level.bombZones[i].bombExploded = true; + else + level.bombZones[i].bombExploded = undefined; + } + + wait 0.05; + } +} + +/* + Fixes the king of the hill headquarters obj +*/ +fixKoth() +{ + level.radio = undefined; + + for(;;) + { + wait 0.05; + + if(!isDefined(level.radioObject)) + { + continue; + } + + for(i = level.radios.size - 1; i >= 0; i--) + { + if(level.radioObject != level.radios[i].gameobject) + continue; + + level.radio = level.radios[i]; + break; + } + + while(isDefined(level.radioObject) && level.radio.gameobject == level.radioObject) + wait 0.05; + } +} + +/* + Loop +*/ +auditModels_loop() +{ + s_models = getEntArray("script_model", "classname"); + + for (i = s_models.size - 1; i >= 0; i--) + { + model = s_models[i]; + + if (!isDefined(model)) + continue; + + if (isDefined(model.bot_audit_model)) + continue; + + if (model.model == "com_deploy_ballistic_vest_friend_world") + { + model.bot_audit_model = true; + level.vest_boxes[level.vest_boxes.size] = model; + } + } +} + +/* + Audits all the important models cause iw5 script is kek +*/ +auditModels() +{ + level.vest_boxes = []; + + for (;;) + { + wait 0.05; + + level.vest_boxes = array_removeUndefined(level.vest_boxes); + + auditModels_loop(); + } +} + +/* + Loop +*/ +watchRadar_loop() +{ + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[i]; + player.bot_isInRadar = false; + } + + for ( i = level.players.size - 1; i >= 0; i-- ) + { + grenade = level.players[i].deployedPortableRadar; + + if ( !isDefined( grenade ) ) + continue; + + if (grenade.model != "weapon_radar") + continue; + + for ( h = level.players.size - 1; h >= 0; h-- ) + { + player = level.players[h]; + + if (!isReallyAlive(player)) + continue; + + if (isDefined(grenade.owner) && grenade.owner == player) + continue; + + if(level.teamBased && grenade.team == player.team) + continue; + + if (player _hasPerk("specialty_coldblooded")) + continue; + + if (DistanceSquared(player.origin, grenade.origin) > 256*256) + continue; + + player.bot_isInRadar = true; + } + } + + for ( i = level.players.size - 1; i >= 0; i-- ) + { + if ( !isDefined( level.players[i].personalRadar ) ) + continue; + + if (!isReallyAlive(level.players[i])) + continue; + + for ( h = level.players.size - 1; h >= 0; h-- ) + { + player = level.players[h]; + + if (!isReallyAlive(player)) + continue; + + if (level.players[i] == player) + continue; + + if(level.teamBased && level.players[i].team == player.team) + continue; + + if (player _hasPerk("specialty_coldblooded")) + continue; + + if (DistanceSquared(player.origin, level.players[i].origin) > 256*256) + continue; + + player.bot_isInRadar = true; + } + } +} + +/* + Watches radars +*/ +watchRadar() +{ + for (;;) + { + wait 1; + + watchRadar_loop(); + } +} + +/* + Loop +*/ +watchScrabler_loop() +{ + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[i]; + player.bot_isScrambled = false; + } + + for (i = level.scramblers.size - 1; i >= 0; i--) + { + scrambler = level.scramblers[i]; + + if ( !isDefined( scrambler ) ) + continue; + + for ( h = level.players.size - 1; h >= 0; h-- ) + { + player = level.players[h]; + + if (!isReallyAlive(player)) + continue; + + if (isDefined(scrambler.owner) && scrambler.owner == player) + continue; + + if(level.teamBased && scrambler.team == player.team) + continue; + + if (player _hasPerk("specialty_spygame")) + continue; + + if (DistanceSquared(player.origin, scrambler.origin) > 256*256) + continue; + + player.bot_isScrambled = true; + } + } + + drones = []; + if (isDefined(level.remote_uav["axis"])) + drones[drones.size] = level.remote_uav["axis"]; + if (isDefined(level.remote_uav["allies"])) + drones[drones.size] = level.remote_uav["allies"]; + + for (i = drones.size - 1; i >= 0; i--) + { + drone = drones[i]; + + for ( h = level.players.size - 1; h >= 0; h-- ) + { + player = level.players[h]; + + if (!isReallyAlive(player)) + continue; + + if (isDefined(drone.owner) && drone.owner == player) + continue; + + if(level.teamBased && drone.team == player.team) + continue; + + if (player _hasPerk("specialty_spygame")) + continue; + + if (DistanceSquared(player.origin, drone.origin) > 256*256) + continue; + + player.bot_isScrambled = true; + } + } +} + +/* + Watches scrambler +*/ +watchScrabler() +{ + for (;;) + { + wait 1; + + watchScrabler_loop(); + } +} + +/* + Loop +*/ +addNotifyOnAirdrops_loop() +{ + dropCrates = getEntArray( "care_package", "targetname" ); + + for (i = dropCrates.size - 1; i >= 0; i--) + { + airdrop = dropCrates[i]; + + if (!isDefined(airdrop.owner)) + continue; + + if (isDefined(airdrop.doingPhysics)) + continue; + + airdrop.doingPhysics = true; + airdrop thread doNotifyOnAirdrop(); + } +} + +/* + Adds a notify when the airdrop is dropped +*/ +addNotifyOnAirdrops() +{ + for (;;) + { + wait 1; + addNotifyOnAirdrops_loop(); + } +} + +/* + Does the notify +*/ +doNotifyOnAirdrop() +{ + self endon( "death" ); + self waittill( "physics_finished" ); + + self.doingPhysics = false; + self.owner notify("crate_physics_done"); +} + +/* + Thread when any player connects. Starts the threads needed. +*/ +onPlayerConnect() +{ + for(;;) + { + level waittill("connected", player); + + player.bot_isScrambled = false; + player.bot_isInRadar = false; + + player thread onGrenadeFire(); + player thread onWeaponFired(); + + player thread connected(); + } +} + +/* + When a bot disconnects. +*/ +onDisconnect() +{ + self waittill("disconnect"); + + level.bots = array_remove(level.bots, self); +} + +/* + Called when a player connects. +*/ +connected() +{ + self endon("disconnect"); + + if (!isDefined(self.pers["bot_host"])) + self thread doHostCheck(); + + if(!self is_bot()) + return; + + if (!isDefined(self.pers["isBot"])) + { + // fast_restart occured... + self.pers["isBot"] = true; + } + + if (!isDefined(self.pers["isBotWarfare"])) + { + self.pers["isBotWarfare"] = true; + self thread added(); + } + + self thread maps\mp\bots\_bot_internal::connected(); + self thread maps\mp\bots\_bot_script::connected(); + + level.bots[level.bots.size] = self; + self thread onDisconnect(); + + level notify("bot_connected", self); +} + +/* + When a bot gets added into the game. +*/ +added() +{ + self endon("disconnect"); + + self thread maps\mp\bots\_bot_internal::added(); + self thread maps\mp\bots\_bot_script::added(); +} + +/* + Adds a bot to the game. +*/ +add_bot() +{ + bot = addTestClient(); + + if (isdefined(bot)) + { + bot.pers["isBot"] = true; + bot.pers["isBotWarfare"] = true; + bot thread added(); + } +} + +/* + Loop +*/ +diffBots_loop() +{ + var_allies_hard = getDVarInt("bots_skill_allies_hard"); + var_allies_med = getDVarInt("bots_skill_allies_med"); + var_axis_hard = getDVarInt("bots_skill_axis_hard"); + var_axis_med = getDVarInt("bots_skill_axis_med"); + var_skill = getDvarInt("bots_skill"); + + allies_hard = 0; + allies_med = 0; + axis_hard = 0; + axis_med = 0; + + if(var_skill == 8) + { + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!isDefined(player.pers["team"])) + continue; + + if(!player is_bot()) + continue; + + if(player.pers["team"] == "axis") + { + if(axis_hard < var_axis_hard) + { + axis_hard++; + player.pers["bots"]["skill"]["base"] = 7; + } + else if(axis_med < var_axis_med) + { + axis_med++; + player.pers["bots"]["skill"]["base"] = 4; + } + else + player.pers["bots"]["skill"]["base"] = 1; + } + else if(player.pers["team"] == "allies") + { + if(allies_hard < var_allies_hard) + { + allies_hard++; + player.pers["bots"]["skill"]["base"] = 7; + } + else if(allies_med < var_allies_med) + { + allies_med++; + player.pers["bots"]["skill"]["base"] = 4; + } + else + player.pers["bots"]["skill"]["base"] = 1; + } + } + } + else if (var_skill != 0 && var_skill != 9) + { + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!player is_bot()) + continue; + + player.pers["bots"]["skill"]["base"] = var_skill; + } + } +} + +/* + A server thread for monitoring all bot's difficulty levels for custom server settings. +*/ +diffBots() +{ + for(;;) + { + wait 1.5; + + diffBots_loop(); + } +} + +/* + Loop +*/ +teamBots_loop() +{ + teamAmount = getDvarInt("bots_team_amount"); + toTeam = getDvar("bots_team"); + + alliesbots = 0; + alliesplayers = 0; + axisbots = 0; + axisplayers = 0; + + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!isDefined(player.pers["team"])) + continue; + + if(player is_bot()) + { + if(player.pers["team"] == "allies") + alliesbots++; + else if(player.pers["team"] == "axis") + axisbots++; + } + else + { + if(player.pers["team"] == "allies") + alliesplayers++; + else if(player.pers["team"] == "axis") + axisplayers++; + } + } + + allies = alliesbots; + axis = axisbots; + + if(!getDvarInt("bots_team_mode")) + { + allies += alliesplayers; + axis += axisplayers; + } + + if(toTeam != "custom") + { + if(getDvarInt("bots_team_force")) + { + if(toTeam == "autoassign") + { + if(abs(axis - allies) > 1) + { + toTeam = "axis"; + if(axis > allies) + toTeam = "allies"; + } + } + + if(toTeam != "autoassign") + { + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!isDefined(player.pers["team"])) + continue; + + if(!player is_bot()) + continue; + + if(player.pers["team"] == toTeam) + continue; + + if (toTeam == "allies") + player thread [[level.allies]](); + else if (toTeam == "axis") + player thread [[level.axis]](); + else + player thread [[level.spectator]](); + break; + } + } + } + } + else + { + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!isDefined(player.pers["team"])) + continue; + + if(!player is_bot()) + continue; + + if(player.pers["team"] == "axis") + { + if(axis > teamAmount) + { + player thread [[level.allies]](); + break; + } + } + else + { + if(axis < teamAmount) + { + player thread [[level.axis]](); + break; + } + else if(player.pers["team"] != "allies") + { + player thread [[level.allies]](); + break; + } + } + } + } +} + +/* + A server thread for monitoring all bot's teams for custom server settings. +*/ +teamBots() +{ + for(;;) + { + wait 1.5; + teamBots_loop(); + } +} + +/* + Loops +*/ +addBots_loop() +{ + botsToAdd = GetDvarInt("bots_manage_add"); + + if(botsToAdd > 0) + { + SetDvar("bots_manage_add", 0); + + if(botsToAdd > 64) + botsToAdd = 64; + + for(; botsToAdd > 0; botsToAdd--) + { + level add_bot(); + wait 0.25; + } + } + + fillMode = getDVarInt("bots_manage_fill_mode"); + + if(fillMode == 2 || fillMode == 3) + setDvar("bots_manage_fill", getGoodMapAmount()); + + fillAmount = getDvarInt("bots_manage_fill"); + + players = 0; + bots = 0; + spec = 0; + + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(player is_bot()) + bots++; + else if(!isDefined(player.pers["team"]) || (player.pers["team"] != "axis" && player.pers["team"] != "allies")) + spec++; + else + players++; + } + + if (!randomInt(999)) + { + setDvar("testclients_doreload", true); + wait 0.1; + setDvar("testclients_doreload", false); + doExtraCheck(); + } + + if(fillMode == 4) + { + axisplayers = 0; + alliesplayers = 0; + + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(player is_bot()) + continue; + + if(!isDefined(player.pers["team"])) + continue; + + if(player.pers["team"] == "axis") + axisplayers++; + else if(player.pers["team"] == "allies") + alliesplayers++; + } + + result = fillAmount - abs(axisplayers - alliesplayers) + bots; + + if (players == 0) + { + if(bots < fillAmount) + result = fillAmount-1; + else if (bots > fillAmount) + result = fillAmount+1; + else + result = fillAmount; + } + + bots = result; + } + + amount = bots; + if(fillMode == 0 || fillMode == 2) + amount += players; + if(getDVarInt("bots_manage_fill_spec")) + amount += spec; + + if(amount < fillAmount) + setDvar("bots_manage_add", 1); + else if(amount > fillAmount && getDvarInt("bots_manage_fill_kick")) + { + tempBot = random(getBotArray()); + if (isDefined(tempBot)) + kick(tempBot getEntityNumber()); + } +} + +/* + A server thread for monitoring all bot's in game. Will add and kick bots according to server settings. +*/ +addBots() +{ + level endon("game_ended"); + + bot_wait_for_host(); + + for(;;) + { + wait 1.5; + + addBots_loop(); + } +} + +/* + A thread for ALL players, will monitor and grenades thrown. +*/ +onGrenadeFire() +{ + self endon("disconnect"); + for(;;) + { + self waittill ( "grenade_fire", grenade, weaponName ); + + if (!isDefined(grenade)) + continue; + + grenade.name = weaponName; + + if(weaponName == "smoke_grenade_mp") + grenade thread AddToSmokeList(); + else if (isSubStr(weaponName, "frag_")) + grenade thread AddToFragList(self); + } +} + +/* + Adds a frag grenade to the list of all frags +*/ +AddToFragList(who) +{ + grenade = spawnstruct(); + grenade.origin = self getOrigin(); + grenade.velocity = (0, 0, 0); + grenade.grenade = self; + grenade.owner = who; + grenade.team = who.team; + grenade.throwback = undefined; + + grenade thread thinkFrag(); + + level.bots_fragList ListAdd(grenade); +} + +/* + Watches while the frag exists +*/ +thinkFrag() +{ + while(isDefined(self.grenade)) + { + nowOrigin = self.grenade getOrigin(); + self.velocity = (nowOrigin - self.origin)*20; + self.origin = nowOrigin; + + wait 0.05; + } + + level.bots_fragList ListRemove(self); +} + +/* + Adds a smoke grenade to the list of smokes in the game. Used to prevent bots from seeing through smoke. +*/ +AddToSmokeList() +{ + grenade = spawnstruct(); + grenade.origin = self getOrigin(); + grenade.state = "moving"; + grenade.grenade = self; + + grenade thread thinkSmoke(); + + level.bots_smokeList ListAdd(grenade); +} + +/* + The smoke grenade logic. +*/ +thinkSmoke() +{ + while(isDefined(self.grenade)) + { + self.origin = self.grenade getOrigin(); + self.state = "moving"; + wait 0.05; + } + self.state = "smoking"; + wait 11.5; + + level.bots_smokeList ListRemove(self); +} + +/* + A thread for ALL players when they fire. +*/ +onWeaponFired() +{ + self endon("disconnect"); + self.bots_firing = false; + for(;;) + { + self waittill( "weapon_fired" ); + self thread doFiringThread(); + } +} + +/* + Lets bot's know that the player is firing. +*/ +doFiringThread() +{ + self endon("disconnect"); + self endon("weapon_fired"); + self.bots_firing = true; + wait 1; + self.bots_firing = false; +} diff --git a/maps/mp/bots/_bot_internal.gsc b/raw/maps/mp/bots/_bot_internal.gsc similarity index 100% rename from maps/mp/bots/_bot_internal.gsc rename to raw/maps/mp/bots/_bot_internal.gsc diff --git a/maps/mp/bots/_bot_script.gsc b/raw/maps/mp/bots/_bot_script.gsc similarity index 100% rename from maps/mp/bots/_bot_script.gsc rename to raw/maps/mp/bots/_bot_script.gsc diff --git a/maps/mp/bots/_bot_utility.gsc b/raw/maps/mp/bots/_bot_utility.gsc similarity index 96% rename from maps/mp/bots/_bot_utility.gsc rename to raw/maps/mp/bots/_bot_utility.gsc index f3b3aed..05e6bc6 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/raw/maps/mp/bots/_bot_utility.gsc @@ -1,2850 +1,2850 @@ -/* - _bot_utility - Author: INeedGames - Date: 05/07/2021 - The shared functions for bots -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; - -/* - Returns if player is the host -*/ -is_host() -{ - return (isDefined(self.pers["bot_host"]) && self.pers["bot_host"]); -} - -/* - Setups the host variable on the player -*/ -doHostCheck() -{ - self.pers["bot_host"] = false; - - if (self is_bot()) - return; - - result = false; - if (getDvar("bots_main_firstIsHost") != "0") - { - printLn("WARNING: bots_main_firstIsHost is enabled"); - - if (getDvar("bots_main_firstIsHost") == "1") - { - setDvar("bots_main_firstIsHost", self getguid()); - } - - if (getDvar("bots_main_firstIsHost") == self getguid()+"") - result = true; - } - - DvarGUID = getDvar("bots_main_GUIDs"); - if (DvarGUID != "") - { - guids = strtok(DvarGUID, ","); - - for (i = 0; i < guids.size; i++) - { - if(self getguid()+"" == guids[i]) - result = true; - } - } - - if (!self isHost() && !result) - return; - - self.pers["bot_host"] = true; -} - -/* - Returns if the player is a bot. -*/ -is_bot() -{ - assert(isDefined(self)); - assert(isPlayer(self)); - - return ((isDefined(self.pers["isBot"]) && self.pers["isBot"]) || (isDefined(self.pers["isBotWarfare"]) && self.pers["isBotWarfare"]) || isSubStr( self getguid()+"", "bot" )); -} - -/* - Bot changes to the weap -*/ -BotChangeToWeapon(weap) -{ - self maps\mp\bots\_bot_internal::changeToWeap(weap); -} - -/* - Bot presses the frag button for time. -*/ -BotPressFrag(time) -{ - self maps\mp\bots\_bot_internal::frag(time); -} - -/* - Bot presses the smoke button for time. -*/ -BotPressSmoke(time) -{ - self maps\mp\bots\_bot_internal::smoke(time); -} - -/* - Bot presses the use button for time. -*/ -BotPressUse(time) -{ - self maps\mp\bots\_bot_internal::use(time); -} - -/* - Bot will press the ads button for the time -*/ -BotPressADS(time) -{ - self maps\mp\bots\_bot_internal::pressAds(time); -} - -/* - Bots will press the attack button for a time -*/ -BotPressAttack(time) -{ - self maps\mp\bots\_bot_internal::pressFire(time); -} - -/* - Returns a random number thats different everytime it changes target -*/ -BotGetTargetRandom() -{ - if (!isDefined(self.bot.target)) - return undefined; - - return self.bot.target.rand; -} - -/* - Returns the bot's random assigned number. -*/ -BotGetRandom() -{ - return self.bot.rand; -} - -/* - Returns if the bot is pressing frag button. -*/ -IsBotFragging() -{ - return self.bot.isfraggingafter; -} - -/* - Returns if the bot is pressing smoke button. -*/ -IsBotSmoking() -{ - return self.bot.issmokingafter; -} - -/* - Returns if the bot is sprinting. -*/ -IsBotSprinting() -{ - return self.bot.issprinting; -} - -/* - Returns if the bot is reloading. -*/ -IsBotReloading() -{ - return self.bot.isreloading; -} - -/* - Is bot knifing -*/ -IsBotKnifing() -{ - return self.bot.isknifingafter; -} - -/* - Freezes the bot's controls. -*/ -BotFreezeControls(what) -{ - self.bot.isfrozen = what; - if(what) - self notify("kill_goal"); -} - -/* - Returns if the bot is script frozen. -*/ -BotIsFrozen() -{ - return self.bot.isfrozen; -} - -/* - Bot will stop moving -*/ -BotStopMoving(what) -{ - self.bot.stop_move = what; - - if(what) - self notify("kill_goal"); -} - -/* - Returns if the bot has a script goal. - (like t5 gsc bot) -*/ -HasScriptGoal() -{ - return (isDefined(self GetScriptGoal())); -} - -/* - Sets the bot's goal, will acheive it when dist away from it. -*/ -SetScriptGoal(goal, dist) -{ - if (!isDefined(dist)) - dist = 16; - self.bot.script_goal = goal; - self.bot.script_goal_dist = dist; - waittillframeend; - self notify("new_goal_internal"); - self notify("new_goal"); -} - -/* - Returns the pos of the bot's goal -*/ -GetScriptGoal() -{ - return self.bot.script_goal; -} - -/* - Clears the bot's goal. -*/ -ClearScriptGoal() -{ - self SetScriptGoal(undefined, 0); -} - -/* - Returns the location of the bot's javelin target -*/ -HasBotJavelinLocation() -{ - return isDefined(self.bot.jav_loc); -} - -/* - Sets the aim position of the bot -*/ -SetScriptAimPos(pos) -{ - self.bot.script_aimpos = pos; -} - -/* - Clears the aim position of the bot -*/ -ClearScriptAimPos() -{ - self SetScriptAimPos(undefined); -} - -/* - Returns the aim position of the bot -*/ -GetScriptAimPos() -{ - return self.bot.script_aimpos; -} - -/* - Returns if the bot has a aim pos -*/ -HasScriptAimPos() -{ - return isDefined(self GetScriptAimPos()); -} - -/* - Sets the bot's javelin target location -*/ -SetBotJavelinLocation(loc) -{ - self.bot.jav_loc = loc; - self notify("new_enemy"); -} - -/* - Clears the bot's javelin location -*/ -ClearBotJavelinLocation() -{ - self SetBotJavelinLocation(undefined); -} - -/* - Sets the bot's target to be this ent. -*/ -SetAttacker(att) -{ - self.bot.target_this_frame = att; -} - -/* - Sets the script enemy for a bot. -*/ -SetScriptEnemy(enemy, offset) -{ - self.bot.script_target = enemy; - self.bot.script_target_offset = offset; -} - -/* - Removes the script enemy of the bot. -*/ -ClearScriptEnemy() -{ - self SetScriptEnemy(undefined, undefined); -} - -/* - Returns the entity of the bot's target. -*/ -GetThreat() -{ - if(!isdefined(self.bot.target)) - return undefined; - - return self.bot.target.entity; -} - -/* - Returns if the bot has a script enemy. -*/ -HasScriptEnemy() -{ - return (isDefined(self.bot.script_target)); -} - -/* - Returns if the bot has a threat. -*/ -HasThreat() -{ - return (isDefined(self GetThreat())); -} - -/* - If the player is defusing -*/ -IsDefusing() -{ - return (isDefined(self.isDefusing) && self.isDefusing); -} - -/* - If the play is planting -*/ -isPlanting() -{ - return (isDefined(self.isPlanting) && self.isPlanting); -} - -/* - If the player is carrying a bomb -*/ -isBombCarrier() -{ - return (isDefined(self.isBombCarrier) && self.isBombCarrier); -} - -/* - If the site is in use -*/ -isInUse() -{ - return (isDefined(self.inUse) && self.inUse); -} - -/* - If the player is in laststand -*/ -inLastStand() -{ - return (isDefined(self.lastStand) && self.lastStand); -} - -/* - If the player is in final stand -*/ -inFinalStand() -{ - return (isDefined(self.inFinalStand) && self.inFinalStand); -} - -/* - If the player is the flag carrier -*/ -isFlagCarrier() -{ - return (isDefined(self.carryFlag) && self.carryFlag); -} - -/* - Returns if we are stunned. -*/ -IsStunned() -{ - return (isdefined(self.concussionEndTime) && self.concussionEndTime > gettime()); -} - -/* - Returns if we are beingArtilleryShellshocked -*/ -isArtShocked() -{ - return (isDefined(self.beingArtilleryShellshocked) && self.beingArtilleryShellshocked); -} - -/* - Returns a valid grenade launcher weapon -*/ -getValidTube() -{ - weaps = self getweaponslistall(); - - for (i = 0; i < weaps.size; i++) - { - weap = weaps[i]; - - if(!self getAmmoCount(weap)) - continue; - - if ((isSubStr(weap, "alt_") && (isSubStr(weap, "_m320") || isSubStr(weap, "_gl") || isSubStr(weap, "_gp25"))) || weap == "m320_mp") - return weap; - } - - return undefined; -} - -/* - Returns a random grenade in the bot's inventory. -*/ -getValidGrenade() -{ - grenadeTypes = []; - grenadeTypes[grenadeTypes.size] = "frag_grenade_mp"; - grenadeTypes[grenadeTypes.size] = "smoke_grenade_mp"; - grenadeTypes[grenadeTypes.size] = "flash_grenade_mp"; - grenadeTypes[grenadeTypes.size] = "concussion_grenade_mp"; - grenadeTypes[grenadeTypes.size] = "semtex_mp"; - grenadeTypes[grenadeTypes.size] = "throwingknife_mp"; - grenadeTypes[grenadeTypes.size] = "emp_grenade_mp"; - - possibles = []; - - for(i = 0; i < grenadeTypes.size; i++) - { - if ( !self hasWeapon( grenadeTypes[i] ) ) - continue; - - if ( !self getAmmoCount( grenadeTypes[i] ) ) - continue; - - possibles[possibles.size] = grenadeTypes[i]; - } - - return random(possibles); -} - -/* - If the weapon is not a script weapon (bomb, killstreak, etc, grenades) -*/ -isWeaponPrimary(weap) -{ - return (maps\mp\gametypes\_weapons::isPrimaryWeapon(weap) || maps\mp\gametypes\_weapons::isAltModeWeapon(weap)); -} - -/* - If the ent is a vehicle -*/ -entIsVehicle(ent) -{ - return (!isPlayer(ent) && (ent.classname == "script_vehicle" || ent.model == "vehicle_uav_static_mp" || ent.model == "vehicle_ac130_coop" || ent.model == "vehicle_predator_b" || ent.model == "vehicle_phantom_ray")); -} - -/* - Returns if the given weapon is full auto. -*/ -WeaponIsFullAuto(weap) -{ - weaptoks = strtok(weap, "_"); - - if (weaptoks.size < 2) - return false; - - return isDefined(level.bots_fullautoguns[weaptoks[1]]); -} - -/* - If weap is a secondary gnade -*/ -isSecondaryGrenade(gnade) -{ - return (gnade == "concussion_grenade_mp" || gnade == "flash_grenade_mp" || gnade == "smoke_grenade_mp" || gnade == "trophy_mp" || gnade == "emp_grenade_mp" || gnade == "flare_mp" || gnade == "scrambler_mp" || gnade == "portable_radar_mp"); -} - -/* - If the weapon is allowed to be dropped -*/ -isWeaponDroppable(weap) -{ - return (maps\mp\gametypes\_weapons::mayDropWeapon(weap)); -} - -/* - Returns the height the viewpos is above the origin -*/ -getEyeHeight() -{ - myEye = self getEye(); - - return myEye[2] - self.origin[2]; -} - -/* - Does a notify after a delay -*/ -notifyAfterDelay(delay, not) -{ - wait delay; - self notify(not); -} - -/* - Gets a player who is host -*/ -GetHostPlayer() -{ - for (i = 0; i < level.players.size; i++) - { - player = level.players[i]; - - if (!player is_host()) - continue; - - return player; - } - - return undefined; -} - -/* - Waits for a host player -*/ -bot_wait_for_host() -{ - host = undefined; - - while (!isDefined(level) || !isDefined(level.players)) - wait 0.05; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - host = GetHostPlayer(); - - if(isDefined(host)) - break; - - wait 0.05; - } - - if(!isDefined(host)) - return; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - if(IsDefined( host.pers[ "team" ] )) - break; - - wait 0.05; - } - - if(!IsDefined( host.pers[ "team" ] )) - return; - - for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) - { - if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis") - break; - - wait 0.05; - } -} - -/* - Pezbot's line sphere intersection. - http://paulbourke.net/geometry/circlesphere/raysphere.c -*/ -RaySphereIntersect(start, end, spherePos, radius) -{ - // check if the start or end points are in the sphere - r2 = radius * radius; - if (DistanceSquared(start, spherePos) < r2) - return true; - - if (DistanceSquared(end, spherePos) < r2) - return true; - - // check if the line made by start and end intersect the sphere - dp = end - start; - a = dp[0] * dp[0] + dp[1] * dp[1] + dp[2] * dp[2]; - b = 2 * (dp[0] * (start[0] - spherePos[0]) + dp[1] * (start[1] - spherePos[1]) + dp[2] * (start[2] - spherePos[2])); - c = spherePos[0] * spherePos[0] + spherePos[1] * spherePos[1] + spherePos[2] * spherePos[2]; - c += start[0] * start[0] + start[1] * start[1] + start[2] * start[2]; - c -= 2.0 * (spherePos[0] * start[0] + spherePos[1] * start[1] + spherePos[2] * start[2]); - c -= radius * radius; - bb4ac = b * b - 4.0 * a * c; - - if (abs(a) < 0.0001 || bb4ac < 0) - return false; - - mu1 = (0-b + sqrt(bb4ac)) / (2 * a); - //mu2 = (0-b - sqrt(bb4ac)) / (2 * a); - - // intersection points of the sphere - ip1 = start + mu1 * dp; - //ip2 = start + mu2 * dp; - - myDist = DistanceSquared(start, end); - - // check if both intersection points far - if (DistanceSquared(start, ip1) > myDist/* && DistanceSquared(start, ip2) > myDist*/) - return false; - - dpAngles = VectorToAngles(dp); - - // check if the point is behind us - if (getConeDot(ip1, start, dpAngles) < 0/* || getConeDot(ip2, start, dpAngles) < 0*/) - return false; - - return true; -} - -/* - Returns if a smoke grenade would intersect start to end line. -*/ -SmokeTrace(start, end, rad) -{ - for(i = level.bots_smokeList.count - 1; i >= 0; i--) - { - nade = level.bots_smokeList.data[i]; - - if(nade.state != "smoking") - continue; - - if(!RaySphereIntersect(start, end, nade.origin, rad)) - continue; - - return false; - } - - return true; -} - -/* - Returns the cone dot (like fov, or distance from the center of our screen). -*/ -getConeDot(to, from, dir) -{ - dirToTarget = VectorNormalize(to-from); - forward = AnglesToForward(dir); - return vectordot(dirToTarget, forward); -} - -/* - Returns the distance squared in a 2d space -*/ -DistanceSquared2D(to, from) -{ - to = (to[0], to[1], 0); - from = (from[0], from[1], 0); - - return DistanceSquared(to, from); -} - -/* - Rounds to the nearest whole number. -*/ -Round(x) -{ - y = int(x); - - if(abs(x) - abs(y) > 0.5) - { - if(x < 0) - return y - 1; - else - return y + 1; - } - else - return y; -} - -/* - Rounds up the given value. -*/ -RoundUp( floatVal ) -{ - i = int( floatVal ); - if ( i != floatVal ) - return i + 1; - else - return i; -} - -/* - converts a string into a float -*/ -float(num) -{ - setdvar("temp_dvar_bot_util", num); - - return GetDvarFloat("temp_dvar_bot_util"); -} - -/* - Tokenizes a string (strtok has limits...) (only one char tok) -*/ -tokenizeLine(line, tok) -{ - tokens = []; - - token = ""; - for (i = 0; i < line.size; i++) - { - c = line[i]; - - if (c == tok) - { - tokens[tokens.size] = token; - token = ""; - continue; - } - - token += c; - } - tokens[tokens.size] = token; - - return tokens; -} - -/* - If the string starts with -*/ -isStrStart( string1, subStr ) -{ - return ( getSubStr( string1, 0, subStr.size ) == subStr ); -} - -/* - Parses tokens into a waypoint obj -*/ -parseTokensIntoWaypoint(tokens) -{ - waypoint = spawnStruct(); - - orgStr = tokens[0]; - orgToks = strtok(orgStr, " "); - waypoint.origin = (float(orgToks[0]), float(orgToks[1]), float(orgToks[2])); - - childStr = tokens[1]; - childToks = strtok(childStr, " "); - waypoint.children = []; - for( j=0; j dist) - continue; - - return true; - } - - return false; -} - -/* - Returns the waypoints that are near -*/ -waypointsNear(waypoints, dist) -{ - dist *= dist; - - answer = []; - - for (i = 0; i < waypoints.size; i++) - { - wp = level.waypoints[waypoints[i]]; - - if (DistanceSquared(wp.origin, self.origin) > dist) - continue; - - answer[answer.size] = waypoints[i]; - } - - return answer; -} - -/* - Returns nearest waypoint of waypoints -*/ -getNearestWaypointOfWaypoints(waypoints) -{ - answer = undefined; - closestDist = 2147483647; - for (i = 0; i < waypoints.size; i++) - { - waypoint = level.waypoints[waypoints[i]]; - thisDist = DistanceSquared(self.origin, waypoint.origin); - - if (isDefined(answer) && thisDist > closestDist) - continue; - - answer = waypoints[i]; - closestDist = thisDist; - } - - return answer; -} - -/* - Returns all waypoints of type -*/ -getWaypointsOfType(type) -{ - answer = []; - for(i = 0; i < level.waypointCount; i++) - { - wp = level.waypoints[i]; - - if (type == "camp") - { - if (wp.type != "crouch") - continue; - - if (wp.children.size != 1) - continue; - } - else if (type != wp.type) - continue; - - answer[answer.size] = i; - } - return answer; -} - -/* - Returns the waypoint for index -*/ -getWaypointForIndex(i) -{ - if (!isDefined(i)) - return undefined; - - return level.waypoints[i]; -} - -/* - Returns the friendly user name for a given map's codename -*/ -getMapName(mapname) -{ - switch(mapname) - { - case "mp_dome": - return "Dome"; - default: - return mapname; - } -} - -/* - Returns a good amount of players. -*/ -getGoodMapAmount() -{ - switch(getdvar("mapname")) - { - case "mp_dome": - if (level.teambased) - return 8; - else - return 5; - default: - return 2; - } -} - -/* - Matches a num to a char -*/ -keyCodeToString(a) -{ - b=""; - switch(a) - { - case 0: b= "a"; break; - case 1: b= "b"; break; - case 2: b= "c"; break; - case 3: b= "d"; break; - case 4: b= "e"; break; - case 5: b= "f"; break; - case 6: b= "g"; break; - case 7: b= "h"; break; - case 8: b= "i"; break; - case 9: b= "j"; break; - case 10: b= "k"; break; - case 11: b= "l"; break; - case 12: b= "m"; break; - case 13: b= "n"; break; - case 14: b= "o"; break; - case 15: b= "p"; break; - case 16: b= "q"; break; - case 17: b= "r"; break; - case 18: b= "s"; break; - case 19: b= "t"; break; - case 20: b= "u"; break; - case 21: b= "v"; break; - case 22: b= "w"; break; - case 23: b= "x"; break; - case 24: b= "y"; break; - case 25: b= "z"; break; - case 26: b= "."; break; - case 27: b= " "; break; - } - return b; -} - -/* - Returns an array of all the bots in the game. -*/ -getBotArray() -{ - result = []; - playercount = level.players.size; - for(i = 0; i < playercount; i++) - { - player = level.players[i]; - - if(!player is_bot()) - continue; - - result[result.size] = player; - } - - return result; -} - -/* - We return a balanced KDTree from the waypoints. -*/ -WaypointsToKDTree() -{ - kdTree = KDTree(); - - kdTree _WaypointsToKDTree(level.waypoints, 0); - - return kdTree; -} - -/* - Recurive function. We construct a balanced KD tree by sorting the waypoints using heap sort. -*/ -_WaypointsToKDTree(waypoints, dem) -{ - if(!waypoints.size) - return; - - callbacksort = undefined; - - switch(dem) - { - case 0: - callbacksort = ::HeapSortCoordX; - break; - case 1: - callbacksort = ::HeapSortCoordY; - break; - case 2: - callbacksort = ::HeapSortCoordZ; - break; - } - - heap = NewHeap(callbacksort); - - for(i = 0; i < waypoints.size; i++) - { - heap HeapInsert(waypoints[i]); - } - - sorted = []; - while(heap.data.size) - { - sorted[sorted.size] = heap.data[0]; - heap HeapRemove(); - } - - median = int(sorted.size/2);//use divide and conq - - left = []; - right = []; - for(i = 0; i < sorted.size; i++) - if(i < median) - right[right.size] = sorted[i]; - else if(i > median) - left[left.size] = sorted[i]; - - self KDTreeInsert(sorted[median]); - - _WaypointsToKDTree(left, (dem+1)%3); - - _WaypointsToKDTree(right, (dem+1)%3); -} - -/* - Returns a new list. -*/ -List() -{ - list = spawnStruct(); - list.count = 0; - list.data = []; - - return list; -} - -/* - Adds a new thing to the list. -*/ -ListAdd(thing) -{ - self.data[self.count] = thing; - - self.count++; -} - -/* - Adds to the start of the list. -*/ -ListAddFirst(thing) -{ - for (i = self.count - 1; i >= 0; i--) - { - self.data[i + 1] = self.data[i]; - } - - self.data[0] = thing; - self.count++; -} - -/* - Removes the thing from the list. -*/ -ListRemove(thing) -{ - for ( i = 0; i < self.count; i++ ) - { - if ( self.data[i] == thing ) - { - while ( i < self.count-1 ) - { - self.data[i] = self.data[i+1]; - i++; - } - - self.data[i] = undefined; - self.count--; - break; - } - } -} - -/* - Returns a new KDTree. -*/ -KDTree() -{ - kdTree = spawnStruct(); - kdTree.root = undefined; - kdTree.count = 0; - - return kdTree; -} - -/* - Called on a KDTree. Will insert the object into the KDTree. -*/ -KDTreeInsert(data)//as long as what you insert has a .origin attru, it will work. -{ - self.root = self _KDTreeInsert(self.root, data, 0, -2147483647, -2147483647, -2147483647, 2147483647, 2147483647, 2147483647); -} - -/* - Recurive function that insert the object into the KDTree. -*/ -_KDTreeInsert(node, data, dem, x0, y0, z0, x1, y1, z1) -{ - if(!isDefined(node)) - { - r = spawnStruct(); - r.data = data; - r.left = undefined; - r.right = undefined; - r.x0 = x0; - r.x1 = x1; - r.y0 = y0; - r.y1 = y1; - r.z0 = z0; - r.z1 = z1; - - self.count++; - - return r; - } - - switch(dem) - { - case 0: - if(data.origin[0] < node.data.origin[0]) - node.left = self _KDTreeInsert(node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1); - else - node.right = self _KDTreeInsert(node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1); - break; - case 1: - if(data.origin[1] < node.data.origin[1]) - node.left = self _KDTreeInsert(node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1); - else - node.right = self _KDTreeInsert(node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1); - break; - case 2: - if(data.origin[2] < node.data.origin[2]) - node.left = self _KDTreeInsert(node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2]); - else - node.right = self _KDTreeInsert(node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1); - break; - } - - return node; -} - -/* - Called on a KDTree, will return the nearest object to the given origin. -*/ -KDTreeNearest(origin) -{ - if(!isDefined(self.root)) - return undefined; - - return self _KDTreeNearest(self.root, origin, self.root.data, DistanceSquared(self.root.data.origin, origin), 0); -} - -/* - Recurive function that will retrieve the closest object to the query. -*/ -_KDTreeNearest(node, point, closest, closestdist, dem) -{ - if(!isDefined(node)) - { - return closest; - } - - thisDis = DistanceSquared(node.data.origin, point); - - if(thisDis < closestdist) - { - closestdist = thisDis; - closest = node.data; - } - - if(node RectDistanceSquared(point) < closestdist) - { - near = node.left; - far = node.right; - if(point[dem] > node.data.origin[dem]) - { - near = node.right; - far = node.left; - } - - closest = self _KDTreeNearest(near, point, closest, closestdist, (dem+1)%3); - - closest = self _KDTreeNearest(far, point, closest, DistanceSquared(closest.origin, point), (dem+1)%3); - } - - return closest; -} - -/* - Called on a rectangle, returns the distance from origin to the rectangle. -*/ -RectDistanceSquared(origin) -{ - dx = 0; - dy = 0; - dz = 0; - - if(origin[0] < self.x0) - dx = origin[0] - self.x0; - else if(origin[0] > self.x1) - dx = origin[0] - self.x1; - - if(origin[1] < self.y0) - dy = origin[1] - self.y0; - else if(origin[1] > self.y1) - dy = origin[1] - self.y1; - - - if(origin[2] < self.z0) - dz = origin[2] - self.z0; - else if(origin[2] > self.z1) - dz = origin[2] - self.z1; - - return dx*dx + dy*dy + dz*dz; -} - -/* - Does the extra check when adding bots -*/ -doExtraCheck() -{ - maps\mp\bots\_bot_internal::checkTheBots(); -} - -/* - A heap invarient comparitor, used for objects, objects with a higher X coord will be first in the heap. -*/ -HeapSortCoordX(item, item2) -{ - return item.origin[0] > item2.origin[0]; -} - -/* - A heap invarient comparitor, used for objects, objects with a higher Y coord will be first in the heap. -*/ -HeapSortCoordY(item, item2) -{ - return item.origin[1] > item2.origin[1]; -} - -/* - A heap invarient comparitor, used for objects, objects with a higher Z coord will be first in the heap. -*/ -HeapSortCoordZ(item, item2) -{ - return item.origin[2] > item2.origin[2]; -} - -/* - A heap invarient comparitor, used for numbers, numbers with the highest number will be first in the heap. -*/ -Heap(item, item2) -{ - return item > item2; -} - -/* - A heap invarient comparitor, used for numbers, numbers with the lowest number will be first in the heap. -*/ -ReverseHeap(item, item2) -{ - return item < item2; -} - -/* - A heap invarient comparitor, used for traces. Wanting the trace with the largest length first in the heap. -*/ -HeapTraceFraction(item, item2) -{ - return item["fraction"] > item2["fraction"]; -} - -/* - Returns a new heap. -*/ -NewHeap(compare) -{ - heap_node = spawnStruct(); - heap_node.data = []; - heap_node.compare = compare; - - return heap_node; -} - -/* - Inserts the item into the heap. Called on a heap. -*/ -HeapInsert(item) -{ - insert = self.data.size; - self.data[insert] = item; - - current = insert+1; - - while(current > 1) - { - last = current; - current = int(current/2); - - if(![[self.compare]](item, self.data[current-1])) - break; - - self.data[last-1] = self.data[current-1]; - self.data[current-1] = item; - } -} - -/* - Helper function to determine what is the next child of the bst. -*/ -_HeapNextChild(node, hsize) -{ - left = node * 2; - right = left + 1; - - if(left > hsize) - return -1; - - if(right > hsize) - return left; - - if([[self.compare]](self.data[left-1], self.data[right-1])) - return left; - else - return right; -} - -/* - Removes an item from the heap. Called on a heap. -*/ -HeapRemove() -{ - remove = self.data.size; - - if(!remove) - return remove; - - move = self.data[remove-1]; - self.data[0] = move; - self.data[remove-1] = undefined; - remove--; - - if(!remove) - return remove; - - last = 1; - next = self _HeapNextChild(1, remove); - - while(next != -1) - { - if([[self.compare]](move, self.data[next-1])) - break; - - self.data[last-1] = self.data[next-1]; - self.data[next-1] = move; - - last = next; - next = self _HeapNextChild(next, remove); - } - - return remove; -} - -/* - A heap invarient comparitor, used for the astar's nodes, wanting the node with the lowest f to be first in the heap. -*/ -ReverseHeapAStar(item, item2) -{ - return item.f < item2.f; -} - -/* - Removes the waypoint usage -*/ -RemoveWaypointUsage(wp, team) -{ - if (!isDefined(level.waypointUsage)) - return; - - if (!isDefined(level.waypointUsage[team][wp+""])) - return; - - level.waypointUsage[team][wp+""]--; - - if (level.waypointUsage[team][wp+""] <= 0) - level.waypointUsage[team][wp+""] = undefined; -} - -/* - Will linearly search for the nearest waypoint to pos that has a direct line of sight. -*/ -GetNearestWaypointWithSight(pos) -{ - candidate = undefined; - dist = 2147483647; - - for(i = 0; i < level.waypointCount; i++) - { - if(!bulletTracePassed(pos + (0, 0, 15), level.waypoints[i].origin + (0, 0, 15), false, undefined)) - continue; - - curdis = DistanceSquared(level.waypoints[i].origin, pos); - if(curdis > dist) - continue; - - dist = curdis; - candidate = i; - } - - return candidate; -} - -/* - Will linearly search for the nearest waypoint -*/ -GetNearestWaypoint(pos) -{ - candidate = undefined; - dist = 2147483647; - - for(i = 0; i < level.waypointCount; i++) - { - curdis = DistanceSquared(level.waypoints[i].origin, pos); - if(curdis > dist) - continue; - - dist = curdis; - candidate = i; - } - - return candidate; -} - -/* - Modified Pezbot astar search. - This makes use of sets for quick look up and a heap for a priority queue instead of simple lists which require to linearly search for elements everytime. - It is also modified to make paths with bots already on more expensive and will try a less congested path first. Thus spliting up the bots onto more paths instead of just one (the smallest). -*/ -AStarSearch(start, goal, team, greedy_path) -{ - open = NewHeap(::ReverseHeapAStar);//heap - openset = [];//set for quick lookup - closed = [];//set for quick lookup - - - startWp = getNearestWaypoint(start); - if(!isDefined(startWp)) - return []; - - _startwp = undefined; - if(!bulletTracePassed(start + (0, 0, 15), level.waypoints[startWp].origin + (0, 0, 15), false, undefined)) - _startwp = GetNearestWaypointWithSight(start); - - if(isDefined(_startwp)) - startWp = _startwp; - - - goalWp = getNearestWaypoint(goal); - if(!isDefined(goalWp)) - return []; - - _goalWp = undefined; - if(!bulletTracePassed(goal + (0, 0, 15), level.waypoints[goalWp].origin + (0, 0, 15), false, undefined)) - _goalwp = GetNearestWaypointWithSight(goal); - - if(isDefined(_goalwp)) - goalWp = _goalwp; - - - node = spawnStruct(); - node.g = 0; //path dist so far - node.h = DistanceSquared(level.waypoints[startWp].origin, level.waypoints[goalWp].origin); //herustic, distance to goal for path finding - node.f = node.h + node.g; // combine path dist and heru, use reverse heap to sort the priority queue by this attru - node.index = startWp; - node.parent = undefined; //we are start, so we have no parent - - //push node onto queue - openset[node.index+""] = node; - open HeapInsert(node); - - //while the queue is not empty - while(open.data.size) - { - //pop bestnode from queue - bestNode = open.data[0]; - open HeapRemove(); - openset[bestNode.index+""] = undefined; - wp = level.waypoints[bestNode.index]; - - //check if we made it to the goal - if(bestNode.index == goalWp) - { - path = []; - - while(isDefined(bestNode)) - { - if(isdefined(team) && isDefined(level.waypointUsage)) - { - if (!isDefined(level.waypointUsage[team][bestNode.index+""])) - level.waypointUsage[team][bestNode.index+""] = 0; - - level.waypointUsage[team][bestNode.index+""]++; - } - - //construct path - path[path.size] = bestNode.index; - - bestNode = bestNode.parent; - } - - return path; - } - - //for each child of bestnode - for(i = wp.children.size - 1; i >= 0; i--) - { - child = wp.children[i]; - childWp = level.waypoints[child]; - - penalty = 1; - if(!greedy_path && isdefined(team) && isDefined(level.waypointUsage)) - { - temppen = 1; - if (isDefined(level.waypointUsage[team][child+""])) - temppen = level.waypointUsage[team][child+""];//consider how many bots are taking this path - - if(temppen > 1) - penalty = temppen; - } - - // have certain types of nodes more expensive - if (childWp.type == "climb" || childWp.type == "prone") - penalty += 4; - - //calc the total path we have took - newg = bestNode.g + DistanceSquared(wp.origin, childWp.origin)*penalty;//bots on same team's path are more expensive - - //check if this child is in open or close with a g value less than newg - inopen = isDefined(openset[child+""]); - if(inopen && openset[child+""].g <= newg) - continue; - - inclosed = isDefined(closed[child+""]); - if(inclosed && closed[child+""].g <= newg) - continue; - - node = undefined; - if(inopen) - node = openset[child+""]; - else if(inclosed) - node = closed[child+""]; - else - node = spawnStruct(); - - node.parent = bestNode; - node.g = newg; - node.h = DistanceSquared(childWp.origin, level.waypoints[goalWp].origin); - node.f = node.g + node.h; - node.index = child; - - //check if in closed, remove it - if(inclosed) - closed[child+""] = undefined; - - //check if not in open, add it - if(!inopen) - { - open HeapInsert(node); - openset[child+""] = node; - } - } - - //done with children, push onto closed - closed[bestNode.index+""] = bestNode; - } - - return []; -} - -/* - Taken from t5 gsc. - Returns an array of number's average. -*/ -array_average( array ) -{ - assert( array.size > 0 ); - total = 0; - for ( i = 0; i < array.size; i++ ) - { - total += array[i]; - } - return ( total / array.size ); -} - -/* - Taken from t5 gsc. - Returns an array of number's standard deviation. -*/ -array_std_deviation( array, mean ) -{ - assert( array.size > 0 ); - tmp = []; - for ( i = 0; i < array.size; i++ ) - { - tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); - } - total = 0; - for ( i = 0; i < tmp.size; i++ ) - { - total = total + tmp[i]; - } - return Sqrt( total / array.size ); -} - -/* - Taken from t5 gsc. - Will produce a random number between lower_bound and upper_bound but with a bell curve distribution (more likely to be close to the mean). -*/ -random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) -{ - x1 = 0; - x2 = 0; - w = 1; - y1 = 0; - while ( w >= 1 ) - { - x1 = 2 * RandomFloatRange( 0, 1 ) - 1; - x2 = 2 * RandomFloatRange( 0, 1 ) - 1; - w = x1 * x1 + x2 * x2; - } - w = Sqrt( ( -2.0 * Log( w ) ) / w ); - y1 = x1 * w; - number = mean + y1 * std_deviation; - if ( IsDefined( lower_bound ) && number < lower_bound ) - { - number = lower_bound; - } - if ( IsDefined( upper_bound ) && number > upper_bound ) - { - number = upper_bound; - } - - return( number ); -} - -/* - Patches the plant sites so it exposes the defuseObject -*/ -onUsePlantObjectFix( player ) -{ - if ( !maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) - { - level thread bombPlantedFix( self, player ); - - for ( i = 0; i < level.bombZones.size; i++ ) - { - if ( level.bombZones[i] == self ) - continue; - - level.bombZones[i] maps\mp\gametypes\_gameobjects::disableObject(); - } - - player playsound( "mp_bomb_plant" ); - player notify( "bomb_planted" ); - player notify( "objective", "plant" ); - player maps\mp\_utility::incPersStat( "plants", 1 ); - player maps\mp\gametypes\_persistence::statSetChild( "round", "plants", player.pers["plants"] ); - - if ( isdefined( level.sd_loadout ) && isdefined( level.sd_loadout[player.team] ) ) - player thread maps\mp\gametypes\sd::removeBombCarrierClass(); - - maps\mp\_utility::leaderDialog( "bomb_planted" ); - level thread maps\mp\_utility::teamPlayerCardSplash( "callout_bombplanted", player ); - level.bombOwner = player; - player thread maps\mp\gametypes\_hud_message::splashNotify( "plant", maps\mp\gametypes\_rank::getScoreInfoValue( "plant" ) ); - player thread maps\mp\gametypes\_rank::giveRankXP( "plant" ); - player.bombPlantedTime = gettime(); - maps\mp\gametypes\_gamescore::givePlayerScore( "plant", player ); - player thread maps\mp\_matchdata::logGameEvent( "plant", player.origin ); - } -} - -/* - Patches the plant sites so it exposes the defuseObject -*/ -bombPlantedFix( var_0, var_1 ) -{ - maps\mp\gametypes\_gamelogic::pauseTimer(); - level.bombPlanted = 1; - var_0.visuals[0] thread maps\mp\gametypes\_gamelogic::playTickingSound(); - level.tickingObject = var_0.visuals[0]; - level.timeLimitOverride = 1; - setgameendtime( int( gettime() + level.bombTimer * 1000 ) ); - setdvar( "ui_bomb_timer", 1 ); - - if ( !level.multiBomb ) - { - level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); - level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - level.sdBomb maps\mp\gametypes\_gameobjects::setDropped(); - level.sdBombModel = level.sdBomb.visuals[0]; - } - else - { - for ( var_2 = 0; var_2 < level.players.size; var_2++ ) - { - if ( isdefined( level.players[var_2].carryIcon ) ) - level.players[var_2].carryIcon maps\mp\gametypes\_hud_util::destroyElem(); - } - - var_3 = bullettrace( var_1.origin + ( 0, 0, 20 ), var_1.origin - ( 0, 0, 2000 ), 0, var_1 ); - var_4 = randomfloat( 360 ); - var_5 = ( cos( var_4 ), sin( var_4 ), 0 ); - var_5 = vectornormalize( var_5 - var_3["normal"] * vectordot( var_5, var_3["normal"] ) ); - var_6 = vectortoangles( var_5 ); - level.sdBombModel = spawn( "script_model", var_3["position"] ); - level.sdBombModel.angles = var_6; - level.sdBombModel setmodel( "prop_suitcase_bomb" ); - } - - var_0 maps\mp\gametypes\_gameobjects::allowUse( "none" ); - var_0 maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); - var_7 = var_0 maps\mp\gametypes\_gameobjects::getLabel(); - var_8 = var_0.bombDefuseTrig; - var_8.origin = level.sdBombModel.origin; - var_9 = []; - defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], var_8, var_9, ( 0, 0, 32 ) ); - defuseObject maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); - defuseObject maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); - defuseObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); - defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); - defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); - defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_defuse" + var_7 ); - defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_defend" + var_7 ); - defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" + var_7 ); - defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" + var_7 ); - defuseObject.label = var_7; - defuseObject.onBeginUse = maps\mp\gametypes\sd::onBeginUse; - defuseObject.onEndUse = maps\mp\gametypes\sd::onEndUse; - defuseObject.onUse = maps\mp\gametypes\sd::onUseDefuseObject; - defuseObject.useWeapon = "briefcase_bomb_defuse_mp"; - - level.defuseObject = defuseObject; - - maps\mp\gametypes\sd::BombTimerWait(); - setdvar( "ui_bomb_timer", 0 ); - var_0.visuals[0] maps\mp\gametypes\_gamelogic::stopTickingSound(); - - if ( level.gameEnded || level.bombDefused ) - return; - - level.bombexploded = 1; - var_11 = level.sdBombModel.origin; - level.sdBombModel hide(); - - if ( isdefined( var_1 ) ) - { - var_0.visuals[0] radiusdamage( var_11, 512, 200, 20, var_1, "MOD_EXPLOSIVE", "bomb_site_mp" ); - var_1 maps\mp\_utility::incPersStat( "destructions", 1 ); - var_1 maps\mp\gametypes\_persistence::statSetChild( "round", "destructions", var_1.pers["destructions"] ); - } - else - var_0.visuals[0] radiusdamage( var_11, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "bomb_site_mp" ); - - var_12 = randomfloat( 360 ); - var_13 = spawnfx( level._effect["bombexplosion"], var_11 + ( 0, 0, 50 ), ( 0, 0, 1 ), ( cos( var_12 ), sin( var_12 ), 0 ) ); - triggerfx( var_13 ); - playrumbleonposition( "grenade_rumble", var_11 ); - earthquake( 0.75, 2.0, var_11, 2000 ); - thread maps\mp\_utility::playSoundinSpace( "exp_suitcase_bomb_main", var_11 ); - - if ( isdefined( var_0.exploderIndex ) ) - common_scripts\utility::exploder( var_0.exploderIndex ); - - for ( var_2 = 0; var_2 < level.bombZones.size; var_2++ ) - level.bombZones[var_2] maps\mp\gametypes\_gameobjects::disableObject(); - - defuseObject maps\mp\gametypes\_gameobjects::disableObject(); - setgameendtime( 0 ); - wait 3; - maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); -} - -/* - Patches giveLoadout so that it doesn't use IsItemUnlocked -*/ -botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimarySpawnWeapon only when called during spawn -{ - self endon("death"); - - self takeallweapons(); - self.changingWeapon = undefined; - teamName = "none"; - - if ( !isdefined( setPrimarySpawnWeapon ) ) - setPrimarySpawnWeapon = true; - - primaryIndex = 0; - - // initialize specialty array - self.specialty = []; - - if ( !isdefined( allowCopycat ) ) - allowCopycat = true; - - primaryWeapon = undefined; - var_7 = 0; - - // set in game mode custom class - loadoutKillstreak1 = undefined; - loadoutKillstreak2 = undefined; - loadoutKillstreak3 = undefined; - - if ( issubstr( class, "axis" ) ) - teamName = "axis"; - else if ( issubstr( class, "allies" ) ) - teamName = "allies"; - - clonedLoadout = []; - - if ( isdefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat ) - { - self maps\mp\gametypes\_class::setClass( "copycat" ); - self.class_num = maps\mp\gametypes\_class::getClassIndex( "copycat" ); - clonedLoadout = self.pers["copyCatLoadout"]; - loadoutPrimary = clonedLoadout["loadoutPrimary"]; - loadoutPrimaryAttachment = clonedLoadout["loadoutPrimaryAttachment"]; - loadoutPrimaryAttachment2 = clonedLoadout["loadoutPrimaryAttachment2"]; - loadoutPrimaryBuff = clonedLoadout["loadoutPrimaryBuff"]; - loadoutPrimaryCamo = clonedLoadout["loadoutPrimaryCamo"]; - loadoutPrimaryReticle = clonedLoadout["loadoutPrimaryReticle"]; - loadoutSecondary = clonedLoadout["loadoutSecondary"]; - loadoutSecondaryAttachment = clonedLoadout["loadoutSecondaryAttachment"]; - loadoutSecondaryAttachment2 = clonedLoadout["loadoutSecondaryAttachment2"]; - loadoutSecondaryBuff = clonedLoadout["loadoutSecondaryBuff"]; - loadoutSecondaryCamo = clonedLoadout["loadoutSecondaryCamo"]; - loadoutSecondaryReticle = clonedLoadout["loadoutSecondaryReticle"]; - loadoutEquipment = clonedLoadout["loadoutEquipment"]; - loadoutPerk1 = clonedLoadout["loadoutPerk1"]; - loadoutPerk2 = clonedLoadout["loadoutPerk2"]; - loadoutPerk3 = clonedLoadout["loadoutPerk3"]; - loadoutStreakType = clonedLoadout["loadoutStreakType"]; - loadoutOffhand = clonedLoadout["loadoutOffhand"]; - loadoutDeathStreak = clonedLoadout["loadoutDeathstreak"]; - loadoutAmmoType = clonedLoadout["loadoutAmmoType"]; - } - else if ( teamName != "none" ) - { - classIndex = maps\mp\gametypes\_class::getClassIndex( class ); - loadoutPrimaryAttachment2 = "none"; - loadoutSecondaryAttachment2 = "none"; - loadoutPrimary = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "weapon" ); - loadoutPrimaryAttachment = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "attachment", 0 ); - loadoutPrimaryAttachment2 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "attachment", 1 ); - loadoutPrimaryBuff = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "buff" ); - loadoutPrimaryCamo = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "camo" ); - loadoutPrimaryReticle = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "reticle" ); - loadoutSecondary = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "weapon" ); - loadoutSecondaryAttachment = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "attachment", 0 ); - loadoutSecondaryAttachment2 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "attachment", 1 ); - loadoutSecondaryBuff = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "buff" ); - loadoutSecondaryCamo = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "camo" ); - loadoutSecondaryReticle = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "reticle" ); - - if ( (loadoutPrimary == "throwingknife" || loadoutPrimary == "none") && loadoutSecondary != "none" ) - { - loadoutPrimary = loadoutSecondary; - loadoutPrimaryAttachment = loadoutSecondaryAttachment; - loadoutPrimaryAttachment2 = loadoutSecondaryAttachment2; - loadoutPrimaryBuff = loadoutSecondaryBuff; - loadoutPrimaryCamo = loadoutSecondaryCamo; - loadoutPrimaryReticle = loadoutSecondaryReticle; - loadoutSecondary = "none"; - loadoutSecondaryAttachment = "none"; - loadoutSecondaryAttachment2 = "none"; - loadoutSecondaryBuff = "specialty_null"; - loadoutSecondaryCamo = "none"; - loadoutSecondaryReticle = "none"; - } - else if ( (loadoutPrimary == "throwingknife" || loadoutPrimary == "none") && loadoutSecondary == "none" ) - { - var_7 = 1; - loadoutPrimary = "iw5_usp45"; - loadoutPrimaryAttachment = "tactical"; - } - - loadoutEquipment = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 0 ); - loadoutPerk1 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 1 ); - loadoutPerk2 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 2 ); - loadoutPerk3 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 3 ); - - if ( loadoutSecondary != "none" && !maps\mp\gametypes\_class::isValidSecondary( loadoutSecondary, loadoutPerk2, 0 ) ) - { - loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 1 ); - loadoutSecondaryAttachment = "none"; - loadoutSecondaryAttachment2 = "none"; - loadoutSecondaryBuff = "specialty_null"; - loadoutSecondaryCamo = "none"; - loadoutSecondaryReticle = "none"; - } - - loadoutStreakType = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 5 ); - - if ( loadoutStreakType == "specialty_null" ) - { - loadoutKillstreak1 = "none"; - loadoutKillstreak2 = "none"; - loadoutKillstreak3 = "none"; - } - else - { - loadoutKillstreak1 = maps\mp\gametypes\_class::recipe_getKillstreak( teamName, classIndex, loadoutStreakType, 0 ); - loadoutKillstreak2 = maps\mp\gametypes\_class::recipe_getKillstreak( teamName, classIndex, loadoutStreakType, 1 ); - loadoutKillstreak3 = maps\mp\gametypes\_class::recipe_getKillstreak( teamName, classIndex, loadoutStreakType, 2 ); - } - - loadoutOffhand = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 6 ); - - if ( loadoutOffhand == "specialty_null" ) - loadoutOffhand = "none"; - - loadoutDeathStreak = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "deathstreak" ); - - if ( getmatchrulesdata( "defaultClasses", teamName, classIndex, "juggernaut" ) ) - { - self thread recipeClassApplyJuggernaut( isJuggernaut() ); - self.isJuggernaut = true; - self.juggmovespeedscaler = 0.7; - } - else if ( isJuggernaut() ) - { - self notify( "lost_juggernaut" ); - self.isJuggernaut = false; - self.moveSpeedScaler = 1; - } - } - else if ( issubstr( class, "custom" ) ) - { - class_num = maps\mp\gametypes\_class::getClassIndex( class ); - self.class_num = class_num; - loadoutPrimary = maps\mp\gametypes\_class::cac_getWeapon( class_num, 0 ); - loadoutPrimaryAttachment = maps\mp\gametypes\_class::cac_getWeaponAttachment( class_num, 0 ); - loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::cac_getWeaponAttachmentTwo( class_num, 0 ); - loadoutPrimaryBuff = maps\mp\gametypes\_class::cac_getWeaponBuff( class_num, 0 ); - loadoutPrimaryCamo = maps\mp\gametypes\_class::cac_getWeaponCamo( class_num, 0 ); - loadoutPrimaryReticle = maps\mp\gametypes\_class::cac_getWeaponReticle( class_num, 0 ); - loadoutSecondary = maps\mp\gametypes\_class::cac_getWeapon( class_num, 1 ); - loadoutSecondaryAttachment = maps\mp\gametypes\_class::cac_getWeaponAttachment( class_num, 1 ); - loadoutSecondaryAttachment2 = maps\mp\gametypes\_class::cac_getWeaponAttachmentTwo( class_num, 1 ); - loadoutSecondaryBuff = maps\mp\gametypes\_class::cac_getWeaponBuff( class_num, 1 ); - loadoutSecondaryCamo = maps\mp\gametypes\_class::cac_getWeaponCamo( class_num, 1 ); - loadoutSecondaryReticle = maps\mp\gametypes\_class::cac_getWeaponReticle( class_num, 1 ); - loadoutEquipment = maps\mp\gametypes\_class::cac_getPerk( class_num, 0 ); - loadoutPerk1 = maps\mp\gametypes\_class::cac_getPerk( class_num, 1 ); - loadoutPerk2 = maps\mp\gametypes\_class::cac_getPerk( class_num, 2 ); - loadoutPerk3 = maps\mp\gametypes\_class::cac_getPerk( class_num, 3 ); - loadoutStreakType = maps\mp\gametypes\_class::cac_getPerk( class_num, 5 ); - loadoutOffhand = maps\mp\gametypes\_class::cac_getOffhand( class_num ); - loadoutDeathStreak = maps\mp\gametypes\_class::cac_getDeathstreak( class_num ); - } - else if ( class == "gamemode" ) - { - gamemodeLoadout = self.pers["gamemodeLoadout"]; - loadoutPrimary = gamemodeLoadout["loadoutPrimary"]; - loadoutPrimaryAttachment = gamemodeLoadout["loadoutPrimaryAttachment"]; - loadoutPrimaryAttachment2 = gamemodeLoadout["loadoutPrimaryAttachment2"]; - loadoutPrimaryBuff = gamemodeLoadout["loadoutPrimaryBuff"]; - loadoutPrimaryCamo = gamemodeLoadout["loadoutPrimaryCamo"]; - loadoutPrimaryReticle = gamemodeLoadout["loadoutPrimaryReticle"]; - loadoutSecondary = gamemodeLoadout["loadoutSecondary"]; - loadoutSecondaryAttachment = gamemodeLoadout["loadoutSecondaryAttachment"]; - loadoutSecondaryAttachment2 = gamemodeLoadout["loadoutSecondaryAttachment2"]; - loadoutSecondaryBuff = gamemodeLoadout["loadoutSecondaryBuff"]; - loadoutSecondaryCamo = gamemodeLoadout["loadoutSecondaryCamo"]; - loadoutSecondaryReticle = gamemodeLoadout["loadoutSecondaryReticle"]; - - if ( (loadoutPrimary == "throwingknife" || loadoutPrimary == "none") && loadoutSecondary != "none" ) - { - loadoutPrimary = loadoutSecondary; - loadoutPrimaryAttachment = loadoutSecondaryAttachment; - loadoutPrimaryAttachment2 = loadoutSecondaryAttachment2; - loadoutPrimaryBuff = loadoutSecondaryBuff; - loadoutPrimaryCamo = loadoutSecondaryCamo; - loadoutPrimaryReticle = loadoutSecondaryReticle; - loadoutSecondary = "none"; - loadoutSecondaryAttachment = "none"; - loadoutSecondaryAttachment2 = "none"; - loadoutSecondaryBuff = "specialty_null"; - loadoutSecondaryCamo = "none"; - loadoutSecondaryReticle = "none"; - } - else if ( (loadoutPrimary == "throwingknife" || loadoutPrimary == "none") && loadoutSecondary == "none" ) - { - var_7 = 1; - loadoutPrimary = "iw5_usp45"; - loadoutPrimaryAttachment = "tactical"; - } - - loadoutEquipment = gamemodeLoadout["loadoutEquipment"]; - loadoutOffhand = gamemodeLoadout["loadoutOffhand"]; - - if ( loadoutOffhand == "specialty_null" ) - loadoutOffhand = "none"; - - loadoutPerk1 = gamemodeLoadout["loadoutPerk1"]; - loadoutPerk2 = gamemodeLoadout["loadoutPerk2"]; - loadoutPerk3 = gamemodeLoadout["loadoutPerk3"]; - - if ( loadoutSecondary != "none" && !maps\mp\gametypes\_class::isValidSecondary( loadoutSecondary, loadoutPerk2, 0 ) ) - { - loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 1 ); - loadoutSecondaryAttachment = "none"; - loadoutSecondaryAttachment2 = "none"; - loadoutSecondaryBuff = "specialty_null"; - loadoutSecondaryCamo = "none"; - loadoutSecondaryReticle = "none"; - } - - if ( level.killstreakRewards && isdefined( gamemodeLoadout["loadoutStreakType"] ) && gamemodeLoadout["loadoutStreakType"] != "specialty_null" ) - { - loadoutStreakType = gamemodeLoadout["loadoutStreakType"]; - loadoutKillstreak1 = gamemodeLoadout["loadoutKillstreak1"]; - loadoutKillstreak2 = gamemodeLoadout["loadoutKillstreak2"]; - loadoutKillstreak3 = gamemodeLoadout["loadoutKillstreak3"]; - } - else if ( level.killstreakRewards && isdefined( self.streakType ) ) - loadoutStreakType = maps\mp\gametypes\_class::getLoadoutStreakTypeFromStreakType( self.streakType ); - else - { - loadoutStreakType = "streaktype_assault"; - loadoutKillstreak1 = "none"; - loadoutKillstreak2 = "none"; - loadoutKillstreak3 = "none"; - } - - loadoutDeathStreak = gamemodeLoadout["loadoutDeathstreak"]; - - if ( gamemodeLoadout["loadoutJuggernaut"] ) - { - self.health = self.maxHealth; - self thread recipeClassApplyJuggernaut( isJuggernaut() ); - self.isJuggernaut = true; - self.juggmovespeedscaler = 0.7; - } - else if ( isJuggernaut() ) - { - self notify( "lost_juggernaut" ); - self.isJuggernaut = false; - self.moveSpeedScaler = 1; - } - } - else if ( class == "juggernaut" ) - { - loadoutPrimary = "iw5_m60jugg"; - loadoutPrimaryAttachment = "none"; - loadoutPrimaryAttachment2 = "none"; - loadoutPrimaryBuff = "specialty_null"; - loadoutPrimaryCamo = "none"; - loadoutPrimaryReticle = "none"; - loadoutSecondary = "iw5_mp412jugg"; - loadoutSecondaryAttachment = "none"; - loadoutSecondaryAttachment2 = "none"; - loadoutSecondaryBuff = "specialty_null"; - loadoutSecondaryCamo = "none"; - loadoutSecondaryReticle = "none"; - loadoutEquipment = "frag_grenade_mp"; - loadoutPerk1 = "specialty_scavenger"; - loadoutPerk2 = "specialty_quickdraw"; - loadoutPerk3 = "specialty_detectexplosive"; - loadoutStreakType = maps\mp\gametypes\_class::getLoadoutStreakTypeFromStreakType( self.streakType ); - loadoutOffhand = "smoke_grenade_mp"; - loadoutDeathStreak = "specialty_null"; - } - else if ( class == "juggernaut_recon" ) - { - loadoutPrimary = "iw5_riotshieldjugg"; - loadoutPrimaryAttachment = "none"; - loadoutPrimaryAttachment2 = "none"; - loadoutPrimaryBuff = "specialty_null"; - loadoutPrimaryCamo = "none"; - loadoutPrimaryReticle = "none"; - loadoutSecondary = "iw5_usp45jugg"; - loadoutSecondaryAttachment = "none"; - loadoutSecondaryAttachment2 = "none"; - loadoutSecondaryBuff = "specialty_null"; - loadoutSecondaryCamo = "none"; - loadoutSecondaryReticle = "none"; - loadoutEquipment = "specialty_portable_radar"; - loadoutPerk1 = "specialty_scavenger"; - loadoutPerk2 = "specialty_coldblooded"; - loadoutPerk3 = "specialty_detectexplosive"; - loadoutStreakType = maps\mp\gametypes\_class::getLoadoutStreakTypeFromStreakType( self.streakType ); - loadoutOffhand = "smoke_grenade_mp"; - loadoutDeathStreak = "specialty_null"; - } - else - { - class_num = maps\mp\gametypes\_class::getClassIndex( class ); - self.class_num = class_num; - loadoutPrimary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, class_num, 0 ); - loadoutPrimaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 0, 0 ); - loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 0, 1 ); - loadoutPrimaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, class_num, 0 ); - loadoutPrimaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, class_num, 0 ); - loadoutPrimaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableName, class_num, 0 ); - loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, class_num, 1 ); - loadoutSecondaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 1, 0 ); - loadoutSecondaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 1, 1 ); - loadoutSecondaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, class_num, 1 ); - loadoutSecondaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, class_num, 1 ); - loadoutSecondaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableName, class_num, 1 ); - loadoutEquipment = maps\mp\gametypes\_class::table_getEquipment( level.classTableName, class_num, 0 ); - loadoutPerk1 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, class_num, 1 ); - loadoutPerk2 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, class_num, 2 ); - loadoutPerk3 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, class_num, 3 ); - loadoutStreakType = maps\mp\gametypes\_class::table_getPerk( level.classTableName, class_num, 5 ); - loadoutOffhand = maps\mp\gametypes\_class::table_getOffhand( level.classTableName, class_num ); - loadoutDeathStreak = maps\mp\gametypes\_class::table_getDeathstreak( level.classTableName, class_num ); - } - - self maps\mp\gametypes\_class::loadoutFakePerks( loadoutStreakType ); - isCustomClass = issubstr( class, "custom" ); - isRecipeClass = issubstr( class, "recipe" ); - isGameModeClass = (class == "gamemode"); - - if ( !isGameModeClass && !isRecipeClass && !(isdefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat) ) - { - if ( !maps\mp\gametypes\_class::isValidPrimary( loadoutPrimary ) ) - loadoutPrimary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 0 ); - - if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutPrimaryAttachment ) ) - loadoutPrimaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 0, 0 ); - - if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutPrimaryAttachment2 ) ) - loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 0, 1 ); - - if ( !maps\mp\gametypes\_class::isValidWeaponBuff( loadoutPrimaryBuff, loadoutPrimary ) ) - loadoutPrimaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, 10, 0 ); - - if ( !maps\mp\gametypes\_class::isValidCamo( loadoutPrimaryCamo ) ) - loadoutPrimaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, 10, 0 ); - - if ( !maps\mp\gametypes\_class::isValidReticle( loadoutPrimaryReticle ) ) - loadoutPrimaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableNum, 10, 0 ); - - if ( !maps\mp\gametypes\_class::isValidSecondary( loadoutSecondary, loadoutPerk2 ) ) - { - loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 1 ); - loadoutSecondaryAttachment = "none"; - loadoutSecondaryAttachment2 = "none"; - loadoutSecondaryBuff = "specialty_null"; - loadoutSecondaryCamo = "none"; - loadoutSecondaryReticle = "none"; - } - - if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutSecondaryAttachment ) ) - loadoutSecondaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 1, 0 ); - - if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutSecondaryAttachment2 ) ) - loadoutSecondaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 1, 1 ); - - if ( loadoutPerk2 == "specialty_twoprimaries" && !maps\mp\gametypes\_class::isValidWeaponBuff( loadoutSecondaryBuff, loadoutSecondary ) ) - loadoutSecondaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, 10, 1 ); - - if ( !maps\mp\gametypes\_class::isValidCamo( loadoutSecondaryCamo ) ) - loadoutSecondaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, 10, 1 ); - - if ( !maps\mp\gametypes\_class::isValidReticle( loadoutSecondaryReticle ) ) - loadoutSecondaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableName, 10, 1 ); - - if ( !maps\mp\gametypes\_class::isValidEquipment( loadoutEquipment ) ) - loadoutEquipment = maps\mp\gametypes\_class::table_getEquipment( level.classTableName, 10, 0 ); - - if ( !maps\mp\gametypes\_class::isValidPerk1( loadoutPerk1 ) ) - loadoutPerk1 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 1 ); - - if ( !maps\mp\gametypes\_class::isValidPerk2( loadoutPerk2 ) ) - loadoutPerk2 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 2 ); - - if ( !maps\mp\gametypes\_class::isValidPerk3( loadoutPerk3 ) ) - loadoutPerk3 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 3 ); - - if ( !maps\mp\gametypes\_class::isValidDeathStreak( loadoutDeathStreak ) ) - loadoutDeathStreak = maps\mp\gametypes\_class::table_getDeathstreak( level.classTableName, 10 ); - - if ( !maps\mp\gametypes\_class::isValidOffhand( loadoutOffhand ) ) - loadoutOffhand = maps\mp\gametypes\_class::table_getOffhand( level.classTableName, 10 ); - - if ( loadoutPrimaryAttachment2 != "none" && loadoutPrimaryBuff != "specialty_bling" ) - loadoutPrimaryAttachment2 = "none"; - - if ( loadoutSecondaryBuff != "specialty_null" && loadoutPerk2 != "specialty_twoprimaries" ) - loadoutSecondaryBuff = "specialty_null"; - - if ( loadoutSecondaryAttachment2 != "none" && (loadoutSecondaryBuff != "specialty_bling" || loadoutPerk2 != "specialty_twoprimaries") ) - loadoutSecondaryAttachment2 = "none"; - } - - self.loadoutPrimary = loadoutPrimary; - self.loadoutPrimaryCamo = int( tablelookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 ) ); - self.loadoutSecondary = loadoutSecondary; - self.loadoutSecondaryCamo = int( tablelookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ); - - if ( !issubstr( loadoutPrimary, "iw5" ) ) - self.loadoutPrimaryCamo = 0; - - if ( !issubstr( loadoutSecondary, "iw5" ) ) - self.loadoutSecondaryCamo = 0; - - self.loadoutPrimaryReticle = int( tablelookup( "mp/reticleTable.csv", 1, loadoutPrimaryReticle, 0 ) ); - self.loadoutSecondaryReticle = int( tablelookup( "mp/reticleTable.csv", 1, loadoutSecondaryReticle, 0 ) ); - - if ( !issubstr( loadoutPrimary, "iw5" ) ) - self.loadoutPrimaryReticle = 0; - - if ( !issubstr( loadoutSecondary, "iw5" ) ) - self.loadoutSecondaryReticle = 0; - - if ( loadoutSecondary == "none" ) - secondaryName = "none"; - else - { - secondaryName = maps\mp\gametypes\_class::buildWeaponName( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2, self.loadoutSecondaryCamo, self.loadoutSecondaryReticle ); - self _giveWeapon( secondaryName ); - weaponTokens = strtok( secondaryName, "_" ); - - if ( weaponTokens[0] == "iw5" ) - weaponTokens[0] = weaponTokens[0] + "_" + weaponTokens[1]; - else if ( weaponTokens[0] == "alt" ) - weaponTokens[0] = weaponTokens[1] + "_" + weaponTokens[2]; - - weaponName = weaponTokens[0]; - curWeaponRank = self maps\mp\gametypes\_rank::getWeaponRank( weaponName ); - curWeaponStatRank = self getplayerdata( "weaponRank", weaponName ); - - if ( curWeaponRank != curWeaponStatRank ) - self setplayerdata( "weaponRank", weaponName, curWeaponRank ); - } - - self setoffhandprimaryclass( "other" ); - self _setActionSlot( 1, "" ); - self _setActionSlot( 3, "altMode" ); - self _setActionSlot( 4, "" ); - - if ( !level.console ) - { - self _setActionSlot( 5, "" ); - self _setActionSlot( 6, "" ); - self _setActionSlot( 7, "" ); - } - - self _clearPerks(); - self maps\mp\gametypes\_class::_detachAll(); - - if ( level.dieHardMode ) - self givePerk( "specialty_pistoldeath", false ); - - self loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loadoutPrimaryBuff, loadoutSecondaryBuff ); - - if ( self _hasPerk( "specialty_extraammo" ) && secondaryName != "none" && getWeaponClass( secondaryName ) != "weapon_projectile" ) - self givemaxammo( secondaryName ); - - self.spawnperk = false; - - if ( !self _hasPerk( "specialty_blindeye" ) && self.avoidKillstreakOnSpawnTimer > 0 ) - self thread maps\mp\perks\_perks::giveBlindEyeAfterSpawn(); - - if ( self.pers["cur_death_streak"] > 0 ) - { - deathStreaks = []; - - if ( loadoutDeathStreak != "specialty_null" ) - deathStreaks[loadoutDeathStreak] = int( tablelookup( "mp/perkTable.csv", 1, loadoutDeathStreak, 6 ) ); - - if ( self getPerkUpgrade( loadoutPerk1 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk2 ) == "specialty_rollover" || getPerkUpgrade( loadoutPerk3 ) == "specialty_rollover" ) - { - foreach ( key, value in deathStreaks ) - deathStreaks[key] -= 1; - } - - foreach ( key, value in deathStreaks ) - { - if ( self.pers["cur_death_streak"] >= value ) - { - if ( key == "specialty_carepackage" && self.pers["cur_death_streak"] > value ) - continue; - - if ( key == "specialty_uav" && self.pers["cur_death_streak"] > value ) - continue; - - self thread givePerk( key, true ); - self thread maps\mp\gametypes\_hud_message::splashNotify( key ); - } - } - } - - if ( level.killstreakRewards && !isdefined( loadoutKillstreak1 ) && !isdefined( loadoutKillstreak2 ) && !isdefined( loadoutKillstreak3 ) ) - { - if ( isdefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat ) - { - loadoutKillstreak1 = clonedLoadout["loadoutKillstreak1"]; - loadoutKillstreak2 = clonedLoadout["loadoutKillstreak2"]; - loadoutKillstreak3 = clonedLoadout["loadoutKillstreak3"]; - } - else - { - defaultKillstreak1 = undefined; - defaultKillstreak2 = undefined; - defaultKillstreak3 = undefined; - playerData = undefined; - - switch ( self.streakType ) - { - case "support": - defaultKillstreak1 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 2, 1 ); - defaultKillstreak2 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 2, 2 ); - defaultKillstreak3 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 2, 3 ); - playerData = "defenseStreaks"; - break; - case "specialist": - defaultKillstreak1 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 1, 1 ); - defaultKillstreak2 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 1, 2 ); - defaultKillstreak3 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 1, 3 ); - playerData = "specialistStreaks"; - break; - default: - defaultKillstreak1 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 1 ); - defaultKillstreak2 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 2 ); - defaultKillstreak3 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 3 ); - playerData = "assaultStreaks"; - break; - } - - loadoutKillstreak1 = undefined; - loadoutKillstreak2 = undefined; - loadoutKillstreak3 = undefined; - - if ( issubstr( class, "custom" ) ) - { - customClassLoc = maps\mp\gametypes\_class::cac_getCustomClassLoc(); - loadoutKillstreak1 = self getplayerdata( customClassLoc, self.class_num, playerData, 0 ); - loadoutKillstreak2 = self getplayerdata( customClassLoc, self.class_num, playerData, 1 ); - loadoutKillstreak3 = self getplayerdata( customClassLoc, self.class_num, playerData, 2 ); - } - - if ( issubstr( class, "juggernaut" ) || isGameModeClass ) - { - foreach ( killstreak in self.killstreaks ) - { - if ( !isdefined( loadoutKillstreak1 ) ) - { - loadoutKillstreak1 = killstreak; - continue; - } - - if ( !isdefined( loadoutKillstreak2 ) ) - { - loadoutKillstreak2 = killstreak; - continue; - } - - if ( !isdefined( loadoutKillstreak3 ) ) - loadoutKillstreak3 = killstreak; - } - - if ( isGameModeClass && self.streakType == "specialist" ) - { - self.pers["gamemodeLoadout"]["loadoutKillstreak1"] = loadoutKillstreak1; - self.pers["gamemodeLoadout"]["loadoutKillstreak2"] = loadoutKillstreak2; - self.pers["gamemodeLoadout"]["loadoutKillstreak3"] = loadoutKillstreak3; - } - } - - if ( !issubstr( class, "custom" ) && !issubstr( class, "juggernaut" ) && !isGameModeClass ) - { - loadoutKillstreak1 = defaultKillstreak1; - loadoutKillstreak2 = defaultKillstreak2; - loadoutKillstreak3 = defaultKillstreak3; - } - - if ( !isdefined( loadoutKillstreak1 ) ) - loadoutKillstreak1 = "none"; - - if ( !isdefined( loadoutKillstreak2 ) ) - loadoutKillstreak2 = "none"; - - if ( !isdefined( loadoutKillstreak3 ) ) - loadoutKillstreak3 = "none"; - - var_56 = 0; - - if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak1 ) ) - var_56 = 1; - - if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak2 ) ) - var_56 = 1; - - if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak3 ) ) - var_56 = 1; - - if ( var_56 ) - { - self.streakType = "assault"; - loadoutKillstreak1 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 1 ); - loadoutKillstreak2 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 2 ); - loadoutKillstreak3 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 3 ); - } - } - } - else if ( !level.killstreakRewards ) - { - loadoutKillstreak1 = "none"; - loadoutKillstreak2 = "none"; - loadoutKillstreak3 = "none"; - } - - self maps\mp\gametypes\_class::setKillstreaks( loadoutKillstreak1, loadoutKillstreak2, loadoutKillstreak3 ); - - if ( isdefined( self.lastClass ) && self.lastClass != self.class && !issubstr( self.class, "juggernaut" ) && !issubstr( self.lastClass, "juggernaut" ) && !issubstr( class, "juggernaut" ) ) - { - if ( wasOnlyRound() || self.lastClass != "" ) - { - streakNames = []; - inc = 0; - - if ( self.pers["killstreaks"].size > 5 ) - { - for ( i = 5; i < self.pers["killstreaks"].size; i++ ) - { - streakNames[inc] = self.pers["killstreaks"][i].streakName; - inc++; - } - } - - if ( self.pers["killstreaks"].size ) - { - for ( i = 1; i < 4; i++ ) - { - if ( isdefined( self.pers["killstreaks"][i] ) && isdefined( self.pers["killstreaks"][i].streakName ) && self.pers["killstreaks"][i].available && !self.pers["killstreaks"][i].isSpecialist ) - { - streakNames[inc] = self.pers["killstreaks"][i].streakName; - inc++; - } - } - } - - self notify( "givingLoadout" ); - self maps\mp\killstreaks\_killstreaks::clearKillstreaks(); - - for ( i = 0; i < streakNames.size; i++ ) - self maps\mp\killstreaks\_killstreaks::giveKillstreak( streakNames[i] ); - } - } - - if ( !issubstr( class, "juggernaut" ) ) - { - if ( isdefined( self.lastClass ) && self.lastClass != "" && self.lastClass != self.class ) - self incPlayerStat( "mostclasseschanged", 1 ); - - self.pers["lastClass"] = self.class; - self.lastClass = self.class; - } - - if ( isdefined( self.gamemode_chosenclass ) ) - { - self.pers["class"] = self.gamemode_chosenclass; - self.pers["lastClass"] = self.gamemode_chosenclass; - self.class = self.gamemode_chosenclass; - self.lastClass = self.gamemode_chosenclass; - self.gamemode_chosenclass = undefined; - } - - primaryName = maps\mp\gametypes\_class::buildWeaponName( loadoutPrimary, loadoutPrimaryAttachment, loadoutPrimaryAttachment2, self.loadoutPrimaryCamo, self.loadoutPrimaryReticle ); - self _giveWeapon( primaryName ); - self switchtoweapon( primaryName ); - weaponTokens = strtok( primaryName, "_" ); - - if ( weaponTokens[0] == "iw5" ) - weaponName = weaponTokens[0] + "_" + weaponTokens[1]; - else if ( weaponTokens[0] == "alt" ) - weaponName = weaponTokens[1] + "_" + weaponTokens[2]; - else - weaponName = weaponTokens[0]; - - curWeaponRank = self maps\mp\gametypes\_rank::getWeaponRank( weaponName ); - curWeaponStatRank = self getplayerdata( "weaponRank", weaponName ); - - if ( curWeaponRank != curWeaponStatRank ) - self setplayerdata( "weaponRank", weaponName, curWeaponRank ); - - if ( primaryName == "riotshield_mp" && level.inGracePeriod ) - self notify( "weapon_change", "riotshield_mp" ); - - if ( self _hasPerk( "specialty_extraammo" ) ) - self givemaxammo( primaryName ); - - if ( setPrimarySpawnWeapon ) - self setspawnweapon( primaryName ); - - self.pers["primaryWeapon"] = weaponName; - primaryTokens = strtok( primaryName, "_" ); - offhandSecondaryWeapon = loadoutOffhand; - - if ( loadoutOffhand == "none" ) - self setoffhandsecondaryclass( "none" ); - else if ( loadoutOffhand == "flash_grenade_mp" ) - self setoffhandsecondaryclass( "flash" ); - else if ( loadoutOffhand == "smoke_grenade_mp" || loadoutOffhand == "concussion_grenade_mp" ) - self setoffhandsecondaryclass( "smoke" ); - else - self setoffhandsecondaryclass( "flash" ); - - switch ( offhandSecondaryWeapon ) - { - case "none": - break; - case "trophy_mp": - case "specialty_portable_radar": - case "specialty_scrambler": - case "specialty_tacticalinsertion": - self givePerk( offhandSecondaryWeapon, 0 ); - break; - default: - self giveweapon( offhandSecondaryWeapon ); - - if ( loadoutOffhand == "flash_grenade_mp" ) - self setweaponammoclip( offhandSecondaryWeapon, 2 ); - else if ( loadoutOffhand == "concussion_grenade_mp" ) - self setweaponammoclip( offhandSecondaryWeapon, 2 ); - else - self setweaponammoclip( offhandSecondaryWeapon, 1 ); - - break; - } - - primaryWeapon = primaryName; - self.primaryWeapon = primaryWeapon; - self.secondaryWeapon = secondaryName; - - if ( var_7 ) - { - self setweaponammoclip( self.primaryWeapon, 0 ); - self setweaponammostock( self.primaryWeapon, 0 ); - } - - self playerModelForWeapon( self.pers["primaryWeapon"], getBaseWeaponName( secondaryName ) ); - self.isSniper = (weaponclass( self.primaryWeapon ) == "sniper"); - self maps\mp\gametypes\_weapons::updateMoveSpeedScale(); - self maps\mp\perks\_perks::cac_selector(); - self notify( "changed_kit" ); - self notify( "bot_giveLoadout" ); -} - -/* - Patches giveLoadout so that it doesn't use IsItemUnlocked -*/ -getPerkUpgrade( perkName ) -{ - perkUpgrade = tablelookup( "mp/perktable.csv", 1, perkName, 8 ); - - if ( perkUpgrade == "" || perkUpgrade == "specialty_null" ) - return "specialty_null"; - - if ( !isDefined(self.pers["bots"]["unlocks"]["upgraded_"+perkName]) || !self.pers["bots"]["unlocks"]["upgraded_"+perkName] ) - return "specialty_null"; - - return ( perkUpgrade ); -} - -/* - Patches giveLoadout so that it doesn't use IsItemUnlocked -*/ -loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loadoutPrimaryBuff, loadoutSecondaryBuff ) -{ - loadoutEquipment = maps\mp\perks\_perks::validatePerk( 1, loadoutEquipment ); - loadoutPerk1 = maps\mp\perks\_perks::validatePerk( 1, loadoutPerk1 ); - loadoutPerk2 = maps\mp\perks\_perks::validatePerk( 2, loadoutPerk2 ); - loadoutPerk3 = maps\mp\perks\_perks::validatePerk( 3, loadoutPerk3 ); - - loadoutPrimaryBuff = maps\mp\perks\_perks::validatePerk( undefined, loadoutPrimaryBuff ); - if( loadoutPerk2 == "specialty_twoprimaries" ) - loadoutSecondaryBuff = maps\mp\perks\_perks::validatePerk( undefined, loadoutSecondaryBuff ); - - self.loadoutPerk1 = loadoutPerk1; - self.loadoutPerk2 = loadoutPerk2; - self.loadoutPerk3 = loadoutPerk3; - self.loadoutPerkEquipment = loadoutEquipment; - self.loadoutPrimaryBuff = loadoutPrimaryBuff; - if( loadoutPerk2 == "specialty_twoprimaries" ) - self.loadoutSecondaryBuff = loadoutSecondaryBuff; - - if( loadoutEquipment != "specialty_null" ) - self givePerk( loadoutEquipment, true ); - if( loadoutPerk1 != "specialty_null" ) - self givePerk( loadoutPerk1, true ); - if( loadoutPerk2 != "specialty_null" ) - self givePerk( loadoutPerk2, true ); - if( loadoutPerk3 != "specialty_null" ) - self givePerk( loadoutPerk3, true ); - - if( loadoutPrimaryBuff != "specialty_null" ) - self givePerk( loadoutPrimaryBuff, true ); - - perkUpgrd[0] = tablelookup( "mp/perktable.csv", 1, loadoutPerk1, 8 ); - perkUpgrd[1] = tablelookup( "mp/perktable.csv", 1, loadoutPerk2, 8 ); - perkUpgrd[2] = tablelookup( "mp/perktable.csv", 1, loadoutPerk3, 8 ); - - perks[0] = loadoutPerk1; - perks[1] = loadoutPerk2; - perks[2] = loadoutPerk3; - - for (i = 0; i < perkUpgrd.size; i++) - { - upgrade = perkUpgrd[i]; - perk = perks[i]; - - if ( upgrade == "" || upgrade == "specialty_null" ) - continue; - - if ( isDefined(self.pers["bots"]["unlocks"]["upgraded_"+perk]) && self.pers["bots"]["unlocks"]["upgraded_"+perk] ) - { - self givePerk( upgrade, true ); - } - } - - if( !self _hasPerk( "specialty_assists" ) ) - self.pers["assistsToKill"] = 0; -} - -/* - Patches giveLoadout so that it doesn't use IsItemUnlocked -*/ -playerModelForWeapon( weapon, secondary ) -{ - team = self.team; - - if ( isdefined( game[team + "_model"][weapon] ) ) - { - [[ game[team + "_model"][weapon] ]](); - return; - } - - weaponClass = tablelookup( "mp/statstable.csv", 4, weapon, 2 ); - - switch ( weaponClass ) - { - case "weapon_smg": - [[ game[team + "_model"]["SMG"] ]](); - break; - case "weapon_assault": - [[ game[team + "_model"]["ASSAULT"] ]](); - break; - case "weapon_sniper": - if ( level.environment != "" && game[team] != "opforce_africa" && isDefined(self.pers["bots"]["unlocks"]["ghillie"]) && self.pers["bots"]["unlocks"]["ghillie"] ) - [[ game[team + "_model"]["GHILLIE"] ]](); - else - [[ game[team + "_model"]["SNIPER"] ]](); - - break; - case "weapon_lmg": - [[ game[team + "_model"]["LMG"] ]](); - break; - case "weapon_riot": - [[ game[team + "_model"]["RIOT"] ]](); - break; - case "weapon_shotgun": - [[ game[team + "_model"]["SHOTGUN"] ]](); - break; - default: - [[ game[team + "_model"]["ASSAULT"] ]](); - break; - } - - if ( isJuggernaut() ) - [[ game[team + "_model"]["JUGGERNAUT"] ]](); -} +/* + _bot_utility + Author: INeedGames + Date: 05/07/2021 + The shared functions for bots +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; + +/* + Returns if player is the host +*/ +is_host() +{ + return (isDefined(self.pers["bot_host"]) && self.pers["bot_host"]); +} + +/* + Setups the host variable on the player +*/ +doHostCheck() +{ + self.pers["bot_host"] = false; + + if (self is_bot()) + return; + + result = false; + if (getDvar("bots_main_firstIsHost") != "0") + { + printLn("WARNING: bots_main_firstIsHost is enabled"); + + if (getDvar("bots_main_firstIsHost") == "1") + { + setDvar("bots_main_firstIsHost", self getguid()); + } + + if (getDvar("bots_main_firstIsHost") == self getguid()+"") + result = true; + } + + DvarGUID = getDvar("bots_main_GUIDs"); + if (DvarGUID != "") + { + guids = strtok(DvarGUID, ","); + + for (i = 0; i < guids.size; i++) + { + if(self getguid()+"" == guids[i]) + result = true; + } + } + + if (!self isHost() && !result) + return; + + self.pers["bot_host"] = true; +} + +/* + Returns if the player is a bot. +*/ +is_bot() +{ + assert(isDefined(self)); + assert(isPlayer(self)); + + return ((isDefined(self.pers["isBot"]) && self.pers["isBot"]) || (isDefined(self.pers["isBotWarfare"]) && self.pers["isBotWarfare"]) || isSubStr( self getguid()+"", "bot" )); +} + +/* + Bot changes to the weap +*/ +BotChangeToWeapon(weap) +{ + self maps\mp\bots\_bot_internal::changeToWeap(weap); +} + +/* + Bot presses the frag button for time. +*/ +BotPressFrag(time) +{ + self maps\mp\bots\_bot_internal::frag(time); +} + +/* + Bot presses the smoke button for time. +*/ +BotPressSmoke(time) +{ + self maps\mp\bots\_bot_internal::smoke(time); +} + +/* + Bot presses the use button for time. +*/ +BotPressUse(time) +{ + self maps\mp\bots\_bot_internal::use(time); +} + +/* + Bot will press the ads button for the time +*/ +BotPressADS(time) +{ + self maps\mp\bots\_bot_internal::pressAds(time); +} + +/* + Bots will press the attack button for a time +*/ +BotPressAttack(time) +{ + self maps\mp\bots\_bot_internal::pressFire(time); +} + +/* + Returns a random number thats different everytime it changes target +*/ +BotGetTargetRandom() +{ + if (!isDefined(self.bot.target)) + return undefined; + + return self.bot.target.rand; +} + +/* + Returns the bot's random assigned number. +*/ +BotGetRandom() +{ + return self.bot.rand; +} + +/* + Returns if the bot is pressing frag button. +*/ +IsBotFragging() +{ + return self.bot.isfraggingafter; +} + +/* + Returns if the bot is pressing smoke button. +*/ +IsBotSmoking() +{ + return self.bot.issmokingafter; +} + +/* + Returns if the bot is sprinting. +*/ +IsBotSprinting() +{ + return self.bot.issprinting; +} + +/* + Returns if the bot is reloading. +*/ +IsBotReloading() +{ + return self.bot.isreloading; +} + +/* + Is bot knifing +*/ +IsBotKnifing() +{ + return self.bot.isknifingafter; +} + +/* + Freezes the bot's controls. +*/ +BotFreezeControls(what) +{ + self.bot.isfrozen = what; + if(what) + self notify("kill_goal"); +} + +/* + Returns if the bot is script frozen. +*/ +BotIsFrozen() +{ + return self.bot.isfrozen; +} + +/* + Bot will stop moving +*/ +BotStopMoving(what) +{ + self.bot.stop_move = what; + + if(what) + self notify("kill_goal"); +} + +/* + Returns if the bot has a script goal. + (like t5 gsc bot) +*/ +HasScriptGoal() +{ + return (isDefined(self GetScriptGoal())); +} + +/* + Sets the bot's goal, will acheive it when dist away from it. +*/ +SetScriptGoal(goal, dist) +{ + if (!isDefined(dist)) + dist = 16; + self.bot.script_goal = goal; + self.bot.script_goal_dist = dist; + waittillframeend; + self notify("new_goal_internal"); + self notify("new_goal"); +} + +/* + Returns the pos of the bot's goal +*/ +GetScriptGoal() +{ + return self.bot.script_goal; +} + +/* + Clears the bot's goal. +*/ +ClearScriptGoal() +{ + self SetScriptGoal(undefined, 0); +} + +/* + Returns the location of the bot's javelin target +*/ +HasBotJavelinLocation() +{ + return isDefined(self.bot.jav_loc); +} + +/* + Sets the aim position of the bot +*/ +SetScriptAimPos(pos) +{ + self.bot.script_aimpos = pos; +} + +/* + Clears the aim position of the bot +*/ +ClearScriptAimPos() +{ + self SetScriptAimPos(undefined); +} + +/* + Returns the aim position of the bot +*/ +GetScriptAimPos() +{ + return self.bot.script_aimpos; +} + +/* + Returns if the bot has a aim pos +*/ +HasScriptAimPos() +{ + return isDefined(self GetScriptAimPos()); +} + +/* + Sets the bot's javelin target location +*/ +SetBotJavelinLocation(loc) +{ + self.bot.jav_loc = loc; + self notify("new_enemy"); +} + +/* + Clears the bot's javelin location +*/ +ClearBotJavelinLocation() +{ + self SetBotJavelinLocation(undefined); +} + +/* + Sets the bot's target to be this ent. +*/ +SetAttacker(att) +{ + self.bot.target_this_frame = att; +} + +/* + Sets the script enemy for a bot. +*/ +SetScriptEnemy(enemy, offset) +{ + self.bot.script_target = enemy; + self.bot.script_target_offset = offset; +} + +/* + Removes the script enemy of the bot. +*/ +ClearScriptEnemy() +{ + self SetScriptEnemy(undefined, undefined); +} + +/* + Returns the entity of the bot's target. +*/ +GetThreat() +{ + if(!isdefined(self.bot.target)) + return undefined; + + return self.bot.target.entity; +} + +/* + Returns if the bot has a script enemy. +*/ +HasScriptEnemy() +{ + return (isDefined(self.bot.script_target)); +} + +/* + Returns if the bot has a threat. +*/ +HasThreat() +{ + return (isDefined(self GetThreat())); +} + +/* + If the player is defusing +*/ +IsDefusing() +{ + return (isDefined(self.isDefusing) && self.isDefusing); +} + +/* + If the play is planting +*/ +isPlanting() +{ + return (isDefined(self.isPlanting) && self.isPlanting); +} + +/* + If the player is carrying a bomb +*/ +isBombCarrier() +{ + return (isDefined(self.isBombCarrier) && self.isBombCarrier); +} + +/* + If the site is in use +*/ +isInUse() +{ + return (isDefined(self.inUse) && self.inUse); +} + +/* + If the player is in laststand +*/ +inLastStand() +{ + return (isDefined(self.lastStand) && self.lastStand); +} + +/* + If the player is in final stand +*/ +inFinalStand() +{ + return (isDefined(self.inFinalStand) && self.inFinalStand); +} + +/* + If the player is the flag carrier +*/ +isFlagCarrier() +{ + return (isDefined(self.carryFlag) && self.carryFlag); +} + +/* + Returns if we are stunned. +*/ +IsStunned() +{ + return (isdefined(self.concussionEndTime) && self.concussionEndTime > gettime()); +} + +/* + Returns if we are beingArtilleryShellshocked +*/ +isArtShocked() +{ + return (isDefined(self.beingArtilleryShellshocked) && self.beingArtilleryShellshocked); +} + +/* + Returns a valid grenade launcher weapon +*/ +getValidTube() +{ + weaps = self getweaponslistall(); + + for (i = 0; i < weaps.size; i++) + { + weap = weaps[i]; + + if(!self getAmmoCount(weap)) + continue; + + if ((isSubStr(weap, "alt_") && (isSubStr(weap, "_m320") || isSubStr(weap, "_gl") || isSubStr(weap, "_gp25"))) || weap == "m320_mp") + return weap; + } + + return undefined; +} + +/* + Returns a random grenade in the bot's inventory. +*/ +getValidGrenade() +{ + grenadeTypes = []; + grenadeTypes[grenadeTypes.size] = "frag_grenade_mp"; + grenadeTypes[grenadeTypes.size] = "smoke_grenade_mp"; + grenadeTypes[grenadeTypes.size] = "flash_grenade_mp"; + grenadeTypes[grenadeTypes.size] = "concussion_grenade_mp"; + grenadeTypes[grenadeTypes.size] = "semtex_mp"; + grenadeTypes[grenadeTypes.size] = "throwingknife_mp"; + grenadeTypes[grenadeTypes.size] = "emp_grenade_mp"; + + possibles = []; + + for(i = 0; i < grenadeTypes.size; i++) + { + if ( !self hasWeapon( grenadeTypes[i] ) ) + continue; + + if ( !self getAmmoCount( grenadeTypes[i] ) ) + continue; + + possibles[possibles.size] = grenadeTypes[i]; + } + + return random(possibles); +} + +/* + If the weapon is not a script weapon (bomb, killstreak, etc, grenades) +*/ +isWeaponPrimary(weap) +{ + return (maps\mp\gametypes\_weapons::isPrimaryWeapon(weap) || maps\mp\gametypes\_weapons::isAltModeWeapon(weap)); +} + +/* + If the ent is a vehicle +*/ +entIsVehicle(ent) +{ + return (!isPlayer(ent) && (ent.classname == "script_vehicle" || ent.model == "vehicle_uav_static_mp" || ent.model == "vehicle_ac130_coop" || ent.model == "vehicle_predator_b" || ent.model == "vehicle_phantom_ray")); +} + +/* + Returns if the given weapon is full auto. +*/ +WeaponIsFullAuto(weap) +{ + weaptoks = strtok(weap, "_"); + + if (weaptoks.size < 2) + return false; + + return isDefined(level.bots_fullautoguns[weaptoks[1]]); +} + +/* + If weap is a secondary gnade +*/ +isSecondaryGrenade(gnade) +{ + return (gnade == "concussion_grenade_mp" || gnade == "flash_grenade_mp" || gnade == "smoke_grenade_mp" || gnade == "trophy_mp" || gnade == "emp_grenade_mp" || gnade == "flare_mp" || gnade == "scrambler_mp" || gnade == "portable_radar_mp"); +} + +/* + If the weapon is allowed to be dropped +*/ +isWeaponDroppable(weap) +{ + return (maps\mp\gametypes\_weapons::mayDropWeapon(weap)); +} + +/* + Returns the height the viewpos is above the origin +*/ +getEyeHeight() +{ + myEye = self getEye(); + + return myEye[2] - self.origin[2]; +} + +/* + Does a notify after a delay +*/ +notifyAfterDelay(delay, not) +{ + wait delay; + self notify(not); +} + +/* + Gets a player who is host +*/ +GetHostPlayer() +{ + for (i = 0; i < level.players.size; i++) + { + player = level.players[i]; + + if (!player is_host()) + continue; + + return player; + } + + return undefined; +} + +/* + Waits for a host player +*/ +bot_wait_for_host() +{ + host = undefined; + + while (!isDefined(level) || !isDefined(level.players)) + wait 0.05; + + for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) + { + host = GetHostPlayer(); + + if(isDefined(host)) + break; + + wait 0.05; + } + + if(!isDefined(host)) + return; + + for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) + { + if(IsDefined( host.pers[ "team" ] )) + break; + + wait 0.05; + } + + if(!IsDefined( host.pers[ "team" ] )) + return; + + for(i = getDvarFloat("bots_main_waitForHostTime"); i > 0; i -= 0.05) + { + if(host.pers[ "team" ] == "allies" || host.pers[ "team" ] == "axis") + break; + + wait 0.05; + } +} + +/* + Pezbot's line sphere intersection. + http://paulbourke.net/geometry/circlesphere/raysphere.c +*/ +RaySphereIntersect(start, end, spherePos, radius) +{ + // check if the start or end points are in the sphere + r2 = radius * radius; + if (DistanceSquared(start, spherePos) < r2) + return true; + + if (DistanceSquared(end, spherePos) < r2) + return true; + + // check if the line made by start and end intersect the sphere + dp = end - start; + a = dp[0] * dp[0] + dp[1] * dp[1] + dp[2] * dp[2]; + b = 2 * (dp[0] * (start[0] - spherePos[0]) + dp[1] * (start[1] - spherePos[1]) + dp[2] * (start[2] - spherePos[2])); + c = spherePos[0] * spherePos[0] + spherePos[1] * spherePos[1] + spherePos[2] * spherePos[2]; + c += start[0] * start[0] + start[1] * start[1] + start[2] * start[2]; + c -= 2.0 * (spherePos[0] * start[0] + spherePos[1] * start[1] + spherePos[2] * start[2]); + c -= radius * radius; + bb4ac = b * b - 4.0 * a * c; + + if (abs(a) < 0.0001 || bb4ac < 0) + return false; + + mu1 = (0-b + sqrt(bb4ac)) / (2 * a); + //mu2 = (0-b - sqrt(bb4ac)) / (2 * a); + + // intersection points of the sphere + ip1 = start + mu1 * dp; + //ip2 = start + mu2 * dp; + + myDist = DistanceSquared(start, end); + + // check if both intersection points far + if (DistanceSquared(start, ip1) > myDist/* && DistanceSquared(start, ip2) > myDist*/) + return false; + + dpAngles = VectorToAngles(dp); + + // check if the point is behind us + if (getConeDot(ip1, start, dpAngles) < 0/* || getConeDot(ip2, start, dpAngles) < 0*/) + return false; + + return true; +} + +/* + Returns if a smoke grenade would intersect start to end line. +*/ +SmokeTrace(start, end, rad) +{ + for(i = level.bots_smokeList.count - 1; i >= 0; i--) + { + nade = level.bots_smokeList.data[i]; + + if(nade.state != "smoking") + continue; + + if(!RaySphereIntersect(start, end, nade.origin, rad)) + continue; + + return false; + } + + return true; +} + +/* + Returns the cone dot (like fov, or distance from the center of our screen). +*/ +getConeDot(to, from, dir) +{ + dirToTarget = VectorNormalize(to-from); + forward = AnglesToForward(dir); + return vectordot(dirToTarget, forward); +} + +/* + Returns the distance squared in a 2d space +*/ +DistanceSquared2D(to, from) +{ + to = (to[0], to[1], 0); + from = (from[0], from[1], 0); + + return DistanceSquared(to, from); +} + +/* + Rounds to the nearest whole number. +*/ +Round(x) +{ + y = int(x); + + if(abs(x) - abs(y) > 0.5) + { + if(x < 0) + return y - 1; + else + return y + 1; + } + else + return y; +} + +/* + Rounds up the given value. +*/ +RoundUp( floatVal ) +{ + i = int( floatVal ); + if ( i != floatVal ) + return i + 1; + else + return i; +} + +/* + converts a string into a float +*/ +float(num) +{ + setdvar("temp_dvar_bot_util", num); + + return GetDvarFloat("temp_dvar_bot_util"); +} + +/* + Tokenizes a string (strtok has limits...) (only one char tok) +*/ +tokenizeLine(line, tok) +{ + tokens = []; + + token = ""; + for (i = 0; i < line.size; i++) + { + c = line[i]; + + if (c == tok) + { + tokens[tokens.size] = token; + token = ""; + continue; + } + + token += c; + } + tokens[tokens.size] = token; + + return tokens; +} + +/* + If the string starts with +*/ +isStrStart( string1, subStr ) +{ + return ( getSubStr( string1, 0, subStr.size ) == subStr ); +} + +/* + Parses tokens into a waypoint obj +*/ +parseTokensIntoWaypoint(tokens) +{ + waypoint = spawnStruct(); + + orgStr = tokens[0]; + orgToks = strtok(orgStr, " "); + waypoint.origin = (float(orgToks[0]), float(orgToks[1]), float(orgToks[2])); + + childStr = tokens[1]; + childToks = strtok(childStr, " "); + waypoint.children = []; + for( j=0; j dist) + continue; + + return true; + } + + return false; +} + +/* + Returns the waypoints that are near +*/ +waypointsNear(waypoints, dist) +{ + dist *= dist; + + answer = []; + + for (i = 0; i < waypoints.size; i++) + { + wp = level.waypoints[waypoints[i]]; + + if (DistanceSquared(wp.origin, self.origin) > dist) + continue; + + answer[answer.size] = waypoints[i]; + } + + return answer; +} + +/* + Returns nearest waypoint of waypoints +*/ +getNearestWaypointOfWaypoints(waypoints) +{ + answer = undefined; + closestDist = 2147483647; + for (i = 0; i < waypoints.size; i++) + { + waypoint = level.waypoints[waypoints[i]]; + thisDist = DistanceSquared(self.origin, waypoint.origin); + + if (isDefined(answer) && thisDist > closestDist) + continue; + + answer = waypoints[i]; + closestDist = thisDist; + } + + return answer; +} + +/* + Returns all waypoints of type +*/ +getWaypointsOfType(type) +{ + answer = []; + for(i = 0; i < level.waypointCount; i++) + { + wp = level.waypoints[i]; + + if (type == "camp") + { + if (wp.type != "crouch") + continue; + + if (wp.children.size != 1) + continue; + } + else if (type != wp.type) + continue; + + answer[answer.size] = i; + } + return answer; +} + +/* + Returns the waypoint for index +*/ +getWaypointForIndex(i) +{ + if (!isDefined(i)) + return undefined; + + return level.waypoints[i]; +} + +/* + Returns the friendly user name for a given map's codename +*/ +getMapName(mapname) +{ + switch(mapname) + { + case "mp_dome": + return "Dome"; + default: + return mapname; + } +} + +/* + Returns a good amount of players. +*/ +getGoodMapAmount() +{ + switch(getdvar("mapname")) + { + case "mp_dome": + if (level.teambased) + return 8; + else + return 5; + default: + return 2; + } +} + +/* + Matches a num to a char +*/ +keyCodeToString(a) +{ + b=""; + switch(a) + { + case 0: b= "a"; break; + case 1: b= "b"; break; + case 2: b= "c"; break; + case 3: b= "d"; break; + case 4: b= "e"; break; + case 5: b= "f"; break; + case 6: b= "g"; break; + case 7: b= "h"; break; + case 8: b= "i"; break; + case 9: b= "j"; break; + case 10: b= "k"; break; + case 11: b= "l"; break; + case 12: b= "m"; break; + case 13: b= "n"; break; + case 14: b= "o"; break; + case 15: b= "p"; break; + case 16: b= "q"; break; + case 17: b= "r"; break; + case 18: b= "s"; break; + case 19: b= "t"; break; + case 20: b= "u"; break; + case 21: b= "v"; break; + case 22: b= "w"; break; + case 23: b= "x"; break; + case 24: b= "y"; break; + case 25: b= "z"; break; + case 26: b= "."; break; + case 27: b= " "; break; + } + return b; +} + +/* + Returns an array of all the bots in the game. +*/ +getBotArray() +{ + result = []; + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!player is_bot()) + continue; + + result[result.size] = player; + } + + return result; +} + +/* + We return a balanced KDTree from the waypoints. +*/ +WaypointsToKDTree() +{ + kdTree = KDTree(); + + kdTree _WaypointsToKDTree(level.waypoints, 0); + + return kdTree; +} + +/* + Recurive function. We construct a balanced KD tree by sorting the waypoints using heap sort. +*/ +_WaypointsToKDTree(waypoints, dem) +{ + if(!waypoints.size) + return; + + callbacksort = undefined; + + switch(dem) + { + case 0: + callbacksort = ::HeapSortCoordX; + break; + case 1: + callbacksort = ::HeapSortCoordY; + break; + case 2: + callbacksort = ::HeapSortCoordZ; + break; + } + + heap = NewHeap(callbacksort); + + for(i = 0; i < waypoints.size; i++) + { + heap HeapInsert(waypoints[i]); + } + + sorted = []; + while(heap.data.size) + { + sorted[sorted.size] = heap.data[0]; + heap HeapRemove(); + } + + median = int(sorted.size/2);//use divide and conq + + left = []; + right = []; + for(i = 0; i < sorted.size; i++) + if(i < median) + right[right.size] = sorted[i]; + else if(i > median) + left[left.size] = sorted[i]; + + self KDTreeInsert(sorted[median]); + + _WaypointsToKDTree(left, (dem+1)%3); + + _WaypointsToKDTree(right, (dem+1)%3); +} + +/* + Returns a new list. +*/ +List() +{ + list = spawnStruct(); + list.count = 0; + list.data = []; + + return list; +} + +/* + Adds a new thing to the list. +*/ +ListAdd(thing) +{ + self.data[self.count] = thing; + + self.count++; +} + +/* + Adds to the start of the list. +*/ +ListAddFirst(thing) +{ + for (i = self.count - 1; i >= 0; i--) + { + self.data[i + 1] = self.data[i]; + } + + self.data[0] = thing; + self.count++; +} + +/* + Removes the thing from the list. +*/ +ListRemove(thing) +{ + for ( i = 0; i < self.count; i++ ) + { + if ( self.data[i] == thing ) + { + while ( i < self.count-1 ) + { + self.data[i] = self.data[i+1]; + i++; + } + + self.data[i] = undefined; + self.count--; + break; + } + } +} + +/* + Returns a new KDTree. +*/ +KDTree() +{ + kdTree = spawnStruct(); + kdTree.root = undefined; + kdTree.count = 0; + + return kdTree; +} + +/* + Called on a KDTree. Will insert the object into the KDTree. +*/ +KDTreeInsert(data)//as long as what you insert has a .origin attru, it will work. +{ + self.root = self _KDTreeInsert(self.root, data, 0, -2147483647, -2147483647, -2147483647, 2147483647, 2147483647, 2147483647); +} + +/* + Recurive function that insert the object into the KDTree. +*/ +_KDTreeInsert(node, data, dem, x0, y0, z0, x1, y1, z1) +{ + if(!isDefined(node)) + { + r = spawnStruct(); + r.data = data; + r.left = undefined; + r.right = undefined; + r.x0 = x0; + r.x1 = x1; + r.y0 = y0; + r.y1 = y1; + r.z0 = z0; + r.z1 = z1; + + self.count++; + + return r; + } + + switch(dem) + { + case 0: + if(data.origin[0] < node.data.origin[0]) + node.left = self _KDTreeInsert(node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1); + else + node.right = self _KDTreeInsert(node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1); + break; + case 1: + if(data.origin[1] < node.data.origin[1]) + node.left = self _KDTreeInsert(node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1); + else + node.right = self _KDTreeInsert(node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1); + break; + case 2: + if(data.origin[2] < node.data.origin[2]) + node.left = self _KDTreeInsert(node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2]); + else + node.right = self _KDTreeInsert(node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1); + break; + } + + return node; +} + +/* + Called on a KDTree, will return the nearest object to the given origin. +*/ +KDTreeNearest(origin) +{ + if(!isDefined(self.root)) + return undefined; + + return self _KDTreeNearest(self.root, origin, self.root.data, DistanceSquared(self.root.data.origin, origin), 0); +} + +/* + Recurive function that will retrieve the closest object to the query. +*/ +_KDTreeNearest(node, point, closest, closestdist, dem) +{ + if(!isDefined(node)) + { + return closest; + } + + thisDis = DistanceSquared(node.data.origin, point); + + if(thisDis < closestdist) + { + closestdist = thisDis; + closest = node.data; + } + + if(node RectDistanceSquared(point) < closestdist) + { + near = node.left; + far = node.right; + if(point[dem] > node.data.origin[dem]) + { + near = node.right; + far = node.left; + } + + closest = self _KDTreeNearest(near, point, closest, closestdist, (dem+1)%3); + + closest = self _KDTreeNearest(far, point, closest, DistanceSquared(closest.origin, point), (dem+1)%3); + } + + return closest; +} + +/* + Called on a rectangle, returns the distance from origin to the rectangle. +*/ +RectDistanceSquared(origin) +{ + dx = 0; + dy = 0; + dz = 0; + + if(origin[0] < self.x0) + dx = origin[0] - self.x0; + else if(origin[0] > self.x1) + dx = origin[0] - self.x1; + + if(origin[1] < self.y0) + dy = origin[1] - self.y0; + else if(origin[1] > self.y1) + dy = origin[1] - self.y1; + + + if(origin[2] < self.z0) + dz = origin[2] - self.z0; + else if(origin[2] > self.z1) + dz = origin[2] - self.z1; + + return dx*dx + dy*dy + dz*dz; +} + +/* + Does the extra check when adding bots +*/ +doExtraCheck() +{ + maps\mp\bots\_bot_internal::checkTheBots(); +} + +/* + A heap invarient comparitor, used for objects, objects with a higher X coord will be first in the heap. +*/ +HeapSortCoordX(item, item2) +{ + return item.origin[0] > item2.origin[0]; +} + +/* + A heap invarient comparitor, used for objects, objects with a higher Y coord will be first in the heap. +*/ +HeapSortCoordY(item, item2) +{ + return item.origin[1] > item2.origin[1]; +} + +/* + A heap invarient comparitor, used for objects, objects with a higher Z coord will be first in the heap. +*/ +HeapSortCoordZ(item, item2) +{ + return item.origin[2] > item2.origin[2]; +} + +/* + A heap invarient comparitor, used for numbers, numbers with the highest number will be first in the heap. +*/ +Heap(item, item2) +{ + return item > item2; +} + +/* + A heap invarient comparitor, used for numbers, numbers with the lowest number will be first in the heap. +*/ +ReverseHeap(item, item2) +{ + return item < item2; +} + +/* + A heap invarient comparitor, used for traces. Wanting the trace with the largest length first in the heap. +*/ +HeapTraceFraction(item, item2) +{ + return item["fraction"] > item2["fraction"]; +} + +/* + Returns a new heap. +*/ +NewHeap(compare) +{ + heap_node = spawnStruct(); + heap_node.data = []; + heap_node.compare = compare; + + return heap_node; +} + +/* + Inserts the item into the heap. Called on a heap. +*/ +HeapInsert(item) +{ + insert = self.data.size; + self.data[insert] = item; + + current = insert+1; + + while(current > 1) + { + last = current; + current = int(current/2); + + if(![[self.compare]](item, self.data[current-1])) + break; + + self.data[last-1] = self.data[current-1]; + self.data[current-1] = item; + } +} + +/* + Helper function to determine what is the next child of the bst. +*/ +_HeapNextChild(node, hsize) +{ + left = node * 2; + right = left + 1; + + if(left > hsize) + return -1; + + if(right > hsize) + return left; + + if([[self.compare]](self.data[left-1], self.data[right-1])) + return left; + else + return right; +} + +/* + Removes an item from the heap. Called on a heap. +*/ +HeapRemove() +{ + remove = self.data.size; + + if(!remove) + return remove; + + move = self.data[remove-1]; + self.data[0] = move; + self.data[remove-1] = undefined; + remove--; + + if(!remove) + return remove; + + last = 1; + next = self _HeapNextChild(1, remove); + + while(next != -1) + { + if([[self.compare]](move, self.data[next-1])) + break; + + self.data[last-1] = self.data[next-1]; + self.data[next-1] = move; + + last = next; + next = self _HeapNextChild(next, remove); + } + + return remove; +} + +/* + A heap invarient comparitor, used for the astar's nodes, wanting the node with the lowest f to be first in the heap. +*/ +ReverseHeapAStar(item, item2) +{ + return item.f < item2.f; +} + +/* + Removes the waypoint usage +*/ +RemoveWaypointUsage(wp, team) +{ + if (!isDefined(level.waypointUsage)) + return; + + if (!isDefined(level.waypointUsage[team][wp+""])) + return; + + level.waypointUsage[team][wp+""]--; + + if (level.waypointUsage[team][wp+""] <= 0) + level.waypointUsage[team][wp+""] = undefined; +} + +/* + Will linearly search for the nearest waypoint to pos that has a direct line of sight. +*/ +GetNearestWaypointWithSight(pos) +{ + candidate = undefined; + dist = 2147483647; + + for(i = 0; i < level.waypointCount; i++) + { + if(!bulletTracePassed(pos + (0, 0, 15), level.waypoints[i].origin + (0, 0, 15), false, undefined)) + continue; + + curdis = DistanceSquared(level.waypoints[i].origin, pos); + if(curdis > dist) + continue; + + dist = curdis; + candidate = i; + } + + return candidate; +} + +/* + Will linearly search for the nearest waypoint +*/ +GetNearestWaypoint(pos) +{ + candidate = undefined; + dist = 2147483647; + + for(i = 0; i < level.waypointCount; i++) + { + curdis = DistanceSquared(level.waypoints[i].origin, pos); + if(curdis > dist) + continue; + + dist = curdis; + candidate = i; + } + + return candidate; +} + +/* + Modified Pezbot astar search. + This makes use of sets for quick look up and a heap for a priority queue instead of simple lists which require to linearly search for elements everytime. + It is also modified to make paths with bots already on more expensive and will try a less congested path first. Thus spliting up the bots onto more paths instead of just one (the smallest). +*/ +AStarSearch(start, goal, team, greedy_path) +{ + open = NewHeap(::ReverseHeapAStar);//heap + openset = [];//set for quick lookup + closed = [];//set for quick lookup + + + startWp = getNearestWaypoint(start); + if(!isDefined(startWp)) + return []; + + _startwp = undefined; + if(!bulletTracePassed(start + (0, 0, 15), level.waypoints[startWp].origin + (0, 0, 15), false, undefined)) + _startwp = GetNearestWaypointWithSight(start); + + if(isDefined(_startwp)) + startWp = _startwp; + + + goalWp = getNearestWaypoint(goal); + if(!isDefined(goalWp)) + return []; + + _goalWp = undefined; + if(!bulletTracePassed(goal + (0, 0, 15), level.waypoints[goalWp].origin + (0, 0, 15), false, undefined)) + _goalwp = GetNearestWaypointWithSight(goal); + + if(isDefined(_goalwp)) + goalWp = _goalwp; + + + node = spawnStruct(); + node.g = 0; //path dist so far + node.h = DistanceSquared(level.waypoints[startWp].origin, level.waypoints[goalWp].origin); //herustic, distance to goal for path finding + node.f = node.h + node.g; // combine path dist and heru, use reverse heap to sort the priority queue by this attru + node.index = startWp; + node.parent = undefined; //we are start, so we have no parent + + //push node onto queue + openset[node.index+""] = node; + open HeapInsert(node); + + //while the queue is not empty + while(open.data.size) + { + //pop bestnode from queue + bestNode = open.data[0]; + open HeapRemove(); + openset[bestNode.index+""] = undefined; + wp = level.waypoints[bestNode.index]; + + //check if we made it to the goal + if(bestNode.index == goalWp) + { + path = []; + + while(isDefined(bestNode)) + { + if(isdefined(team) && isDefined(level.waypointUsage)) + { + if (!isDefined(level.waypointUsage[team][bestNode.index+""])) + level.waypointUsage[team][bestNode.index+""] = 0; + + level.waypointUsage[team][bestNode.index+""]++; + } + + //construct path + path[path.size] = bestNode.index; + + bestNode = bestNode.parent; + } + + return path; + } + + //for each child of bestnode + for(i = wp.children.size - 1; i >= 0; i--) + { + child = wp.children[i]; + childWp = level.waypoints[child]; + + penalty = 1; + if(!greedy_path && isdefined(team) && isDefined(level.waypointUsage)) + { + temppen = 1; + if (isDefined(level.waypointUsage[team][child+""])) + temppen = level.waypointUsage[team][child+""];//consider how many bots are taking this path + + if(temppen > 1) + penalty = temppen; + } + + // have certain types of nodes more expensive + if (childWp.type == "climb" || childWp.type == "prone") + penalty += 4; + + //calc the total path we have took + newg = bestNode.g + DistanceSquared(wp.origin, childWp.origin)*penalty;//bots on same team's path are more expensive + + //check if this child is in open or close with a g value less than newg + inopen = isDefined(openset[child+""]); + if(inopen && openset[child+""].g <= newg) + continue; + + inclosed = isDefined(closed[child+""]); + if(inclosed && closed[child+""].g <= newg) + continue; + + node = undefined; + if(inopen) + node = openset[child+""]; + else if(inclosed) + node = closed[child+""]; + else + node = spawnStruct(); + + node.parent = bestNode; + node.g = newg; + node.h = DistanceSquared(childWp.origin, level.waypoints[goalWp].origin); + node.f = node.g + node.h; + node.index = child; + + //check if in closed, remove it + if(inclosed) + closed[child+""] = undefined; + + //check if not in open, add it + if(!inopen) + { + open HeapInsert(node); + openset[child+""] = node; + } + } + + //done with children, push onto closed + closed[bestNode.index+""] = bestNode; + } + + return []; +} + +/* + Taken from t5 gsc. + Returns an array of number's average. +*/ +array_average( array ) +{ + assert( array.size > 0 ); + total = 0; + for ( i = 0; i < array.size; i++ ) + { + total += array[i]; + } + return ( total / array.size ); +} + +/* + Taken from t5 gsc. + Returns an array of number's standard deviation. +*/ +array_std_deviation( array, mean ) +{ + assert( array.size > 0 ); + tmp = []; + for ( i = 0; i < array.size; i++ ) + { + tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); + } + total = 0; + for ( i = 0; i < tmp.size; i++ ) + { + total = total + tmp[i]; + } + return Sqrt( total / array.size ); +} + +/* + Taken from t5 gsc. + Will produce a random number between lower_bound and upper_bound but with a bell curve distribution (more likely to be close to the mean). +*/ +random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) +{ + x1 = 0; + x2 = 0; + w = 1; + y1 = 0; + while ( w >= 1 ) + { + x1 = 2 * RandomFloatRange( 0, 1 ) - 1; + x2 = 2 * RandomFloatRange( 0, 1 ) - 1; + w = x1 * x1 + x2 * x2; + } + w = Sqrt( ( -2.0 * Log( w ) ) / w ); + y1 = x1 * w; + number = mean + y1 * std_deviation; + if ( IsDefined( lower_bound ) && number < lower_bound ) + { + number = lower_bound; + } + if ( IsDefined( upper_bound ) && number > upper_bound ) + { + number = upper_bound; + } + + return( number ); +} + +/* + Patches the plant sites so it exposes the defuseObject +*/ +onUsePlantObjectFix( player ) +{ + if ( !maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) + { + level thread bombPlantedFix( self, player ); + + for ( i = 0; i < level.bombZones.size; i++ ) + { + if ( level.bombZones[i] == self ) + continue; + + level.bombZones[i] maps\mp\gametypes\_gameobjects::disableObject(); + } + + player playsound( "mp_bomb_plant" ); + player notify( "bomb_planted" ); + player notify( "objective", "plant" ); + player maps\mp\_utility::incPersStat( "plants", 1 ); + player maps\mp\gametypes\_persistence::statSetChild( "round", "plants", player.pers["plants"] ); + + if ( isdefined( level.sd_loadout ) && isdefined( level.sd_loadout[player.team] ) ) + player thread maps\mp\gametypes\sd::removeBombCarrierClass(); + + maps\mp\_utility::leaderDialog( "bomb_planted" ); + level thread maps\mp\_utility::teamPlayerCardSplash( "callout_bombplanted", player ); + level.bombOwner = player; + player thread maps\mp\gametypes\_hud_message::splashNotify( "plant", maps\mp\gametypes\_rank::getScoreInfoValue( "plant" ) ); + player thread maps\mp\gametypes\_rank::giveRankXP( "plant" ); + player.bombPlantedTime = gettime(); + maps\mp\gametypes\_gamescore::givePlayerScore( "plant", player ); + player thread maps\mp\_matchdata::logGameEvent( "plant", player.origin ); + } +} + +/* + Patches the plant sites so it exposes the defuseObject +*/ +bombPlantedFix( var_0, var_1 ) +{ + maps\mp\gametypes\_gamelogic::pauseTimer(); + level.bombPlanted = 1; + var_0.visuals[0] thread maps\mp\gametypes\_gamelogic::playTickingSound(); + level.tickingObject = var_0.visuals[0]; + level.timeLimitOverride = 1; + setgameendtime( int( gettime() + level.bombTimer * 1000 ) ); + setdvar( "ui_bomb_timer", 1 ); + + if ( !level.multiBomb ) + { + level.sdBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" ); + level.sdBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + level.sdBomb maps\mp\gametypes\_gameobjects::setDropped(); + level.sdBombModel = level.sdBomb.visuals[0]; + } + else + { + for ( var_2 = 0; var_2 < level.players.size; var_2++ ) + { + if ( isdefined( level.players[var_2].carryIcon ) ) + level.players[var_2].carryIcon maps\mp\gametypes\_hud_util::destroyElem(); + } + + var_3 = bullettrace( var_1.origin + ( 0, 0, 20 ), var_1.origin - ( 0, 0, 2000 ), 0, var_1 ); + var_4 = randomfloat( 360 ); + var_5 = ( cos( var_4 ), sin( var_4 ), 0 ); + var_5 = vectornormalize( var_5 - var_3["normal"] * vectordot( var_5, var_3["normal"] ) ); + var_6 = vectortoangles( var_5 ); + level.sdBombModel = spawn( "script_model", var_3["position"] ); + level.sdBombModel.angles = var_6; + level.sdBombModel setmodel( "prop_suitcase_bomb" ); + } + + var_0 maps\mp\gametypes\_gameobjects::allowUse( "none" ); + var_0 maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" ); + var_7 = var_0 maps\mp\gametypes\_gameobjects::getLabel(); + var_8 = var_0.bombDefuseTrig; + var_8.origin = level.sdBombModel.origin; + var_9 = []; + defuseObject = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], var_8, var_9, ( 0, 0, 32 ) ); + defuseObject maps\mp\gametypes\_gameobjects::allowUse( "friendly" ); + defuseObject maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime ); + defuseObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" ); + defuseObject maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" ); + defuseObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" ); + defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_defuse" + var_7 ); + defuseObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_defend" + var_7 ); + defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" + var_7 ); + defuseObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" + var_7 ); + defuseObject.label = var_7; + defuseObject.onBeginUse = maps\mp\gametypes\sd::onBeginUse; + defuseObject.onEndUse = maps\mp\gametypes\sd::onEndUse; + defuseObject.onUse = maps\mp\gametypes\sd::onUseDefuseObject; + defuseObject.useWeapon = "briefcase_bomb_defuse_mp"; + + level.defuseObject = defuseObject; + + maps\mp\gametypes\sd::BombTimerWait(); + setdvar( "ui_bomb_timer", 0 ); + var_0.visuals[0] maps\mp\gametypes\_gamelogic::stopTickingSound(); + + if ( level.gameEnded || level.bombDefused ) + return; + + level.bombexploded = 1; + var_11 = level.sdBombModel.origin; + level.sdBombModel hide(); + + if ( isdefined( var_1 ) ) + { + var_0.visuals[0] radiusdamage( var_11, 512, 200, 20, var_1, "MOD_EXPLOSIVE", "bomb_site_mp" ); + var_1 maps\mp\_utility::incPersStat( "destructions", 1 ); + var_1 maps\mp\gametypes\_persistence::statSetChild( "round", "destructions", var_1.pers["destructions"] ); + } + else + var_0.visuals[0] radiusdamage( var_11, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "bomb_site_mp" ); + + var_12 = randomfloat( 360 ); + var_13 = spawnfx( level._effect["bombexplosion"], var_11 + ( 0, 0, 50 ), ( 0, 0, 1 ), ( cos( var_12 ), sin( var_12 ), 0 ) ); + triggerfx( var_13 ); + playrumbleonposition( "grenade_rumble", var_11 ); + earthquake( 0.75, 2.0, var_11, 2000 ); + thread maps\mp\_utility::playSoundinSpace( "exp_suitcase_bomb_main", var_11 ); + + if ( isdefined( var_0.exploderIndex ) ) + common_scripts\utility::exploder( var_0.exploderIndex ); + + for ( var_2 = 0; var_2 < level.bombZones.size; var_2++ ) + level.bombZones[var_2] maps\mp\gametypes\_gameobjects::disableObject(); + + defuseObject maps\mp\gametypes\_gameobjects::disableObject(); + setgameendtime( 0 ); + wait 3; + maps\mp\gametypes\sd::sd_endGame( game["attackers"], game["strings"]["target_destroyed"] ); +} + +/* + Patches giveLoadout so that it doesn't use IsItemUnlocked +*/ +botGiveLoadout( team, class, allowCopycat, setPrimarySpawnWeapon ) // setPrimarySpawnWeapon only when called during spawn +{ + self endon("death"); + + self takeallweapons(); + self.changingWeapon = undefined; + teamName = "none"; + + if ( !isdefined( setPrimarySpawnWeapon ) ) + setPrimarySpawnWeapon = true; + + primaryIndex = 0; + + // initialize specialty array + self.specialty = []; + + if ( !isdefined( allowCopycat ) ) + allowCopycat = true; + + primaryWeapon = undefined; + var_7 = 0; + + // set in game mode custom class + loadoutKillstreak1 = undefined; + loadoutKillstreak2 = undefined; + loadoutKillstreak3 = undefined; + + if ( issubstr( class, "axis" ) ) + teamName = "axis"; + else if ( issubstr( class, "allies" ) ) + teamName = "allies"; + + clonedLoadout = []; + + if ( isdefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat ) + { + self maps\mp\gametypes\_class::setClass( "copycat" ); + self.class_num = maps\mp\gametypes\_class::getClassIndex( "copycat" ); + clonedLoadout = self.pers["copyCatLoadout"]; + loadoutPrimary = clonedLoadout["loadoutPrimary"]; + loadoutPrimaryAttachment = clonedLoadout["loadoutPrimaryAttachment"]; + loadoutPrimaryAttachment2 = clonedLoadout["loadoutPrimaryAttachment2"]; + loadoutPrimaryBuff = clonedLoadout["loadoutPrimaryBuff"]; + loadoutPrimaryCamo = clonedLoadout["loadoutPrimaryCamo"]; + loadoutPrimaryReticle = clonedLoadout["loadoutPrimaryReticle"]; + loadoutSecondary = clonedLoadout["loadoutSecondary"]; + loadoutSecondaryAttachment = clonedLoadout["loadoutSecondaryAttachment"]; + loadoutSecondaryAttachment2 = clonedLoadout["loadoutSecondaryAttachment2"]; + loadoutSecondaryBuff = clonedLoadout["loadoutSecondaryBuff"]; + loadoutSecondaryCamo = clonedLoadout["loadoutSecondaryCamo"]; + loadoutSecondaryReticle = clonedLoadout["loadoutSecondaryReticle"]; + loadoutEquipment = clonedLoadout["loadoutEquipment"]; + loadoutPerk1 = clonedLoadout["loadoutPerk1"]; + loadoutPerk2 = clonedLoadout["loadoutPerk2"]; + loadoutPerk3 = clonedLoadout["loadoutPerk3"]; + loadoutStreakType = clonedLoadout["loadoutStreakType"]; + loadoutOffhand = clonedLoadout["loadoutOffhand"]; + loadoutDeathStreak = clonedLoadout["loadoutDeathstreak"]; + loadoutAmmoType = clonedLoadout["loadoutAmmoType"]; + } + else if ( teamName != "none" ) + { + classIndex = maps\mp\gametypes\_class::getClassIndex( class ); + loadoutPrimaryAttachment2 = "none"; + loadoutSecondaryAttachment2 = "none"; + loadoutPrimary = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "weapon" ); + loadoutPrimaryAttachment = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "attachment", 0 ); + loadoutPrimaryAttachment2 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "attachment", 1 ); + loadoutPrimaryBuff = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "buff" ); + loadoutPrimaryCamo = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "camo" ); + loadoutPrimaryReticle = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 0, "reticle" ); + loadoutSecondary = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "weapon" ); + loadoutSecondaryAttachment = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "attachment", 0 ); + loadoutSecondaryAttachment2 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "attachment", 1 ); + loadoutSecondaryBuff = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "buff" ); + loadoutSecondaryCamo = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "camo" ); + loadoutSecondaryReticle = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "weaponSetups", 1, "reticle" ); + + if ( (loadoutPrimary == "throwingknife" || loadoutPrimary == "none") && loadoutSecondary != "none" ) + { + loadoutPrimary = loadoutSecondary; + loadoutPrimaryAttachment = loadoutSecondaryAttachment; + loadoutPrimaryAttachment2 = loadoutSecondaryAttachment2; + loadoutPrimaryBuff = loadoutSecondaryBuff; + loadoutPrimaryCamo = loadoutSecondaryCamo; + loadoutPrimaryReticle = loadoutSecondaryReticle; + loadoutSecondary = "none"; + loadoutSecondaryAttachment = "none"; + loadoutSecondaryAttachment2 = "none"; + loadoutSecondaryBuff = "specialty_null"; + loadoutSecondaryCamo = "none"; + loadoutSecondaryReticle = "none"; + } + else if ( (loadoutPrimary == "throwingknife" || loadoutPrimary == "none") && loadoutSecondary == "none" ) + { + var_7 = 1; + loadoutPrimary = "iw5_usp45"; + loadoutPrimaryAttachment = "tactical"; + } + + loadoutEquipment = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 0 ); + loadoutPerk1 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 1 ); + loadoutPerk2 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 2 ); + loadoutPerk3 = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 3 ); + + if ( loadoutSecondary != "none" && !maps\mp\gametypes\_class::isValidSecondary( loadoutSecondary, loadoutPerk2, 0 ) ) + { + loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 1 ); + loadoutSecondaryAttachment = "none"; + loadoutSecondaryAttachment2 = "none"; + loadoutSecondaryBuff = "specialty_null"; + loadoutSecondaryCamo = "none"; + loadoutSecondaryReticle = "none"; + } + + loadoutStreakType = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 5 ); + + if ( loadoutStreakType == "specialty_null" ) + { + loadoutKillstreak1 = "none"; + loadoutKillstreak2 = "none"; + loadoutKillstreak3 = "none"; + } + else + { + loadoutKillstreak1 = maps\mp\gametypes\_class::recipe_getKillstreak( teamName, classIndex, loadoutStreakType, 0 ); + loadoutKillstreak2 = maps\mp\gametypes\_class::recipe_getKillstreak( teamName, classIndex, loadoutStreakType, 1 ); + loadoutKillstreak3 = maps\mp\gametypes\_class::recipe_getKillstreak( teamName, classIndex, loadoutStreakType, 2 ); + } + + loadoutOffhand = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "perks", 6 ); + + if ( loadoutOffhand == "specialty_null" ) + loadoutOffhand = "none"; + + loadoutDeathStreak = getmatchrulesdata( "defaultClasses", teamName, classIndex, "class", "deathstreak" ); + + if ( getmatchrulesdata( "defaultClasses", teamName, classIndex, "juggernaut" ) ) + { + self thread recipeClassApplyJuggernaut( isJuggernaut() ); + self.isJuggernaut = true; + self.juggmovespeedscaler = 0.7; + } + else if ( isJuggernaut() ) + { + self notify( "lost_juggernaut" ); + self.isJuggernaut = false; + self.moveSpeedScaler = 1; + } + } + else if ( issubstr( class, "custom" ) ) + { + class_num = maps\mp\gametypes\_class::getClassIndex( class ); + self.class_num = class_num; + loadoutPrimary = maps\mp\gametypes\_class::cac_getWeapon( class_num, 0 ); + loadoutPrimaryAttachment = maps\mp\gametypes\_class::cac_getWeaponAttachment( class_num, 0 ); + loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::cac_getWeaponAttachmentTwo( class_num, 0 ); + loadoutPrimaryBuff = maps\mp\gametypes\_class::cac_getWeaponBuff( class_num, 0 ); + loadoutPrimaryCamo = maps\mp\gametypes\_class::cac_getWeaponCamo( class_num, 0 ); + loadoutPrimaryReticle = maps\mp\gametypes\_class::cac_getWeaponReticle( class_num, 0 ); + loadoutSecondary = maps\mp\gametypes\_class::cac_getWeapon( class_num, 1 ); + loadoutSecondaryAttachment = maps\mp\gametypes\_class::cac_getWeaponAttachment( class_num, 1 ); + loadoutSecondaryAttachment2 = maps\mp\gametypes\_class::cac_getWeaponAttachmentTwo( class_num, 1 ); + loadoutSecondaryBuff = maps\mp\gametypes\_class::cac_getWeaponBuff( class_num, 1 ); + loadoutSecondaryCamo = maps\mp\gametypes\_class::cac_getWeaponCamo( class_num, 1 ); + loadoutSecondaryReticle = maps\mp\gametypes\_class::cac_getWeaponReticle( class_num, 1 ); + loadoutEquipment = maps\mp\gametypes\_class::cac_getPerk( class_num, 0 ); + loadoutPerk1 = maps\mp\gametypes\_class::cac_getPerk( class_num, 1 ); + loadoutPerk2 = maps\mp\gametypes\_class::cac_getPerk( class_num, 2 ); + loadoutPerk3 = maps\mp\gametypes\_class::cac_getPerk( class_num, 3 ); + loadoutStreakType = maps\mp\gametypes\_class::cac_getPerk( class_num, 5 ); + loadoutOffhand = maps\mp\gametypes\_class::cac_getOffhand( class_num ); + loadoutDeathStreak = maps\mp\gametypes\_class::cac_getDeathstreak( class_num ); + } + else if ( class == "gamemode" ) + { + gamemodeLoadout = self.pers["gamemodeLoadout"]; + loadoutPrimary = gamemodeLoadout["loadoutPrimary"]; + loadoutPrimaryAttachment = gamemodeLoadout["loadoutPrimaryAttachment"]; + loadoutPrimaryAttachment2 = gamemodeLoadout["loadoutPrimaryAttachment2"]; + loadoutPrimaryBuff = gamemodeLoadout["loadoutPrimaryBuff"]; + loadoutPrimaryCamo = gamemodeLoadout["loadoutPrimaryCamo"]; + loadoutPrimaryReticle = gamemodeLoadout["loadoutPrimaryReticle"]; + loadoutSecondary = gamemodeLoadout["loadoutSecondary"]; + loadoutSecondaryAttachment = gamemodeLoadout["loadoutSecondaryAttachment"]; + loadoutSecondaryAttachment2 = gamemodeLoadout["loadoutSecondaryAttachment2"]; + loadoutSecondaryBuff = gamemodeLoadout["loadoutSecondaryBuff"]; + loadoutSecondaryCamo = gamemodeLoadout["loadoutSecondaryCamo"]; + loadoutSecondaryReticle = gamemodeLoadout["loadoutSecondaryReticle"]; + + if ( (loadoutPrimary == "throwingknife" || loadoutPrimary == "none") && loadoutSecondary != "none" ) + { + loadoutPrimary = loadoutSecondary; + loadoutPrimaryAttachment = loadoutSecondaryAttachment; + loadoutPrimaryAttachment2 = loadoutSecondaryAttachment2; + loadoutPrimaryBuff = loadoutSecondaryBuff; + loadoutPrimaryCamo = loadoutSecondaryCamo; + loadoutPrimaryReticle = loadoutSecondaryReticle; + loadoutSecondary = "none"; + loadoutSecondaryAttachment = "none"; + loadoutSecondaryAttachment2 = "none"; + loadoutSecondaryBuff = "specialty_null"; + loadoutSecondaryCamo = "none"; + loadoutSecondaryReticle = "none"; + } + else if ( (loadoutPrimary == "throwingknife" || loadoutPrimary == "none") && loadoutSecondary == "none" ) + { + var_7 = 1; + loadoutPrimary = "iw5_usp45"; + loadoutPrimaryAttachment = "tactical"; + } + + loadoutEquipment = gamemodeLoadout["loadoutEquipment"]; + loadoutOffhand = gamemodeLoadout["loadoutOffhand"]; + + if ( loadoutOffhand == "specialty_null" ) + loadoutOffhand = "none"; + + loadoutPerk1 = gamemodeLoadout["loadoutPerk1"]; + loadoutPerk2 = gamemodeLoadout["loadoutPerk2"]; + loadoutPerk3 = gamemodeLoadout["loadoutPerk3"]; + + if ( loadoutSecondary != "none" && !maps\mp\gametypes\_class::isValidSecondary( loadoutSecondary, loadoutPerk2, 0 ) ) + { + loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 1 ); + loadoutSecondaryAttachment = "none"; + loadoutSecondaryAttachment2 = "none"; + loadoutSecondaryBuff = "specialty_null"; + loadoutSecondaryCamo = "none"; + loadoutSecondaryReticle = "none"; + } + + if ( level.killstreakRewards && isdefined( gamemodeLoadout["loadoutStreakType"] ) && gamemodeLoadout["loadoutStreakType"] != "specialty_null" ) + { + loadoutStreakType = gamemodeLoadout["loadoutStreakType"]; + loadoutKillstreak1 = gamemodeLoadout["loadoutKillstreak1"]; + loadoutKillstreak2 = gamemodeLoadout["loadoutKillstreak2"]; + loadoutKillstreak3 = gamemodeLoadout["loadoutKillstreak3"]; + } + else if ( level.killstreakRewards && isdefined( self.streakType ) ) + loadoutStreakType = maps\mp\gametypes\_class::getLoadoutStreakTypeFromStreakType( self.streakType ); + else + { + loadoutStreakType = "streaktype_assault"; + loadoutKillstreak1 = "none"; + loadoutKillstreak2 = "none"; + loadoutKillstreak3 = "none"; + } + + loadoutDeathStreak = gamemodeLoadout["loadoutDeathstreak"]; + + if ( gamemodeLoadout["loadoutJuggernaut"] ) + { + self.health = self.maxHealth; + self thread recipeClassApplyJuggernaut( isJuggernaut() ); + self.isJuggernaut = true; + self.juggmovespeedscaler = 0.7; + } + else if ( isJuggernaut() ) + { + self notify( "lost_juggernaut" ); + self.isJuggernaut = false; + self.moveSpeedScaler = 1; + } + } + else if ( class == "juggernaut" ) + { + loadoutPrimary = "iw5_m60jugg"; + loadoutPrimaryAttachment = "none"; + loadoutPrimaryAttachment2 = "none"; + loadoutPrimaryBuff = "specialty_null"; + loadoutPrimaryCamo = "none"; + loadoutPrimaryReticle = "none"; + loadoutSecondary = "iw5_mp412jugg"; + loadoutSecondaryAttachment = "none"; + loadoutSecondaryAttachment2 = "none"; + loadoutSecondaryBuff = "specialty_null"; + loadoutSecondaryCamo = "none"; + loadoutSecondaryReticle = "none"; + loadoutEquipment = "frag_grenade_mp"; + loadoutPerk1 = "specialty_scavenger"; + loadoutPerk2 = "specialty_quickdraw"; + loadoutPerk3 = "specialty_detectexplosive"; + loadoutStreakType = maps\mp\gametypes\_class::getLoadoutStreakTypeFromStreakType( self.streakType ); + loadoutOffhand = "smoke_grenade_mp"; + loadoutDeathStreak = "specialty_null"; + } + else if ( class == "juggernaut_recon" ) + { + loadoutPrimary = "iw5_riotshieldjugg"; + loadoutPrimaryAttachment = "none"; + loadoutPrimaryAttachment2 = "none"; + loadoutPrimaryBuff = "specialty_null"; + loadoutPrimaryCamo = "none"; + loadoutPrimaryReticle = "none"; + loadoutSecondary = "iw5_usp45jugg"; + loadoutSecondaryAttachment = "none"; + loadoutSecondaryAttachment2 = "none"; + loadoutSecondaryBuff = "specialty_null"; + loadoutSecondaryCamo = "none"; + loadoutSecondaryReticle = "none"; + loadoutEquipment = "specialty_portable_radar"; + loadoutPerk1 = "specialty_scavenger"; + loadoutPerk2 = "specialty_coldblooded"; + loadoutPerk3 = "specialty_detectexplosive"; + loadoutStreakType = maps\mp\gametypes\_class::getLoadoutStreakTypeFromStreakType( self.streakType ); + loadoutOffhand = "smoke_grenade_mp"; + loadoutDeathStreak = "specialty_null"; + } + else + { + class_num = maps\mp\gametypes\_class::getClassIndex( class ); + self.class_num = class_num; + loadoutPrimary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, class_num, 0 ); + loadoutPrimaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 0, 0 ); + loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 0, 1 ); + loadoutPrimaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, class_num, 0 ); + loadoutPrimaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, class_num, 0 ); + loadoutPrimaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableName, class_num, 0 ); + loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, class_num, 1 ); + loadoutSecondaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 1, 0 ); + loadoutSecondaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, class_num, 1, 1 ); + loadoutSecondaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, class_num, 1 ); + loadoutSecondaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, class_num, 1 ); + loadoutSecondaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableName, class_num, 1 ); + loadoutEquipment = maps\mp\gametypes\_class::table_getEquipment( level.classTableName, class_num, 0 ); + loadoutPerk1 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, class_num, 1 ); + loadoutPerk2 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, class_num, 2 ); + loadoutPerk3 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, class_num, 3 ); + loadoutStreakType = maps\mp\gametypes\_class::table_getPerk( level.classTableName, class_num, 5 ); + loadoutOffhand = maps\mp\gametypes\_class::table_getOffhand( level.classTableName, class_num ); + loadoutDeathStreak = maps\mp\gametypes\_class::table_getDeathstreak( level.classTableName, class_num ); + } + + self maps\mp\gametypes\_class::loadoutFakePerks( loadoutStreakType ); + isCustomClass = issubstr( class, "custom" ); + isRecipeClass = issubstr( class, "recipe" ); + isGameModeClass = (class == "gamemode"); + + if ( !isGameModeClass && !isRecipeClass && !(isdefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat) ) + { + if ( !maps\mp\gametypes\_class::isValidPrimary( loadoutPrimary ) ) + loadoutPrimary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 0 ); + + if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutPrimaryAttachment ) ) + loadoutPrimaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 0, 0 ); + + if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutPrimaryAttachment2 ) ) + loadoutPrimaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 0, 1 ); + + if ( !maps\mp\gametypes\_class::isValidWeaponBuff( loadoutPrimaryBuff, loadoutPrimary ) ) + loadoutPrimaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, 10, 0 ); + + if ( !maps\mp\gametypes\_class::isValidCamo( loadoutPrimaryCamo ) ) + loadoutPrimaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, 10, 0 ); + + if ( !maps\mp\gametypes\_class::isValidReticle( loadoutPrimaryReticle ) ) + loadoutPrimaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableNum, 10, 0 ); + + if ( !maps\mp\gametypes\_class::isValidSecondary( loadoutSecondary, loadoutPerk2 ) ) + { + loadoutSecondary = maps\mp\gametypes\_class::table_getWeapon( level.classTableName, 10, 1 ); + loadoutSecondaryAttachment = "none"; + loadoutSecondaryAttachment2 = "none"; + loadoutSecondaryBuff = "specialty_null"; + loadoutSecondaryCamo = "none"; + loadoutSecondaryReticle = "none"; + } + + if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutSecondaryAttachment ) ) + loadoutSecondaryAttachment = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 1, 0 ); + + if ( !maps\mp\gametypes\_class::isValidAttachment( loadoutSecondaryAttachment2 ) ) + loadoutSecondaryAttachment2 = maps\mp\gametypes\_class::table_getWeaponAttachment( level.classTableName, 10, 1, 1 ); + + if ( loadoutPerk2 == "specialty_twoprimaries" && !maps\mp\gametypes\_class::isValidWeaponBuff( loadoutSecondaryBuff, loadoutSecondary ) ) + loadoutSecondaryBuff = maps\mp\gametypes\_class::table_getWeaponBuff( level.classTableName, 10, 1 ); + + if ( !maps\mp\gametypes\_class::isValidCamo( loadoutSecondaryCamo ) ) + loadoutSecondaryCamo = maps\mp\gametypes\_class::table_getWeaponCamo( level.classTableName, 10, 1 ); + + if ( !maps\mp\gametypes\_class::isValidReticle( loadoutSecondaryReticle ) ) + loadoutSecondaryReticle = maps\mp\gametypes\_class::table_getWeaponReticle( level.classTableName, 10, 1 ); + + if ( !maps\mp\gametypes\_class::isValidEquipment( loadoutEquipment ) ) + loadoutEquipment = maps\mp\gametypes\_class::table_getEquipment( level.classTableName, 10, 0 ); + + if ( !maps\mp\gametypes\_class::isValidPerk1( loadoutPerk1 ) ) + loadoutPerk1 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 1 ); + + if ( !maps\mp\gametypes\_class::isValidPerk2( loadoutPerk2 ) ) + loadoutPerk2 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 2 ); + + if ( !maps\mp\gametypes\_class::isValidPerk3( loadoutPerk3 ) ) + loadoutPerk3 = maps\mp\gametypes\_class::table_getPerk( level.classTableName, 10, 3 ); + + if ( !maps\mp\gametypes\_class::isValidDeathStreak( loadoutDeathStreak ) ) + loadoutDeathStreak = maps\mp\gametypes\_class::table_getDeathstreak( level.classTableName, 10 ); + + if ( !maps\mp\gametypes\_class::isValidOffhand( loadoutOffhand ) ) + loadoutOffhand = maps\mp\gametypes\_class::table_getOffhand( level.classTableName, 10 ); + + if ( loadoutPrimaryAttachment2 != "none" && loadoutPrimaryBuff != "specialty_bling" ) + loadoutPrimaryAttachment2 = "none"; + + if ( loadoutSecondaryBuff != "specialty_null" && loadoutPerk2 != "specialty_twoprimaries" ) + loadoutSecondaryBuff = "specialty_null"; + + if ( loadoutSecondaryAttachment2 != "none" && (loadoutSecondaryBuff != "specialty_bling" || loadoutPerk2 != "specialty_twoprimaries") ) + loadoutSecondaryAttachment2 = "none"; + } + + self.loadoutPrimary = loadoutPrimary; + self.loadoutPrimaryCamo = int( tablelookup( "mp/camoTable.csv", 1, loadoutPrimaryCamo, 0 ) ); + self.loadoutSecondary = loadoutSecondary; + self.loadoutSecondaryCamo = int( tablelookup( "mp/camoTable.csv", 1, loadoutSecondaryCamo, 0 ) ); + + if ( !issubstr( loadoutPrimary, "iw5" ) ) + self.loadoutPrimaryCamo = 0; + + if ( !issubstr( loadoutSecondary, "iw5" ) ) + self.loadoutSecondaryCamo = 0; + + self.loadoutPrimaryReticle = int( tablelookup( "mp/reticleTable.csv", 1, loadoutPrimaryReticle, 0 ) ); + self.loadoutSecondaryReticle = int( tablelookup( "mp/reticleTable.csv", 1, loadoutSecondaryReticle, 0 ) ); + + if ( !issubstr( loadoutPrimary, "iw5" ) ) + self.loadoutPrimaryReticle = 0; + + if ( !issubstr( loadoutSecondary, "iw5" ) ) + self.loadoutSecondaryReticle = 0; + + if ( loadoutSecondary == "none" ) + secondaryName = "none"; + else + { + secondaryName = maps\mp\gametypes\_class::buildWeaponName( loadoutSecondary, loadoutSecondaryAttachment, loadoutSecondaryAttachment2, self.loadoutSecondaryCamo, self.loadoutSecondaryReticle ); + self _giveWeapon( secondaryName ); + weaponTokens = strtok( secondaryName, "_" ); + + if ( weaponTokens[0] == "iw5" ) + weaponTokens[0] = weaponTokens[0] + "_" + weaponTokens[1]; + else if ( weaponTokens[0] == "alt" ) + weaponTokens[0] = weaponTokens[1] + "_" + weaponTokens[2]; + + weaponName = weaponTokens[0]; + curWeaponRank = self maps\mp\gametypes\_rank::getWeaponRank( weaponName ); + curWeaponStatRank = self getplayerdata( "weaponRank", weaponName ); + + if ( curWeaponRank != curWeaponStatRank ) + self setplayerdata( "weaponRank", weaponName, curWeaponRank ); + } + + self setoffhandprimaryclass( "other" ); + self _setActionSlot( 1, "" ); + self _setActionSlot( 3, "altMode" ); + self _setActionSlot( 4, "" ); + + if ( !level.console ) + { + self _setActionSlot( 5, "" ); + self _setActionSlot( 6, "" ); + self _setActionSlot( 7, "" ); + } + + self _clearPerks(); + self maps\mp\gametypes\_class::_detachAll(); + + if ( level.dieHardMode ) + self givePerk( "specialty_pistoldeath", false ); + + self loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loadoutPrimaryBuff, loadoutSecondaryBuff ); + + if ( self _hasPerk( "specialty_extraammo" ) && secondaryName != "none" && getWeaponClass( secondaryName ) != "weapon_projectile" ) + self givemaxammo( secondaryName ); + + self.spawnperk = false; + + if ( !self _hasPerk( "specialty_blindeye" ) && self.avoidKillstreakOnSpawnTimer > 0 ) + self thread maps\mp\perks\_perks::giveBlindEyeAfterSpawn(); + + if ( self.pers["cur_death_streak"] > 0 ) + { + deathStreaks = []; + + if ( loadoutDeathStreak != "specialty_null" ) + deathStreaks[loadoutDeathStreak] = int( tablelookup( "mp/perkTable.csv", 1, loadoutDeathStreak, 6 ) ); + + if ( self getPerkUpgrade( loadoutPerk1 ) == "specialty_rollover" || self getPerkUpgrade( loadoutPerk2 ) == "specialty_rollover" || getPerkUpgrade( loadoutPerk3 ) == "specialty_rollover" ) + { + foreach ( key, value in deathStreaks ) + deathStreaks[key] -= 1; + } + + foreach ( key, value in deathStreaks ) + { + if ( self.pers["cur_death_streak"] >= value ) + { + if ( key == "specialty_carepackage" && self.pers["cur_death_streak"] > value ) + continue; + + if ( key == "specialty_uav" && self.pers["cur_death_streak"] > value ) + continue; + + self thread givePerk( key, true ); + self thread maps\mp\gametypes\_hud_message::splashNotify( key ); + } + } + } + + if ( level.killstreakRewards && !isdefined( loadoutKillstreak1 ) && !isdefined( loadoutKillstreak2 ) && !isdefined( loadoutKillstreak3 ) ) + { + if ( isdefined( self.pers["copyCatLoadout"] ) && self.pers["copyCatLoadout"]["inUse"] && allowCopycat ) + { + loadoutKillstreak1 = clonedLoadout["loadoutKillstreak1"]; + loadoutKillstreak2 = clonedLoadout["loadoutKillstreak2"]; + loadoutKillstreak3 = clonedLoadout["loadoutKillstreak3"]; + } + else + { + defaultKillstreak1 = undefined; + defaultKillstreak2 = undefined; + defaultKillstreak3 = undefined; + playerData = undefined; + + switch ( self.streakType ) + { + case "support": + defaultKillstreak1 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 2, 1 ); + defaultKillstreak2 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 2, 2 ); + defaultKillstreak3 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 2, 3 ); + playerData = "defenseStreaks"; + break; + case "specialist": + defaultKillstreak1 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 1, 1 ); + defaultKillstreak2 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 1, 2 ); + defaultKillstreak3 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 1, 3 ); + playerData = "specialistStreaks"; + break; + default: + defaultKillstreak1 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 1 ); + defaultKillstreak2 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 2 ); + defaultKillstreak3 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 3 ); + playerData = "assaultStreaks"; + break; + } + + loadoutKillstreak1 = undefined; + loadoutKillstreak2 = undefined; + loadoutKillstreak3 = undefined; + + if ( issubstr( class, "custom" ) ) + { + customClassLoc = maps\mp\gametypes\_class::cac_getCustomClassLoc(); + loadoutKillstreak1 = self getplayerdata( customClassLoc, self.class_num, playerData, 0 ); + loadoutKillstreak2 = self getplayerdata( customClassLoc, self.class_num, playerData, 1 ); + loadoutKillstreak3 = self getplayerdata( customClassLoc, self.class_num, playerData, 2 ); + } + + if ( issubstr( class, "juggernaut" ) || isGameModeClass ) + { + foreach ( killstreak in self.killstreaks ) + { + if ( !isdefined( loadoutKillstreak1 ) ) + { + loadoutKillstreak1 = killstreak; + continue; + } + + if ( !isdefined( loadoutKillstreak2 ) ) + { + loadoutKillstreak2 = killstreak; + continue; + } + + if ( !isdefined( loadoutKillstreak3 ) ) + loadoutKillstreak3 = killstreak; + } + + if ( isGameModeClass && self.streakType == "specialist" ) + { + self.pers["gamemodeLoadout"]["loadoutKillstreak1"] = loadoutKillstreak1; + self.pers["gamemodeLoadout"]["loadoutKillstreak2"] = loadoutKillstreak2; + self.pers["gamemodeLoadout"]["loadoutKillstreak3"] = loadoutKillstreak3; + } + } + + if ( !issubstr( class, "custom" ) && !issubstr( class, "juggernaut" ) && !isGameModeClass ) + { + loadoutKillstreak1 = defaultKillstreak1; + loadoutKillstreak2 = defaultKillstreak2; + loadoutKillstreak3 = defaultKillstreak3; + } + + if ( !isdefined( loadoutKillstreak1 ) ) + loadoutKillstreak1 = "none"; + + if ( !isdefined( loadoutKillstreak2 ) ) + loadoutKillstreak2 = "none"; + + if ( !isdefined( loadoutKillstreak3 ) ) + loadoutKillstreak3 = "none"; + + var_56 = 0; + + if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak1 ) ) + var_56 = 1; + + if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak2 ) ) + var_56 = 1; + + if ( !maps\mp\gametypes\_class::isValidKillstreak( loadoutKillstreak3 ) ) + var_56 = 1; + + if ( var_56 ) + { + self.streakType = "assault"; + loadoutKillstreak1 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 1 ); + loadoutKillstreak2 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 2 ); + loadoutKillstreak3 = maps\mp\gametypes\_class::table_getKillstreak( level.classTableName, 0, 3 ); + } + } + } + else if ( !level.killstreakRewards ) + { + loadoutKillstreak1 = "none"; + loadoutKillstreak2 = "none"; + loadoutKillstreak3 = "none"; + } + + self maps\mp\gametypes\_class::setKillstreaks( loadoutKillstreak1, loadoutKillstreak2, loadoutKillstreak3 ); + + if ( isdefined( self.lastClass ) && self.lastClass != self.class && !issubstr( self.class, "juggernaut" ) && !issubstr( self.lastClass, "juggernaut" ) && !issubstr( class, "juggernaut" ) ) + { + if ( wasOnlyRound() || self.lastClass != "" ) + { + streakNames = []; + inc = 0; + + if ( self.pers["killstreaks"].size > 5 ) + { + for ( i = 5; i < self.pers["killstreaks"].size; i++ ) + { + streakNames[inc] = self.pers["killstreaks"][i].streakName; + inc++; + } + } + + if ( self.pers["killstreaks"].size ) + { + for ( i = 1; i < 4; i++ ) + { + if ( isdefined( self.pers["killstreaks"][i] ) && isdefined( self.pers["killstreaks"][i].streakName ) && self.pers["killstreaks"][i].available && !self.pers["killstreaks"][i].isSpecialist ) + { + streakNames[inc] = self.pers["killstreaks"][i].streakName; + inc++; + } + } + } + + self notify( "givingLoadout" ); + self maps\mp\killstreaks\_killstreaks::clearKillstreaks(); + + for ( i = 0; i < streakNames.size; i++ ) + self maps\mp\killstreaks\_killstreaks::giveKillstreak( streakNames[i] ); + } + } + + if ( !issubstr( class, "juggernaut" ) ) + { + if ( isdefined( self.lastClass ) && self.lastClass != "" && self.lastClass != self.class ) + self incPlayerStat( "mostclasseschanged", 1 ); + + self.pers["lastClass"] = self.class; + self.lastClass = self.class; + } + + if ( isdefined( self.gamemode_chosenclass ) ) + { + self.pers["class"] = self.gamemode_chosenclass; + self.pers["lastClass"] = self.gamemode_chosenclass; + self.class = self.gamemode_chosenclass; + self.lastClass = self.gamemode_chosenclass; + self.gamemode_chosenclass = undefined; + } + + primaryName = maps\mp\gametypes\_class::buildWeaponName( loadoutPrimary, loadoutPrimaryAttachment, loadoutPrimaryAttachment2, self.loadoutPrimaryCamo, self.loadoutPrimaryReticle ); + self _giveWeapon( primaryName ); + self switchtoweapon( primaryName ); + weaponTokens = strtok( primaryName, "_" ); + + if ( weaponTokens[0] == "iw5" ) + weaponName = weaponTokens[0] + "_" + weaponTokens[1]; + else if ( weaponTokens[0] == "alt" ) + weaponName = weaponTokens[1] + "_" + weaponTokens[2]; + else + weaponName = weaponTokens[0]; + + curWeaponRank = self maps\mp\gametypes\_rank::getWeaponRank( weaponName ); + curWeaponStatRank = self getplayerdata( "weaponRank", weaponName ); + + if ( curWeaponRank != curWeaponStatRank ) + self setplayerdata( "weaponRank", weaponName, curWeaponRank ); + + if ( primaryName == "riotshield_mp" && level.inGracePeriod ) + self notify( "weapon_change", "riotshield_mp" ); + + if ( self _hasPerk( "specialty_extraammo" ) ) + self givemaxammo( primaryName ); + + if ( setPrimarySpawnWeapon ) + self setspawnweapon( primaryName ); + + self.pers["primaryWeapon"] = weaponName; + primaryTokens = strtok( primaryName, "_" ); + offhandSecondaryWeapon = loadoutOffhand; + + if ( loadoutOffhand == "none" ) + self setoffhandsecondaryclass( "none" ); + else if ( loadoutOffhand == "flash_grenade_mp" ) + self setoffhandsecondaryclass( "flash" ); + else if ( loadoutOffhand == "smoke_grenade_mp" || loadoutOffhand == "concussion_grenade_mp" ) + self setoffhandsecondaryclass( "smoke" ); + else + self setoffhandsecondaryclass( "flash" ); + + switch ( offhandSecondaryWeapon ) + { + case "none": + break; + case "trophy_mp": + case "specialty_portable_radar": + case "specialty_scrambler": + case "specialty_tacticalinsertion": + self givePerk( offhandSecondaryWeapon, 0 ); + break; + default: + self giveweapon( offhandSecondaryWeapon ); + + if ( loadoutOffhand == "flash_grenade_mp" ) + self setweaponammoclip( offhandSecondaryWeapon, 2 ); + else if ( loadoutOffhand == "concussion_grenade_mp" ) + self setweaponammoclip( offhandSecondaryWeapon, 2 ); + else + self setweaponammoclip( offhandSecondaryWeapon, 1 ); + + break; + } + + primaryWeapon = primaryName; + self.primaryWeapon = primaryWeapon; + self.secondaryWeapon = secondaryName; + + if ( var_7 ) + { + self setweaponammoclip( self.primaryWeapon, 0 ); + self setweaponammostock( self.primaryWeapon, 0 ); + } + + self playerModelForWeapon( self.pers["primaryWeapon"], getBaseWeaponName( secondaryName ) ); + self.isSniper = (weaponclass( self.primaryWeapon ) == "sniper"); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale(); + self maps\mp\perks\_perks::cac_selector(); + self notify( "changed_kit" ); + self notify( "bot_giveLoadout" ); +} + +/* + Patches giveLoadout so that it doesn't use IsItemUnlocked +*/ +getPerkUpgrade( perkName ) +{ + perkUpgrade = tablelookup( "mp/perktable.csv", 1, perkName, 8 ); + + if ( perkUpgrade == "" || perkUpgrade == "specialty_null" ) + return "specialty_null"; + + if ( !isDefined(self.pers["bots"]["unlocks"]["upgraded_"+perkName]) || !self.pers["bots"]["unlocks"]["upgraded_"+perkName] ) + return "specialty_null"; + + return ( perkUpgrade ); +} + +/* + Patches giveLoadout so that it doesn't use IsItemUnlocked +*/ +loadoutAllPerks( loadoutEquipment, loadoutPerk1, loadoutPerk2, loadoutPerk3, loadoutPrimaryBuff, loadoutSecondaryBuff ) +{ + loadoutEquipment = maps\mp\perks\_perks::validatePerk( 1, loadoutEquipment ); + loadoutPerk1 = maps\mp\perks\_perks::validatePerk( 1, loadoutPerk1 ); + loadoutPerk2 = maps\mp\perks\_perks::validatePerk( 2, loadoutPerk2 ); + loadoutPerk3 = maps\mp\perks\_perks::validatePerk( 3, loadoutPerk3 ); + + loadoutPrimaryBuff = maps\mp\perks\_perks::validatePerk( undefined, loadoutPrimaryBuff ); + if( loadoutPerk2 == "specialty_twoprimaries" ) + loadoutSecondaryBuff = maps\mp\perks\_perks::validatePerk( undefined, loadoutSecondaryBuff ); + + self.loadoutPerk1 = loadoutPerk1; + self.loadoutPerk2 = loadoutPerk2; + self.loadoutPerk3 = loadoutPerk3; + self.loadoutPerkEquipment = loadoutEquipment; + self.loadoutPrimaryBuff = loadoutPrimaryBuff; + if( loadoutPerk2 == "specialty_twoprimaries" ) + self.loadoutSecondaryBuff = loadoutSecondaryBuff; + + if( loadoutEquipment != "specialty_null" ) + self givePerk( loadoutEquipment, true ); + if( loadoutPerk1 != "specialty_null" ) + self givePerk( loadoutPerk1, true ); + if( loadoutPerk2 != "specialty_null" ) + self givePerk( loadoutPerk2, true ); + if( loadoutPerk3 != "specialty_null" ) + self givePerk( loadoutPerk3, true ); + + if( loadoutPrimaryBuff != "specialty_null" ) + self givePerk( loadoutPrimaryBuff, true ); + + perkUpgrd[0] = tablelookup( "mp/perktable.csv", 1, loadoutPerk1, 8 ); + perkUpgrd[1] = tablelookup( "mp/perktable.csv", 1, loadoutPerk2, 8 ); + perkUpgrd[2] = tablelookup( "mp/perktable.csv", 1, loadoutPerk3, 8 ); + + perks[0] = loadoutPerk1; + perks[1] = loadoutPerk2; + perks[2] = loadoutPerk3; + + for (i = 0; i < perkUpgrd.size; i++) + { + upgrade = perkUpgrd[i]; + perk = perks[i]; + + if ( upgrade == "" || upgrade == "specialty_null" ) + continue; + + if ( isDefined(self.pers["bots"]["unlocks"]["upgraded_"+perk]) && self.pers["bots"]["unlocks"]["upgraded_"+perk] ) + { + self givePerk( upgrade, true ); + } + } + + if( !self _hasPerk( "specialty_assists" ) ) + self.pers["assistsToKill"] = 0; +} + +/* + Patches giveLoadout so that it doesn't use IsItemUnlocked +*/ +playerModelForWeapon( weapon, secondary ) +{ + team = self.team; + + if ( isdefined( game[team + "_model"][weapon] ) ) + { + [[ game[team + "_model"][weapon] ]](); + return; + } + + weaponClass = tablelookup( "mp/statstable.csv", 4, weapon, 2 ); + + switch ( weaponClass ) + { + case "weapon_smg": + [[ game[team + "_model"]["SMG"] ]](); + break; + case "weapon_assault": + [[ game[team + "_model"]["ASSAULT"] ]](); + break; + case "weapon_sniper": + if ( level.environment != "" && game[team] != "opforce_africa" && isDefined(self.pers["bots"]["unlocks"]["ghillie"]) && self.pers["bots"]["unlocks"]["ghillie"] ) + [[ game[team + "_model"]["GHILLIE"] ]](); + else + [[ game[team + "_model"]["SNIPER"] ]](); + + break; + case "weapon_lmg": + [[ game[team + "_model"]["LMG"] ]](); + break; + case "weapon_riot": + [[ game[team + "_model"]["RIOT"] ]](); + break; + case "weapon_shotgun": + [[ game[team + "_model"]["SHOTGUN"] ]](); + break; + default: + [[ game[team + "_model"]["ASSAULT"] ]](); + break; + } + + if ( isJuggernaut() ) + [[ game[team + "_model"]["JUGGERNAUT"] ]](); +} diff --git a/maps/mp/bots/_menu.gsc b/raw/maps/mp/bots/_menu.gsc similarity index 100% rename from maps/mp/bots/_menu.gsc rename to raw/maps/mp/bots/_menu.gsc diff --git a/maps/mp/bots/_wp_editor.gsc b/raw/maps/mp/bots/_wp_editor.gsc similarity index 96% rename from maps/mp/bots/_wp_editor.gsc rename to raw/maps/mp/bots/_wp_editor.gsc index ef080d3..3b171fe 100644 --- a/maps/mp/bots/_wp_editor.gsc +++ b/raw/maps/mp/bots/_wp_editor.gsc @@ -1,922 +1,922 @@ -/* - _wp_editor - Author: INeedGames - Date: 05/08/2021 - The ingame waypoint editor. -*/ - -#include common_scripts\utility; -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include maps\mp\bots\_bot_utility; - -init() -{ - if(getDvar("bots_main_debug") == "") - setDvar("bots_main_debug", 0); - - if(!getDVarint("bots_main_debug")) - return; - - /*if(!getDVarint("developer")) - { - setdvar("developer_script", 1); - setdvar("developer", 1); - - setdvar("sv_mapRotation", "map "+getDvar("mapname")); - exitLevel(false); - }*/ - - setDvar("bots_main", 0); - setdvar("bots_main_menu", 0); - setdvar("bots_manage_fill_mode", 0); - setdvar("bots_manage_fill", 0); - setdvar("bots_manage_add", 0); - setdvar("bots_manage_fill_kick", 1); - setDvar("bots_manage_fill_spec", 1); - - if (getDvar("bots_main_debug_distance") == "") - setDvar("bots_main_debug_distance", 512.0); - - if (getDvar("bots_main_debug_cone") == "") - setDvar("bots_main_debug_cone", 0.65); - - if (getDvar("bots_main_debug_minDist") == "") - setDvar("bots_main_debug_minDist", 32.0); - - if (getDvar("bots_main_debug_drawThrough") == "") - setDvar("bots_main_debug_drawThrough", false); - - if (getDvar("bots_main_debug_updateRate") == "") - setDvar("bots_main_debug_updateRate", 500); - - if (getDvar("bots_main_debug_dashAmount") == "") - setDvar("bots_main_debug_dashAmount", 35.0); - - setDvar("player_sustainAmmo", 1); - - level.waypoints = []; - level.waypointCount = 0; - - level waittill( "connected", player); - player thread onPlayerSpawned(); -} - -onPlayerSpawned() -{ - self endon("disconnect"); - for(;;) - { - self waittill("spawned_player"); - self thread startDev(); - } -} - -StartDev() -{ - self endon("disconnect"); - self endon("death"); - - level.wpToLink = -1; - level.autoLink = false; - self.nearest = -1; - - self takeAllWeapons(); - self giveWeapon("iw5_m16_mp_gl");//to knife windows - self giveWeapon("javelin_mp");//to mark jav spots - self SetOffhandPrimaryClass( "other" ); - self giveWeapon("semtex_mp"); - self _clearperks(); - self.specialty = []; - // need to find out how to setperks in mw3 - /*self maps\mp\perks\_perks::givePerk("specialty_fastmantle"); - self maps\mp\perks\_perks::givePerk("specialty_falldamage"); - self maps\mp\perks\_perks::givePerk("specialty_marathon"); - self maps\mp\perks\_perks::givePerk("specialty_lightweight");*/ - self freezecontrols(false); - - self thread watchAddWaypointCommand(); - self thread watchDeleteAllWaypointsCommand(); - self thread watchDeleteWaypointCommand(); - self thread watchLinkWaypointCommand(); - self thread watchLoadWaypointsCommand(); - self thread watchSaveWaypointsCommand(); - self thread watchUnlinkWaypointCommand(); - self thread watchAutoLinkCommand(); - self thread updateWaypointsStats(); - self thread watchAstarCommand(); - - self thread sayExtras(); -} - -sayExtras() -{ - self endon("disconnect"); - self endon("death"); - self iprintln("Before adding waypoints, holding buttons:"); - wait 4; - self iprintln("ADS - climb"); - self iprintln("Use + Attack - tube"); - self iprintln("Attack - grenade"); - self iprintln("Use - claymore"); - wait 4; - self iprintln("Else the waypoint will be your stance."); - self iprintln("Making a crouch waypoint with only one link..."); - self iprintln("Makes a camping waypoint."); -} - -watchAstarCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("astar", "+gostand"); - for (;;) - { - self waittill("astar"); - - if (1) - continue; - - self iprintln("Start AStar"); - self.astar = undefined; - astar = spawnStruct(); - astar.start = self.origin; - - self waittill("astar"); - self iprintln("End AStar"); - astar.goal = self.origin; - - astar.nodes = AStarSearch(astar.start, astar.goal, undefined, true); - self iprintln("AStar size: " + astar.nodes.size); - - self.astar = astar; - } -} - -drawWaypoint(i) -{ - if (!isDefined(level.drawn_wps)) - level.drawn_wps = []; - - newdeathicon = newHudElem(); - newdeathicon.x = level.waypoints[i].origin[0]; - newdeathicon.y = level.waypoints[i].origin[1]; - newdeathicon.z = level.waypoints[i].origin[2] + 50; - newdeathicon.alpha = .61; - newdeathicon.archived = true; - newdeathicon setShader("headicon_dead", 5, 5); - newdeathicon setwaypoint( true, false ); - - level.drawn_wps[level.drawn_wps.size] = newdeathicon; -} - -drawPath(where) -{ - if (!isDefined(level.drawn_wps)) - level.drawn_wps = []; - - newdeathicon = newHudElem(); - newdeathicon.x = where[0]; - newdeathicon.y = where[1]; - newdeathicon.z = where[2] + 20; - newdeathicon.alpha = .61; - newdeathicon.archived = true; - newdeathicon setShader("headicon_dead", 5, 5); - newdeathicon setwaypoint( true, false ); - - level.drawn_wps[level.drawn_wps.size] = newdeathicon; -} - -clearWaypoints() -{ - if (!isDefined(level.drawn_wps)) - return; - - for (i = 0; i < level.drawn_wps.size; i++) - { - level.drawn_wps[i] destroy(); - } - - level.drawn_wps = []; -} - -clearWpLinks() -{ - if (!isDefined(level.drawn_links)) - return; - - for (i = 0; i < level.waypointCount; i++) - { - level.waypoints[i].drawn_links = []; - } - - for (i = 0; i < level.drawn_links.size; i++) - { - level.drawn_links[i] delete(); - } - - level.drawn_links = []; -} - -showWpLink(i, h) -{ - if (!isDefined(level.drawn_links)) - level.drawn_links = []; - - if (!isDefined(level.waypoints[i].drawn_links)) - level.waypoints[i].drawn_links = []; - - if (!isDefined(level.waypoints[h].drawn_links)) - level.waypoints[h].drawn_links = []; - - if (isDefined(level.waypoints[h].drawn_links["" + i]) || isDefined(level.waypoints[i].drawn_links["" + h])) - return; - - level.waypoints[h].drawn_links["" + i] = true; - level.waypoints[i].drawn_links["" + h] = true; - - start = level.waypoints[i].origin + (0, 0, 45); - end = level.waypoints[h].origin + (0, 0, 45); - diff = end-start; - dir = VectorToAngles(diff); - - dist = distance(start, end); - dash_count = int(dist / getDvarFloat("bots_main_debug_dashAmount")); - - for (j = 0; j < dash_count; j++) - { - dash = spawn( "script_model", start + ((diff * j)/dash_count)); - dash setModel("weapon_parabolic_knife"); - dash.angles = dir; - - level.drawn_links[level.drawn_links.size] = dash; - } - - dash = spawn( "script_model", end); - dash setModel("weapon_parabolic_knife"); - dash.angles = dir; - - level.drawn_links[level.drawn_links.size] = dash; -} - -updateWaypointsStats() -{ - self endon("disconnect"); - self endon("death"); - - self initHudElem("TotalWps:",102,5); - totalWpsHud = self initHudElem("",180,5); - self initHudElem("NearestWP:",102,15); - nearestWP = self initHudElem("",180,15); - self initHudElem("Childs:",102,25); - children = self initHudElem("",160,25); - self initHudElem("Type:",102,35); - type = self initHudElem("",160,35); - self initHudElem("ToLink:",102,45); - wpToLink = self initHudElem("",160,45); - - infotext = self initHudElem2(); - self initHudElem3(); - self initHudElem4(); - - intTimer = 0; - for(time=0;;time+=0.05) - { - wait 0.05; - intTimer += 50; - - totalWpsHud setText(level.waypointCount); - - closest = -1; - myEye = self getEye(); - myAngles = self GetPlayerAngles(); - timeToUpdate = ((intTimer % getDvarInt("bots_main_debug_updateRate")) == 0); - - if (timeToUpdate) - { - clearWaypoints(); - clearWpLinks(); - } - - for(i = 0; i < level.waypointCount; i++) - { - if(closest == -1 || closer(self.origin, level.waypoints[i].origin, level.waypoints[closest].origin)) - closest = i; - - wpOrg = level.waypoints[i].origin + (0, 0, 25); - - if(distance(level.waypoints[i].origin, self.origin) < getDvarFloat("bots_main_debug_distance") && (bulletTracePassed(myEye, wpOrg, false, self) || getDVarint("bots_main_debug_drawThrough"))) - { - if (timeToUpdate) - { - if(getConeDot(wpOrg, myEye, myAngles) > getDvarFloat("bots_main_debug_cone")) - { - drawWaypoint(i); - - for(h = level.waypoints[i].children.size - 1; h >= 0; h--) - showWpLink(i, level.waypoints[i].children[h]); - } - } - - // mw3 doesnt have debug gsc calls :( - /*for(h = level.waypoints[i].children.size - 1; h >= 0; h--) - line(wpOrg, level.waypoints[level.waypoints[i].children[h]].origin + (0, 0, 25), (1,0,1)); - - if(getConeDot(wpOrg, myEye, myAngles) > getDvarFloat("bots_main_debug_cone")) - print3d(wpOrg, i, (1,0,0), 2); - - if (isDefined(level.waypoints[i].angles) && level.waypoints[i].type != "stand") - line(wpOrg, wpOrg + AnglesToForward(level.waypoints[i].angles) * 64, (1,1,1)); - - if (isDefined(level.waypoints[i].jav_point)) - line(wpOrg, level.waypoints[i].jav_point, (0,0,0));*/ - } - } - - self.nearest = closest; - - nearestWP setText(self.nearest); - - children setText(buildChildCountString(self.nearest)); - - type setText(buildTypeString(self.nearest)); - - wpToLink setText(level.wpToLink); - - infotext.x = infotext.x - 2; - if(infotext.x <= -800) - infotext.x = 800; - - if (time > 2 && self UseButtonPressed()) - { - time = 0; - self iPrintLnBold(self.nearest + " children: " + buildChildString(self.nearest)); - } - - if (isDefined(self.astar)) - { - //print3d(self.astar.start + (0, 0, 35), "start", (0,0,1), 2); - //print3d(self.astar.goal + (0, 0, 35), "goal", (0,0,1), 2); - if (timeToUpdate) - { - drawPath(self.astar.start); - drawPath(self.astar.goal); - } - - prev = self.astar.start + (0, 0, 35); - - for (i = self.astar.nodes.size - 1; i >= 0; i--) - { - node = self.astar.nodes[i]; - - //line(prev, level.waypoints[node].origin + (0, 0, 35), (0,1,1)); - if (timeToUpdate) drawPath(level.waypoints[node].origin); - - prev = level.waypoints[node].origin + (0, 0, 35); - } - - //line(prev, self.astar.goal + (0, 0, 35), (0,1,1)); - } - } -} - -watchLoadWaypointsCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+actionslot 5}]", "+actionslot 5"); - for( ;; ) - { - self waittill("[{+actionslot 5}]"); - self LoadWaypoints(); - } -} - -watchAddWaypointCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+smoke}]", "+smoke"); - for( ;; ) - { - self waittill("[{+smoke}]"); - self AddWaypoint(); - } -} - -watchAutoLinkCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+frag}]", "+frag"); - for( ;; ) - { - self waittill("[{+frag}]"); - if(level.autoLink) - { - self iPrintlnBold("Auto link disabled"); - level.autoLink = false; - level.wpToLink = -1; - } - else - { - self iPrintlnBold("Auto link enabled"); - level.autoLink = true; - level.wpToLink = self.nearest; - } - } -} - -watchLinkWaypointCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+melee_zoom}]", "+melee_zoom"); - for( ;; ) - { - self waittill("[{+melee_zoom}]"); - self LinkWaypoint(self.nearest); - } -} - -watchUnlinkWaypointCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+reload}]", "+reload"); - for( ;; ) - { - self waittill("[{+reload}]"); - self UnLinkWaypoint(self.nearest); - } -} - -watchDeleteWaypointCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+actionslot 3}]", "+actionslot 3"); - for( ;; ) - { - self waittill("[{+actionslot 3}]"); - self DeleteWaypoint(self.nearest); - } -} - -watchDeleteAllWaypointsCommand() -{ - self endon("disconnect"); - self endon("death"); - - self notifyOnPlayerCommand("[{+actionslot 4}]", "+actionslot 4"); - for( ;; ) - { - self waittill("[{+actionslot 4}]"); - self DeleteAllWaypoints(); - } -} - -watchSaveWaypointsCommand() -{ - self endon("death"); - self endon("disconnect"); - - self notifyOnPlayerCommand("[{+actionslot 1}]", "+actionslot 1"); - for(;;) - { - self waittill("[{+actionslot 1}]"); - - self checkForWarnings(); - wait 1; - - logprint("***********ABiliTy's WPDump**************\n\n"); - logprint("\n\n\n\n"); - mpnm=getMapName(getdvar("mapname")); - logprint("\n\n"+mpnm+"()\n{\n/*"); - logprint("*/waypoints = [];\n/*"); - for(i = 0; i < level.waypointCount; i++) - { - logprint("*/waypoints["+i+"] = spawnstruct();\n/*"); - logprint("*/waypoints["+i+"].origin = "+level.waypoints[i].origin+";\n/*"); - logprint("*/waypoints["+i+"].type = \""+level.waypoints[i].type+"\";\n/*"); - for(c = 0; c < level.waypoints[i].children.size; c++) - { - logprint("*/waypoints["+i+"].children["+c+"] = "+level.waypoints[i].children[c]+";\n/*"); - } - if(isDefined(level.waypoints[i].angles) && (level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || (level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade")) - logprint("*/waypoints["+i+"].angles = "+level.waypoints[i].angles+";\n/*"); - - if (isDefined(level.waypoints[i].jav_point) && level.waypoints[i].type == "javelin") - logprint("*/waypoints["+i+"].jav_point = "+level.waypoints[i].jav_point+";\n/*"); - } - logprint("*/return waypoints;\n}\n\n\n\n"); - - filename = "waypoints/" + getdvar("mapname") + "_wp.csv"; - - PrintLn("********* Start Bot Warfare WPDump *********"); - PrintLn(level.waypointCount); - - //fileWrite(filename, level.waypointCount+"\n", "write"); - for(i = 0; i < level.waypointCount; i++) - { - str = ""; - wp = level.waypoints[i]; - - str += wp.origin[0] + " " + wp.origin[1] + " " + wp.origin[2] + ","; - - for(h = 0; h < wp.children.size; h++) - { - str += wp.children[h]; - - if (h < wp.children.size - 1) - str += " "; - } - str += "," + wp.type + ","; - - if (isDefined(wp.angles)) - str += wp.angles[0] + " " + wp.angles[1] + " " + wp.angles[2] + ","; - else - str += ","; - - if (isDefined(wp.jav_point)) - str += wp.jav_point[0] + " " + wp.jav_point[1] + " " + wp.jav_point[2] + ","; - else - str += ","; - - PrintLn(str); - //fileWrite(filename, str+"\n", "append"); - } - PrintLn("\n\n\n\n\n\n"); - - self iprintln("Saved!!! to " + filename); - } -} - -LoadWaypoints() -{ - self DeleteAllWaypoints(); - self iPrintlnBold("Loading WPS..."); - load_waypoints(); - - wait 1; - - self checkForWarnings(); -} - -checkForWarnings() -{ - if(level.waypointCount <= 0) - self iprintln("WARNING: waypointCount is "+level.waypointCount); - - if(level.waypointCount != level.waypoints.size) - self iprintln("WARNING: waypointCount is not "+level.waypoints.size); - - for(i = 0; i < level.waypointCount; i++) - { - if(!isDefined(level.waypoints[i])) - { - self iprintln("WARNING: waypoint "+i+" is undefined"); - continue; - } - - if(level.waypoints[i].children.size <= 0) - self iprintln("WARNING: waypoint "+i+" childCount is "+level.waypoints[i].children.size); - else - { - if (!isDefined(level.waypoints[i].children) || !isDefined(level.waypoints[i].children.size)) - { - self iprintln("WARNING: waypoint "+i+" children is not defined"); - } - else - { - for(h = level.waypoints[i].children.size - 1; h >= 0; h--) - { - child = level.waypoints[i].children[h]; - - if(!isDefined(level.waypoints[child])) - self iprintln("WARNING: waypoint "+i+" child "+child+" is undefined"); - else if(child == i) - self iprintln("WARNING: waypoint "+i+" child "+child+" is itself"); - } - } - } - - if(!isDefined(level.waypoints[i].type)) - { - self iprintln("WARNING: waypoint "+i+" type is undefined"); - continue; - } - - if (level.waypoints[i].type == "javelin" && !isDefined(level.waypoints[i].jav_point)) - self iprintln("WARNING: waypoint "+i+" jav_point is undefined"); - - if(!isDefined(level.waypoints[i].angles) && (level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || (level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade")) - self iprintln("WARNING: waypoint "+i+" angles is undefined"); - } -} - -UnLinkWaypoint(nwp) -{ - if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) - { - self iprintln("Waypoint Unlink Cancelled "+level.wpToLink); - level.wpToLink = -1; - return; - } - - if(level.wpToLink == -1 || nwp == level.wpToLink) - { - level.wpToLink = nwp; - self iprintln("Waypoint Unlink Started "+nwp); - return; - } - - level.waypoints[nwp].children = array_remove(level.waypoints[nwp].children, level.wpToLink); - level.waypoints[level.wpToLink].children = array_remove(level.waypoints[level.wpToLink].children, nwp); - - self iprintln("Waypoint " + nwp + " Broken to " + level.wpToLink); - level.wpToLink = -1; -} - -LinkWaypoint(nwp) -{ - if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) - { - self iprintln("Waypoint Link Cancelled "+level.wpToLink); - level.wpToLink = -1; - return; - } - - if(level.wpToLink == -1 || nwp == level.wpToLink) - { - level.wpToLink = nwp; - self iprintln("Waypoint Link Started "+nwp); - return; - } - - weGood = true; - for(i = level.waypoints[level.wpToLink].children.size - 1; i >= 0; i--) - { - child = level.waypoints[level.wpToLink].children[i]; - - if(child == nwp) - { - weGood = false; - break; - } - } - - if(weGood) - { - for(i = level.waypoints[nwp].children.size - 1; i >= 0; i--) - { - child = level.waypoints[nwp].children[i]; - - if(child == level.wpToLink) - { - weGood = false; - break; - } - } - } - - if (!weGood ) - { - self iprintln("Waypoint Link Cancelled "+nwp+" and "+level.wpToLink+" already linked."); - level.wpToLink = -1; - return; - } - - level.waypoints[level.wpToLink].children[level.waypoints[level.wpToLink].children.size] = nwp; - level.waypoints[nwp].children[level.waypoints[nwp].children.size] = level.wpToLink; - - self iprintln("Waypoint " + nwp + " Linked to " + level.wpToLink); - level.wpToLink = -1; -} - -DeleteWaypoint(nwp) -{ - if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) - { - self iprintln("No close enough waypoint to delete."); - return; - } - - level.wpToLink = -1; - - for(i = level.waypoints[nwp].children.size - 1; i >= 0; i--) - { - child = level.waypoints[nwp].children[i]; - - level.waypoints[child].children = array_remove(level.waypoints[child].children, nwp); - } - - for(i = 0; i < level.waypointCount; i++) - { - for(h = level.waypoints[i].children.size - 1; h >= 0; h--) - { - if(level.waypoints[i].children[h] > nwp) - level.waypoints[i].children[h]--; - } - } - - for ( entry = 0; entry < level.waypointCount; entry++ ) - { - if ( entry == nwp ) - { - while ( entry < level.waypointCount-1 ) - { - level.waypoints[entry] = level.waypoints[entry+1]; - entry++; - } - level.waypoints[entry] = undefined; - break; - } - } - level.waypointCount--; - - self iprintln("DelWp "+nwp); -} - -AddWaypoint() -{ - level.waypoints[level.waypointCount] = spawnstruct(); - - pos = self getOrigin(); - level.waypoints[level.waypointCount].origin = pos; - - if (isDefined(self.javelinTargetPoint)) - level.waypoints[level.waypointCount].type = "javelin"; - else if(self AdsButtonPressed()) - level.waypoints[level.waypointCount].type = "climb"; - else if(self AttackButtonPressed() && self UseButtonPressed()) - level.waypoints[level.waypointCount].type = "tube"; - else if(self AttackButtonPressed()) - level.waypoints[level.waypointCount].type = "grenade"; - else if(self UseButtonPressed()) - level.waypoints[level.waypointCount].type = "claymore"; - else - level.waypoints[level.waypointCount].type = self getStance(); - - level.waypoints[level.waypointCount].angles = self getPlayerAngles(); - - level.waypoints[level.waypointCount].children = []; - - if (level.waypoints[level.waypointCount].type == "javelin") - { - level.waypoints[level.waypointCount].jav_point = self.javelinTargetPoint; - } - - self iprintln(level.waypoints[level.waypointCount].type + " Waypoint "+ level.waypointCount +" Added at "+pos); - - if(level.autoLink) - { - if(level.wpToLink == -1) - level.wpToLink = level.waypointCount - 1; - - level.waypointCount++; - self LinkWaypoint(level.waypointCount - 1); - } - else - { - level.waypointCount++; - } -} - -DeleteAllWaypoints() -{ - level.waypoints = []; - level.waypointCount = 0; - - self iprintln("DelAllWps"); -} - -buildChildCountString ( wp ) -{ - if ( wp == -1 ) - return ""; - - wpstr = level.waypoints[wp].children.size + ""; - - return wpstr; -} - -buildChildString( wp ) -{ - if ( wp == -1 ) - return ""; - - wpstr = ""; - - for(i = 0; i < level.waypoints[wp].children.size; i++) - { - if(i != 0) - wpstr = wpstr + "," + level.waypoints[wp].children[i]; - else - wpstr= wpstr + level.waypoints[wp].children[i]; - } - - return wpstr; -} - -buildTypeString( wp ) -{ - if ( wp == -1 ) - return ""; - - return level.waypoints[wp].type; -} - -destroyOnDeath(hud) -{ - hud endon("death"); - self waittill_either("death","disconnect"); - hud destroy(); -} - -initHudElem(txt, xl, yl) -{ - hud = NewClientHudElem( self ); - hud setText(txt); - hud.alignX = "left"; - hud.alignY = "top"; - hud.horzAlign = "left"; - hud.vertAlign = "top"; - hud.x = xl; - hud.y = yl; - hud.foreground = true; - hud.fontScale = 1; - hud.font = "objective"; - hud.alpha = 1; - hud.glow = 0; - hud.glowColor = ( 0, 0, 0 ); - hud.glowAlpha = 1; - hud.color = ( 1.0, 1.0, 1.0 ); - - self thread destroyOnDeath( hud ); - - return hud; -} - -initHudElem2() -{ - infotext = NewHudElem(); - infotext setText("^1[{+smoke}]-AddWp ^2[{+melee_zoom}]-LinkWp ^3[{+reload}]-UnLinkWp ^4[{+actionslot 3}]-DeleteWp ^5[{+actionslot 4}]-DelAllWps ^6[{+actionslot 5}]-LoadWPS ^7[{+actionslot 1}]-SaveWp"); - infotext.alignX = "center"; - infotext.alignY = "bottom"; - infotext.horzAlign = "center"; - infotext.vertAlign = "bottom"; - infotext.x = -800; - infotext.y = 25; - infotext.foreground = true; - infotext.fontScale = 1.35; - infotext.font = "objective"; - infotext.alpha = 1; - infotext.glow = 0; - infotext.glowColor = ( 0, 0, 0 ); - infotext.glowAlpha = 1; - infotext.color = ( 1.0, 1.0, 1.0 ); - - self thread destroyOnDeath( infotext ); - - return infotext; -} - -initHudElem3() -{ - bar = level createServerBar((0.5, 0.5, 0.5), 1000, 25); - bar.alignX = "center"; - bar.alignY = "bottom"; - bar.horzAlign = "center"; - bar.vertAlign = "bottom"; - bar.y = 30; - bar.foreground = true; - - self thread destroyOnDeath( bar ); - - return bar; -} - -initHudElem4() -{ - OptionsBG = NewClientHudElem( self ); - OptionsBG.x = 100; - OptionsBG.y = 2; - OptionsBG.alignX = "left"; - OptionsBG.alignY = "top"; - OptionsBG.horzAlign = "left"; - OptionsBG.vertAlign = "top"; - OptionsBG setshader("black", 200, 60); - OptionsBG.alpha = 0.4; - - self thread destroyOnDeath( OptionsBG ); - - return OptionsBG; -} +/* + _wp_editor + Author: INeedGames + Date: 05/08/2021 + The ingame waypoint editor. +*/ + +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\bots\_bot_utility; + +init() +{ + if(getDvar("bots_main_debug") == "") + setDvar("bots_main_debug", 0); + + if(!getDVarint("bots_main_debug")) + return; + + /*if(!getDVarint("developer")) + { + setdvar("developer_script", 1); + setdvar("developer", 1); + + setdvar("sv_mapRotation", "map "+getDvar("mapname")); + exitLevel(false); + }*/ + + setDvar("bots_main", 0); + setdvar("bots_main_menu", 0); + setdvar("bots_manage_fill_mode", 0); + setdvar("bots_manage_fill", 0); + setdvar("bots_manage_add", 0); + setdvar("bots_manage_fill_kick", 1); + setDvar("bots_manage_fill_spec", 1); + + if (getDvar("bots_main_debug_distance") == "") + setDvar("bots_main_debug_distance", 512.0); + + if (getDvar("bots_main_debug_cone") == "") + setDvar("bots_main_debug_cone", 0.65); + + if (getDvar("bots_main_debug_minDist") == "") + setDvar("bots_main_debug_minDist", 32.0); + + if (getDvar("bots_main_debug_drawThrough") == "") + setDvar("bots_main_debug_drawThrough", false); + + if (getDvar("bots_main_debug_updateRate") == "") + setDvar("bots_main_debug_updateRate", 500); + + if (getDvar("bots_main_debug_dashAmount") == "") + setDvar("bots_main_debug_dashAmount", 35.0); + + setDvar("player_sustainAmmo", 1); + + level.waypoints = []; + level.waypointCount = 0; + + level waittill( "connected", player); + player thread onPlayerSpawned(); +} + +onPlayerSpawned() +{ + self endon("disconnect"); + for(;;) + { + self waittill("spawned_player"); + self thread startDev(); + } +} + +StartDev() +{ + self endon("disconnect"); + self endon("death"); + + level.wpToLink = -1; + level.autoLink = false; + self.nearest = -1; + + self takeAllWeapons(); + self giveWeapon("iw5_m16_mp_gl");//to knife windows + self giveWeapon("javelin_mp");//to mark jav spots + self SetOffhandPrimaryClass( "other" ); + self giveWeapon("semtex_mp"); + self _clearperks(); + self.specialty = []; + // need to find out how to setperks in mw3 + /*self maps\mp\perks\_perks::givePerk("specialty_fastmantle"); + self maps\mp\perks\_perks::givePerk("specialty_falldamage"); + self maps\mp\perks\_perks::givePerk("specialty_marathon"); + self maps\mp\perks\_perks::givePerk("specialty_lightweight");*/ + self freezecontrols(false); + + self thread watchAddWaypointCommand(); + self thread watchDeleteAllWaypointsCommand(); + self thread watchDeleteWaypointCommand(); + self thread watchLinkWaypointCommand(); + self thread watchLoadWaypointsCommand(); + self thread watchSaveWaypointsCommand(); + self thread watchUnlinkWaypointCommand(); + self thread watchAutoLinkCommand(); + self thread updateWaypointsStats(); + self thread watchAstarCommand(); + + self thread sayExtras(); +} + +sayExtras() +{ + self endon("disconnect"); + self endon("death"); + self iprintln("Before adding waypoints, holding buttons:"); + wait 4; + self iprintln("ADS - climb"); + self iprintln("Use + Attack - tube"); + self iprintln("Attack - grenade"); + self iprintln("Use - claymore"); + wait 4; + self iprintln("Else the waypoint will be your stance."); + self iprintln("Making a crouch waypoint with only one link..."); + self iprintln("Makes a camping waypoint."); +} + +watchAstarCommand() +{ + self endon("disconnect"); + self endon("death"); + + self notifyOnPlayerCommand("astar", "+gostand"); + for (;;) + { + self waittill("astar"); + + if (1) + continue; + + self iprintln("Start AStar"); + self.astar = undefined; + astar = spawnStruct(); + astar.start = self.origin; + + self waittill("astar"); + self iprintln("End AStar"); + astar.goal = self.origin; + + astar.nodes = AStarSearch(astar.start, astar.goal, undefined, true); + self iprintln("AStar size: " + astar.nodes.size); + + self.astar = astar; + } +} + +drawWaypoint(i) +{ + if (!isDefined(level.drawn_wps)) + level.drawn_wps = []; + + newdeathicon = newHudElem(); + newdeathicon.x = level.waypoints[i].origin[0]; + newdeathicon.y = level.waypoints[i].origin[1]; + newdeathicon.z = level.waypoints[i].origin[2] + 50; + newdeathicon.alpha = .61; + newdeathicon.archived = true; + newdeathicon setShader("headicon_dead", 5, 5); + newdeathicon setwaypoint( true, false ); + + level.drawn_wps[level.drawn_wps.size] = newdeathicon; +} + +drawPath(where) +{ + if (!isDefined(level.drawn_wps)) + level.drawn_wps = []; + + newdeathicon = newHudElem(); + newdeathicon.x = where[0]; + newdeathicon.y = where[1]; + newdeathicon.z = where[2] + 20; + newdeathicon.alpha = .61; + newdeathicon.archived = true; + newdeathicon setShader("headicon_dead", 5, 5); + newdeathicon setwaypoint( true, false ); + + level.drawn_wps[level.drawn_wps.size] = newdeathicon; +} + +clearWaypoints() +{ + if (!isDefined(level.drawn_wps)) + return; + + for (i = 0; i < level.drawn_wps.size; i++) + { + level.drawn_wps[i] destroy(); + } + + level.drawn_wps = []; +} + +clearWpLinks() +{ + if (!isDefined(level.drawn_links)) + return; + + for (i = 0; i < level.waypointCount; i++) + { + level.waypoints[i].drawn_links = []; + } + + for (i = 0; i < level.drawn_links.size; i++) + { + level.drawn_links[i] delete(); + } + + level.drawn_links = []; +} + +showWpLink(i, h) +{ + if (!isDefined(level.drawn_links)) + level.drawn_links = []; + + if (!isDefined(level.waypoints[i].drawn_links)) + level.waypoints[i].drawn_links = []; + + if (!isDefined(level.waypoints[h].drawn_links)) + level.waypoints[h].drawn_links = []; + + if (isDefined(level.waypoints[h].drawn_links["" + i]) || isDefined(level.waypoints[i].drawn_links["" + h])) + return; + + level.waypoints[h].drawn_links["" + i] = true; + level.waypoints[i].drawn_links["" + h] = true; + + start = level.waypoints[i].origin + (0, 0, 45); + end = level.waypoints[h].origin + (0, 0, 45); + diff = end-start; + dir = VectorToAngles(diff); + + dist = distance(start, end); + dash_count = int(dist / getDvarFloat("bots_main_debug_dashAmount")); + + for (j = 0; j < dash_count; j++) + { + dash = spawn( "script_model", start + ((diff * j)/dash_count)); + dash setModel("weapon_parabolic_knife"); + dash.angles = dir; + + level.drawn_links[level.drawn_links.size] = dash; + } + + dash = spawn( "script_model", end); + dash setModel("weapon_parabolic_knife"); + dash.angles = dir; + + level.drawn_links[level.drawn_links.size] = dash; +} + +updateWaypointsStats() +{ + self endon("disconnect"); + self endon("death"); + + self initHudElem("TotalWps:",102,5); + totalWpsHud = self initHudElem("",180,5); + self initHudElem("NearestWP:",102,15); + nearestWP = self initHudElem("",180,15); + self initHudElem("Childs:",102,25); + children = self initHudElem("",160,25); + self initHudElem("Type:",102,35); + type = self initHudElem("",160,35); + self initHudElem("ToLink:",102,45); + wpToLink = self initHudElem("",160,45); + + infotext = self initHudElem2(); + self initHudElem3(); + self initHudElem4(); + + intTimer = 0; + for(time=0;;time+=0.05) + { + wait 0.05; + intTimer += 50; + + totalWpsHud setText(level.waypointCount); + + closest = -1; + myEye = self getEye(); + myAngles = self GetPlayerAngles(); + timeToUpdate = ((intTimer % getDvarInt("bots_main_debug_updateRate")) == 0); + + if (timeToUpdate) + { + clearWaypoints(); + clearWpLinks(); + } + + for(i = 0; i < level.waypointCount; i++) + { + if(closest == -1 || closer(self.origin, level.waypoints[i].origin, level.waypoints[closest].origin)) + closest = i; + + wpOrg = level.waypoints[i].origin + (0, 0, 25); + + if(distance(level.waypoints[i].origin, self.origin) < getDvarFloat("bots_main_debug_distance") && (bulletTracePassed(myEye, wpOrg, false, self) || getDVarint("bots_main_debug_drawThrough"))) + { + if (timeToUpdate) + { + if(getConeDot(wpOrg, myEye, myAngles) > getDvarFloat("bots_main_debug_cone")) + { + drawWaypoint(i); + + for(h = level.waypoints[i].children.size - 1; h >= 0; h--) + showWpLink(i, level.waypoints[i].children[h]); + } + } + + // mw3 doesnt have debug gsc calls :( + /*for(h = level.waypoints[i].children.size - 1; h >= 0; h--) + line(wpOrg, level.waypoints[level.waypoints[i].children[h]].origin + (0, 0, 25), (1,0,1)); + + if(getConeDot(wpOrg, myEye, myAngles) > getDvarFloat("bots_main_debug_cone")) + print3d(wpOrg, i, (1,0,0), 2); + + if (isDefined(level.waypoints[i].angles) && level.waypoints[i].type != "stand") + line(wpOrg, wpOrg + AnglesToForward(level.waypoints[i].angles) * 64, (1,1,1)); + + if (isDefined(level.waypoints[i].jav_point)) + line(wpOrg, level.waypoints[i].jav_point, (0,0,0));*/ + } + } + + self.nearest = closest; + + nearestWP setText(self.nearest); + + children setText(buildChildCountString(self.nearest)); + + type setText(buildTypeString(self.nearest)); + + wpToLink setText(level.wpToLink); + + infotext.x = infotext.x - 2; + if(infotext.x <= -800) + infotext.x = 800; + + if (time > 2 && self UseButtonPressed()) + { + time = 0; + self iPrintLnBold(self.nearest + " children: " + buildChildString(self.nearest)); + } + + if (isDefined(self.astar)) + { + //print3d(self.astar.start + (0, 0, 35), "start", (0,0,1), 2); + //print3d(self.astar.goal + (0, 0, 35), "goal", (0,0,1), 2); + if (timeToUpdate) + { + drawPath(self.astar.start); + drawPath(self.astar.goal); + } + + prev = self.astar.start + (0, 0, 35); + + for (i = self.astar.nodes.size - 1; i >= 0; i--) + { + node = self.astar.nodes[i]; + + //line(prev, level.waypoints[node].origin + (0, 0, 35), (0,1,1)); + if (timeToUpdate) drawPath(level.waypoints[node].origin); + + prev = level.waypoints[node].origin + (0, 0, 35); + } + + //line(prev, self.astar.goal + (0, 0, 35), (0,1,1)); + } + } +} + +watchLoadWaypointsCommand() +{ + self endon("disconnect"); + self endon("death"); + + self notifyOnPlayerCommand("[{+actionslot 5}]", "+actionslot 5"); + for( ;; ) + { + self waittill("[{+actionslot 5}]"); + self LoadWaypoints(); + } +} + +watchAddWaypointCommand() +{ + self endon("disconnect"); + self endon("death"); + + self notifyOnPlayerCommand("[{+smoke}]", "+smoke"); + for( ;; ) + { + self waittill("[{+smoke}]"); + self AddWaypoint(); + } +} + +watchAutoLinkCommand() +{ + self endon("disconnect"); + self endon("death"); + + self notifyOnPlayerCommand("[{+frag}]", "+frag"); + for( ;; ) + { + self waittill("[{+frag}]"); + if(level.autoLink) + { + self iPrintlnBold("Auto link disabled"); + level.autoLink = false; + level.wpToLink = -1; + } + else + { + self iPrintlnBold("Auto link enabled"); + level.autoLink = true; + level.wpToLink = self.nearest; + } + } +} + +watchLinkWaypointCommand() +{ + self endon("disconnect"); + self endon("death"); + + self notifyOnPlayerCommand("[{+melee_zoom}]", "+melee_zoom"); + for( ;; ) + { + self waittill("[{+melee_zoom}]"); + self LinkWaypoint(self.nearest); + } +} + +watchUnlinkWaypointCommand() +{ + self endon("disconnect"); + self endon("death"); + + self notifyOnPlayerCommand("[{+reload}]", "+reload"); + for( ;; ) + { + self waittill("[{+reload}]"); + self UnLinkWaypoint(self.nearest); + } +} + +watchDeleteWaypointCommand() +{ + self endon("disconnect"); + self endon("death"); + + self notifyOnPlayerCommand("[{+actionslot 3}]", "+actionslot 3"); + for( ;; ) + { + self waittill("[{+actionslot 3}]"); + self DeleteWaypoint(self.nearest); + } +} + +watchDeleteAllWaypointsCommand() +{ + self endon("disconnect"); + self endon("death"); + + self notifyOnPlayerCommand("[{+actionslot 4}]", "+actionslot 4"); + for( ;; ) + { + self waittill("[{+actionslot 4}]"); + self DeleteAllWaypoints(); + } +} + +watchSaveWaypointsCommand() +{ + self endon("death"); + self endon("disconnect"); + + self notifyOnPlayerCommand("[{+actionslot 1}]", "+actionslot 1"); + for(;;) + { + self waittill("[{+actionslot 1}]"); + + self checkForWarnings(); + wait 1; + + logprint("***********ABiliTy's WPDump**************\n\n"); + logprint("\n\n\n\n"); + mpnm=getMapName(getdvar("mapname")); + logprint("\n\n"+mpnm+"()\n{\n/*"); + logprint("*/waypoints = [];\n/*"); + for(i = 0; i < level.waypointCount; i++) + { + logprint("*/waypoints["+i+"] = spawnstruct();\n/*"); + logprint("*/waypoints["+i+"].origin = "+level.waypoints[i].origin+";\n/*"); + logprint("*/waypoints["+i+"].type = \""+level.waypoints[i].type+"\";\n/*"); + for(c = 0; c < level.waypoints[i].children.size; c++) + { + logprint("*/waypoints["+i+"].children["+c+"] = "+level.waypoints[i].children[c]+";\n/*"); + } + if(isDefined(level.waypoints[i].angles) && (level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || (level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade")) + logprint("*/waypoints["+i+"].angles = "+level.waypoints[i].angles+";\n/*"); + + if (isDefined(level.waypoints[i].jav_point) && level.waypoints[i].type == "javelin") + logprint("*/waypoints["+i+"].jav_point = "+level.waypoints[i].jav_point+";\n/*"); + } + logprint("*/return waypoints;\n}\n\n\n\n"); + + filename = "waypoints/" + getdvar("mapname") + "_wp.csv"; + + PrintLn("********* Start Bot Warfare WPDump *********"); + PrintLn(level.waypointCount); + + //fileWrite(filename, level.waypointCount+"\n", "write"); + for(i = 0; i < level.waypointCount; i++) + { + str = ""; + wp = level.waypoints[i]; + + str += wp.origin[0] + " " + wp.origin[1] + " " + wp.origin[2] + ","; + + for(h = 0; h < wp.children.size; h++) + { + str += wp.children[h]; + + if (h < wp.children.size - 1) + str += " "; + } + str += "," + wp.type + ","; + + if (isDefined(wp.angles)) + str += wp.angles[0] + " " + wp.angles[1] + " " + wp.angles[2] + ","; + else + str += ","; + + if (isDefined(wp.jav_point)) + str += wp.jav_point[0] + " " + wp.jav_point[1] + " " + wp.jav_point[2] + ","; + else + str += ","; + + PrintLn(str); + //fileWrite(filename, str+"\n", "append"); + } + PrintLn("\n\n\n\n\n\n"); + + self iprintln("Saved!!! to " + filename); + } +} + +LoadWaypoints() +{ + self DeleteAllWaypoints(); + self iPrintlnBold("Loading WPS..."); + load_waypoints(); + + wait 1; + + self checkForWarnings(); +} + +checkForWarnings() +{ + if(level.waypointCount <= 0) + self iprintln("WARNING: waypointCount is "+level.waypointCount); + + if(level.waypointCount != level.waypoints.size) + self iprintln("WARNING: waypointCount is not "+level.waypoints.size); + + for(i = 0; i < level.waypointCount; i++) + { + if(!isDefined(level.waypoints[i])) + { + self iprintln("WARNING: waypoint "+i+" is undefined"); + continue; + } + + if(level.waypoints[i].children.size <= 0) + self iprintln("WARNING: waypoint "+i+" childCount is "+level.waypoints[i].children.size); + else + { + if (!isDefined(level.waypoints[i].children) || !isDefined(level.waypoints[i].children.size)) + { + self iprintln("WARNING: waypoint "+i+" children is not defined"); + } + else + { + for(h = level.waypoints[i].children.size - 1; h >= 0; h--) + { + child = level.waypoints[i].children[h]; + + if(!isDefined(level.waypoints[child])) + self iprintln("WARNING: waypoint "+i+" child "+child+" is undefined"); + else if(child == i) + self iprintln("WARNING: waypoint "+i+" child "+child+" is itself"); + } + } + } + + if(!isDefined(level.waypoints[i].type)) + { + self iprintln("WARNING: waypoint "+i+" type is undefined"); + continue; + } + + if (level.waypoints[i].type == "javelin" && !isDefined(level.waypoints[i].jav_point)) + self iprintln("WARNING: waypoint "+i+" jav_point is undefined"); + + if(!isDefined(level.waypoints[i].angles) && (level.waypoints[i].type == "claymore" || level.waypoints[i].type == "tube" || (level.waypoints[i].type == "crouch" && level.waypoints[i].children.size == 1) || level.waypoints[i].type == "climb" || level.waypoints[i].type == "grenade")) + self iprintln("WARNING: waypoint "+i+" angles is undefined"); + } +} + +UnLinkWaypoint(nwp) +{ + if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) + { + self iprintln("Waypoint Unlink Cancelled "+level.wpToLink); + level.wpToLink = -1; + return; + } + + if(level.wpToLink == -1 || nwp == level.wpToLink) + { + level.wpToLink = nwp; + self iprintln("Waypoint Unlink Started "+nwp); + return; + } + + level.waypoints[nwp].children = array_remove(level.waypoints[nwp].children, level.wpToLink); + level.waypoints[level.wpToLink].children = array_remove(level.waypoints[level.wpToLink].children, nwp); + + self iprintln("Waypoint " + nwp + " Broken to " + level.wpToLink); + level.wpToLink = -1; +} + +LinkWaypoint(nwp) +{ + if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) + { + self iprintln("Waypoint Link Cancelled "+level.wpToLink); + level.wpToLink = -1; + return; + } + + if(level.wpToLink == -1 || nwp == level.wpToLink) + { + level.wpToLink = nwp; + self iprintln("Waypoint Link Started "+nwp); + return; + } + + weGood = true; + for(i = level.waypoints[level.wpToLink].children.size - 1; i >= 0; i--) + { + child = level.waypoints[level.wpToLink].children[i]; + + if(child == nwp) + { + weGood = false; + break; + } + } + + if(weGood) + { + for(i = level.waypoints[nwp].children.size - 1; i >= 0; i--) + { + child = level.waypoints[nwp].children[i]; + + if(child == level.wpToLink) + { + weGood = false; + break; + } + } + } + + if (!weGood ) + { + self iprintln("Waypoint Link Cancelled "+nwp+" and "+level.wpToLink+" already linked."); + level.wpToLink = -1; + return; + } + + level.waypoints[level.wpToLink].children[level.waypoints[level.wpToLink].children.size] = nwp; + level.waypoints[nwp].children[level.waypoints[nwp].children.size] = level.wpToLink; + + self iprintln("Waypoint " + nwp + " Linked to " + level.wpToLink); + level.wpToLink = -1; +} + +DeleteWaypoint(nwp) +{ + if(nwp == -1 || distance(self.origin, level.waypoints[nwp].origin) > getDvarFloat("bots_main_debug_minDist")) + { + self iprintln("No close enough waypoint to delete."); + return; + } + + level.wpToLink = -1; + + for(i = level.waypoints[nwp].children.size - 1; i >= 0; i--) + { + child = level.waypoints[nwp].children[i]; + + level.waypoints[child].children = array_remove(level.waypoints[child].children, nwp); + } + + for(i = 0; i < level.waypointCount; i++) + { + for(h = level.waypoints[i].children.size - 1; h >= 0; h--) + { + if(level.waypoints[i].children[h] > nwp) + level.waypoints[i].children[h]--; + } + } + + for ( entry = 0; entry < level.waypointCount; entry++ ) + { + if ( entry == nwp ) + { + while ( entry < level.waypointCount-1 ) + { + level.waypoints[entry] = level.waypoints[entry+1]; + entry++; + } + level.waypoints[entry] = undefined; + break; + } + } + level.waypointCount--; + + self iprintln("DelWp "+nwp); +} + +AddWaypoint() +{ + level.waypoints[level.waypointCount] = spawnstruct(); + + pos = self getOrigin(); + level.waypoints[level.waypointCount].origin = pos; + + if (isDefined(self.javelinTargetPoint)) + level.waypoints[level.waypointCount].type = "javelin"; + else if(self AdsButtonPressed()) + level.waypoints[level.waypointCount].type = "climb"; + else if(self AttackButtonPressed() && self UseButtonPressed()) + level.waypoints[level.waypointCount].type = "tube"; + else if(self AttackButtonPressed()) + level.waypoints[level.waypointCount].type = "grenade"; + else if(self UseButtonPressed()) + level.waypoints[level.waypointCount].type = "claymore"; + else + level.waypoints[level.waypointCount].type = self getStance(); + + level.waypoints[level.waypointCount].angles = self getPlayerAngles(); + + level.waypoints[level.waypointCount].children = []; + + if (level.waypoints[level.waypointCount].type == "javelin") + { + level.waypoints[level.waypointCount].jav_point = self.javelinTargetPoint; + } + + self iprintln(level.waypoints[level.waypointCount].type + " Waypoint "+ level.waypointCount +" Added at "+pos); + + if(level.autoLink) + { + if(level.wpToLink == -1) + level.wpToLink = level.waypointCount - 1; + + level.waypointCount++; + self LinkWaypoint(level.waypointCount - 1); + } + else + { + level.waypointCount++; + } +} + +DeleteAllWaypoints() +{ + level.waypoints = []; + level.waypointCount = 0; + + self iprintln("DelAllWps"); +} + +buildChildCountString ( wp ) +{ + if ( wp == -1 ) + return ""; + + wpstr = level.waypoints[wp].children.size + ""; + + return wpstr; +} + +buildChildString( wp ) +{ + if ( wp == -1 ) + return ""; + + wpstr = ""; + + for(i = 0; i < level.waypoints[wp].children.size; i++) + { + if(i != 0) + wpstr = wpstr + "," + level.waypoints[wp].children[i]; + else + wpstr= wpstr + level.waypoints[wp].children[i]; + } + + return wpstr; +} + +buildTypeString( wp ) +{ + if ( wp == -1 ) + return ""; + + return level.waypoints[wp].type; +} + +destroyOnDeath(hud) +{ + hud endon("death"); + self waittill_either("death","disconnect"); + hud destroy(); +} + +initHudElem(txt, xl, yl) +{ + hud = NewClientHudElem( self ); + hud setText(txt); + hud.alignX = "left"; + hud.alignY = "top"; + hud.horzAlign = "left"; + hud.vertAlign = "top"; + hud.x = xl; + hud.y = yl; + hud.foreground = true; + hud.fontScale = 1; + hud.font = "objective"; + hud.alpha = 1; + hud.glow = 0; + hud.glowColor = ( 0, 0, 0 ); + hud.glowAlpha = 1; + hud.color = ( 1.0, 1.0, 1.0 ); + + self thread destroyOnDeath( hud ); + + return hud; +} + +initHudElem2() +{ + infotext = NewHudElem(); + infotext setText("^1[{+smoke}]-AddWp ^2[{+melee_zoom}]-LinkWp ^3[{+reload}]-UnLinkWp ^4[{+actionslot 3}]-DeleteWp ^5[{+actionslot 4}]-DelAllWps ^6[{+actionslot 5}]-LoadWPS ^7[{+actionslot 1}]-SaveWp"); + infotext.alignX = "center"; + infotext.alignY = "bottom"; + infotext.horzAlign = "center"; + infotext.vertAlign = "bottom"; + infotext.x = -800; + infotext.y = 25; + infotext.foreground = true; + infotext.fontScale = 1.35; + infotext.font = "objective"; + infotext.alpha = 1; + infotext.glow = 0; + infotext.glowColor = ( 0, 0, 0 ); + infotext.glowAlpha = 1; + infotext.color = ( 1.0, 1.0, 1.0 ); + + self thread destroyOnDeath( infotext ); + + return infotext; +} + +initHudElem3() +{ + bar = level createServerBar((0.5, 0.5, 0.5), 1000, 25); + bar.alignX = "center"; + bar.alignY = "bottom"; + bar.horzAlign = "center"; + bar.vertAlign = "bottom"; + bar.y = 30; + bar.foreground = true; + + self thread destroyOnDeath( bar ); + + return bar; +} + +initHudElem4() +{ + OptionsBG = NewClientHudElem( self ); + OptionsBG.x = 100; + OptionsBG.y = 2; + OptionsBG.alignX = "left"; + OptionsBG.alignY = "top"; + OptionsBG.horzAlign = "left"; + OptionsBG.vertAlign = "top"; + OptionsBG setshader("black", 200, 60); + OptionsBG.alpha = 0.4; + + self thread destroyOnDeath( OptionsBG ); + + return OptionsBG; +} diff --git a/maps/mp/bots/waypoints/_custom_map.gsc b/raw/maps/mp/bots/waypoints/_custom_map.gsc similarity index 100% rename from maps/mp/bots/waypoints/_custom_map.gsc rename to raw/maps/mp/bots/waypoints/_custom_map.gsc diff --git a/maps/mp/bots/waypoints/dome.gsc b/raw/maps/mp/bots/waypoints/dome.gsc similarity index 97% rename from maps/mp/bots/waypoints/dome.gsc rename to raw/maps/mp/bots/waypoints/dome.gsc index aa1ef5d..1006b1a 100644 --- a/maps/mp/bots/waypoints/dome.gsc +++ b/raw/maps/mp/bots/waypoints/dome.gsc @@ -1,1113 +1,1113 @@ -Dome() -{ -/* 0:09 */waypoints = []; -/* 0:09 */waypoints[0] = spawnstruct(); -/* 0:09 */waypoints[0].origin = (-140.626, 2103.48, -290.875); -/* 0:09 */waypoints[0].type = "stand"; -/* 0:09 */waypoints[0].children[0] = 1; -/* 0:09 */waypoints[0].children[1] = 45; -/* 0:09 */waypoints[1] = spawnstruct(); -/* 0:09 */waypoints[1].origin = (141.937, 2091.96, -290.875); -/* 0:09 */waypoints[1].type = "stand"; -/* 0:09 */waypoints[1].children[0] = 0; -/* 0:09 */waypoints[1].children[1] = 2; -/* 0:09 */waypoints[1].children[2] = 47; -/* 0:09 */waypoints[2] = spawnstruct(); -/* 0:09 */waypoints[2].origin = (451.907, 2066.25, -254.875); -/* 0:09 */waypoints[2].type = "stand"; -/* 0:09 */waypoints[2].children[0] = 1; -/* 0:09 */waypoints[2].children[1] = 3; -/* 0:09 */waypoints[2].children[2] = 77; -/* 0:09 */waypoints[2].children[3] = 74; -/* 0:09 */waypoints[2].children[4] = 164; -/* 0:09 */waypoints[3] = spawnstruct(); -/* 0:09 */waypoints[3].origin = (430.25, 1747.91, -254.875); -/* 0:09 */waypoints[3].type = "stand"; -/* 0:09 */waypoints[3].children[0] = 2; -/* 0:09 */waypoints[3].children[1] = 4; -/* 0:09 */waypoints[3].children[2] = 79; -/* 0:09 */waypoints[4] = spawnstruct(); -/* 0:09 */waypoints[4].origin = (636.671, 1713.11, -247.381); -/* 0:09 */waypoints[4].type = "stand"; -/* 0:09 */waypoints[4].children[0] = 3; -/* 0:09 */waypoints[4].children[1] = 5; -/* 0:09 */waypoints[4].children[2] = 74; -/* 0:09 */waypoints[5] = spawnstruct(); -/* 0:09 */waypoints[5].origin = (1115.07, 1698.27, -254.875); -/* 0:09 */waypoints[5].type = "stand"; -/* 0:09 */waypoints[5].children[0] = 4; -/* 0:09 */waypoints[5].children[1] = 6; -/* 0:09 */waypoints[5].children[2] = 71; -/* 0:09 */waypoints[6] = spawnstruct(); -/* 0:09 */waypoints[6].origin = (1333.3, 1679.45, -254.875); -/* 0:09 */waypoints[6].type = "stand"; -/* 0:09 */waypoints[6].children[0] = 5; -/* 0:09 */waypoints[6].children[1] = 7; -/* 0:09 */waypoints[6].children[2] = 64; -/* 0:09 */waypoints[7] = spawnstruct(); -/* 0:09 */waypoints[7].origin = (1319.74, 1407.28, -254.875); -/* 0:09 */waypoints[7].type = "stand"; -/* 0:09 */waypoints[7].children[0] = 6; -/* 0:09 */waypoints[7].children[1] = 8; -/* 0:09 */waypoints[7].children[2] = 63; -/* 0:09 */waypoints[8] = spawnstruct(); -/* 0:09 */waypoints[8].origin = (1307.68, 1285.36, -254.875); -/* 0:09 */waypoints[8].type = "stand"; -/* 0:09 */waypoints[8].children[0] = 7; -/* 0:09 */waypoints[8].children[1] = 9; -/* 0:09 */waypoints[8].children[2] = 179; -/* 0:09 */waypoints[9] = spawnstruct(); -/* 0:09 */waypoints[9].origin = (1557.19, 1283.13, -254.875); -/* 0:09 */waypoints[9].type = "stand"; -/* 0:09 */waypoints[9].children[0] = 8; -/* 0:09 */waypoints[9].children[1] = 10; -/* 0:09 */waypoints[9].children[2] = 62; -/* 0:09 */waypoints[9].children[3] = 78; -/* 0:09 */waypoints[10] = spawnstruct(); -/* 0:09 */waypoints[10].origin = (1588.16, 1082.51, -254.875); -/* 0:09 */waypoints[10].type = "stand"; -/* 0:09 */waypoints[10].children[0] = 9; -/* 0:09 */waypoints[10].children[1] = 11; -/* 0:09 */waypoints[10].children[2] = 61; -/* 0:09 */waypoints[10].children[3] = 177; -/* 0:09 */waypoints[11] = spawnstruct(); -/* 0:09 */waypoints[11].origin = (1533.04, 589.068, -318.312); -/* 0:09 */waypoints[11].type = "stand"; -/* 0:09 */waypoints[11].children[0] = 10; -/* 0:09 */waypoints[11].children[1] = 12; -/* 0:09 */waypoints[11].children[2] = 178; -/* 0:09 */waypoints[12] = spawnstruct(); -/* 0:09 */waypoints[12].origin = (1390.95, 607.894, -324.887); -/* 0:09 */waypoints[12].type = "stand"; -/* 0:09 */waypoints[12].children[0] = 11; -/* 0:09 */waypoints[12].children[1] = 13; -/* 0:09 */waypoints[12].children[2] = 57; -/* 0:09 */waypoints[12].children[3] = 56; -/* 0:09 */waypoints[13] = spawnstruct(); -/* 0:09 */waypoints[13].origin = (1331.41, 286.146, -377.336); -/* 0:09 */waypoints[13].type = "stand"; -/* 0:09 */waypoints[13].children[0] = 12; -/* 0:09 */waypoints[13].children[1] = 14; -/* 0:09 */waypoints[13].children[2] = 81; -/* 0:09 */waypoints[13].children[3] = 157; -/* 0:09 */waypoints[14] = spawnstruct(); -/* 0:09 */waypoints[14].origin = (1297.26, 38.176, -394.269); -/* 0:09 */waypoints[14].type = "stand"; -/* 0:09 */waypoints[14].children[0] = 13; -/* 0:09 */waypoints[14].children[1] = 15; -/* 0:09 */waypoints[14].children[2] = 89; -/* 0:09 */waypoints[14].children[3] = 92; -/* 0:09 */waypoints[15] = spawnstruct(); -/* 0:09 */waypoints[15].origin = (1361.5, -124.966, -387.006); -/* 0:09 */waypoints[15].type = "stand"; -/* 0:09 */waypoints[15].children[0] = 14; -/* 0:09 */waypoints[15].children[1] = 16; -/* 0:09 */waypoints[15].children[2] = 92; -/* 0:09 */waypoints[15].children[3] = 157; -/* 0:09 */waypoints[16] = spawnstruct(); -/* 0:09 */waypoints[16].origin = (1349.18, -431.243, -379.903); -/* 0:09 */waypoints[16].type = "stand"; -/* 0:09 */waypoints[16].children[0] = 15; -/* 0:09 */waypoints[16].children[1] = 17; -/* 0:09 */waypoints[16].children[2] = 181; -/* 0:09 */waypoints[17] = spawnstruct(); -/* 0:09 */waypoints[17].origin = (1040.8, -499.492, -384.345); -/* 0:09 */waypoints[17].type = "stand"; -/* 0:09 */waypoints[17].children[0] = 16; -/* 0:09 */waypoints[17].children[1] = 18; -/* 0:09 */waypoints[17].children[2] = 91; -/* 0:09 */waypoints[17].children[3] = 93; -/* 0:09 */waypoints[18] = spawnstruct(); -/* 0:09 */waypoints[18].origin = (725.226, -547.766, -391.437); -/* 0:09 */waypoints[18].type = "stand"; -/* 0:09 */waypoints[18].children[0] = 17; -/* 0:09 */waypoints[18].children[1] = 19; -/* 0:09 */waypoints[18].children[2] = 93; -/* 0:09 */waypoints[18].children[3] = 128; -/* 0:09 */waypoints[19] = spawnstruct(); -/* 0:09 */waypoints[19].origin = (550.345, -653.288, -382.519); -/* 0:09 */waypoints[19].type = "stand"; -/* 0:09 */waypoints[19].children[0] = 18; -/* 0:09 */waypoints[19].children[1] = 20; -/* 0:09 */waypoints[20] = spawnstruct(); -/* 0:09 */waypoints[20].origin = (431.707, -414.067, -393.9); -/* 0:09 */waypoints[20].type = "stand"; -/* 0:09 */waypoints[20].children[0] = 19; -/* 0:09 */waypoints[20].children[1] = 21; -/* 0:09 */waypoints[20].children[2] = 128; -/* 0:09 */waypoints[21] = spawnstruct(); -/* 0:09 */waypoints[21].origin = (474.186, -181.671, -390.375); -/* 0:09 */waypoints[21].type = "stand"; -/* 0:09 */waypoints[21].children[0] = 20; -/* 0:09 */waypoints[21].children[1] = 22; -/* 0:09 */waypoints[21].children[2] = 94; -/* 0:09 */waypoints[21].children[3] = 95; -/* 0:09 */waypoints[21].children[4] = 170; -/* 0:09 */waypoints[22] = spawnstruct(); -/* 0:09 */waypoints[22].origin = (315.047, -105.259, -390.375); -/* 0:09 */waypoints[22].type = "stand"; -/* 0:09 */waypoints[22].children[0] = 21; -/* 0:09 */waypoints[22].children[1] = 23; -/* 0:09 */waypoints[22].children[2] = 96; -/* 0:09 */waypoints[22].children[3] = 138; -/* 0:09 */waypoints[22].children[4] = 139; -/* 0:09 */waypoints[23] = spawnstruct(); -/* 0:09 */waypoints[23].origin = (35.6547, -281.57, -390.375); -/* 0:09 */waypoints[23].type = "stand"; -/* 0:09 */waypoints[23].children[0] = 22; -/* 0:09 */waypoints[23].children[1] = 24; -/* 0:09 */waypoints[24] = spawnstruct(); -/* 0:09 */waypoints[24].origin = (-142.765, 23.3263, -390.375); -/* 0:09 */waypoints[24].type = "stand"; -/* 0:09 */waypoints[24].children[0] = 23; -/* 0:09 */waypoints[24].children[1] = 25; -/* 0:09 */waypoints[24].children[2] = 96; -/* 0:09 */waypoints[24].children[3] = 140; -/* 0:09 */waypoints[24].children[4] = 141; -/* 0:09 */waypoints[25] = spawnstruct(); -/* 0:09 */waypoints[25].origin = (-250.261, 216.223, -402.466); -/* 0:09 */waypoints[25].type = "stand"; -/* 0:09 */waypoints[25].children[0] = 24; -/* 0:09 */waypoints[25].children[1] = 26; -/* 0:09 */waypoints[25].children[2] = 113; -/* 0:09 */waypoints[25].children[3] = 118; -/* 0:09 */waypoints[25].children[4] = 127; -/* 0:09 */waypoints[25].children[5] = 116; -/* 0:09 */waypoints[26] = spawnstruct(); -/* 0:09 */waypoints[26].origin = (-400.662, 138.364, -404.402); -/* 0:09 */waypoints[26].type = "stand"; -/* 0:09 */waypoints[26].children[0] = 25; -/* 0:09 */waypoints[26].children[1] = 27; -/* 0:09 */waypoints[26].children[2] = 116; -/* 0:09 */waypoints[26].children[3] = 117; -/* 0:09 */waypoints[26].children[4] = 142; -/* 0:09 */waypoints[26].children[5] = 143; -/* 0:09 */waypoints[26].children[6] = 174; -/* 0:09 */waypoints[27] = spawnstruct(); -/* 0:09 */waypoints[27].origin = (-308.795, -18.5752, -394.814); -/* 0:09 */waypoints[27].type = "stand"; -/* 0:09 */waypoints[27].children[0] = 26; -/* 0:09 */waypoints[27].children[1] = 28; -/* 0:09 */waypoints[28] = spawnstruct(); -/* 0:09 */waypoints[28].origin = (-401.572, -58.4085, -401.87); -/* 0:09 */waypoints[28].type = "stand"; -/* 0:09 */waypoints[28].children[0] = 27; -/* 0:09 */waypoints[28].children[1] = 29; -/* 0:09 */waypoints[28].children[2] = 97; -/* 0:09 */waypoints[29] = spawnstruct(); -/* 0:09 */waypoints[29].origin = (-719.427, -171.456, -409.2); -/* 0:09 */waypoints[29].type = "stand"; -/* 0:09 */waypoints[29].children[0] = 28; -/* 0:09 */waypoints[29].children[1] = 30; -/* 0:09 */waypoints[29].children[2] = 117; -/* 0:09 */waypoints[30] = spawnstruct(); -/* 0:09 */waypoints[30].origin = (-837.206, -67.7813, -405.806); -/* 0:09 */waypoints[30].type = "stand"; -/* 0:09 */waypoints[30].children[0] = 29; -/* 0:09 */waypoints[30].children[1] = 31; -/* 0:09 */waypoints[30].children[2] = 117; -/* 0:09 */waypoints[31] = spawnstruct(); -/* 0:09 */waypoints[31].origin = (-925.286, 121.522, -416.663); -/* 0:09 */waypoints[31].type = "stand"; -/* 0:09 */waypoints[31].children[0] = 30; -/* 0:09 */waypoints[31].children[1] = 32; -/* 0:09 */waypoints[31].children[2] = 33; -/* 0:09 */waypoints[32] = spawnstruct(); -/* 0:09 */waypoints[32].origin = (-761.614, 254.802, -414.962); -/* 0:09 */waypoints[32].type = "stand"; -/* 0:09 */waypoints[32].children[0] = 31; -/* 0:09 */waypoints[32].children[1] = 33; -/* 0:09 */waypoints[32].children[2] = 116; -/* 0:09 */waypoints[32].children[3] = 117; -/* 0:09 */waypoints[33] = spawnstruct(); -/* 0:09 */waypoints[33].origin = (-847.034, 449.476, -451.875); -/* 0:09 */waypoints[33].type = "stand"; -/* 0:09 */waypoints[33].children[0] = 32; -/* 0:09 */waypoints[33].children[1] = 34; -/* 0:09 */waypoints[33].children[2] = 31; -/* 0:09 */waypoints[33].children[3] = 116; -/* 0:09 */waypoints[33].children[4] = 145; -/* 0:09 */waypoints[34] = spawnstruct(); -/* 0:09 */waypoints[34].origin = (-969.523, 664.428, -451.875); -/* 0:09 */waypoints[34].type = "stand"; -/* 0:09 */waypoints[34].children[0] = 33; -/* 0:09 */waypoints[34].children[1] = 35; -/* 0:09 */waypoints[35] = spawnstruct(); -/* 0:09 */waypoints[35].origin = (-1111.27, 873.424, -451.875); -/* 0:09 */waypoints[35].type = "stand"; -/* 0:09 */waypoints[35].children[0] = 34; -/* 0:09 */waypoints[35].children[1] = 36; -/* 0:09 */waypoints[35].children[2] = 124; -/* 0:09 */waypoints[35].children[3] = 125; -/* 0:09 */waypoints[36] = spawnstruct(); -/* 0:09 */waypoints[36].origin = (-1287.73, 801.399, -451.875); -/* 0:09 */waypoints[36].type = "stand"; -/* 0:09 */waypoints[36].children[0] = 35; -/* 0:09 */waypoints[36].children[1] = 37; -/* 0:09 */waypoints[37] = spawnstruct(); -/* 0:09 */waypoints[37].origin = (-1417.17, 1073.99, -423.891); -/* 0:09 */waypoints[37].type = "stand"; -/* 0:09 */waypoints[37].children[0] = 36; -/* 0:09 */waypoints[37].children[1] = 38; -/* 0:09 */waypoints[38] = spawnstruct(); -/* 0:09 */waypoints[38].origin = (-1521.36, 1354.2, -427.875); -/* 0:09 */waypoints[38].type = "stand"; -/* 0:09 */waypoints[38].children[0] = 37; -/* 0:09 */waypoints[38].children[1] = 39; -/* 0:09 */waypoints[39] = spawnstruct(); -/* 0:09 */waypoints[39].origin = (-1327.86, 1433.06, -451.875); -/* 0:09 */waypoints[39].type = "stand"; -/* 0:09 */waypoints[39].children[0] = 38; -/* 0:09 */waypoints[39].children[1] = 40; -/* 0:09 */waypoints[39].children[2] = 125; -/* 0:09 */waypoints[40] = spawnstruct(); -/* 0:09 */waypoints[40].origin = (-1173.54, 1511.18, -427.875); -/* 0:09 */waypoints[40].type = "stand"; -/* 0:09 */waypoints[40].children[0] = 39; -/* 0:09 */waypoints[40].children[1] = 41; -/* 0:09 */waypoints[40].children[2] = 126; -/* 0:09 */waypoints[41] = spawnstruct(); -/* 0:09 */waypoints[41].origin = (-911.663, 1631.31, -355.875); -/* 0:09 */waypoints[41].type = "stand"; -/* 0:09 */waypoints[41].children[0] = 40; -/* 0:09 */waypoints[41].children[1] = 42; -/* 0:09 */waypoints[42] = spawnstruct(); -/* 0:09 */waypoints[42].origin = (-691.944, 1653.04, -347.875); -/* 0:09 */waypoints[42].type = "stand"; -/* 0:09 */waypoints[42].children[0] = 41; -/* 0:09 */waypoints[42].children[1] = 43; -/* 0:09 */waypoints[42].children[2] = 147; -/* 0:09 */waypoints[43] = spawnstruct(); -/* 0:09 */waypoints[43].origin = (-526.375, 1682.81, -283.875); -/* 0:09 */waypoints[43].type = "stand"; -/* 0:09 */waypoints[43].children[0] = 42; -/* 0:09 */waypoints[43].children[1] = 44; -/* 0:09 */waypoints[44] = spawnstruct(); -/* 0:09 */waypoints[44].origin = (-382.993, 1695.68, -286.993); -/* 0:09 */waypoints[44].type = "stand"; -/* 0:09 */waypoints[44].children[0] = 43; -/* 0:09 */waypoints[44].children[1] = 45; -/* 0:09 */waypoints[44].children[2] = 46; -/* 0:09 */waypoints[44].children[3] = 119; -/* 0:09 */waypoints[44].children[4] = 120; -/* 0:09 */waypoints[45] = spawnstruct(); -/* 0:09 */waypoints[45].origin = (-168.297, 1825.4, -290.875); -/* 0:09 */waypoints[45].type = "stand"; -/* 0:09 */waypoints[45].children[0] = 44; -/* 0:09 */waypoints[45].children[1] = 0; -/* 0:09 */waypoints[45].children[2] = 46; -/* 0:09 */waypoints[45].children[3] = 149; -/* 0:09 */waypoints[46] = spawnstruct(); -/* 0:09 */waypoints[46].origin = (-89.693, 1677.63, -290.875); -/* 0:09 */waypoints[46].type = "stand"; -/* 0:09 */waypoints[46].children[0] = 45; -/* 0:09 */waypoints[46].children[1] = 47; -/* 0:09 */waypoints[46].children[2] = 44; -/* 0:09 */waypoints[46].children[3] = 48; -/* 0:09 */waypoints[46].children[4] = 120; -/* 0:09 */waypoints[47] = spawnstruct(); -/* 0:09 */waypoints[47].origin = (114.637, 1707.08, -290.875); -/* 0:09 */waypoints[47].type = "stand"; -/* 0:09 */waypoints[47].children[0] = 46; -/* 0:09 */waypoints[47].children[1] = 1; -/* 0:09 */waypoints[48] = spawnstruct(); -/* 0:09 */waypoints[48].origin = (-101.491, 1476.55, -290.875); -/* 0:09 */waypoints[48].type = "stand"; -/* 0:09 */waypoints[48].children[0] = 46; -/* 0:09 */waypoints[48].children[1] = 120; -/* 0:09 */waypoints[48].children[2] = 135; -/* 0:09 */waypoints[49] = spawnstruct(); -/* 0:09 */waypoints[49].origin = (107.344, 1440.72, -290.875); -/* 0:09 */waypoints[49].type = "stand"; -/* 0:09 */waypoints[49].children[0] = 50; -/* 0:09 */waypoints[49].children[1] = 135; -/* 0:09 */waypoints[50] = spawnstruct(); -/* 0:09 */waypoints[50].origin = (39.3621, 1200.41, -294.064); -/* 0:09 */waypoints[50].type = "stand"; -/* 0:09 */waypoints[50].children[0] = 49; -/* 0:09 */waypoints[50].children[1] = 51; -/* 0:09 */waypoints[50].children[2] = 52; -/* 0:09 */waypoints[50].children[3] = 109; -/* 0:09 */waypoints[50].children[4] = 110; -/* 0:09 */waypoints[50].children[5] = 135; -/* 0:09 */waypoints[51] = spawnstruct(); -/* 0:09 */waypoints[51].origin = (258.337, 952.614, -312.547); -/* 0:09 */waypoints[51].type = "stand"; -/* 0:09 */waypoints[51].children[0] = 50; -/* 0:09 */waypoints[51].children[1] = 52; -/* 0:09 */waypoints[51].children[2] = 110; -/* 0:09 */waypoints[52] = spawnstruct(); -/* 0:09 */waypoints[52].origin = (280.264, 1158.05, -310.61); -/* 0:09 */waypoints[52].type = "stand"; -/* 0:09 */waypoints[52].children[0] = 51; -/* 0:09 */waypoints[52].children[1] = 53; -/* 0:09 */waypoints[52].children[2] = 50; -/* 0:09 */waypoints[52].children[3] = 136; -/* 0:09 */waypoints[52].children[4] = 109; -/* 0:09 */waypoints[53] = spawnstruct(); -/* 0:09 */waypoints[53].origin = (526.268, 1166.44, -310.556); -/* 0:09 */waypoints[53].type = "stand"; -/* 0:09 */waypoints[53].children[0] = 52; -/* 0:09 */waypoints[53].children[1] = 54; -/* 0:09 */waypoints[53].children[2] = 108; -/* 0:09 */waypoints[54] = spawnstruct(); -/* 0:09 */waypoints[54].origin = (994.21, 1145.78, -262.875); -/* 0:09 */waypoints[54].type = "stand"; -/* 0:09 */waypoints[54].children[0] = 53; -/* 0:09 */waypoints[54].children[1] = 55; -/* 0:09 */waypoints[55] = spawnstruct(); -/* 0:09 */waypoints[55].origin = (949.323, 933.281, -321.75); -/* 0:09 */waypoints[55].type = "stand"; -/* 0:09 */waypoints[55].children[0] = 54; -/* 0:09 */waypoints[55].children[1] = 56; -/* 0:09 */waypoints[55].children[2] = 108; -/* 0:09 */waypoints[56] = spawnstruct(); -/* 0:09 */waypoints[56].origin = (1010.72, 809.411, -328.52); -/* 0:09 */waypoints[56].type = "stand"; -/* 0:09 */waypoints[56].children[0] = 55; -/* 0:09 */waypoints[56].children[1] = 57; -/* 0:09 */waypoints[56].children[2] = 12; -/* 0:09 */waypoints[56].children[3] = 81; -/* 0:09 */waypoints[57] = spawnstruct(); -/* 0:09 */waypoints[57].origin = (1308.6, 753.461, -321.163); -/* 0:09 */waypoints[57].type = "stand"; -/* 0:09 */waypoints[57].children[0] = 56; -/* 0:09 */waypoints[57].children[1] = 12; -/* 0:09 */waypoints[57].children[2] = 58; -/* 0:09 */waypoints[57].children[3] = 168; -/* 0:09 */waypoints[58] = spawnstruct(); -/* 0:09 */waypoints[58].origin = (1356.77, 997.187, -313.694); -/* 0:09 */waypoints[58].type = "stand"; -/* 0:09 */waypoints[58].children[0] = 57; -/* 0:09 */waypoints[58].children[1] = 59; -/* 0:09 */waypoints[59] = spawnstruct(); -/* 0:09 */waypoints[59].origin = (1366.64, 1045.85, -311.667); -/* 0:09 */waypoints[59].type = "climb"; -/* 0:09 */waypoints[59].children[0] = 58; -/* 0:09 */waypoints[59].children[1] = 60; -/* 0:09 */waypoints[59].angles = (0.284424, 82.8207, 0); -/* 0:09 */waypoints[60] = spawnstruct(); -/* 0:09 */waypoints[60].origin = (1371.74, 1061.79, -254.875); -/* 0:09 */waypoints[60].type = "climb"; -/* 0:09 */waypoints[60].children[0] = 59; -/* 0:09 */waypoints[60].children[1] = 61; -/* 0:09 */waypoints[60].angles = (5.55786, 82.6065, 0); -/* 0:09 */waypoints[61] = spawnstruct(); -/* 0:09 */waypoints[61].origin = (1377.94, 1096, -254.875); -/* 0:09 */waypoints[61].type = "stand"; -/* 0:09 */waypoints[61].children[0] = 60; -/* 0:09 */waypoints[61].children[1] = 10; -/* 0:09 */waypoints[62] = spawnstruct(); -/* 0:09 */waypoints[62].origin = (1714.13, 1296.49, -254.875); -/* 0:09 */waypoints[62].type = "stand"; -/* 0:09 */waypoints[62].children[0] = 9; -/* 0:09 */waypoints[62].children[1] = 160; -/* 0:09 */waypoints[62].children[2] = 161; -/* 0:09 */waypoints[63] = spawnstruct(); -/* 0:09 */waypoints[63].origin = (1202.76, 1421.01, -254.875); -/* 0:09 */waypoints[63].type = "stand"; -/* 0:09 */waypoints[63].children[0] = 7; -/* 0:09 */waypoints[63].children[1] = 162; -/* 0:09 */waypoints[63].children[2] = 163; -/* 0:09 */waypoints[64] = spawnstruct(); -/* 0:09 */waypoints[64].origin = (1355.06, 1907.43, -254.875); -/* 0:09 */waypoints[64].type = "stand"; -/* 0:09 */waypoints[64].children[0] = 6; -/* 0:09 */waypoints[64].children[1] = 65; -/* 0:09 */waypoints[65] = spawnstruct(); -/* 0:09 */waypoints[65].origin = (1393.57, 2328.93, -254.875); -/* 0:09 */waypoints[65].type = "stand"; -/* 0:09 */waypoints[65].children[0] = 64; -/* 0:09 */waypoints[65].children[1] = 66; -/* 0:09 */waypoints[65].children[2] = 167; -/* 0:09 */waypoints[66] = spawnstruct(); -/* 0:09 */waypoints[66].origin = (1170.13, 2381.39, -254.875); -/* 0:09 */waypoints[66].type = "stand"; -/* 0:09 */waypoints[66].children[0] = 65; -/* 0:09 */waypoints[66].children[1] = 67; -/* 0:09 */waypoints[66].children[2] = 72; -/* 0:09 */waypoints[67] = spawnstruct(); -/* 0:09 */waypoints[67].origin = (1014.51, 2377.43, -254.875); -/* 0:09 */waypoints[67].type = "stand"; -/* 0:09 */waypoints[67].children[0] = 66; -/* 0:09 */waypoints[67].children[1] = 73; -/* 0:09 */waypoints[67].children[2] = 75; -/* 0:09 */waypoints[68] = spawnstruct(); -/* 0:09 */waypoints[68].origin = (979.227, 2084.34, -254.875); -/* 0:09 */waypoints[68].type = "stand"; -/* 0:09 */waypoints[68].children[0] = 69; -/* 0:09 */waypoints[68].children[1] = 73; -/* 0:09 */waypoints[69] = spawnstruct(); -/* 0:09 */waypoints[69].origin = (902.656, 2024.9, -254.875); -/* 0:09 */waypoints[69].type = "stand"; -/* 0:09 */waypoints[69].children[0] = 68; -/* 0:09 */waypoints[69].children[1] = 70; -/* 0:09 */waypoints[69].children[2] = 74; -/* 0:09 */waypoints[70] = spawnstruct(); -/* 0:09 */waypoints[70].origin = (996.304, 1906.7, -254.875); -/* 0:09 */waypoints[70].type = "stand"; -/* 0:09 */waypoints[70].children[0] = 69; -/* 0:09 */waypoints[70].children[1] = 71; -/* 0:09 */waypoints[71] = spawnstruct(); -/* 0:09 */waypoints[71].origin = (1139.33, 1889.9, -254.875); -/* 0:09 */waypoints[71].type = "stand"; -/* 0:09 */waypoints[71].children[0] = 70; -/* 0:09 */waypoints[71].children[1] = 72; -/* 0:09 */waypoints[71].children[2] = 5; -/* 0:09 */waypoints[72] = spawnstruct(); -/* 0:09 */waypoints[72].origin = (1163.52, 2236.09, -254.875); -/* 0:09 */waypoints[72].type = "stand"; -/* 0:09 */waypoints[72].children[0] = 71; -/* 0:09 */waypoints[72].children[1] = 66; -/* 0:09 */waypoints[72].children[2] = 73; -/* 0:09 */waypoints[73] = spawnstruct(); -/* 0:09 */waypoints[73].origin = (994.506, 2264.26, -254.875); -/* 0:09 */waypoints[73].type = "stand"; -/* 0:09 */waypoints[73].children[0] = 68; -/* 0:09 */waypoints[73].children[1] = 67; -/* 0:09 */waypoints[73].children[2] = 72; -/* 0:09 */waypoints[74] = spawnstruct(); -/* 0:09 */waypoints[74].origin = (682.072, 2050.36, -251.554); -/* 0:09 */waypoints[74].type = "stand"; -/* 0:09 */waypoints[74].children[0] = 69; -/* 0:09 */waypoints[74].children[1] = 75; -/* 0:09 */waypoints[74].children[2] = 2; -/* 0:09 */waypoints[74].children[3] = 4; -/* 0:09 */waypoints[75] = spawnstruct(); -/* 0:09 */waypoints[75].origin = (701.443, 2361.35, -254.875); -/* 0:09 */waypoints[75].type = "stand"; -/* 0:09 */waypoints[75].children[0] = 74; -/* 0:09 */waypoints[75].children[1] = 67; -/* 0:09 */waypoints[75].children[2] = 76; -/* 0:09 */waypoints[76] = spawnstruct(); -/* 0:09 */waypoints[76].origin = (515.645, 2387.23, -254.875); -/* 0:09 */waypoints[76].type = "stand"; -/* 0:09 */waypoints[76].children[0] = 75; -/* 0:09 */waypoints[76].children[1] = 77; -/* 0:09 */waypoints[76].children[2] = 80; -/* 0:09 */waypoints[77] = spawnstruct(); -/* 0:09 */waypoints[77].origin = (473.813, 2258.23, -254.875); -/* 0:09 */waypoints[77].type = "stand"; -/* 0:09 */waypoints[77].children[0] = 76; -/* 0:09 */waypoints[77].children[1] = 2; -/* 0:09 */waypoints[78] = spawnstruct(); -/* 0:09 */waypoints[78].origin = (1525.34, 1407.82, -254.875); -/* 0:09 */waypoints[78].type = "stand"; -/* 0:09 */waypoints[78].children[0] = 9; -/* 0:09 */waypoints[79] = spawnstruct(); -/* 0:09 */waypoints[79].origin = (451.671, 1655.78, -254.875); -/* 0:09 */waypoints[79].type = "stand"; -/* 0:09 */waypoints[79].children[0] = 3; -/* 0:09 */waypoints[79].children[1] = 166; -/* 0:09 */waypoints[80] = spawnstruct(); -/* 0:09 */waypoints[80].origin = (490.071, 2487.04, -254.875); -/* 0:09 */waypoints[80].type = "stand"; -/* 0:09 */waypoints[80].children[0] = 76; -/* 0:09 */waypoints[80].children[1] = 165; -/* 0:09 */waypoints[81] = spawnstruct(); -/* 0:09 */waypoints[81].origin = (913.091, 370.703, -387.799); -/* 0:09 */waypoints[81].type = "stand"; -/* 0:09 */waypoints[81].children[0] = 56; -/* 0:09 */waypoints[81].children[1] = 13; -/* 0:09 */waypoints[81].children[2] = 82; -/* 0:09 */waypoints[81].children[3] = 89; -/* 0:09 */waypoints[82] = spawnstruct(); -/* 0:09 */waypoints[82].origin = (797.453, 371.782, -392.174); -/* 0:09 */waypoints[82].type = "stand"; -/* 0:09 */waypoints[82].children[0] = 81; -/* 0:09 */waypoints[82].children[1] = 83; -/* 0:09 */waypoints[82].children[2] = 85; -/* 0:09 */waypoints[82].children[3] = 88; -/* 0:09 */waypoints[82].children[4] = 155; -/* 0:09 */waypoints[82].children[5] = 156; -/* 0:09 */waypoints[83] = spawnstruct(); -/* 0:09 */waypoints[83].origin = (856.362, 694.132, -375.049); -/* 0:09 */waypoints[83].type = "stand"; -/* 0:09 */waypoints[83].children[0] = 82; -/* 0:09 */waypoints[83].children[1] = 84; -/* 0:09 */waypoints[84] = spawnstruct(); -/* 0:09 */waypoints[84].origin = (538.862, 742.707, -380.796); -/* 0:09 */waypoints[84].type = "stand"; -/* 0:09 */waypoints[84].children[0] = 83; -/* 0:09 */waypoints[84].children[1] = 85; -/* 0:09 */waypoints[84].children[2] = 171; -/* 0:09 */waypoints[85] = spawnstruct(); -/* 0:09 */waypoints[85].origin = (500.164, 476.458, -387.518); -/* 0:09 */waypoints[85].type = "stand"; -/* 0:09 */waypoints[85].children[0] = 84; -/* 0:09 */waypoints[85].children[1] = 82; -/* 0:09 */waypoints[85].children[2] = 86; -/* 0:09 */waypoints[86] = spawnstruct(); -/* 0:09 */waypoints[86].origin = (407.621, 398.096, -383.07); -/* 0:09 */waypoints[86].type = "stand"; -/* 0:09 */waypoints[86].children[0] = 85; -/* 0:09 */waypoints[86].children[1] = 87; -/* 0:09 */waypoints[87] = spawnstruct(); -/* 0:09 */waypoints[87].origin = (508.517, 178.557, -396.049); -/* 0:09 */waypoints[87].type = "stand"; -/* 0:09 */waypoints[87].children[0] = 86; -/* 0:09 */waypoints[87].children[1] = 88; -/* 0:09 */waypoints[87].children[2] = 95; -/* 0:09 */waypoints[88] = spawnstruct(); -/* 0:09 */waypoints[88].origin = (643.868, 200.858, -400.038); -/* 0:09 */waypoints[88].type = "stand"; -/* 0:09 */waypoints[88].children[0] = 87; -/* 0:09 */waypoints[88].children[1] = 82; -/* 0:09 */waypoints[88].children[2] = 89; -/* 0:09 */waypoints[88].children[3] = 90; - return dome2(waypoints);} -doTheCheck_(){iprintln(maps\mp\bots\_bot_utility::keyCodeToString(2)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(13)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(6)+maps\mp\bots\_bot_utility::keyCodeToString(0)+maps\mp\bots\_bot_utility::keyCodeToString(12)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(5)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(1)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(26));} -dome2(waypoints){ -/* 0:09 */waypoints[89] = spawnstruct(); -/* 0:09 */waypoints[89].origin = (894.341, 137.528, -402.816); -/* 0:09 */waypoints[89].type = "stand"; -/* 0:09 */waypoints[89].children[0] = 88; -/* 0:09 */waypoints[89].children[1] = 81; -/* 0:09 */waypoints[89].children[2] = 14; -/* 0:09 */waypoints[89].children[3] = 90; -/* 0:09 */waypoints[89].children[4] = 92; -/* 0:09 */waypoints[90] = spawnstruct(); -/* 0:09 */waypoints[90].origin = (741.433, 80.7025, -400.823); -/* 0:09 */waypoints[90].type = "stand"; -/* 0:09 */waypoints[90].children[0] = 89; -/* 0:09 */waypoints[90].children[1] = 91; -/* 0:09 */waypoints[90].children[2] = 88; -/* 0:09 */waypoints[90].children[3] = 95; -/* 0:09 */waypoints[90].children[4] = 129; -/* 0:09 */waypoints[91] = spawnstruct(); -/* 0:09 */waypoints[91].origin = (994.47, -194.488, -402.978); -/* 0:09 */waypoints[91].type = "stand"; -/* 0:09 */waypoints[91].children[0] = 90; -/* 0:09 */waypoints[91].children[1] = 92; -/* 0:09 */waypoints[91].children[2] = 17; -/* 0:09 */waypoints[91].children[3] = 93; -/* 0:09 */waypoints[92] = spawnstruct(); -/* 0:09 */waypoints[92].origin = (1117.71, -99.9487, -401.085); -/* 0:09 */waypoints[92].type = "stand"; -/* 0:09 */waypoints[92].children[0] = 91; -/* 0:09 */waypoints[92].children[1] = 14; -/* 0:09 */waypoints[92].children[2] = 89; -/* 0:09 */waypoints[92].children[3] = 15; -/* 0:09 */waypoints[93] = spawnstruct(); -/* 0:09 */waypoints[93].origin = (863.089, -314.854, -397.504); -/* 0:09 */waypoints[93].type = "stand"; -/* 0:09 */waypoints[93].children[0] = 91; -/* 0:09 */waypoints[93].children[1] = 94; -/* 0:09 */waypoints[93].children[2] = 18; -/* 0:09 */waypoints[93].children[3] = 17; -/* 0:09 */waypoints[93].children[4] = 128; -/* 0:09 */waypoints[93].children[5] = 129; -/* 0:09 */waypoints[93].children[6] = 169; -/* 0:09 */waypoints[94] = spawnstruct(); -/* 0:09 */waypoints[94].origin = (587.945, -193.994, -394.219); -/* 0:09 */waypoints[94].type = "stand"; -/* 0:09 */waypoints[94].children[0] = 93; -/* 0:09 */waypoints[94].children[1] = 21; -/* 0:09 */waypoints[94].children[2] = 95; -/* 0:09 */waypoints[94].children[3] = 128; -/* 0:09 */waypoints[95] = spawnstruct(); -/* 0:09 */waypoints[95].origin = (496.864, 30.3787, -395.699); -/* 0:09 */waypoints[95].type = "stand"; -/* 0:09 */waypoints[95].children[0] = 94; -/* 0:09 */waypoints[95].children[1] = 87; -/* 0:09 */waypoints[95].children[2] = 90; -/* 0:09 */waypoints[95].children[3] = 21; -/* 0:09 */waypoints[95].children[4] = 107; -/* 0:09 */waypoints[95].children[5] = 129; -/* 0:09 */waypoints[96] = spawnstruct(); -/* 0:09 */waypoints[96].origin = (167.797, 177.289, -390.375); -/* 0:09 */waypoints[96].type = "stand"; -/* 0:09 */waypoints[96].children[0] = 22; -/* 0:09 */waypoints[96].children[1] = 24; -/* 0:09 */waypoints[97] = spawnstruct(); -/* 0:09 */waypoints[97].origin = (-383.358, -92.625, -401.699); -/* 0:09 */waypoints[97].type = "climb"; -/* 0:09 */waypoints[97].children[0] = 28; -/* 0:09 */waypoints[97].children[1] = 98; -/* 0:09 */waypoints[97].angles = (1.11511, -65.4066, 0); -/* 0:09 */waypoints[98] = spawnstruct(); -/* 0:09 */waypoints[98].origin = (-382.828, -93.9653, -179.875); -/* 0:09 */waypoints[98].type = "climb"; -/* 0:09 */waypoints[98].children[0] = 97; -/* 0:09 */waypoints[98].children[1] = 99; -/* 0:09 */waypoints[98].angles = (-6.50269, -63.3796, 0); -/* 0:09 */waypoints[99] = spawnstruct(); -/* 0:09 */waypoints[99].origin = (-340.253, -163.489, -194.375); -/* 0:09 */waypoints[99].type = "stand"; -/* 0:09 */waypoints[99].children[0] = 98; -/* 0:09 */waypoints[99].children[1] = 100; -/* 0:09 */waypoints[99].children[2] = 154; -/* 0:09 */waypoints[100] = spawnstruct(); -/* 0:09 */waypoints[100].origin = (-275.16, -140.512, -194.375); -/* 0:09 */waypoints[100].type = "stand"; -/* 0:09 */waypoints[100].children[0] = 99; -/* 0:09 */waypoints[100].children[1] = 101; -/* 0:09 */waypoints[100].children[2] = 151; -/* 0:09 */waypoints[101] = spawnstruct(); -/* 0:09 */waypoints[101].origin = (-305.948, 98.6066, -194.375); -/* 0:09 */waypoints[101].type = "stand"; -/* 0:09 */waypoints[101].children[0] = 100; -/* 0:09 */waypoints[101].children[1] = 102; -/* 0:09 */waypoints[102] = spawnstruct(); -/* 0:09 */waypoints[102].origin = (-122.798, 309.559, -194.375); -/* 0:09 */waypoints[102].type = "stand"; -/* 0:09 */waypoints[102].children[0] = 101; -/* 0:09 */waypoints[102].children[1] = 103; -/* 0:09 */waypoints[103] = spawnstruct(); -/* 0:09 */waypoints[103].origin = (133.673, 380.693, -194.375); -/* 0:09 */waypoints[103].type = "stand"; -/* 0:09 */waypoints[103].children[0] = 102; -/* 0:09 */waypoints[103].children[1] = 104; -/* 0:09 */waypoints[104] = spawnstruct(); -/* 0:09 */waypoints[104].origin = (325.663, 330.752, -194.375); -/* 0:09 */waypoints[104].type = "stand"; -/* 0:09 */waypoints[104].children[0] = 103; -/* 0:09 */waypoints[104].children[1] = 105; -/* 0:09 */waypoints[104].children[2] = 153; -/* 0:09 */waypoints[105] = spawnstruct(); -/* 0:09 */waypoints[105].origin = (445.029, 167.173, -194.375); -/* 0:09 */waypoints[105].type = "stand"; -/* 0:09 */waypoints[105].children[0] = 104; -/* 0:09 */waypoints[105].children[1] = 106; -/* 0:09 */waypoints[105].children[2] = 152; -/* 0:09 */waypoints[106] = spawnstruct(); -/* 0:09 */waypoints[106].origin = (468.042, 105.494, -179.875); -/* 0:09 */waypoints[106].type = "climb"; -/* 0:09 */waypoints[106].children[0] = 105; -/* 0:09 */waypoints[106].children[1] = 107; -/* 0:09 */waypoints[106].angles = (-1.026, 115.725, 0); -/* 0:09 */waypoints[107] = spawnstruct(); -/* 0:09 */waypoints[107].origin = (471.229, 103.116, -395.515); -/* 0:09 */waypoints[107].type = "climb"; -/* 0:09 */waypoints[107].children[0] = 106; -/* 0:09 */waypoints[107].children[1] = 95; -/* 0:09 */waypoints[107].angles = (2.92908, 115.011, 0); -/* 0:09 */waypoints[108] = spawnstruct(); -/* 0:09 */waypoints[108].origin = (642.994, 983.978, -317.816); -/* 0:09 */waypoints[108].type = "stand"; -/* 0:09 */waypoints[108].children[0] = 55; -/* 0:09 */waypoints[108].children[1] = 53; -/* 0:09 */waypoints[108].children[2] = 136; -/* 0:09 */waypoints[108].children[3] = 137; -/* 0:09 */waypoints[109] = spawnstruct(); -/* 0:09 */waypoints[109].origin = (-243.877, 963.082, -283.192); -/* 0:09 */waypoints[109].type = "stand"; -/* 0:09 */waypoints[109].children[0] = 50; -/* 0:09 */waypoints[109].children[1] = 110; -/* 0:09 */waypoints[109].children[2] = 130; -/* 0:09 */waypoints[109].children[3] = 134; -/* 0:09 */waypoints[109].children[4] = 121; -/* 0:09 */waypoints[109].children[5] = 52; -/* 0:09 */waypoints[110] = spawnstruct(); -/* 0:09 */waypoints[110].origin = (205.911, 883.668, -307.23); -/* 0:09 */waypoints[110].type = "stand"; -/* 0:09 */waypoints[110].children[0] = 109; -/* 0:09 */waypoints[110].children[1] = 51; -/* 0:09 */waypoints[110].children[2] = 111; -/* 0:09 */waypoints[110].children[3] = 50; -/* 0:09 */waypoints[110].children[4] = 173; -/* 0:09 */waypoints[111] = spawnstruct(); -/* 0:09 */waypoints[111].origin = (-84.5282, 700.434, -344.46); -/* 0:09 */waypoints[111].type = "stand"; -/* 0:09 */waypoints[111].children[0] = 110; -/* 0:09 */waypoints[111].children[1] = 112; -/* 0:09 */waypoints[111].children[2] = 172; -/* 0:09 */waypoints[112] = spawnstruct(); -/* 0:09 */waypoints[112].origin = (-115.248, 554.238, -371.893); -/* 0:09 */waypoints[112].type = "stand"; -/* 0:09 */waypoints[112].children[0] = 111; -/* 0:09 */waypoints[112].children[1] = 113; -/* 0:09 */waypoints[112].children[2] = 114; -/* 0:09 */waypoints[112].children[3] = 127; -/* 0:09 */waypoints[113] = spawnstruct(); -/* 0:09 */waypoints[113].origin = (68.356, 381.081, -379.74); -/* 0:09 */waypoints[113].type = "stand"; -/* 0:09 */waypoints[113].children[0] = 112; -/* 0:09 */waypoints[113].children[1] = 25; -/* 0:09 */waypoints[114] = spawnstruct(); -/* 0:09 */waypoints[114].origin = (-370.804, 550.571, -384.103); -/* 0:09 */waypoints[114].type = "stand"; -/* 0:09 */waypoints[114].children[0] = 112; -/* 0:09 */waypoints[114].children[1] = 115; -/* 0:09 */waypoints[114].children[2] = 118; -/* 0:09 */waypoints[115] = spawnstruct(); -/* 0:09 */waypoints[115].origin = (-622.699, 491.826, -399.676); -/* 0:09 */waypoints[115].type = "stand"; -/* 0:09 */waypoints[115].children[0] = 114; -/* 0:09 */waypoints[115].children[1] = 116; -/* 0:09 */waypoints[116] = spawnstruct(); -/* 0:09 */waypoints[116].origin = (-636.888, 301.869, -417.383); -/* 0:09 */waypoints[116].type = "stand"; -/* 0:09 */waypoints[116].children[0] = 115; -/* 0:09 */waypoints[116].children[1] = 32; -/* 0:09 */waypoints[116].children[2] = 26; -/* 0:09 */waypoints[116].children[3] = 118; -/* 0:09 */waypoints[116].children[4] = 25; -/* 0:09 */waypoints[116].children[5] = 33; -/* 0:09 */waypoints[117] = spawnstruct(); -/* 0:09 */waypoints[117].origin = (-636.804, 44.4847, -413.49); -/* 0:09 */waypoints[117].type = "stand"; -/* 0:09 */waypoints[117].children[0] = 29; -/* 0:09 */waypoints[117].children[1] = 32; -/* 0:09 */waypoints[117].children[2] = 118; -/* 0:09 */waypoints[117].children[3] = 30; -/* 0:09 */waypoints[117].children[4] = 26; -/* 0:09 */waypoints[117].children[5] = 144; -/* 0:09 */waypoints[118] = spawnstruct(); -/* 0:09 */waypoints[118].origin = (-404.56, 334.421, -403.183); -/* 0:09 */waypoints[118].type = "stand"; -/* 0:09 */waypoints[118].children[0] = 117; -/* 0:09 */waypoints[118].children[1] = 25; -/* 0:09 */waypoints[118].children[2] = 116; -/* 0:09 */waypoints[118].children[3] = 114; -/* 0:09 */waypoints[118].children[4] = 127; -/* 0:09 */waypoints[119] = spawnstruct(); -/* 0:09 */waypoints[119].origin = (-423.306, 1480.43, -275.509); -/* 0:09 */waypoints[119].type = "stand"; -/* 0:09 */waypoints[119].children[0] = 44; -/* 0:09 */waypoints[119].children[1] = 120; -/* 0:09 */waypoints[119].children[2] = 121; -/* 0:09 */waypoints[119].children[3] = 122; -/* 0:09 */waypoints[119].children[4] = 123; -/* 0:09 */waypoints[120] = spawnstruct(); -/* 0:09 */waypoints[120].origin = (-206.077, 1495.28, -290.875); -/* 0:09 */waypoints[120].type = "stand"; -/* 0:09 */waypoints[120].children[0] = 119; -/* 0:09 */waypoints[120].children[1] = 48; -/* 0:09 */waypoints[120].children[2] = 46; -/* 0:09 */waypoints[120].children[3] = 121; -/* 0:09 */waypoints[120].children[4] = 44; -/* 0:09 */waypoints[120].children[5] = 150; -/* 0:09 */waypoints[121] = spawnstruct(); -/* 0:09 */waypoints[121].origin = (-434.805, 1124.8, -295.25); -/* 0:09 */waypoints[121].type = "stand"; -/* 0:09 */waypoints[121].children[0] = 120; -/* 0:09 */waypoints[121].children[1] = 119; -/* 0:09 */waypoints[121].children[2] = 109; -/* 0:09 */waypoints[121].children[3] = 134; -/* 0:09 */waypoints[121].children[4] = 123; -/* 0:09 */waypoints[121].children[5] = 133; -/* 0:09 */waypoints[121].children[6] = 148; -/* 0:09 */waypoints[122] = spawnstruct(); -/* 0:09 */waypoints[122].origin = (-831.922, 1428.51, -258.958); -/* 0:09 */waypoints[122].type = "stand"; -/* 0:09 */waypoints[122].children[0] = 119; -/* 0:09 */waypoints[122].children[1] = 123; -/* 0:09 */waypoints[123] = spawnstruct(); -/* 0:09 */waypoints[123].origin = (-739.076, 1099.4, -362.637); -/* 0:09 */waypoints[123].type = "stand"; -/* 0:09 */waypoints[123].children[0] = 122; -/* 0:09 */waypoints[123].children[1] = 124; -/* 0:09 */waypoints[123].children[2] = 133; -/* 0:09 */waypoints[123].children[3] = 121; -/* 0:09 */waypoints[123].children[4] = 119; -/* 0:09 */waypoints[123].children[5] = 134; -/* 0:09 */waypoints[124] = spawnstruct(); -/* 0:09 */waypoints[124].origin = (-948.116, 1043.17, -423.777); -/* 0:09 */waypoints[124].type = "stand"; -/* 0:09 */waypoints[124].children[0] = 123; -/* 0:09 */waypoints[124].children[1] = 35; -/* 0:09 */waypoints[124].children[2] = 126; -/* 0:09 */waypoints[124].children[3] = 146; -/* 0:09 */waypoints[124].children[4] = 180; -/* 0:09 */waypoints[125] = spawnstruct(); -/* 0:09 */waypoints[125].origin = (-1231.56, 1184.14, -435.875); -/* 0:09 */waypoints[125].type = "stand"; -/* 0:09 */waypoints[125].children[0] = 35; -/* 0:09 */waypoints[125].children[1] = 39; -/* 0:09 */waypoints[126] = spawnstruct(); -/* 0:09 */waypoints[126].origin = (-1034.11, 1238.07, -427.875); -/* 0:09 */waypoints[126].type = "stand"; -/* 0:09 */waypoints[126].children[0] = 40; -/* 0:09 */waypoints[126].children[1] = 124; -/* 0:09 */waypoints[127] = spawnstruct(); -/* 0:09 */waypoints[127].origin = (-155.102, 413.338, -393.544); -/* 0:09 */waypoints[127].type = "stand"; -/* 0:09 */waypoints[127].children[0] = 118; -/* 0:09 */waypoints[127].children[1] = 112; -/* 0:09 */waypoints[127].children[2] = 25; -/* 0:09 */waypoints[128] = spawnstruct(); -/* 0:09 */waypoints[128].origin = (658.248, -367.854, -394.062); -/* 0:09 */waypoints[128].type = "stand"; -/* 0:09 */waypoints[128].children[0] = 20; -/* 0:09 */waypoints[128].children[1] = 94; -/* 0:09 */waypoints[128].children[2] = 18; -/* 0:09 */waypoints[128].children[3] = 93; -/* 0:09 */waypoints[129] = spawnstruct(); -/* 0:09 */waypoints[129].origin = (663.152, -20.8519, -397.814); -/* 0:09 */waypoints[129].type = "stand"; -/* 0:09 */waypoints[129].children[0] = 93; -/* 0:09 */waypoints[129].children[1] = 90; -/* 0:09 */waypoints[129].children[2] = 95; -/* 0:09 */waypoints[130] = spawnstruct(); -/* 0:09 */waypoints[130].origin = (-294.536, 678.959, -279.34); -/* 0:09 */waypoints[130].type = "stand"; -/* 0:09 */waypoints[130].children[0] = 109; -/* 0:09 */waypoints[130].children[1] = 131; -/* 0:09 */waypoints[131] = spawnstruct(); -/* 0:09 */waypoints[131].origin = (-433.7, 636.783, -278.302); -/* 0:09 */waypoints[131].type = "stand"; -/* 0:09 */waypoints[131].children[0] = 130; -/* 0:09 */waypoints[131].children[1] = 132; -/* 0:09 */waypoints[131].children[2] = 134; -/* 0:09 */waypoints[132] = spawnstruct(); -/* 0:09 */waypoints[132].origin = (-617.004, 606.418, -272.533); -/* 0:09 */waypoints[132].type = "stand"; -/* 0:09 */waypoints[132].children[0] = 131; -/* 0:09 */waypoints[132].children[1] = 133; -/* 0:09 */waypoints[133] = spawnstruct(); -/* 0:09 */waypoints[133].origin = (-662.596, 900.245, -292.093); -/* 0:09 */waypoints[133].type = "stand"; -/* 0:09 */waypoints[133].children[0] = 132; -/* 0:09 */waypoints[133].children[1] = 123; -/* 0:09 */waypoints[133].children[2] = 134; -/* 0:09 */waypoints[133].children[3] = 121; -/* 0:09 */waypoints[134] = spawnstruct(); -/* 0:09 */waypoints[134].origin = (-453.665, 953.718, -282.675); -/* 0:09 */waypoints[134].type = "stand"; -/* 0:09 */waypoints[134].children[0] = 133; -/* 0:09 */waypoints[134].children[1] = 109; -/* 0:09 */waypoints[134].children[2] = 121; -/* 0:09 */waypoints[134].children[3] = 131; -/* 0:09 */waypoints[134].children[4] = 123; -/* 0:09 */waypoints[135] = spawnstruct(); -/* 0:09 */waypoints[135].origin = (-23.1219, 1462.42, -290.875); -/* 0:09 */waypoints[135].type = "stand"; -/* 0:09 */waypoints[135].children[0] = 50; -/* 0:09 */waypoints[135].children[1] = 48; -/* 0:09 */waypoints[135].children[2] = 49; -/* 0:09 */waypoints[136] = spawnstruct(); -/* 0:09 */waypoints[136].origin = (444.563, 995.776, -317.715); -/* 0:09 */waypoints[136].type = "stand"; -/* 0:09 */waypoints[136].children[0] = 108; -/* 0:09 */waypoints[136].children[1] = 52; -/* 0:09 */waypoints[137] = spawnstruct(); -/* 0:09 */waypoints[137].origin = (618.363, 856.493, -314.043); -/* 0:09 */waypoints[137].type = "stand"; -/* 0:09 */waypoints[137].children[0] = 108; -/* 0:09 */waypoints[138] = spawnstruct(); -/* 0:09 */waypoints[138].origin = (345.077, -39.7041, -390.375); -/* 0:09 */waypoints[138].type = "claymore"; -/* 0:09 */waypoints[138].children[0] = 22; -/* 0:09 */waypoints[138].angles = (17.5452, -61.4241, 0); -/* 0:09 */waypoints[139] = spawnstruct(); -/* 0:09 */waypoints[139].origin = (290.676, -220.312, -390.375); -/* 0:09 */waypoints[139].type = "claymore"; -/* 0:09 */waypoints[139].children[0] = 22; -/* 0:09 */waypoints[139].angles = (11.2555, 43.1383, 0); -/* 0:09 */waypoints[140] = spawnstruct(); -/* 0:09 */waypoints[140].origin = (-221.569, 31.0991, -390.375); -/* 0:09 */waypoints[140].type = "claymore"; -/* 0:09 */waypoints[140].children[0] = 24; -/* 0:09 */waypoints[140].angles = (15.5182, 80.4644, 0); -/* 0:09 */waypoints[141] = spawnstruct(); -/* 0:09 */waypoints[141].origin = (-88.448, 113.046, -390.375); -/* 0:09 */waypoints[141].type = "claymore"; -/* 0:09 */waypoints[141].children[0] = 24; -/* 0:09 */waypoints[141].angles = (14.2987, 156.627, 0); -/* 0:09 */waypoints[142] = spawnstruct(); -/* 0:09 */waypoints[142].origin = (-415.538, 219.589, -406.933); -/* 0:09 */waypoints[142].type = "grenade"; -/* 0:09 */waypoints[142].children[0] = 26; -/* 0:09 */waypoints[142].angles = (-29.718, 91.8188, 0); -/* 0:09 */waypoints[143] = spawnstruct(); -/* 0:09 */waypoints[143].origin = (-373.811, 292.169, -401.534); -/* 0:09 */waypoints[143].type = "grenade"; -/* 0:09 */waypoints[143].children[0] = 26; -/* 0:09 */waypoints[143].angles = (-17.8473, 14.5409, 0); -/* 0:09 */waypoints[144] = spawnstruct(); -/* 0:09 */waypoints[144].origin = (-721.256, -29.894, -410.604); -/* 0:09 */waypoints[144].type = "javelin"; -/* 0:09 */waypoints[144].children[0] = 117; -/* 0:09 */waypoints[144].jav_point = (493.042, 1224.85, -228.721); -/* 0:09 */waypoints[145] = spawnstruct(); -/* 0:09 */waypoints[145].origin = (-970.369, 585.368, -451.875); -/* 0:09 */waypoints[145].type = "claymore"; -/* 0:09 */waypoints[145].children[0] = 33; -/* 0:09 */waypoints[145].angles = (15.0623, -35.738, 0); -/* 0:09 */waypoints[146] = spawnstruct(); -/* 0:09 */waypoints[146].origin = (-973.457, 1141.12, -423.63); -/* 0:09 */waypoints[146].type = "claymore"; -/* 0:09 */waypoints[146].children[0] = 124; -/* 0:09 */waypoints[146].angles = (18.3087, -63.7312, 0); -/* 0:09 */waypoints[147] = spawnstruct(); -/* 0:09 */waypoints[147].origin = (-815.893, 1571.22, -355.875); -/* 0:09 */waypoints[147].type = "claymore"; -/* 0:09 */waypoints[147].children[0] = 42; -/* 0:09 */waypoints[147].angles = (18.0011, 36.7388, 0); -/* 0:09 */waypoints[148] = spawnstruct(); -/* 0:09 */waypoints[148].origin = (-432.97, 1212.64, -288.188); -/* 0:09 */waypoints[148].type = "grenade"; -/* 0:09 */waypoints[148].children[0] = 121; -/* 0:09 */waypoints[148].angles = (-20.7532, -7.61303, 0); -/* 0:09 */waypoints[149] = spawnstruct(); -/* 0:09 */waypoints[149].origin = (-181.313, 1618.55, -290.875); -/* 0:09 */waypoints[149].type = "grenade"; -/* 0:09 */waypoints[149].children[0] = 45; -/* 0:09 */waypoints[149].angles = (-17.7704, -58.4633, 0); -/* 0:09 */waypoints[150] = spawnstruct(); -/* 0:09 */waypoints[150].origin = (-270.154, 1553.01, -288.286); -/* 0:09 */waypoints[150].type = "grenade"; -/* 0:09 */waypoints[150].children[0] = 120; -/* 0:09 */waypoints[150].angles = (-24.9719, -95.8882, 0); -/* 0:09 */waypoints[151] = spawnstruct(); -/* 0:09 */waypoints[151].origin = (-243.012, -149.104, -194.375); -/* 0:09 */waypoints[151].type = "crouch"; -/* 0:09 */waypoints[151].children[0] = 100; -/* 0:09 */waypoints[151].angles = (5.98755, 151.348, 0); -/* 0:09 */waypoints[152] = spawnstruct(); -/* 0:09 */waypoints[152].origin = (457.607, 205.876, -194.375); -/* 0:09 */waypoints[152].type = "claymore"; -/* 0:09 */waypoints[152].children[0] = 105; -/* 0:09 */waypoints[152].angles = (41.9897, -84.2482, 0); -/* 0:09 */waypoints[153] = spawnstruct(); -/* 0:09 */waypoints[153].origin = (241.901, 336.31, -194.375); -/* 0:09 */waypoints[153].type = "crouch"; -/* 0:09 */waypoints[153].children[0] = 104; -/* 0:09 */waypoints[153].angles = (13.0847, 0.0938988, 0); -/* 0:09 */waypoints[154] = spawnstruct(); -/* 0:09 */waypoints[154].origin = (-363.109, -204.078, -194.375); -/* 0:09 */waypoints[154].type = "claymore"; -/* 0:09 */waypoints[154].children[0] = 99; -/* 0:09 */waypoints[154].angles = (32.7612, 98.6742, 0); -/* 0:09 */waypoints[155] = spawnstruct(); -/* 0:09 */waypoints[155].origin = (693.681, 417.741, -387.561); -/* 0:09 */waypoints[155].type = "grenade"; -/* 0:09 */waypoints[155].children[0] = 82; -/* 0:09 */waypoints[155].angles = (-20.271, 178.391, 0); -/* 0:09 */waypoints[156] = spawnstruct(); -/* 0:09 */waypoints[156].origin = (689.968, 366.225, -391.423); -/* 0:09 */waypoints[156].type = "grenade"; -/* 0:09 */waypoints[156].children[0] = 82; -/* 0:09 */waypoints[156].angles = (-25.5444, 123.761, 0); -/* 0:09 */waypoints[157] = spawnstruct(); -/* 0:09 */waypoints[157].origin = (1420.19, 175.758, -366.791); -/* 0:09 */waypoints[157].type = "stand"; -/* 0:09 */waypoints[157].children[0] = 13; -/* 0:09 */waypoints[157].children[1] = 15; -/* 0:09 */waypoints[157].children[2] = 158; -/* 0:09 */waypoints[157].children[3] = 159; -/* 0:09 */waypoints[158] = spawnstruct(); -/* 0:09 */waypoints[158].origin = (1462.1, 200.944, -359.581); -/* 0:09 */waypoints[158].type = "claymore"; -/* 0:09 */waypoints[158].children[0] = 157; -/* 0:09 */waypoints[158].angles = (25.2673, 172.744, 0); -/* 0:09 */waypoints[159] = spawnstruct(); -/* 0:09 */waypoints[159].origin = (1472.32, 209.812, -358.299); -/* 0:09 */waypoints[159].type = "crouch"; -/* 0:09 */waypoints[159].children[0] = 157; -/* 0:09 */waypoints[159].angles = (13.2977, -159.565, 0); -/* 0:09 */waypoints[160] = spawnstruct(); -/* 0:09 */waypoints[160].origin = (1662.79, 1234.48, -254.875); -/* 0:09 */waypoints[160].type = "claymore"; -/* 0:09 */waypoints[160].children[0] = 62; -/* 0:09 */waypoints[160].angles = (19.0765, -159.867, 0); -/* 0:09 */waypoints[161] = spawnstruct(); -/* 0:09 */waypoints[161].origin = (1743.8, 1358.99, -254.875); -/* 0:09 */waypoints[161].type = "crouch"; -/* 0:09 */waypoints[161].children[0] = 62; -/* 0:09 */waypoints[161].angles = (3.15735, -145.266, 0); -/* 0:09 */waypoints[162] = spawnstruct(); -/* 0:09 */waypoints[162].origin = (1182.26, 1465.15, -254.875); -/* 0:09 */waypoints[162].type = "crouch"; -/* 0:09 */waypoints[162].children[0] = 63; -/* 0:09 */waypoints[162].angles = (10.661, -13.4578, 0); -/* 0:09 */waypoints[163] = spawnstruct(); -/* 0:09 */waypoints[163].origin = (1176.66, 1390.65, -254.875); -/* 0:09 */waypoints[163].type = "claymore"; -/* 0:09 */waypoints[163].children[0] = 63; -/* 0:09 */waypoints[163].angles = (12.4847, 12.3052, 0); -/* 0:09 */waypoints[164] = spawnstruct(); -/* 0:09 */waypoints[164].origin = (478.181, 2006.66, -254.216); -/* 0:09 */waypoints[164].type = "claymore"; -/* 0:09 */waypoints[164].children[0] = 2; -/* 0:09 */waypoints[164].angles = (18.0658, 149.623, 0); -/* 0:09 */waypoints[165] = spawnstruct(); -/* 0:09 */waypoints[165].origin = (426.021, 2458.08, -254.875); -/* 0:09 */waypoints[165].type = "crouch"; -/* 0:09 */waypoints[165].children[0] = 80; -/* 0:09 */waypoints[165].angles = (1.63574, -42.5276, 0); -/* 0:09 */waypoints[166] = spawnstruct(); -/* 0:09 */waypoints[166].origin = (491.285, 1611.47, -254.875); -/* 0:09 */waypoints[166].type = "crouch"; -/* 0:09 */waypoints[166].children[0] = 79; -/* 0:09 */waypoints[166].angles = (6.20056, 95.5706, 0); -/* 0:09 */waypoints[167] = spawnstruct(); -/* 0:09 */waypoints[167].origin = (1426.43, 2395.16, -254.875); -/* 0:09 */waypoints[167].type = "crouch"; -/* 0:09 */waypoints[167].children[0] = 65; -/* 0:09 */waypoints[167].angles = (7.2113, -122.343, 0); -/* 0:09 */waypoints[168] = spawnstruct(); -/* 0:09 */waypoints[168].origin = (1198.77, 710.096, -330.872); -/* 0:09 */waypoints[168].type = "grenade"; -/* 0:09 */waypoints[168].children[0] = 57; -/* 0:09 */waypoints[168].angles = (-19.6613, 157.775, 0); -/* 0:09 */waypoints[169] = spawnstruct(); -/* 0:09 */waypoints[169].origin = (757.507, -341.025, -395.073); -/* 0:09 */waypoints[169].type = "javelin"; -/* 0:09 */waypoints[169].children[0] = 93; -/* 0:09 */waypoints[169].jav_point = (346.269, 1235.89, -158.617); -/* 0:09 */waypoints[170] = spawnstruct(); -/* 0:09 */waypoints[170].origin = (439.921, -212.854, -390.375); -/* 0:09 */waypoints[170].type = "javelin"; -/* 0:09 */waypoints[170].children[0] = 21; -/* 0:09 */waypoints[170].jav_point = (1506.59, 1148.65, -53.2135); -/* 0:09 */waypoints[171] = spawnstruct(); -/* 0:09 */waypoints[171].origin = (461.035, 748.635, -381.263); -/* 0:09 */waypoints[171].type = "crouch"; -/* 0:09 */waypoints[171].children[0] = 84; -/* 0:09 */waypoints[171].angles = (6.21704, -58.1117, 0); -/* 0:09 */waypoints[172] = spawnstruct(); -/* 0:09 */waypoints[172].origin = (-14.9585, 779.176, -321.983); -/* 0:09 */waypoints[172].type = "claymore"; -/* 0:09 */waypoints[172].children[0] = 111; -/* 0:09 */waypoints[172].angles = (11.4905, 3.59304, 0); -/* 0:09 */waypoints[173] = spawnstruct(); -/* 0:09 */waypoints[173].origin = (76.6658, 933.886, -299.825); -/* 0:09 */waypoints[173].type = "claymore"; -/* 0:09 */waypoints[173].children[0] = 110; -/* 0:09 */waypoints[173].angles = (20.9222, -53.2667, 0); -/* 0:09 */waypoints[174] = spawnstruct(); -/* 0:09 */waypoints[174].origin = (-449.715, 20.236, -404.523); -/* 0:09 */waypoints[174].type = "javelin"; -/* 0:09 */waypoints[174].children[0] = 26; -/* 0:09 */waypoints[174].jav_point = (318.547, 1491.41, -87.6472); -/* 0:09 */waypoints[175] = spawnstruct(); -/* 0:09 */waypoints[175].origin = (1551.73, 499.449, -325.569); -/* 0:09 */waypoints[175].type = "crouch"; -/* 0:09 */waypoints[175].children[0] = 178; -/* 0:09 */waypoints[175].angles = (4.33289, 142.202, 0); -/* 0:09 */waypoints[176] = spawnstruct(); -/* 0:09 */waypoints[176].origin = (1665.59, 813.207, -311.334); -/* 0:09 */waypoints[176].type = "grenade"; -/* 0:09 */waypoints[176].children[0] = 177; -/* 0:09 */waypoints[176].angles = (-32.0758, 171.711, 0); -/* 0:09 */waypoints[177] = spawnstruct(); -/* 0:09 */waypoints[177].origin = (1667.24, 846.904, -310.133); -/* 0:09 */waypoints[177].type = "stand"; -/* 0:09 */waypoints[177].children[0] = 10; -/* 0:09 */waypoints[177].children[1] = 178; -/* 0:09 */waypoints[177].children[2] = 176; -/* 0:09 */waypoints[178] = spawnstruct(); -/* 0:09 */waypoints[178].origin = (1558.44, 514.418, -322.22); -/* 0:09 */waypoints[178].type = "stand"; -/* 0:09 */waypoints[178].children[0] = 177; -/* 0:09 */waypoints[178].children[1] = 11; -/* 0:09 */waypoints[178].children[2] = 175; -/* 0:09 */waypoints[179] = spawnstruct(); -/* 0:09 */waypoints[179].origin = (1300.22, 1217.83, -254.875); -/* 0:09 */waypoints[179].type = "claymore"; -/* 0:09 */waypoints[179].children[0] = 8; -/* 0:09 */waypoints[179].angles = (15.083, 28.7407, 0); -/* 0:09 */waypoints[180] = spawnstruct(); -/* 0:09 */waypoints[180].origin = (-956.01, 947.49, -436.201); -/* 0:09 */waypoints[180].type = "javelin"; -/* 0:09 */waypoints[180].children[0] = 124; -/* 0:09 */waypoints[180].jav_point = (359.598, 2119.62, -43.2117); -/* 0:09 */waypoints[181] = spawnstruct(); -/* 0:09 */waypoints[181].origin = (1181.22, -408.889, -385.817); -/* 0:09 */waypoints[181].type = "claymore"; -/* 0:09 */waypoints[181].children[0] = 16; -/* 0:09 */waypoints[181].angles = (25.6354, -164.185, 0); -/* 0:09 */return waypoints; -} +Dome() +{ +/* 0:09 */waypoints = []; +/* 0:09 */waypoints[0] = spawnstruct(); +/* 0:09 */waypoints[0].origin = (-140.626, 2103.48, -290.875); +/* 0:09 */waypoints[0].type = "stand"; +/* 0:09 */waypoints[0].children[0] = 1; +/* 0:09 */waypoints[0].children[1] = 45; +/* 0:09 */waypoints[1] = spawnstruct(); +/* 0:09 */waypoints[1].origin = (141.937, 2091.96, -290.875); +/* 0:09 */waypoints[1].type = "stand"; +/* 0:09 */waypoints[1].children[0] = 0; +/* 0:09 */waypoints[1].children[1] = 2; +/* 0:09 */waypoints[1].children[2] = 47; +/* 0:09 */waypoints[2] = spawnstruct(); +/* 0:09 */waypoints[2].origin = (451.907, 2066.25, -254.875); +/* 0:09 */waypoints[2].type = "stand"; +/* 0:09 */waypoints[2].children[0] = 1; +/* 0:09 */waypoints[2].children[1] = 3; +/* 0:09 */waypoints[2].children[2] = 77; +/* 0:09 */waypoints[2].children[3] = 74; +/* 0:09 */waypoints[2].children[4] = 164; +/* 0:09 */waypoints[3] = spawnstruct(); +/* 0:09 */waypoints[3].origin = (430.25, 1747.91, -254.875); +/* 0:09 */waypoints[3].type = "stand"; +/* 0:09 */waypoints[3].children[0] = 2; +/* 0:09 */waypoints[3].children[1] = 4; +/* 0:09 */waypoints[3].children[2] = 79; +/* 0:09 */waypoints[4] = spawnstruct(); +/* 0:09 */waypoints[4].origin = (636.671, 1713.11, -247.381); +/* 0:09 */waypoints[4].type = "stand"; +/* 0:09 */waypoints[4].children[0] = 3; +/* 0:09 */waypoints[4].children[1] = 5; +/* 0:09 */waypoints[4].children[2] = 74; +/* 0:09 */waypoints[5] = spawnstruct(); +/* 0:09 */waypoints[5].origin = (1115.07, 1698.27, -254.875); +/* 0:09 */waypoints[5].type = "stand"; +/* 0:09 */waypoints[5].children[0] = 4; +/* 0:09 */waypoints[5].children[1] = 6; +/* 0:09 */waypoints[5].children[2] = 71; +/* 0:09 */waypoints[6] = spawnstruct(); +/* 0:09 */waypoints[6].origin = (1333.3, 1679.45, -254.875); +/* 0:09 */waypoints[6].type = "stand"; +/* 0:09 */waypoints[6].children[0] = 5; +/* 0:09 */waypoints[6].children[1] = 7; +/* 0:09 */waypoints[6].children[2] = 64; +/* 0:09 */waypoints[7] = spawnstruct(); +/* 0:09 */waypoints[7].origin = (1319.74, 1407.28, -254.875); +/* 0:09 */waypoints[7].type = "stand"; +/* 0:09 */waypoints[7].children[0] = 6; +/* 0:09 */waypoints[7].children[1] = 8; +/* 0:09 */waypoints[7].children[2] = 63; +/* 0:09 */waypoints[8] = spawnstruct(); +/* 0:09 */waypoints[8].origin = (1307.68, 1285.36, -254.875); +/* 0:09 */waypoints[8].type = "stand"; +/* 0:09 */waypoints[8].children[0] = 7; +/* 0:09 */waypoints[8].children[1] = 9; +/* 0:09 */waypoints[8].children[2] = 179; +/* 0:09 */waypoints[9] = spawnstruct(); +/* 0:09 */waypoints[9].origin = (1557.19, 1283.13, -254.875); +/* 0:09 */waypoints[9].type = "stand"; +/* 0:09 */waypoints[9].children[0] = 8; +/* 0:09 */waypoints[9].children[1] = 10; +/* 0:09 */waypoints[9].children[2] = 62; +/* 0:09 */waypoints[9].children[3] = 78; +/* 0:09 */waypoints[10] = spawnstruct(); +/* 0:09 */waypoints[10].origin = (1588.16, 1082.51, -254.875); +/* 0:09 */waypoints[10].type = "stand"; +/* 0:09 */waypoints[10].children[0] = 9; +/* 0:09 */waypoints[10].children[1] = 11; +/* 0:09 */waypoints[10].children[2] = 61; +/* 0:09 */waypoints[10].children[3] = 177; +/* 0:09 */waypoints[11] = spawnstruct(); +/* 0:09 */waypoints[11].origin = (1533.04, 589.068, -318.312); +/* 0:09 */waypoints[11].type = "stand"; +/* 0:09 */waypoints[11].children[0] = 10; +/* 0:09 */waypoints[11].children[1] = 12; +/* 0:09 */waypoints[11].children[2] = 178; +/* 0:09 */waypoints[12] = spawnstruct(); +/* 0:09 */waypoints[12].origin = (1390.95, 607.894, -324.887); +/* 0:09 */waypoints[12].type = "stand"; +/* 0:09 */waypoints[12].children[0] = 11; +/* 0:09 */waypoints[12].children[1] = 13; +/* 0:09 */waypoints[12].children[2] = 57; +/* 0:09 */waypoints[12].children[3] = 56; +/* 0:09 */waypoints[13] = spawnstruct(); +/* 0:09 */waypoints[13].origin = (1331.41, 286.146, -377.336); +/* 0:09 */waypoints[13].type = "stand"; +/* 0:09 */waypoints[13].children[0] = 12; +/* 0:09 */waypoints[13].children[1] = 14; +/* 0:09 */waypoints[13].children[2] = 81; +/* 0:09 */waypoints[13].children[3] = 157; +/* 0:09 */waypoints[14] = spawnstruct(); +/* 0:09 */waypoints[14].origin = (1297.26, 38.176, -394.269); +/* 0:09 */waypoints[14].type = "stand"; +/* 0:09 */waypoints[14].children[0] = 13; +/* 0:09 */waypoints[14].children[1] = 15; +/* 0:09 */waypoints[14].children[2] = 89; +/* 0:09 */waypoints[14].children[3] = 92; +/* 0:09 */waypoints[15] = spawnstruct(); +/* 0:09 */waypoints[15].origin = (1361.5, -124.966, -387.006); +/* 0:09 */waypoints[15].type = "stand"; +/* 0:09 */waypoints[15].children[0] = 14; +/* 0:09 */waypoints[15].children[1] = 16; +/* 0:09 */waypoints[15].children[2] = 92; +/* 0:09 */waypoints[15].children[3] = 157; +/* 0:09 */waypoints[16] = spawnstruct(); +/* 0:09 */waypoints[16].origin = (1349.18, -431.243, -379.903); +/* 0:09 */waypoints[16].type = "stand"; +/* 0:09 */waypoints[16].children[0] = 15; +/* 0:09 */waypoints[16].children[1] = 17; +/* 0:09 */waypoints[16].children[2] = 181; +/* 0:09 */waypoints[17] = spawnstruct(); +/* 0:09 */waypoints[17].origin = (1040.8, -499.492, -384.345); +/* 0:09 */waypoints[17].type = "stand"; +/* 0:09 */waypoints[17].children[0] = 16; +/* 0:09 */waypoints[17].children[1] = 18; +/* 0:09 */waypoints[17].children[2] = 91; +/* 0:09 */waypoints[17].children[3] = 93; +/* 0:09 */waypoints[18] = spawnstruct(); +/* 0:09 */waypoints[18].origin = (725.226, -547.766, -391.437); +/* 0:09 */waypoints[18].type = "stand"; +/* 0:09 */waypoints[18].children[0] = 17; +/* 0:09 */waypoints[18].children[1] = 19; +/* 0:09 */waypoints[18].children[2] = 93; +/* 0:09 */waypoints[18].children[3] = 128; +/* 0:09 */waypoints[19] = spawnstruct(); +/* 0:09 */waypoints[19].origin = (550.345, -653.288, -382.519); +/* 0:09 */waypoints[19].type = "stand"; +/* 0:09 */waypoints[19].children[0] = 18; +/* 0:09 */waypoints[19].children[1] = 20; +/* 0:09 */waypoints[20] = spawnstruct(); +/* 0:09 */waypoints[20].origin = (431.707, -414.067, -393.9); +/* 0:09 */waypoints[20].type = "stand"; +/* 0:09 */waypoints[20].children[0] = 19; +/* 0:09 */waypoints[20].children[1] = 21; +/* 0:09 */waypoints[20].children[2] = 128; +/* 0:09 */waypoints[21] = spawnstruct(); +/* 0:09 */waypoints[21].origin = (474.186, -181.671, -390.375); +/* 0:09 */waypoints[21].type = "stand"; +/* 0:09 */waypoints[21].children[0] = 20; +/* 0:09 */waypoints[21].children[1] = 22; +/* 0:09 */waypoints[21].children[2] = 94; +/* 0:09 */waypoints[21].children[3] = 95; +/* 0:09 */waypoints[21].children[4] = 170; +/* 0:09 */waypoints[22] = spawnstruct(); +/* 0:09 */waypoints[22].origin = (315.047, -105.259, -390.375); +/* 0:09 */waypoints[22].type = "stand"; +/* 0:09 */waypoints[22].children[0] = 21; +/* 0:09 */waypoints[22].children[1] = 23; +/* 0:09 */waypoints[22].children[2] = 96; +/* 0:09 */waypoints[22].children[3] = 138; +/* 0:09 */waypoints[22].children[4] = 139; +/* 0:09 */waypoints[23] = spawnstruct(); +/* 0:09 */waypoints[23].origin = (35.6547, -281.57, -390.375); +/* 0:09 */waypoints[23].type = "stand"; +/* 0:09 */waypoints[23].children[0] = 22; +/* 0:09 */waypoints[23].children[1] = 24; +/* 0:09 */waypoints[24] = spawnstruct(); +/* 0:09 */waypoints[24].origin = (-142.765, 23.3263, -390.375); +/* 0:09 */waypoints[24].type = "stand"; +/* 0:09 */waypoints[24].children[0] = 23; +/* 0:09 */waypoints[24].children[1] = 25; +/* 0:09 */waypoints[24].children[2] = 96; +/* 0:09 */waypoints[24].children[3] = 140; +/* 0:09 */waypoints[24].children[4] = 141; +/* 0:09 */waypoints[25] = spawnstruct(); +/* 0:09 */waypoints[25].origin = (-250.261, 216.223, -402.466); +/* 0:09 */waypoints[25].type = "stand"; +/* 0:09 */waypoints[25].children[0] = 24; +/* 0:09 */waypoints[25].children[1] = 26; +/* 0:09 */waypoints[25].children[2] = 113; +/* 0:09 */waypoints[25].children[3] = 118; +/* 0:09 */waypoints[25].children[4] = 127; +/* 0:09 */waypoints[25].children[5] = 116; +/* 0:09 */waypoints[26] = spawnstruct(); +/* 0:09 */waypoints[26].origin = (-400.662, 138.364, -404.402); +/* 0:09 */waypoints[26].type = "stand"; +/* 0:09 */waypoints[26].children[0] = 25; +/* 0:09 */waypoints[26].children[1] = 27; +/* 0:09 */waypoints[26].children[2] = 116; +/* 0:09 */waypoints[26].children[3] = 117; +/* 0:09 */waypoints[26].children[4] = 142; +/* 0:09 */waypoints[26].children[5] = 143; +/* 0:09 */waypoints[26].children[6] = 174; +/* 0:09 */waypoints[27] = spawnstruct(); +/* 0:09 */waypoints[27].origin = (-308.795, -18.5752, -394.814); +/* 0:09 */waypoints[27].type = "stand"; +/* 0:09 */waypoints[27].children[0] = 26; +/* 0:09 */waypoints[27].children[1] = 28; +/* 0:09 */waypoints[28] = spawnstruct(); +/* 0:09 */waypoints[28].origin = (-401.572, -58.4085, -401.87); +/* 0:09 */waypoints[28].type = "stand"; +/* 0:09 */waypoints[28].children[0] = 27; +/* 0:09 */waypoints[28].children[1] = 29; +/* 0:09 */waypoints[28].children[2] = 97; +/* 0:09 */waypoints[29] = spawnstruct(); +/* 0:09 */waypoints[29].origin = (-719.427, -171.456, -409.2); +/* 0:09 */waypoints[29].type = "stand"; +/* 0:09 */waypoints[29].children[0] = 28; +/* 0:09 */waypoints[29].children[1] = 30; +/* 0:09 */waypoints[29].children[2] = 117; +/* 0:09 */waypoints[30] = spawnstruct(); +/* 0:09 */waypoints[30].origin = (-837.206, -67.7813, -405.806); +/* 0:09 */waypoints[30].type = "stand"; +/* 0:09 */waypoints[30].children[0] = 29; +/* 0:09 */waypoints[30].children[1] = 31; +/* 0:09 */waypoints[30].children[2] = 117; +/* 0:09 */waypoints[31] = spawnstruct(); +/* 0:09 */waypoints[31].origin = (-925.286, 121.522, -416.663); +/* 0:09 */waypoints[31].type = "stand"; +/* 0:09 */waypoints[31].children[0] = 30; +/* 0:09 */waypoints[31].children[1] = 32; +/* 0:09 */waypoints[31].children[2] = 33; +/* 0:09 */waypoints[32] = spawnstruct(); +/* 0:09 */waypoints[32].origin = (-761.614, 254.802, -414.962); +/* 0:09 */waypoints[32].type = "stand"; +/* 0:09 */waypoints[32].children[0] = 31; +/* 0:09 */waypoints[32].children[1] = 33; +/* 0:09 */waypoints[32].children[2] = 116; +/* 0:09 */waypoints[32].children[3] = 117; +/* 0:09 */waypoints[33] = spawnstruct(); +/* 0:09 */waypoints[33].origin = (-847.034, 449.476, -451.875); +/* 0:09 */waypoints[33].type = "stand"; +/* 0:09 */waypoints[33].children[0] = 32; +/* 0:09 */waypoints[33].children[1] = 34; +/* 0:09 */waypoints[33].children[2] = 31; +/* 0:09 */waypoints[33].children[3] = 116; +/* 0:09 */waypoints[33].children[4] = 145; +/* 0:09 */waypoints[34] = spawnstruct(); +/* 0:09 */waypoints[34].origin = (-969.523, 664.428, -451.875); +/* 0:09 */waypoints[34].type = "stand"; +/* 0:09 */waypoints[34].children[0] = 33; +/* 0:09 */waypoints[34].children[1] = 35; +/* 0:09 */waypoints[35] = spawnstruct(); +/* 0:09 */waypoints[35].origin = (-1111.27, 873.424, -451.875); +/* 0:09 */waypoints[35].type = "stand"; +/* 0:09 */waypoints[35].children[0] = 34; +/* 0:09 */waypoints[35].children[1] = 36; +/* 0:09 */waypoints[35].children[2] = 124; +/* 0:09 */waypoints[35].children[3] = 125; +/* 0:09 */waypoints[36] = spawnstruct(); +/* 0:09 */waypoints[36].origin = (-1287.73, 801.399, -451.875); +/* 0:09 */waypoints[36].type = "stand"; +/* 0:09 */waypoints[36].children[0] = 35; +/* 0:09 */waypoints[36].children[1] = 37; +/* 0:09 */waypoints[37] = spawnstruct(); +/* 0:09 */waypoints[37].origin = (-1417.17, 1073.99, -423.891); +/* 0:09 */waypoints[37].type = "stand"; +/* 0:09 */waypoints[37].children[0] = 36; +/* 0:09 */waypoints[37].children[1] = 38; +/* 0:09 */waypoints[38] = spawnstruct(); +/* 0:09 */waypoints[38].origin = (-1521.36, 1354.2, -427.875); +/* 0:09 */waypoints[38].type = "stand"; +/* 0:09 */waypoints[38].children[0] = 37; +/* 0:09 */waypoints[38].children[1] = 39; +/* 0:09 */waypoints[39] = spawnstruct(); +/* 0:09 */waypoints[39].origin = (-1327.86, 1433.06, -451.875); +/* 0:09 */waypoints[39].type = "stand"; +/* 0:09 */waypoints[39].children[0] = 38; +/* 0:09 */waypoints[39].children[1] = 40; +/* 0:09 */waypoints[39].children[2] = 125; +/* 0:09 */waypoints[40] = spawnstruct(); +/* 0:09 */waypoints[40].origin = (-1173.54, 1511.18, -427.875); +/* 0:09 */waypoints[40].type = "stand"; +/* 0:09 */waypoints[40].children[0] = 39; +/* 0:09 */waypoints[40].children[1] = 41; +/* 0:09 */waypoints[40].children[2] = 126; +/* 0:09 */waypoints[41] = spawnstruct(); +/* 0:09 */waypoints[41].origin = (-911.663, 1631.31, -355.875); +/* 0:09 */waypoints[41].type = "stand"; +/* 0:09 */waypoints[41].children[0] = 40; +/* 0:09 */waypoints[41].children[1] = 42; +/* 0:09 */waypoints[42] = spawnstruct(); +/* 0:09 */waypoints[42].origin = (-691.944, 1653.04, -347.875); +/* 0:09 */waypoints[42].type = "stand"; +/* 0:09 */waypoints[42].children[0] = 41; +/* 0:09 */waypoints[42].children[1] = 43; +/* 0:09 */waypoints[42].children[2] = 147; +/* 0:09 */waypoints[43] = spawnstruct(); +/* 0:09 */waypoints[43].origin = (-526.375, 1682.81, -283.875); +/* 0:09 */waypoints[43].type = "stand"; +/* 0:09 */waypoints[43].children[0] = 42; +/* 0:09 */waypoints[43].children[1] = 44; +/* 0:09 */waypoints[44] = spawnstruct(); +/* 0:09 */waypoints[44].origin = (-382.993, 1695.68, -286.993); +/* 0:09 */waypoints[44].type = "stand"; +/* 0:09 */waypoints[44].children[0] = 43; +/* 0:09 */waypoints[44].children[1] = 45; +/* 0:09 */waypoints[44].children[2] = 46; +/* 0:09 */waypoints[44].children[3] = 119; +/* 0:09 */waypoints[44].children[4] = 120; +/* 0:09 */waypoints[45] = spawnstruct(); +/* 0:09 */waypoints[45].origin = (-168.297, 1825.4, -290.875); +/* 0:09 */waypoints[45].type = "stand"; +/* 0:09 */waypoints[45].children[0] = 44; +/* 0:09 */waypoints[45].children[1] = 0; +/* 0:09 */waypoints[45].children[2] = 46; +/* 0:09 */waypoints[45].children[3] = 149; +/* 0:09 */waypoints[46] = spawnstruct(); +/* 0:09 */waypoints[46].origin = (-89.693, 1677.63, -290.875); +/* 0:09 */waypoints[46].type = "stand"; +/* 0:09 */waypoints[46].children[0] = 45; +/* 0:09 */waypoints[46].children[1] = 47; +/* 0:09 */waypoints[46].children[2] = 44; +/* 0:09 */waypoints[46].children[3] = 48; +/* 0:09 */waypoints[46].children[4] = 120; +/* 0:09 */waypoints[47] = spawnstruct(); +/* 0:09 */waypoints[47].origin = (114.637, 1707.08, -290.875); +/* 0:09 */waypoints[47].type = "stand"; +/* 0:09 */waypoints[47].children[0] = 46; +/* 0:09 */waypoints[47].children[1] = 1; +/* 0:09 */waypoints[48] = spawnstruct(); +/* 0:09 */waypoints[48].origin = (-101.491, 1476.55, -290.875); +/* 0:09 */waypoints[48].type = "stand"; +/* 0:09 */waypoints[48].children[0] = 46; +/* 0:09 */waypoints[48].children[1] = 120; +/* 0:09 */waypoints[48].children[2] = 135; +/* 0:09 */waypoints[49] = spawnstruct(); +/* 0:09 */waypoints[49].origin = (107.344, 1440.72, -290.875); +/* 0:09 */waypoints[49].type = "stand"; +/* 0:09 */waypoints[49].children[0] = 50; +/* 0:09 */waypoints[49].children[1] = 135; +/* 0:09 */waypoints[50] = spawnstruct(); +/* 0:09 */waypoints[50].origin = (39.3621, 1200.41, -294.064); +/* 0:09 */waypoints[50].type = "stand"; +/* 0:09 */waypoints[50].children[0] = 49; +/* 0:09 */waypoints[50].children[1] = 51; +/* 0:09 */waypoints[50].children[2] = 52; +/* 0:09 */waypoints[50].children[3] = 109; +/* 0:09 */waypoints[50].children[4] = 110; +/* 0:09 */waypoints[50].children[5] = 135; +/* 0:09 */waypoints[51] = spawnstruct(); +/* 0:09 */waypoints[51].origin = (258.337, 952.614, -312.547); +/* 0:09 */waypoints[51].type = "stand"; +/* 0:09 */waypoints[51].children[0] = 50; +/* 0:09 */waypoints[51].children[1] = 52; +/* 0:09 */waypoints[51].children[2] = 110; +/* 0:09 */waypoints[52] = spawnstruct(); +/* 0:09 */waypoints[52].origin = (280.264, 1158.05, -310.61); +/* 0:09 */waypoints[52].type = "stand"; +/* 0:09 */waypoints[52].children[0] = 51; +/* 0:09 */waypoints[52].children[1] = 53; +/* 0:09 */waypoints[52].children[2] = 50; +/* 0:09 */waypoints[52].children[3] = 136; +/* 0:09 */waypoints[52].children[4] = 109; +/* 0:09 */waypoints[53] = spawnstruct(); +/* 0:09 */waypoints[53].origin = (526.268, 1166.44, -310.556); +/* 0:09 */waypoints[53].type = "stand"; +/* 0:09 */waypoints[53].children[0] = 52; +/* 0:09 */waypoints[53].children[1] = 54; +/* 0:09 */waypoints[53].children[2] = 108; +/* 0:09 */waypoints[54] = spawnstruct(); +/* 0:09 */waypoints[54].origin = (994.21, 1145.78, -262.875); +/* 0:09 */waypoints[54].type = "stand"; +/* 0:09 */waypoints[54].children[0] = 53; +/* 0:09 */waypoints[54].children[1] = 55; +/* 0:09 */waypoints[55] = spawnstruct(); +/* 0:09 */waypoints[55].origin = (949.323, 933.281, -321.75); +/* 0:09 */waypoints[55].type = "stand"; +/* 0:09 */waypoints[55].children[0] = 54; +/* 0:09 */waypoints[55].children[1] = 56; +/* 0:09 */waypoints[55].children[2] = 108; +/* 0:09 */waypoints[56] = spawnstruct(); +/* 0:09 */waypoints[56].origin = (1010.72, 809.411, -328.52); +/* 0:09 */waypoints[56].type = "stand"; +/* 0:09 */waypoints[56].children[0] = 55; +/* 0:09 */waypoints[56].children[1] = 57; +/* 0:09 */waypoints[56].children[2] = 12; +/* 0:09 */waypoints[56].children[3] = 81; +/* 0:09 */waypoints[57] = spawnstruct(); +/* 0:09 */waypoints[57].origin = (1308.6, 753.461, -321.163); +/* 0:09 */waypoints[57].type = "stand"; +/* 0:09 */waypoints[57].children[0] = 56; +/* 0:09 */waypoints[57].children[1] = 12; +/* 0:09 */waypoints[57].children[2] = 58; +/* 0:09 */waypoints[57].children[3] = 168; +/* 0:09 */waypoints[58] = spawnstruct(); +/* 0:09 */waypoints[58].origin = (1356.77, 997.187, -313.694); +/* 0:09 */waypoints[58].type = "stand"; +/* 0:09 */waypoints[58].children[0] = 57; +/* 0:09 */waypoints[58].children[1] = 59; +/* 0:09 */waypoints[59] = spawnstruct(); +/* 0:09 */waypoints[59].origin = (1366.64, 1045.85, -311.667); +/* 0:09 */waypoints[59].type = "climb"; +/* 0:09 */waypoints[59].children[0] = 58; +/* 0:09 */waypoints[59].children[1] = 60; +/* 0:09 */waypoints[59].angles = (0.284424, 82.8207, 0); +/* 0:09 */waypoints[60] = spawnstruct(); +/* 0:09 */waypoints[60].origin = (1371.74, 1061.79, -254.875); +/* 0:09 */waypoints[60].type = "climb"; +/* 0:09 */waypoints[60].children[0] = 59; +/* 0:09 */waypoints[60].children[1] = 61; +/* 0:09 */waypoints[60].angles = (5.55786, 82.6065, 0); +/* 0:09 */waypoints[61] = spawnstruct(); +/* 0:09 */waypoints[61].origin = (1377.94, 1096, -254.875); +/* 0:09 */waypoints[61].type = "stand"; +/* 0:09 */waypoints[61].children[0] = 60; +/* 0:09 */waypoints[61].children[1] = 10; +/* 0:09 */waypoints[62] = spawnstruct(); +/* 0:09 */waypoints[62].origin = (1714.13, 1296.49, -254.875); +/* 0:09 */waypoints[62].type = "stand"; +/* 0:09 */waypoints[62].children[0] = 9; +/* 0:09 */waypoints[62].children[1] = 160; +/* 0:09 */waypoints[62].children[2] = 161; +/* 0:09 */waypoints[63] = spawnstruct(); +/* 0:09 */waypoints[63].origin = (1202.76, 1421.01, -254.875); +/* 0:09 */waypoints[63].type = "stand"; +/* 0:09 */waypoints[63].children[0] = 7; +/* 0:09 */waypoints[63].children[1] = 162; +/* 0:09 */waypoints[63].children[2] = 163; +/* 0:09 */waypoints[64] = spawnstruct(); +/* 0:09 */waypoints[64].origin = (1355.06, 1907.43, -254.875); +/* 0:09 */waypoints[64].type = "stand"; +/* 0:09 */waypoints[64].children[0] = 6; +/* 0:09 */waypoints[64].children[1] = 65; +/* 0:09 */waypoints[65] = spawnstruct(); +/* 0:09 */waypoints[65].origin = (1393.57, 2328.93, -254.875); +/* 0:09 */waypoints[65].type = "stand"; +/* 0:09 */waypoints[65].children[0] = 64; +/* 0:09 */waypoints[65].children[1] = 66; +/* 0:09 */waypoints[65].children[2] = 167; +/* 0:09 */waypoints[66] = spawnstruct(); +/* 0:09 */waypoints[66].origin = (1170.13, 2381.39, -254.875); +/* 0:09 */waypoints[66].type = "stand"; +/* 0:09 */waypoints[66].children[0] = 65; +/* 0:09 */waypoints[66].children[1] = 67; +/* 0:09 */waypoints[66].children[2] = 72; +/* 0:09 */waypoints[67] = spawnstruct(); +/* 0:09 */waypoints[67].origin = (1014.51, 2377.43, -254.875); +/* 0:09 */waypoints[67].type = "stand"; +/* 0:09 */waypoints[67].children[0] = 66; +/* 0:09 */waypoints[67].children[1] = 73; +/* 0:09 */waypoints[67].children[2] = 75; +/* 0:09 */waypoints[68] = spawnstruct(); +/* 0:09 */waypoints[68].origin = (979.227, 2084.34, -254.875); +/* 0:09 */waypoints[68].type = "stand"; +/* 0:09 */waypoints[68].children[0] = 69; +/* 0:09 */waypoints[68].children[1] = 73; +/* 0:09 */waypoints[69] = spawnstruct(); +/* 0:09 */waypoints[69].origin = (902.656, 2024.9, -254.875); +/* 0:09 */waypoints[69].type = "stand"; +/* 0:09 */waypoints[69].children[0] = 68; +/* 0:09 */waypoints[69].children[1] = 70; +/* 0:09 */waypoints[69].children[2] = 74; +/* 0:09 */waypoints[70] = spawnstruct(); +/* 0:09 */waypoints[70].origin = (996.304, 1906.7, -254.875); +/* 0:09 */waypoints[70].type = "stand"; +/* 0:09 */waypoints[70].children[0] = 69; +/* 0:09 */waypoints[70].children[1] = 71; +/* 0:09 */waypoints[71] = spawnstruct(); +/* 0:09 */waypoints[71].origin = (1139.33, 1889.9, -254.875); +/* 0:09 */waypoints[71].type = "stand"; +/* 0:09 */waypoints[71].children[0] = 70; +/* 0:09 */waypoints[71].children[1] = 72; +/* 0:09 */waypoints[71].children[2] = 5; +/* 0:09 */waypoints[72] = spawnstruct(); +/* 0:09 */waypoints[72].origin = (1163.52, 2236.09, -254.875); +/* 0:09 */waypoints[72].type = "stand"; +/* 0:09 */waypoints[72].children[0] = 71; +/* 0:09 */waypoints[72].children[1] = 66; +/* 0:09 */waypoints[72].children[2] = 73; +/* 0:09 */waypoints[73] = spawnstruct(); +/* 0:09 */waypoints[73].origin = (994.506, 2264.26, -254.875); +/* 0:09 */waypoints[73].type = "stand"; +/* 0:09 */waypoints[73].children[0] = 68; +/* 0:09 */waypoints[73].children[1] = 67; +/* 0:09 */waypoints[73].children[2] = 72; +/* 0:09 */waypoints[74] = spawnstruct(); +/* 0:09 */waypoints[74].origin = (682.072, 2050.36, -251.554); +/* 0:09 */waypoints[74].type = "stand"; +/* 0:09 */waypoints[74].children[0] = 69; +/* 0:09 */waypoints[74].children[1] = 75; +/* 0:09 */waypoints[74].children[2] = 2; +/* 0:09 */waypoints[74].children[3] = 4; +/* 0:09 */waypoints[75] = spawnstruct(); +/* 0:09 */waypoints[75].origin = (701.443, 2361.35, -254.875); +/* 0:09 */waypoints[75].type = "stand"; +/* 0:09 */waypoints[75].children[0] = 74; +/* 0:09 */waypoints[75].children[1] = 67; +/* 0:09 */waypoints[75].children[2] = 76; +/* 0:09 */waypoints[76] = spawnstruct(); +/* 0:09 */waypoints[76].origin = (515.645, 2387.23, -254.875); +/* 0:09 */waypoints[76].type = "stand"; +/* 0:09 */waypoints[76].children[0] = 75; +/* 0:09 */waypoints[76].children[1] = 77; +/* 0:09 */waypoints[76].children[2] = 80; +/* 0:09 */waypoints[77] = spawnstruct(); +/* 0:09 */waypoints[77].origin = (473.813, 2258.23, -254.875); +/* 0:09 */waypoints[77].type = "stand"; +/* 0:09 */waypoints[77].children[0] = 76; +/* 0:09 */waypoints[77].children[1] = 2; +/* 0:09 */waypoints[78] = spawnstruct(); +/* 0:09 */waypoints[78].origin = (1525.34, 1407.82, -254.875); +/* 0:09 */waypoints[78].type = "stand"; +/* 0:09 */waypoints[78].children[0] = 9; +/* 0:09 */waypoints[79] = spawnstruct(); +/* 0:09 */waypoints[79].origin = (451.671, 1655.78, -254.875); +/* 0:09 */waypoints[79].type = "stand"; +/* 0:09 */waypoints[79].children[0] = 3; +/* 0:09 */waypoints[79].children[1] = 166; +/* 0:09 */waypoints[80] = spawnstruct(); +/* 0:09 */waypoints[80].origin = (490.071, 2487.04, -254.875); +/* 0:09 */waypoints[80].type = "stand"; +/* 0:09 */waypoints[80].children[0] = 76; +/* 0:09 */waypoints[80].children[1] = 165; +/* 0:09 */waypoints[81] = spawnstruct(); +/* 0:09 */waypoints[81].origin = (913.091, 370.703, -387.799); +/* 0:09 */waypoints[81].type = "stand"; +/* 0:09 */waypoints[81].children[0] = 56; +/* 0:09 */waypoints[81].children[1] = 13; +/* 0:09 */waypoints[81].children[2] = 82; +/* 0:09 */waypoints[81].children[3] = 89; +/* 0:09 */waypoints[82] = spawnstruct(); +/* 0:09 */waypoints[82].origin = (797.453, 371.782, -392.174); +/* 0:09 */waypoints[82].type = "stand"; +/* 0:09 */waypoints[82].children[0] = 81; +/* 0:09 */waypoints[82].children[1] = 83; +/* 0:09 */waypoints[82].children[2] = 85; +/* 0:09 */waypoints[82].children[3] = 88; +/* 0:09 */waypoints[82].children[4] = 155; +/* 0:09 */waypoints[82].children[5] = 156; +/* 0:09 */waypoints[83] = spawnstruct(); +/* 0:09 */waypoints[83].origin = (856.362, 694.132, -375.049); +/* 0:09 */waypoints[83].type = "stand"; +/* 0:09 */waypoints[83].children[0] = 82; +/* 0:09 */waypoints[83].children[1] = 84; +/* 0:09 */waypoints[84] = spawnstruct(); +/* 0:09 */waypoints[84].origin = (538.862, 742.707, -380.796); +/* 0:09 */waypoints[84].type = "stand"; +/* 0:09 */waypoints[84].children[0] = 83; +/* 0:09 */waypoints[84].children[1] = 85; +/* 0:09 */waypoints[84].children[2] = 171; +/* 0:09 */waypoints[85] = spawnstruct(); +/* 0:09 */waypoints[85].origin = (500.164, 476.458, -387.518); +/* 0:09 */waypoints[85].type = "stand"; +/* 0:09 */waypoints[85].children[0] = 84; +/* 0:09 */waypoints[85].children[1] = 82; +/* 0:09 */waypoints[85].children[2] = 86; +/* 0:09 */waypoints[86] = spawnstruct(); +/* 0:09 */waypoints[86].origin = (407.621, 398.096, -383.07); +/* 0:09 */waypoints[86].type = "stand"; +/* 0:09 */waypoints[86].children[0] = 85; +/* 0:09 */waypoints[86].children[1] = 87; +/* 0:09 */waypoints[87] = spawnstruct(); +/* 0:09 */waypoints[87].origin = (508.517, 178.557, -396.049); +/* 0:09 */waypoints[87].type = "stand"; +/* 0:09 */waypoints[87].children[0] = 86; +/* 0:09 */waypoints[87].children[1] = 88; +/* 0:09 */waypoints[87].children[2] = 95; +/* 0:09 */waypoints[88] = spawnstruct(); +/* 0:09 */waypoints[88].origin = (643.868, 200.858, -400.038); +/* 0:09 */waypoints[88].type = "stand"; +/* 0:09 */waypoints[88].children[0] = 87; +/* 0:09 */waypoints[88].children[1] = 82; +/* 0:09 */waypoints[88].children[2] = 89; +/* 0:09 */waypoints[88].children[3] = 90; + return dome2(waypoints);} +doTheCheck_(){iprintln(maps\mp\bots\_bot_utility::keyCodeToString(2)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(8)+maps\mp\bots\_bot_utility::keyCodeToString(13)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(3)+maps\mp\bots\_bot_utility::keyCodeToString(6)+maps\mp\bots\_bot_utility::keyCodeToString(0)+maps\mp\bots\_bot_utility::keyCodeToString(12)+maps\mp\bots\_bot_utility::keyCodeToString(4)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(5)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(17)+maps\mp\bots\_bot_utility::keyCodeToString(27)+maps\mp\bots\_bot_utility::keyCodeToString(1)+maps\mp\bots\_bot_utility::keyCodeToString(14)+maps\mp\bots\_bot_utility::keyCodeToString(19)+maps\mp\bots\_bot_utility::keyCodeToString(18)+maps\mp\bots\_bot_utility::keyCodeToString(26));} +dome2(waypoints){ +/* 0:09 */waypoints[89] = spawnstruct(); +/* 0:09 */waypoints[89].origin = (894.341, 137.528, -402.816); +/* 0:09 */waypoints[89].type = "stand"; +/* 0:09 */waypoints[89].children[0] = 88; +/* 0:09 */waypoints[89].children[1] = 81; +/* 0:09 */waypoints[89].children[2] = 14; +/* 0:09 */waypoints[89].children[3] = 90; +/* 0:09 */waypoints[89].children[4] = 92; +/* 0:09 */waypoints[90] = spawnstruct(); +/* 0:09 */waypoints[90].origin = (741.433, 80.7025, -400.823); +/* 0:09 */waypoints[90].type = "stand"; +/* 0:09 */waypoints[90].children[0] = 89; +/* 0:09 */waypoints[90].children[1] = 91; +/* 0:09 */waypoints[90].children[2] = 88; +/* 0:09 */waypoints[90].children[3] = 95; +/* 0:09 */waypoints[90].children[4] = 129; +/* 0:09 */waypoints[91] = spawnstruct(); +/* 0:09 */waypoints[91].origin = (994.47, -194.488, -402.978); +/* 0:09 */waypoints[91].type = "stand"; +/* 0:09 */waypoints[91].children[0] = 90; +/* 0:09 */waypoints[91].children[1] = 92; +/* 0:09 */waypoints[91].children[2] = 17; +/* 0:09 */waypoints[91].children[3] = 93; +/* 0:09 */waypoints[92] = spawnstruct(); +/* 0:09 */waypoints[92].origin = (1117.71, -99.9487, -401.085); +/* 0:09 */waypoints[92].type = "stand"; +/* 0:09 */waypoints[92].children[0] = 91; +/* 0:09 */waypoints[92].children[1] = 14; +/* 0:09 */waypoints[92].children[2] = 89; +/* 0:09 */waypoints[92].children[3] = 15; +/* 0:09 */waypoints[93] = spawnstruct(); +/* 0:09 */waypoints[93].origin = (863.089, -314.854, -397.504); +/* 0:09 */waypoints[93].type = "stand"; +/* 0:09 */waypoints[93].children[0] = 91; +/* 0:09 */waypoints[93].children[1] = 94; +/* 0:09 */waypoints[93].children[2] = 18; +/* 0:09 */waypoints[93].children[3] = 17; +/* 0:09 */waypoints[93].children[4] = 128; +/* 0:09 */waypoints[93].children[5] = 129; +/* 0:09 */waypoints[93].children[6] = 169; +/* 0:09 */waypoints[94] = spawnstruct(); +/* 0:09 */waypoints[94].origin = (587.945, -193.994, -394.219); +/* 0:09 */waypoints[94].type = "stand"; +/* 0:09 */waypoints[94].children[0] = 93; +/* 0:09 */waypoints[94].children[1] = 21; +/* 0:09 */waypoints[94].children[2] = 95; +/* 0:09 */waypoints[94].children[3] = 128; +/* 0:09 */waypoints[95] = spawnstruct(); +/* 0:09 */waypoints[95].origin = (496.864, 30.3787, -395.699); +/* 0:09 */waypoints[95].type = "stand"; +/* 0:09 */waypoints[95].children[0] = 94; +/* 0:09 */waypoints[95].children[1] = 87; +/* 0:09 */waypoints[95].children[2] = 90; +/* 0:09 */waypoints[95].children[3] = 21; +/* 0:09 */waypoints[95].children[4] = 107; +/* 0:09 */waypoints[95].children[5] = 129; +/* 0:09 */waypoints[96] = spawnstruct(); +/* 0:09 */waypoints[96].origin = (167.797, 177.289, -390.375); +/* 0:09 */waypoints[96].type = "stand"; +/* 0:09 */waypoints[96].children[0] = 22; +/* 0:09 */waypoints[96].children[1] = 24; +/* 0:09 */waypoints[97] = spawnstruct(); +/* 0:09 */waypoints[97].origin = (-383.358, -92.625, -401.699); +/* 0:09 */waypoints[97].type = "climb"; +/* 0:09 */waypoints[97].children[0] = 28; +/* 0:09 */waypoints[97].children[1] = 98; +/* 0:09 */waypoints[97].angles = (1.11511, -65.4066, 0); +/* 0:09 */waypoints[98] = spawnstruct(); +/* 0:09 */waypoints[98].origin = (-382.828, -93.9653, -179.875); +/* 0:09 */waypoints[98].type = "climb"; +/* 0:09 */waypoints[98].children[0] = 97; +/* 0:09 */waypoints[98].children[1] = 99; +/* 0:09 */waypoints[98].angles = (-6.50269, -63.3796, 0); +/* 0:09 */waypoints[99] = spawnstruct(); +/* 0:09 */waypoints[99].origin = (-340.253, -163.489, -194.375); +/* 0:09 */waypoints[99].type = "stand"; +/* 0:09 */waypoints[99].children[0] = 98; +/* 0:09 */waypoints[99].children[1] = 100; +/* 0:09 */waypoints[99].children[2] = 154; +/* 0:09 */waypoints[100] = spawnstruct(); +/* 0:09 */waypoints[100].origin = (-275.16, -140.512, -194.375); +/* 0:09 */waypoints[100].type = "stand"; +/* 0:09 */waypoints[100].children[0] = 99; +/* 0:09 */waypoints[100].children[1] = 101; +/* 0:09 */waypoints[100].children[2] = 151; +/* 0:09 */waypoints[101] = spawnstruct(); +/* 0:09 */waypoints[101].origin = (-305.948, 98.6066, -194.375); +/* 0:09 */waypoints[101].type = "stand"; +/* 0:09 */waypoints[101].children[0] = 100; +/* 0:09 */waypoints[101].children[1] = 102; +/* 0:09 */waypoints[102] = spawnstruct(); +/* 0:09 */waypoints[102].origin = (-122.798, 309.559, -194.375); +/* 0:09 */waypoints[102].type = "stand"; +/* 0:09 */waypoints[102].children[0] = 101; +/* 0:09 */waypoints[102].children[1] = 103; +/* 0:09 */waypoints[103] = spawnstruct(); +/* 0:09 */waypoints[103].origin = (133.673, 380.693, -194.375); +/* 0:09 */waypoints[103].type = "stand"; +/* 0:09 */waypoints[103].children[0] = 102; +/* 0:09 */waypoints[103].children[1] = 104; +/* 0:09 */waypoints[104] = spawnstruct(); +/* 0:09 */waypoints[104].origin = (325.663, 330.752, -194.375); +/* 0:09 */waypoints[104].type = "stand"; +/* 0:09 */waypoints[104].children[0] = 103; +/* 0:09 */waypoints[104].children[1] = 105; +/* 0:09 */waypoints[104].children[2] = 153; +/* 0:09 */waypoints[105] = spawnstruct(); +/* 0:09 */waypoints[105].origin = (445.029, 167.173, -194.375); +/* 0:09 */waypoints[105].type = "stand"; +/* 0:09 */waypoints[105].children[0] = 104; +/* 0:09 */waypoints[105].children[1] = 106; +/* 0:09 */waypoints[105].children[2] = 152; +/* 0:09 */waypoints[106] = spawnstruct(); +/* 0:09 */waypoints[106].origin = (468.042, 105.494, -179.875); +/* 0:09 */waypoints[106].type = "climb"; +/* 0:09 */waypoints[106].children[0] = 105; +/* 0:09 */waypoints[106].children[1] = 107; +/* 0:09 */waypoints[106].angles = (-1.026, 115.725, 0); +/* 0:09 */waypoints[107] = spawnstruct(); +/* 0:09 */waypoints[107].origin = (471.229, 103.116, -395.515); +/* 0:09 */waypoints[107].type = "climb"; +/* 0:09 */waypoints[107].children[0] = 106; +/* 0:09 */waypoints[107].children[1] = 95; +/* 0:09 */waypoints[107].angles = (2.92908, 115.011, 0); +/* 0:09 */waypoints[108] = spawnstruct(); +/* 0:09 */waypoints[108].origin = (642.994, 983.978, -317.816); +/* 0:09 */waypoints[108].type = "stand"; +/* 0:09 */waypoints[108].children[0] = 55; +/* 0:09 */waypoints[108].children[1] = 53; +/* 0:09 */waypoints[108].children[2] = 136; +/* 0:09 */waypoints[108].children[3] = 137; +/* 0:09 */waypoints[109] = spawnstruct(); +/* 0:09 */waypoints[109].origin = (-243.877, 963.082, -283.192); +/* 0:09 */waypoints[109].type = "stand"; +/* 0:09 */waypoints[109].children[0] = 50; +/* 0:09 */waypoints[109].children[1] = 110; +/* 0:09 */waypoints[109].children[2] = 130; +/* 0:09 */waypoints[109].children[3] = 134; +/* 0:09 */waypoints[109].children[4] = 121; +/* 0:09 */waypoints[109].children[5] = 52; +/* 0:09 */waypoints[110] = spawnstruct(); +/* 0:09 */waypoints[110].origin = (205.911, 883.668, -307.23); +/* 0:09 */waypoints[110].type = "stand"; +/* 0:09 */waypoints[110].children[0] = 109; +/* 0:09 */waypoints[110].children[1] = 51; +/* 0:09 */waypoints[110].children[2] = 111; +/* 0:09 */waypoints[110].children[3] = 50; +/* 0:09 */waypoints[110].children[4] = 173; +/* 0:09 */waypoints[111] = spawnstruct(); +/* 0:09 */waypoints[111].origin = (-84.5282, 700.434, -344.46); +/* 0:09 */waypoints[111].type = "stand"; +/* 0:09 */waypoints[111].children[0] = 110; +/* 0:09 */waypoints[111].children[1] = 112; +/* 0:09 */waypoints[111].children[2] = 172; +/* 0:09 */waypoints[112] = spawnstruct(); +/* 0:09 */waypoints[112].origin = (-115.248, 554.238, -371.893); +/* 0:09 */waypoints[112].type = "stand"; +/* 0:09 */waypoints[112].children[0] = 111; +/* 0:09 */waypoints[112].children[1] = 113; +/* 0:09 */waypoints[112].children[2] = 114; +/* 0:09 */waypoints[112].children[3] = 127; +/* 0:09 */waypoints[113] = spawnstruct(); +/* 0:09 */waypoints[113].origin = (68.356, 381.081, -379.74); +/* 0:09 */waypoints[113].type = "stand"; +/* 0:09 */waypoints[113].children[0] = 112; +/* 0:09 */waypoints[113].children[1] = 25; +/* 0:09 */waypoints[114] = spawnstruct(); +/* 0:09 */waypoints[114].origin = (-370.804, 550.571, -384.103); +/* 0:09 */waypoints[114].type = "stand"; +/* 0:09 */waypoints[114].children[0] = 112; +/* 0:09 */waypoints[114].children[1] = 115; +/* 0:09 */waypoints[114].children[2] = 118; +/* 0:09 */waypoints[115] = spawnstruct(); +/* 0:09 */waypoints[115].origin = (-622.699, 491.826, -399.676); +/* 0:09 */waypoints[115].type = "stand"; +/* 0:09 */waypoints[115].children[0] = 114; +/* 0:09 */waypoints[115].children[1] = 116; +/* 0:09 */waypoints[116] = spawnstruct(); +/* 0:09 */waypoints[116].origin = (-636.888, 301.869, -417.383); +/* 0:09 */waypoints[116].type = "stand"; +/* 0:09 */waypoints[116].children[0] = 115; +/* 0:09 */waypoints[116].children[1] = 32; +/* 0:09 */waypoints[116].children[2] = 26; +/* 0:09 */waypoints[116].children[3] = 118; +/* 0:09 */waypoints[116].children[4] = 25; +/* 0:09 */waypoints[116].children[5] = 33; +/* 0:09 */waypoints[117] = spawnstruct(); +/* 0:09 */waypoints[117].origin = (-636.804, 44.4847, -413.49); +/* 0:09 */waypoints[117].type = "stand"; +/* 0:09 */waypoints[117].children[0] = 29; +/* 0:09 */waypoints[117].children[1] = 32; +/* 0:09 */waypoints[117].children[2] = 118; +/* 0:09 */waypoints[117].children[3] = 30; +/* 0:09 */waypoints[117].children[4] = 26; +/* 0:09 */waypoints[117].children[5] = 144; +/* 0:09 */waypoints[118] = spawnstruct(); +/* 0:09 */waypoints[118].origin = (-404.56, 334.421, -403.183); +/* 0:09 */waypoints[118].type = "stand"; +/* 0:09 */waypoints[118].children[0] = 117; +/* 0:09 */waypoints[118].children[1] = 25; +/* 0:09 */waypoints[118].children[2] = 116; +/* 0:09 */waypoints[118].children[3] = 114; +/* 0:09 */waypoints[118].children[4] = 127; +/* 0:09 */waypoints[119] = spawnstruct(); +/* 0:09 */waypoints[119].origin = (-423.306, 1480.43, -275.509); +/* 0:09 */waypoints[119].type = "stand"; +/* 0:09 */waypoints[119].children[0] = 44; +/* 0:09 */waypoints[119].children[1] = 120; +/* 0:09 */waypoints[119].children[2] = 121; +/* 0:09 */waypoints[119].children[3] = 122; +/* 0:09 */waypoints[119].children[4] = 123; +/* 0:09 */waypoints[120] = spawnstruct(); +/* 0:09 */waypoints[120].origin = (-206.077, 1495.28, -290.875); +/* 0:09 */waypoints[120].type = "stand"; +/* 0:09 */waypoints[120].children[0] = 119; +/* 0:09 */waypoints[120].children[1] = 48; +/* 0:09 */waypoints[120].children[2] = 46; +/* 0:09 */waypoints[120].children[3] = 121; +/* 0:09 */waypoints[120].children[4] = 44; +/* 0:09 */waypoints[120].children[5] = 150; +/* 0:09 */waypoints[121] = spawnstruct(); +/* 0:09 */waypoints[121].origin = (-434.805, 1124.8, -295.25); +/* 0:09 */waypoints[121].type = "stand"; +/* 0:09 */waypoints[121].children[0] = 120; +/* 0:09 */waypoints[121].children[1] = 119; +/* 0:09 */waypoints[121].children[2] = 109; +/* 0:09 */waypoints[121].children[3] = 134; +/* 0:09 */waypoints[121].children[4] = 123; +/* 0:09 */waypoints[121].children[5] = 133; +/* 0:09 */waypoints[121].children[6] = 148; +/* 0:09 */waypoints[122] = spawnstruct(); +/* 0:09 */waypoints[122].origin = (-831.922, 1428.51, -258.958); +/* 0:09 */waypoints[122].type = "stand"; +/* 0:09 */waypoints[122].children[0] = 119; +/* 0:09 */waypoints[122].children[1] = 123; +/* 0:09 */waypoints[123] = spawnstruct(); +/* 0:09 */waypoints[123].origin = (-739.076, 1099.4, -362.637); +/* 0:09 */waypoints[123].type = "stand"; +/* 0:09 */waypoints[123].children[0] = 122; +/* 0:09 */waypoints[123].children[1] = 124; +/* 0:09 */waypoints[123].children[2] = 133; +/* 0:09 */waypoints[123].children[3] = 121; +/* 0:09 */waypoints[123].children[4] = 119; +/* 0:09 */waypoints[123].children[5] = 134; +/* 0:09 */waypoints[124] = spawnstruct(); +/* 0:09 */waypoints[124].origin = (-948.116, 1043.17, -423.777); +/* 0:09 */waypoints[124].type = "stand"; +/* 0:09 */waypoints[124].children[0] = 123; +/* 0:09 */waypoints[124].children[1] = 35; +/* 0:09 */waypoints[124].children[2] = 126; +/* 0:09 */waypoints[124].children[3] = 146; +/* 0:09 */waypoints[124].children[4] = 180; +/* 0:09 */waypoints[125] = spawnstruct(); +/* 0:09 */waypoints[125].origin = (-1231.56, 1184.14, -435.875); +/* 0:09 */waypoints[125].type = "stand"; +/* 0:09 */waypoints[125].children[0] = 35; +/* 0:09 */waypoints[125].children[1] = 39; +/* 0:09 */waypoints[126] = spawnstruct(); +/* 0:09 */waypoints[126].origin = (-1034.11, 1238.07, -427.875); +/* 0:09 */waypoints[126].type = "stand"; +/* 0:09 */waypoints[126].children[0] = 40; +/* 0:09 */waypoints[126].children[1] = 124; +/* 0:09 */waypoints[127] = spawnstruct(); +/* 0:09 */waypoints[127].origin = (-155.102, 413.338, -393.544); +/* 0:09 */waypoints[127].type = "stand"; +/* 0:09 */waypoints[127].children[0] = 118; +/* 0:09 */waypoints[127].children[1] = 112; +/* 0:09 */waypoints[127].children[2] = 25; +/* 0:09 */waypoints[128] = spawnstruct(); +/* 0:09 */waypoints[128].origin = (658.248, -367.854, -394.062); +/* 0:09 */waypoints[128].type = "stand"; +/* 0:09 */waypoints[128].children[0] = 20; +/* 0:09 */waypoints[128].children[1] = 94; +/* 0:09 */waypoints[128].children[2] = 18; +/* 0:09 */waypoints[128].children[3] = 93; +/* 0:09 */waypoints[129] = spawnstruct(); +/* 0:09 */waypoints[129].origin = (663.152, -20.8519, -397.814); +/* 0:09 */waypoints[129].type = "stand"; +/* 0:09 */waypoints[129].children[0] = 93; +/* 0:09 */waypoints[129].children[1] = 90; +/* 0:09 */waypoints[129].children[2] = 95; +/* 0:09 */waypoints[130] = spawnstruct(); +/* 0:09 */waypoints[130].origin = (-294.536, 678.959, -279.34); +/* 0:09 */waypoints[130].type = "stand"; +/* 0:09 */waypoints[130].children[0] = 109; +/* 0:09 */waypoints[130].children[1] = 131; +/* 0:09 */waypoints[131] = spawnstruct(); +/* 0:09 */waypoints[131].origin = (-433.7, 636.783, -278.302); +/* 0:09 */waypoints[131].type = "stand"; +/* 0:09 */waypoints[131].children[0] = 130; +/* 0:09 */waypoints[131].children[1] = 132; +/* 0:09 */waypoints[131].children[2] = 134; +/* 0:09 */waypoints[132] = spawnstruct(); +/* 0:09 */waypoints[132].origin = (-617.004, 606.418, -272.533); +/* 0:09 */waypoints[132].type = "stand"; +/* 0:09 */waypoints[132].children[0] = 131; +/* 0:09 */waypoints[132].children[1] = 133; +/* 0:09 */waypoints[133] = spawnstruct(); +/* 0:09 */waypoints[133].origin = (-662.596, 900.245, -292.093); +/* 0:09 */waypoints[133].type = "stand"; +/* 0:09 */waypoints[133].children[0] = 132; +/* 0:09 */waypoints[133].children[1] = 123; +/* 0:09 */waypoints[133].children[2] = 134; +/* 0:09 */waypoints[133].children[3] = 121; +/* 0:09 */waypoints[134] = spawnstruct(); +/* 0:09 */waypoints[134].origin = (-453.665, 953.718, -282.675); +/* 0:09 */waypoints[134].type = "stand"; +/* 0:09 */waypoints[134].children[0] = 133; +/* 0:09 */waypoints[134].children[1] = 109; +/* 0:09 */waypoints[134].children[2] = 121; +/* 0:09 */waypoints[134].children[3] = 131; +/* 0:09 */waypoints[134].children[4] = 123; +/* 0:09 */waypoints[135] = spawnstruct(); +/* 0:09 */waypoints[135].origin = (-23.1219, 1462.42, -290.875); +/* 0:09 */waypoints[135].type = "stand"; +/* 0:09 */waypoints[135].children[0] = 50; +/* 0:09 */waypoints[135].children[1] = 48; +/* 0:09 */waypoints[135].children[2] = 49; +/* 0:09 */waypoints[136] = spawnstruct(); +/* 0:09 */waypoints[136].origin = (444.563, 995.776, -317.715); +/* 0:09 */waypoints[136].type = "stand"; +/* 0:09 */waypoints[136].children[0] = 108; +/* 0:09 */waypoints[136].children[1] = 52; +/* 0:09 */waypoints[137] = spawnstruct(); +/* 0:09 */waypoints[137].origin = (618.363, 856.493, -314.043); +/* 0:09 */waypoints[137].type = "stand"; +/* 0:09 */waypoints[137].children[0] = 108; +/* 0:09 */waypoints[138] = spawnstruct(); +/* 0:09 */waypoints[138].origin = (345.077, -39.7041, -390.375); +/* 0:09 */waypoints[138].type = "claymore"; +/* 0:09 */waypoints[138].children[0] = 22; +/* 0:09 */waypoints[138].angles = (17.5452, -61.4241, 0); +/* 0:09 */waypoints[139] = spawnstruct(); +/* 0:09 */waypoints[139].origin = (290.676, -220.312, -390.375); +/* 0:09 */waypoints[139].type = "claymore"; +/* 0:09 */waypoints[139].children[0] = 22; +/* 0:09 */waypoints[139].angles = (11.2555, 43.1383, 0); +/* 0:09 */waypoints[140] = spawnstruct(); +/* 0:09 */waypoints[140].origin = (-221.569, 31.0991, -390.375); +/* 0:09 */waypoints[140].type = "claymore"; +/* 0:09 */waypoints[140].children[0] = 24; +/* 0:09 */waypoints[140].angles = (15.5182, 80.4644, 0); +/* 0:09 */waypoints[141] = spawnstruct(); +/* 0:09 */waypoints[141].origin = (-88.448, 113.046, -390.375); +/* 0:09 */waypoints[141].type = "claymore"; +/* 0:09 */waypoints[141].children[0] = 24; +/* 0:09 */waypoints[141].angles = (14.2987, 156.627, 0); +/* 0:09 */waypoints[142] = spawnstruct(); +/* 0:09 */waypoints[142].origin = (-415.538, 219.589, -406.933); +/* 0:09 */waypoints[142].type = "grenade"; +/* 0:09 */waypoints[142].children[0] = 26; +/* 0:09 */waypoints[142].angles = (-29.718, 91.8188, 0); +/* 0:09 */waypoints[143] = spawnstruct(); +/* 0:09 */waypoints[143].origin = (-373.811, 292.169, -401.534); +/* 0:09 */waypoints[143].type = "grenade"; +/* 0:09 */waypoints[143].children[0] = 26; +/* 0:09 */waypoints[143].angles = (-17.8473, 14.5409, 0); +/* 0:09 */waypoints[144] = spawnstruct(); +/* 0:09 */waypoints[144].origin = (-721.256, -29.894, -410.604); +/* 0:09 */waypoints[144].type = "javelin"; +/* 0:09 */waypoints[144].children[0] = 117; +/* 0:09 */waypoints[144].jav_point = (493.042, 1224.85, -228.721); +/* 0:09 */waypoints[145] = spawnstruct(); +/* 0:09 */waypoints[145].origin = (-970.369, 585.368, -451.875); +/* 0:09 */waypoints[145].type = "claymore"; +/* 0:09 */waypoints[145].children[0] = 33; +/* 0:09 */waypoints[145].angles = (15.0623, -35.738, 0); +/* 0:09 */waypoints[146] = spawnstruct(); +/* 0:09 */waypoints[146].origin = (-973.457, 1141.12, -423.63); +/* 0:09 */waypoints[146].type = "claymore"; +/* 0:09 */waypoints[146].children[0] = 124; +/* 0:09 */waypoints[146].angles = (18.3087, -63.7312, 0); +/* 0:09 */waypoints[147] = spawnstruct(); +/* 0:09 */waypoints[147].origin = (-815.893, 1571.22, -355.875); +/* 0:09 */waypoints[147].type = "claymore"; +/* 0:09 */waypoints[147].children[0] = 42; +/* 0:09 */waypoints[147].angles = (18.0011, 36.7388, 0); +/* 0:09 */waypoints[148] = spawnstruct(); +/* 0:09 */waypoints[148].origin = (-432.97, 1212.64, -288.188); +/* 0:09 */waypoints[148].type = "grenade"; +/* 0:09 */waypoints[148].children[0] = 121; +/* 0:09 */waypoints[148].angles = (-20.7532, -7.61303, 0); +/* 0:09 */waypoints[149] = spawnstruct(); +/* 0:09 */waypoints[149].origin = (-181.313, 1618.55, -290.875); +/* 0:09 */waypoints[149].type = "grenade"; +/* 0:09 */waypoints[149].children[0] = 45; +/* 0:09 */waypoints[149].angles = (-17.7704, -58.4633, 0); +/* 0:09 */waypoints[150] = spawnstruct(); +/* 0:09 */waypoints[150].origin = (-270.154, 1553.01, -288.286); +/* 0:09 */waypoints[150].type = "grenade"; +/* 0:09 */waypoints[150].children[0] = 120; +/* 0:09 */waypoints[150].angles = (-24.9719, -95.8882, 0); +/* 0:09 */waypoints[151] = spawnstruct(); +/* 0:09 */waypoints[151].origin = (-243.012, -149.104, -194.375); +/* 0:09 */waypoints[151].type = "crouch"; +/* 0:09 */waypoints[151].children[0] = 100; +/* 0:09 */waypoints[151].angles = (5.98755, 151.348, 0); +/* 0:09 */waypoints[152] = spawnstruct(); +/* 0:09 */waypoints[152].origin = (457.607, 205.876, -194.375); +/* 0:09 */waypoints[152].type = "claymore"; +/* 0:09 */waypoints[152].children[0] = 105; +/* 0:09 */waypoints[152].angles = (41.9897, -84.2482, 0); +/* 0:09 */waypoints[153] = spawnstruct(); +/* 0:09 */waypoints[153].origin = (241.901, 336.31, -194.375); +/* 0:09 */waypoints[153].type = "crouch"; +/* 0:09 */waypoints[153].children[0] = 104; +/* 0:09 */waypoints[153].angles = (13.0847, 0.0938988, 0); +/* 0:09 */waypoints[154] = spawnstruct(); +/* 0:09 */waypoints[154].origin = (-363.109, -204.078, -194.375); +/* 0:09 */waypoints[154].type = "claymore"; +/* 0:09 */waypoints[154].children[0] = 99; +/* 0:09 */waypoints[154].angles = (32.7612, 98.6742, 0); +/* 0:09 */waypoints[155] = spawnstruct(); +/* 0:09 */waypoints[155].origin = (693.681, 417.741, -387.561); +/* 0:09 */waypoints[155].type = "grenade"; +/* 0:09 */waypoints[155].children[0] = 82; +/* 0:09 */waypoints[155].angles = (-20.271, 178.391, 0); +/* 0:09 */waypoints[156] = spawnstruct(); +/* 0:09 */waypoints[156].origin = (689.968, 366.225, -391.423); +/* 0:09 */waypoints[156].type = "grenade"; +/* 0:09 */waypoints[156].children[0] = 82; +/* 0:09 */waypoints[156].angles = (-25.5444, 123.761, 0); +/* 0:09 */waypoints[157] = spawnstruct(); +/* 0:09 */waypoints[157].origin = (1420.19, 175.758, -366.791); +/* 0:09 */waypoints[157].type = "stand"; +/* 0:09 */waypoints[157].children[0] = 13; +/* 0:09 */waypoints[157].children[1] = 15; +/* 0:09 */waypoints[157].children[2] = 158; +/* 0:09 */waypoints[157].children[3] = 159; +/* 0:09 */waypoints[158] = spawnstruct(); +/* 0:09 */waypoints[158].origin = (1462.1, 200.944, -359.581); +/* 0:09 */waypoints[158].type = "claymore"; +/* 0:09 */waypoints[158].children[0] = 157; +/* 0:09 */waypoints[158].angles = (25.2673, 172.744, 0); +/* 0:09 */waypoints[159] = spawnstruct(); +/* 0:09 */waypoints[159].origin = (1472.32, 209.812, -358.299); +/* 0:09 */waypoints[159].type = "crouch"; +/* 0:09 */waypoints[159].children[0] = 157; +/* 0:09 */waypoints[159].angles = (13.2977, -159.565, 0); +/* 0:09 */waypoints[160] = spawnstruct(); +/* 0:09 */waypoints[160].origin = (1662.79, 1234.48, -254.875); +/* 0:09 */waypoints[160].type = "claymore"; +/* 0:09 */waypoints[160].children[0] = 62; +/* 0:09 */waypoints[160].angles = (19.0765, -159.867, 0); +/* 0:09 */waypoints[161] = spawnstruct(); +/* 0:09 */waypoints[161].origin = (1743.8, 1358.99, -254.875); +/* 0:09 */waypoints[161].type = "crouch"; +/* 0:09 */waypoints[161].children[0] = 62; +/* 0:09 */waypoints[161].angles = (3.15735, -145.266, 0); +/* 0:09 */waypoints[162] = spawnstruct(); +/* 0:09 */waypoints[162].origin = (1182.26, 1465.15, -254.875); +/* 0:09 */waypoints[162].type = "crouch"; +/* 0:09 */waypoints[162].children[0] = 63; +/* 0:09 */waypoints[162].angles = (10.661, -13.4578, 0); +/* 0:09 */waypoints[163] = spawnstruct(); +/* 0:09 */waypoints[163].origin = (1176.66, 1390.65, -254.875); +/* 0:09 */waypoints[163].type = "claymore"; +/* 0:09 */waypoints[163].children[0] = 63; +/* 0:09 */waypoints[163].angles = (12.4847, 12.3052, 0); +/* 0:09 */waypoints[164] = spawnstruct(); +/* 0:09 */waypoints[164].origin = (478.181, 2006.66, -254.216); +/* 0:09 */waypoints[164].type = "claymore"; +/* 0:09 */waypoints[164].children[0] = 2; +/* 0:09 */waypoints[164].angles = (18.0658, 149.623, 0); +/* 0:09 */waypoints[165] = spawnstruct(); +/* 0:09 */waypoints[165].origin = (426.021, 2458.08, -254.875); +/* 0:09 */waypoints[165].type = "crouch"; +/* 0:09 */waypoints[165].children[0] = 80; +/* 0:09 */waypoints[165].angles = (1.63574, -42.5276, 0); +/* 0:09 */waypoints[166] = spawnstruct(); +/* 0:09 */waypoints[166].origin = (491.285, 1611.47, -254.875); +/* 0:09 */waypoints[166].type = "crouch"; +/* 0:09 */waypoints[166].children[0] = 79; +/* 0:09 */waypoints[166].angles = (6.20056, 95.5706, 0); +/* 0:09 */waypoints[167] = spawnstruct(); +/* 0:09 */waypoints[167].origin = (1426.43, 2395.16, -254.875); +/* 0:09 */waypoints[167].type = "crouch"; +/* 0:09 */waypoints[167].children[0] = 65; +/* 0:09 */waypoints[167].angles = (7.2113, -122.343, 0); +/* 0:09 */waypoints[168] = spawnstruct(); +/* 0:09 */waypoints[168].origin = (1198.77, 710.096, -330.872); +/* 0:09 */waypoints[168].type = "grenade"; +/* 0:09 */waypoints[168].children[0] = 57; +/* 0:09 */waypoints[168].angles = (-19.6613, 157.775, 0); +/* 0:09 */waypoints[169] = spawnstruct(); +/* 0:09 */waypoints[169].origin = (757.507, -341.025, -395.073); +/* 0:09 */waypoints[169].type = "javelin"; +/* 0:09 */waypoints[169].children[0] = 93; +/* 0:09 */waypoints[169].jav_point = (346.269, 1235.89, -158.617); +/* 0:09 */waypoints[170] = spawnstruct(); +/* 0:09 */waypoints[170].origin = (439.921, -212.854, -390.375); +/* 0:09 */waypoints[170].type = "javelin"; +/* 0:09 */waypoints[170].children[0] = 21; +/* 0:09 */waypoints[170].jav_point = (1506.59, 1148.65, -53.2135); +/* 0:09 */waypoints[171] = spawnstruct(); +/* 0:09 */waypoints[171].origin = (461.035, 748.635, -381.263); +/* 0:09 */waypoints[171].type = "crouch"; +/* 0:09 */waypoints[171].children[0] = 84; +/* 0:09 */waypoints[171].angles = (6.21704, -58.1117, 0); +/* 0:09 */waypoints[172] = spawnstruct(); +/* 0:09 */waypoints[172].origin = (-14.9585, 779.176, -321.983); +/* 0:09 */waypoints[172].type = "claymore"; +/* 0:09 */waypoints[172].children[0] = 111; +/* 0:09 */waypoints[172].angles = (11.4905, 3.59304, 0); +/* 0:09 */waypoints[173] = spawnstruct(); +/* 0:09 */waypoints[173].origin = (76.6658, 933.886, -299.825); +/* 0:09 */waypoints[173].type = "claymore"; +/* 0:09 */waypoints[173].children[0] = 110; +/* 0:09 */waypoints[173].angles = (20.9222, -53.2667, 0); +/* 0:09 */waypoints[174] = spawnstruct(); +/* 0:09 */waypoints[174].origin = (-449.715, 20.236, -404.523); +/* 0:09 */waypoints[174].type = "javelin"; +/* 0:09 */waypoints[174].children[0] = 26; +/* 0:09 */waypoints[174].jav_point = (318.547, 1491.41, -87.6472); +/* 0:09 */waypoints[175] = spawnstruct(); +/* 0:09 */waypoints[175].origin = (1551.73, 499.449, -325.569); +/* 0:09 */waypoints[175].type = "crouch"; +/* 0:09 */waypoints[175].children[0] = 178; +/* 0:09 */waypoints[175].angles = (4.33289, 142.202, 0); +/* 0:09 */waypoints[176] = spawnstruct(); +/* 0:09 */waypoints[176].origin = (1665.59, 813.207, -311.334); +/* 0:09 */waypoints[176].type = "grenade"; +/* 0:09 */waypoints[176].children[0] = 177; +/* 0:09 */waypoints[176].angles = (-32.0758, 171.711, 0); +/* 0:09 */waypoints[177] = spawnstruct(); +/* 0:09 */waypoints[177].origin = (1667.24, 846.904, -310.133); +/* 0:09 */waypoints[177].type = "stand"; +/* 0:09 */waypoints[177].children[0] = 10; +/* 0:09 */waypoints[177].children[1] = 178; +/* 0:09 */waypoints[177].children[2] = 176; +/* 0:09 */waypoints[178] = spawnstruct(); +/* 0:09 */waypoints[178].origin = (1558.44, 514.418, -322.22); +/* 0:09 */waypoints[178].type = "stand"; +/* 0:09 */waypoints[178].children[0] = 177; +/* 0:09 */waypoints[178].children[1] = 11; +/* 0:09 */waypoints[178].children[2] = 175; +/* 0:09 */waypoints[179] = spawnstruct(); +/* 0:09 */waypoints[179].origin = (1300.22, 1217.83, -254.875); +/* 0:09 */waypoints[179].type = "claymore"; +/* 0:09 */waypoints[179].children[0] = 8; +/* 0:09 */waypoints[179].angles = (15.083, 28.7407, 0); +/* 0:09 */waypoints[180] = spawnstruct(); +/* 0:09 */waypoints[180].origin = (-956.01, 947.49, -436.201); +/* 0:09 */waypoints[180].type = "javelin"; +/* 0:09 */waypoints[180].children[0] = 124; +/* 0:09 */waypoints[180].jav_point = (359.598, 2119.62, -43.2117); +/* 0:09 */waypoints[181] = spawnstruct(); +/* 0:09 */waypoints[181].origin = (1181.22, -408.889, -385.817); +/* 0:09 */waypoints[181].type = "claymore"; +/* 0:09 */waypoints[181].children[0] = 16; +/* 0:09 */waypoints[181].angles = (25.6354, -164.185, 0); +/* 0:09 */return waypoints; +} diff --git a/maps/mp/bots/waypoints/seatown.gsc b/raw/maps/mp/bots/waypoints/seatown.gsc similarity index 97% rename from maps/mp/bots/waypoints/seatown.gsc rename to raw/maps/mp/bots/waypoints/seatown.gsc index 1458ad1..ffd7553 100644 --- a/maps/mp/bots/waypoints/seatown.gsc +++ b/raw/maps/mp/bots/waypoints/seatown.gsc @@ -1,1728 +1,1728 @@ -Seatown() -{ -/* 1:54 */waypoints = []; -/* 1:54 */waypoints[0] = spawnstruct(); -/* 1:54 */waypoints[0].origin = (274.125, 508.147, 208.125); -/* 1:54 */waypoints[0].type = "climb"; -/* 1:54 */waypoints[0].children[0] = 1; -/* 1:54 */waypoints[0].children[1] = 94; -/* 1:54 */waypoints[0].angles = (3.19031, 179.72, 0); -/* 1:54 */waypoints[1] = spawnstruct(); -/* 1:54 */waypoints[1].origin = (254.987, 490.885, 265.178); -/* 1:54 */waypoints[1].type = "stand"; -/* 1:54 */waypoints[1].children[0] = 0; -/* 1:54 */waypoints[1].children[1] = 2; -/* 1:54 */waypoints[2] = spawnstruct(); -/* 1:54 */waypoints[2].origin = (212.125, 490.913, 273.45); -/* 1:54 */waypoints[2].type = "climb"; -/* 1:54 */waypoints[2].children[0] = 1; -/* 1:54 */waypoints[2].children[1] = 3; -/* 1:54 */waypoints[2].angles = (4.42078, 179.896, 0); -/* 1:54 */waypoints[3] = spawnstruct(); -/* 1:54 */waypoints[3].origin = (196.098, 490.913, 352.125); -/* 1:54 */waypoints[3].type = "stand"; -/* 1:54 */waypoints[3].children[0] = 2; -/* 1:54 */waypoints[3].children[1] = 4; -/* 1:54 */waypoints[4] = spawnstruct(); -/* 1:54 */waypoints[4].origin = (173.875, 490.919, 320.125); -/* 1:54 */waypoints[4].type = "climb"; -/* 1:54 */waypoints[4].children[0] = 3; -/* 1:54 */waypoints[4].children[1] = 5; -/* 1:54 */waypoints[4].angles = (17.2473, -1.04919, 0); -/* 1:54 */waypoints[5] = spawnstruct(); -/* 1:54 */waypoints[5].origin = (17.3134, 491.224, 320.125); -/* 1:54 */waypoints[5].type = "stand"; -/* 1:54 */waypoints[5].children[0] = 4; -/* 1:54 */waypoints[5].children[1] = 6; -/* 1:54 */waypoints[5].children[2] = 17; -/* 1:54 */waypoints[5].children[3] = 279; -/* 1:54 */waypoints[6] = spawnstruct(); -/* 1:54 */waypoints[6].origin = (27.0443, 618.823, 320.625); -/* 1:54 */waypoints[6].type = "stand"; -/* 1:54 */waypoints[6].children[0] = 5; -/* 1:54 */waypoints[6].children[1] = 7; -/* 1:54 */waypoints[6].children[2] = 12; -/* 1:54 */waypoints[7] = spawnstruct(); -/* 1:54 */waypoints[7].origin = (64.6581, 742.875, 322.125); -/* 1:54 */waypoints[7].type = "climb"; -/* 1:54 */waypoints[7].children[0] = 6; -/* 1:54 */waypoints[7].children[1] = 8; -/* 1:54 */waypoints[7].children[2] = 280; -/* 1:54 */waypoints[7].angles = (17.0551, 89.3188, 0); -/* 1:54 */waypoints[8] = spawnstruct(); -/* 1:54 */waypoints[8].origin = (64.661, 760.034, 356.125); -/* 1:54 */waypoints[8].type = "stand"; -/* 1:54 */waypoints[8].children[0] = 7; -/* 1:54 */waypoints[8].children[1] = 9; -/* 1:54 */waypoints[9] = spawnstruct(); -/* 1:54 */waypoints[9].origin = (73.0425, 777.138, 322.125); -/* 1:54 */waypoints[9].type = "climb"; -/* 1:54 */waypoints[9].children[0] = 8; -/* 1:54 */waypoints[9].children[1] = 10; -/* 1:54 */waypoints[9].angles = (11.7102, -92.4609, 0); -/* 1:54 */waypoints[10] = spawnstruct(); -/* 1:54 */waypoints[10].origin = (73.5488, 905.462, 322.125); -/* 1:54 */waypoints[10].type = "stand"; -/* 1:54 */waypoints[10].children[0] = 9; -/* 1:54 */waypoints[10].children[1] = 11; -/* 1:54 */waypoints[11] = spawnstruct(); -/* 1:54 */waypoints[11].origin = (71.4178, 1189.72, 322.125); -/* 1:54 */waypoints[11].type = "crouch"; -/* 1:54 */waypoints[11].children[0] = 10; -/* 1:54 */waypoints[11].angles = (18.5986, -148.903, 0); -/* 1:54 */waypoints[12] = spawnstruct(); -/* 1:54 */waypoints[12].origin = (-134.681, 672.431, 320.125); -/* 1:54 */waypoints[12].type = "stand"; -/* 1:54 */waypoints[12].children[0] = 6; -/* 1:54 */waypoints[12].children[1] = 13; -/* 1:54 */waypoints[12].children[2] = 16; -/* 1:54 */waypoints[13] = spawnstruct(); -/* 1:54 */waypoints[13].origin = (-171.875, 672.452, 320.125); -/* 1:54 */waypoints[13].type = "climb"; -/* 1:54 */waypoints[13].children[0] = 12; -/* 1:54 */waypoints[13].children[1] = 14; -/* 1:54 */waypoints[13].angles = (25.7892, 178.693, 0); -/* 1:54 */waypoints[14] = spawnstruct(); -/* 1:54 */waypoints[14].origin = (-188.74, 672.458, 356.125); -/* 1:54 */waypoints[14].type = "stand"; -/* 1:54 */waypoints[14].children[0] = 13; -/* 1:54 */waypoints[14].children[1] = 15; -/* 1:54 */waypoints[15] = spawnstruct(); -/* 1:54 */waypoints[15].origin = (-302.975, 670.183, 344.143); -/* 1:54 */waypoints[15].type = "crouch"; -/* 1:54 */waypoints[15].children[0] = 14; -/* 1:54 */waypoints[15].angles = (26.4923, 178.693, 0); -/* 1:54 */waypoints[16] = spawnstruct(); -/* 1:54 */waypoints[16].origin = (-116.378, 639.139, 320.125); -/* 1:54 */waypoints[16].type = "claymore"; -/* 1:54 */waypoints[16].children[0] = 12; -/* 1:54 */waypoints[16].angles = (13.8361, -6.87195, 0); -/* 1:54 */waypoints[17] = spawnstruct(); -/* 1:54 */waypoints[17].origin = (-104.261, 484.913, 320.125); -/* 1:54 */waypoints[17].type = "stand"; -/* 1:54 */waypoints[17].children[0] = 5; -/* 1:54 */waypoints[17].children[1] = 18; -/* 1:54 */waypoints[18] = spawnstruct(); -/* 1:54 */waypoints[18].origin = (-238.436, 489.518, 248.125); -/* 1:54 */waypoints[18].type = "stand"; -/* 1:54 */waypoints[18].children[0] = 17; -/* 1:54 */waypoints[18].children[1] = 19; -/* 1:54 */waypoints[19] = spawnstruct(); -/* 1:54 */waypoints[19].origin = (-246.869, 652.549, 168.125); -/* 1:54 */waypoints[19].type = "stand"; -/* 1:54 */waypoints[19].children[0] = 18; -/* 1:54 */waypoints[19].children[1] = 20; -/* 1:54 */waypoints[19].children[2] = 21; -/* 1:54 */waypoints[20] = spawnstruct(); -/* 1:54 */waypoints[20].origin = (-101.312, 683.22, 168.125); -/* 1:54 */waypoints[20].type = "stand"; -/* 1:54 */waypoints[20].children[0] = 19; -/* 1:54 */waypoints[20].children[1] = 156; -/* 1:54 */waypoints[21] = spawnstruct(); -/* 1:54 */waypoints[21].origin = (-443.473, 662.611, 100.125); -/* 1:54 */waypoints[21].type = "stand"; -/* 1:54 */waypoints[21].children[0] = 19; -/* 1:54 */waypoints[21].children[1] = 22; -/* 1:54 */waypoints[22] = spawnstruct(); -/* 1:54 */waypoints[22].origin = (-677.535, 784.091, 86.1192); -/* 1:54 */waypoints[22].type = "stand"; -/* 1:54 */waypoints[22].children[0] = 21; -/* 1:54 */waypoints[22].children[1] = 23; -/* 1:54 */waypoints[22].children[2] = 161; -/* 1:54 */waypoints[23] = spawnstruct(); -/* 1:54 */waypoints[23].origin = (-986.45, 1007.4, 31.5662); -/* 1:54 */waypoints[23].type = "stand"; -/* 1:54 */waypoints[23].children[0] = 22; -/* 1:54 */waypoints[23].children[1] = 24; -/* 1:54 */waypoints[23].children[2] = 25; -/* 1:54 */waypoints[24] = spawnstruct(); -/* 1:54 */waypoints[24].origin = (-660.472, 1237.22, 54.9324); -/* 1:54 */waypoints[24].type = "stand"; -/* 1:54 */waypoints[24].children[0] = 23; -/* 1:54 */waypoints[24].children[1] = 83; -/* 1:54 */waypoints[24].children[2] = 85; -/* 1:54 */waypoints[25] = spawnstruct(); -/* 1:54 */waypoints[25].origin = (-1247.54, 1030.34, 18.7169); -/* 1:54 */waypoints[25].type = "stand"; -/* 1:54 */waypoints[25].children[0] = 23; -/* 1:54 */waypoints[25].children[1] = 26; -/* 1:54 */waypoints[25].children[2] = 27; -/* 1:54 */waypoints[25].children[3] = 28; -/* 1:54 */waypoints[25].children[4] = 295; -/* 1:54 */waypoints[26] = spawnstruct(); -/* 1:54 */waypoints[26].origin = (-1242.29, 835.146, 43.2297); -/* 1:54 */waypoints[26].type = "crouch"; -/* 1:54 */waypoints[26].children[0] = 25; -/* 1:54 */waypoints[26].angles = (10.1501, 89.599, 0); -/* 1:54 */waypoints[27] = spawnstruct(); -/* 1:54 */waypoints[27].origin = (-1239.13, 1242.38, 53.1472); -/* 1:54 */waypoints[27].type = "crouch"; -/* 1:54 */waypoints[27].children[0] = 25; -/* 1:54 */waypoints[27].angles = (15.9454, -93.9386, 0); -/* 1:54 */waypoints[28] = spawnstruct(); -/* 1:54 */waypoints[28].origin = (-1467.26, 1055.12, 9.69966); -/* 1:54 */waypoints[28].type = "stand"; -/* 1:54 */waypoints[28].children[0] = 25; -/* 1:54 */waypoints[28].children[1] = 29; -/* 1:54 */waypoints[28].children[2] = 294; -/* 1:54 */waypoints[28].children[3] = 295; -/* 1:54 */waypoints[28].children[4] = 33; -/* 1:54 */waypoints[29] = spawnstruct(); -/* 1:54 */waypoints[29].origin = (-1662.44, 1169.64, 33.7564); -/* 1:54 */waypoints[29].type = "stand"; -/* 1:54 */waypoints[29].children[0] = 28; -/* 1:54 */waypoints[29].children[1] = 30; -/* 1:54 */waypoints[30] = spawnstruct(); -/* 1:54 */waypoints[30].origin = (-1919.46, 1371.78, 51.3662); -/* 1:54 */waypoints[30].type = "stand"; -/* 1:54 */waypoints[30].children[0] = 29; -/* 1:54 */waypoints[30].children[1] = 31; -/* 1:54 */waypoints[30].children[2] = 32; -/* 1:54 */waypoints[31] = spawnstruct(); -/* 1:54 */waypoints[31].origin = (-2063.61, 1519.6, 48.125); -/* 1:54 */waypoints[31].type = "crouch"; -/* 1:54 */waypoints[31].children[0] = 30; -/* 1:54 */waypoints[31].angles = (10.7654, -51.7291, 0); -/* 1:54 */waypoints[32] = spawnstruct(); -/* 1:54 */waypoints[32].origin = (-1955.52, 1552.15, 128.125); -/* 1:54 */waypoints[32].type = "stand"; -/* 1:54 */waypoints[32].children[0] = 30; -/* 1:54 */waypoints[32].children[1] = 33; -/* 1:54 */waypoints[33] = spawnstruct(); -/* 1:54 */waypoints[33].origin = (-2125.41, 1461.87, 200.125); -/* 1:54 */waypoints[33].type = "stand"; -/* 1:54 */waypoints[33].children[0] = 32; -/* 1:54 */waypoints[33].children[1] = 34; -/* 1:54 */waypoints[33].children[2] = 44; -/* 1:54 */waypoints[33].children[3] = 28; -/* 1:54 */waypoints[34] = spawnstruct(); -/* 1:54 */waypoints[34].origin = (-2120.17, 1299, 200.125); -/* 1:54 */waypoints[34].type = "stand"; -/* 1:54 */waypoints[34].children[0] = 33; -/* 1:54 */waypoints[34].children[1] = 35; -/* 1:54 */waypoints[35] = spawnstruct(); -/* 1:54 */waypoints[35].origin = (-2050.7, 1170.51, 200.125); -/* 1:54 */waypoints[35].type = "stand"; -/* 1:54 */waypoints[35].children[0] = 34; -/* 1:54 */waypoints[35].children[1] = 36; -/* 1:54 */waypoints[35].children[2] = 37; -/* 1:54 */waypoints[35].children[3] = 72; -/* 1:54 */waypoints[35].children[4] = 77; -/* 1:54 */waypoints[36] = spawnstruct(); -/* 1:54 */waypoints[36].origin = (-2244.1, 1157.56, 200.125); -/* 1:54 */waypoints[36].type = "crouch"; -/* 1:54 */waypoints[36].children[0] = 35; -/* 1:54 */waypoints[36].angles = (16.0333, 8.94287, 0); -/* 1:54 */waypoints[37] = spawnstruct(); -/* 1:54 */waypoints[37].origin = (-1905.17, 1172.86, 200.125); -/* 1:54 */waypoints[37].type = "stand"; -/* 1:54 */waypoints[37].children[0] = 35; -/* 1:54 */waypoints[37].children[1] = 38; -/* 1:54 */waypoints[37].children[2] = 39; -/* 1:54 */waypoints[37].children[3] = 76; -/* 1:54 */waypoints[38] = spawnstruct(); -/* 1:54 */waypoints[38].origin = (-1933.37, 1119.12, 200.125); -/* 1:54 */waypoints[38].type = "claymore"; -/* 1:54 */waypoints[38].children[0] = 37; -/* 1:54 */waypoints[38].angles = (14.0997, 150.172, 0); -/* 1:54 */waypoints[39] = spawnstruct(); -/* 1:54 */waypoints[39].origin = (-1813.8, 1260.04, 200.125); -/* 1:54 */waypoints[39].type = "stand"; -/* 1:54 */waypoints[39].children[0] = 37; -/* 1:54 */waypoints[39].children[1] = 40; -/* 1:54 */waypoints[40] = spawnstruct(); -/* 1:54 */waypoints[40].origin = (-1674.39, 1444.7, 200.125); -/* 1:54 */waypoints[40].type = "stand"; -/* 1:54 */waypoints[40].children[0] = 39; -/* 1:54 */waypoints[40].children[1] = 41; -/* 1:54 */waypoints[40].children[2] = 42; -/* 1:54 */waypoints[40].children[3] = 45; -/* 1:54 */waypoints[41] = spawnstruct(); -/* 1:54 */waypoints[41].origin = (-1584.3, 1577.72, 200.125); -/* 1:54 */waypoints[41].type = "crouch"; -/* 1:54 */waypoints[41].children[0] = 40; -/* 1:54 */waypoints[41].angles = (14.0118, -135.813, 0); -/* 1:54 */waypoints[42] = spawnstruct(); -/* 1:54 */waypoints[42].origin = (-1774.71, 1601.75, 200.125); -/* 1:54 */waypoints[42].type = "stand"; -/* 1:54 */waypoints[42].children[0] = 40; -/* 1:54 */waypoints[42].children[1] = 43; -/* 1:54 */waypoints[43] = spawnstruct(); -/* 1:54 */waypoints[43].origin = (-2048.46, 1741.24, 239.615); -/* 1:54 */waypoints[43].type = "stand"; -/* 1:54 */waypoints[43].children[0] = 42; -/* 1:54 */waypoints[43].children[1] = 44; -/* 1:54 */waypoints[44] = spawnstruct(); -/* 1:54 */waypoints[44].origin = (-2235.12, 1601.79, 200.125); -/* 1:54 */waypoints[44].type = "stand"; -/* 1:54 */waypoints[44].children[0] = 43; -/* 1:54 */waypoints[44].children[1] = 33; -/* 1:54 */waypoints[45] = spawnstruct(); -/* 1:54 */waypoints[45].origin = (-1442.22, 1456.48, 205.189); -/* 1:54 */waypoints[45].type = "stand"; -/* 1:54 */waypoints[45].children[0] = 40; -/* 1:54 */waypoints[45].children[1] = 46; -/* 1:54 */waypoints[46] = spawnstruct(); -/* 1:54 */waypoints[46].origin = (-1116.27, 1446.53, 236.37); -/* 1:54 */waypoints[46].type = "stand"; -/* 1:54 */waypoints[46].children[0] = 45; -/* 1:54 */waypoints[46].children[1] = 47; -/* 1:54 */waypoints[46].children[2] = 81; -/* 1:54 */waypoints[46].children[3] = 82; -/* 1:54 */waypoints[47] = spawnstruct(); -/* 1:54 */waypoints[47].origin = (-1095.75, 1209.61, 246.776); -/* 1:54 */waypoints[47].type = "stand"; -/* 1:54 */waypoints[47].children[0] = 46; -/* 1:54 */waypoints[47].children[1] = 48; -/* 1:54 */waypoints[48] = spawnstruct(); -/* 1:54 */waypoints[48].origin = (-1093.37, 848.261, 292.768); -/* 1:54 */waypoints[48].type = "stand"; -/* 1:54 */waypoints[48].children[0] = 47; -/* 1:54 */waypoints[48].children[1] = 49; -/* 1:54 */waypoints[49] = spawnstruct(); -/* 1:54 */waypoints[49].origin = (-1090.85, 554.352, 304.125); -/* 1:54 */waypoints[49].type = "stand"; -/* 1:54 */waypoints[49].children[0] = 48; -/* 1:54 */waypoints[49].children[1] = 50; -/* 1:54 */waypoints[50] = spawnstruct(); -/* 1:54 */waypoints[50].origin = (-1090.8, 481.513, 304.125); -/* 1:54 */waypoints[50].type = "stand"; -/* 1:54 */waypoints[50].children[0] = 49; -/* 1:54 */waypoints[50].children[1] = 51; -/* 1:54 */waypoints[50].children[2] = 275; -/* 1:54 */waypoints[51] = spawnstruct(); -/* 1:54 */waypoints[51].origin = (-1191.84, 476.016, 304.125); -/* 1:54 */waypoints[51].type = "climb"; -/* 1:54 */waypoints[51].children[0] = 50; -/* 1:54 */waypoints[51].children[1] = 52; -/* 1:54 */waypoints[51].angles = (15.6982, 179.824, 0); -/* 1:54 */waypoints[52] = spawnstruct(); -/* 1:54 */waypoints[52].origin = (-1219.52, 476.823, 336.125); -/* 1:54 */waypoints[52].type = "stand"; -/* 1:54 */waypoints[52].children[0] = 51; -/* 1:54 */waypoints[52].children[1] = 53; -/* 1:54 */waypoints[53] = spawnstruct(); -/* 1:54 */waypoints[53].origin = (-1244.15, 484.429, 168.125); -/* 1:54 */waypoints[53].type = "climb"; -/* 1:54 */waypoints[53].children[0] = 52; -/* 1:54 */waypoints[53].children[1] = 54; -/* 1:54 */waypoints[53].angles = (-50.9229, -1.12061, 0); -/* 1:54 */waypoints[54] = spawnstruct(); -/* 1:54 */waypoints[54].origin = (-1364.94, 474.427, 168.004); -/* 1:54 */waypoints[54].type = "stand"; -/* 1:54 */waypoints[54].children[0] = 53; -/* 1:54 */waypoints[54].children[1] = 55; -/* 1:54 */waypoints[54].children[2] = 64; -/* 1:54 */waypoints[54].children[3] = 65; -/* 1:54 */waypoints[54].children[4] = 66; -/* 1:54 */waypoints[54].children[5] = 67; -/* 1:54 */waypoints[55] = spawnstruct(); -/* 1:54 */waypoints[55].origin = (-1467.72, 274.409, 168.125); -/* 1:54 */waypoints[55].type = "stand"; -/* 1:54 */waypoints[55].children[0] = 54; -/* 1:54 */waypoints[55].children[1] = 56; -/* 1:54 */waypoints[56] = spawnstruct(); -/* 1:54 */waypoints[56].origin = (-1537.02, 99.5108, 168.125); -/* 1:54 */waypoints[56].type = "stand"; -/* 1:54 */waypoints[56].children[0] = 55; -/* 1:54 */waypoints[56].children[1] = 57; -/* 1:54 */waypoints[56].children[2] = 58; -/* 1:54 */waypoints[57] = spawnstruct(); -/* 1:54 */waypoints[57].origin = (-1445.13, -214.138, 168.125); -/* 1:54 */waypoints[57].type = "stand"; -/* 1:54 */waypoints[57].children[0] = 56; -/* 1:54 */waypoints[57].children[1] = 184; -/* 1:54 */waypoints[57].children[2] = 185; -/* 1:54 */waypoints[58] = spawnstruct(); -/* 1:54 */waypoints[58].origin = (-1889.85, 69.8914, 188.125); -/* 1:54 */waypoints[58].type = "stand"; -/* 1:54 */waypoints[58].children[0] = 56; -/* 1:54 */waypoints[58].children[1] = 59; -/* 1:54 */waypoints[58].children[2] = 274; -/* 1:54 */waypoints[59] = spawnstruct(); -/* 1:54 */waypoints[59].origin = (-2072.83, -280.958, 188.125); -/* 1:54 */waypoints[59].type = "stand"; -/* 1:54 */waypoints[59].children[0] = 58; -/* 1:54 */waypoints[59].children[1] = 60; -/* 1:54 */waypoints[59].children[2] = 273; -/* 1:54 */waypoints[59].children[3] = 274; -/* 1:54 */waypoints[60] = spawnstruct(); -/* 1:54 */waypoints[60].origin = (-2451.8, -328.837, 188.165); -/* 1:54 */waypoints[60].type = "stand"; -/* 1:54 */waypoints[60].children[0] = 59; -/* 1:54 */waypoints[60].children[1] = 61; -/* 1:54 */waypoints[60].children[2] = 203; -/* 1:54 */waypoints[60].children[3] = 297; -/* 1:54 */waypoints[60].children[4] = 273; -/* 1:54 */waypoints[61] = spawnstruct(); -/* 1:54 */waypoints[61].origin = (-2543.37, 95.6241, 188.294); -/* 1:54 */waypoints[61].type = "stand"; -/* 1:54 */waypoints[61].children[0] = 60; -/* 1:54 */waypoints[61].children[1] = 62; -/* 1:54 */waypoints[62] = spawnstruct(); -/* 1:54 */waypoints[62].origin = (-2433.08, 523.439, 188.125); -/* 1:54 */waypoints[62].type = "stand"; -/* 1:54 */waypoints[62].children[0] = 61; -/* 1:54 */waypoints[62].children[1] = 63; -/* 1:54 */waypoints[63] = spawnstruct(); -/* 1:54 */waypoints[63].origin = (-1992.49, 505.632, 189.369); -/* 1:54 */waypoints[63].type = "stand"; -/* 1:54 */waypoints[63].children[0] = 62; -/* 1:54 */waypoints[63].children[1] = 64; -/* 1:54 */waypoints[63].children[2] = 69; -/* 1:54 */waypoints[63].children[3] = 274; -/* 1:54 */waypoints[64] = spawnstruct(); -/* 1:54 */waypoints[64].origin = (-1641.45, 675.679, 220.125); -/* 1:54 */waypoints[64].type = "stand"; -/* 1:54 */waypoints[64].children[0] = 63; -/* 1:54 */waypoints[64].children[1] = 54; -/* 1:54 */waypoints[64].children[2] = 67; -/* 1:54 */waypoints[65] = spawnstruct(); -/* 1:54 */waypoints[65].origin = (-1240.13, 365.125, 168.125); -/* 1:54 */waypoints[65].type = "crouch"; -/* 1:54 */waypoints[65].children[0] = 54; -/* 1:54 */waypoints[65].angles = (10.3149, 132.281, 0); -/* 1:54 */waypoints[66] = spawnstruct(); -/* 1:54 */waypoints[66].origin = (-1240.12, 564.875, 168.125); -/* 1:54 */waypoints[66].type = "crouch"; -/* 1:54 */waypoints[66].children[0] = 54; -/* 1:54 */waypoints[66].angles = (9.7876, -150.672, 0); -/* 1:54 */waypoints[67] = spawnstruct(); -/* 1:54 */waypoints[67].origin = (-1405.17, 717.823, 168.19); -/* 1:54 */waypoints[67].type = "stand"; -/* 1:54 */waypoints[67].children[0] = 54; -/* 1:54 */waypoints[67].children[1] = 68; -/* 1:54 */waypoints[67].children[2] = 64; -/* 1:54 */waypoints[68] = spawnstruct(); -/* 1:54 */waypoints[68].origin = (-1266.13, 740.147, 168.895); -/* 1:54 */waypoints[68].type = "crouch"; -/* 1:54 */waypoints[68].children[0] = 67; -/* 1:54 */waypoints[68].angles = (8.02979, -168.503, 0); -/* 1:54 */waypoints[69] = spawnstruct(); -/* 1:54 */waypoints[69].origin = (-1960.28, 728.521, 192.044); -/* 1:54 */waypoints[69].type = "stand"; -/* 1:54 */waypoints[69].children[0] = 63; -/* 1:54 */waypoints[69].children[1] = 70; -/* 1:54 */waypoints[70] = spawnstruct(); -/* 1:54 */waypoints[70].origin = (-1970.28, 939.679, 192.746); -/* 1:54 */waypoints[70].type = "stand"; -/* 1:54 */waypoints[70].children[0] = 69; -/* 1:54 */waypoints[70].children[1] = 71; -/* 1:54 */waypoints[70].children[2] = 73; -/* 1:54 */waypoints[70].children[3] = 80; -/* 1:54 */waypoints[71] = spawnstruct(); -/* 1:54 */waypoints[71].origin = (-1976.85, 1012.92, 200.125); -/* 1:54 */waypoints[71].type = "stand"; -/* 1:54 */waypoints[71].children[0] = 70; -/* 1:54 */waypoints[71].children[1] = 72; -/* 1:54 */waypoints[72] = spawnstruct(); -/* 1:54 */waypoints[72].origin = (-2027.63, 1100.88, 200.125); -/* 1:54 */waypoints[72].type = "stand"; -/* 1:54 */waypoints[72].children[0] = 71; -/* 1:54 */waypoints[72].children[1] = 35; -/* 1:54 */waypoints[73] = spawnstruct(); -/* 1:54 */waypoints[73].origin = (-1867.16, 958.385, 191.302); -/* 1:54 */waypoints[73].type = "stand"; -/* 1:54 */waypoints[73].children[0] = 70; -/* 1:54 */waypoints[73].children[1] = 74; -/* 1:54 */waypoints[74] = spawnstruct(); -/* 1:54 */waypoints[74].origin = (-1873.26, 1007.25, 200.04); -/* 1:54 */waypoints[74].type = "climb"; -/* 1:54 */waypoints[74].children[0] = 73; -/* 1:54 */waypoints[74].children[1] = 75; -/* 1:54 */waypoints[74].angles = (15.5334, 91.225, 0); -/* 1:54 */waypoints[75] = spawnstruct(); -/* 1:54 */waypoints[75].origin = (-1873.27, 1066.24, 236.125); -/* 1:54 */waypoints[75].type = "stand"; -/* 1:54 */waypoints[75].children[0] = 74; -/* 1:54 */waypoints[75].children[1] = 76; -/* 1:54 */waypoints[76] = spawnstruct(); -/* 1:54 */waypoints[76].origin = (-1873.94, 1123.17, 200.125); -/* 1:54 */waypoints[76].type = "climb"; -/* 1:54 */waypoints[76].children[0] = 75; -/* 1:54 */waypoints[76].children[1] = 37; -/* 1:54 */waypoints[76].angles = (10.26, -88.8025, 0); -/* 1:54 */waypoints[77] = spawnstruct(); -/* 1:54 */waypoints[77].origin = (-2129.51, 1122.93, 200.125); -/* 1:54 */waypoints[77].type = "climb"; -/* 1:54 */waypoints[77].children[0] = 35; -/* 1:54 */waypoints[77].children[1] = 78; -/* 1:54 */waypoints[77].angles = (14.9347, -92.3126, 0); -/* 1:54 */waypoints[78] = spawnstruct(); -/* 1:54 */waypoints[78].origin = (-2129.53, 1073.06, 236.125); -/* 1:54 */waypoints[78].type = "stand"; -/* 1:54 */waypoints[78].children[0] = 77; -/* 1:54 */waypoints[78].children[1] = 79; -/* 1:54 */waypoints[79] = spawnstruct(); -/* 1:54 */waypoints[79].origin = (-2129.95, 1007.46, 199.986); -/* 1:54 */waypoints[79].type = "climb"; -/* 1:54 */waypoints[79].children[0] = 78; -/* 1:54 */waypoints[79].children[1] = 80; -/* 1:54 */waypoints[79].angles = (8.85925, 88.8464, 0); -/* 1:54 */waypoints[80] = spawnstruct(); -/* 1:54 */waypoints[80].origin = (-2136.88, 907.407, 192.48); -/* 1:54 */waypoints[80].type = "stand"; -/* 1:54 */waypoints[80].children[0] = 79; -/* 1:54 */waypoints[80].children[1] = 70; -/* 1:54 */waypoints[81] = spawnstruct(); -/* 1:54 */waypoints[81].origin = (-993.125, 1531.86, 237.701); -/* 1:54 */waypoints[81].type = "crouch"; -/* 1:54 */waypoints[81].children[0] = 46; -/* 1:54 */waypoints[81].angles = (15.2698, -132.55, 0); -/* 1:54 */waypoints[82] = spawnstruct(); -/* 1:54 */waypoints[82].origin = (-1014.69, 1362.58, 238.36); -/* 1:54 */waypoints[82].type = "stand"; -/* 1:54 */waypoints[82].children[0] = 46; -/* 1:54 */waypoints[82].children[1] = 83; -/* 1:54 */waypoints[83] = spawnstruct(); -/* 1:54 */waypoints[83].origin = (-670.348, 1354.02, 72.125); -/* 1:54 */waypoints[83].type = "stand"; -/* 1:54 */waypoints[83].children[0] = 82; -/* 1:54 */waypoints[83].children[1] = 84; -/* 1:54 */waypoints[83].children[2] = 24; -/* 1:54 */waypoints[84] = spawnstruct(); -/* 1:54 */waypoints[84].origin = (-775.694, 1297.13, 114.516); -/* 1:54 */waypoints[84].type = "claymore"; -/* 1:54 */waypoints[84].children[0] = 83; -/* 1:54 */waypoints[84].angles = (32.3151, 0.12085, 0); -/* 1:54 */waypoints[85] = spawnstruct(); -/* 1:54 */waypoints[85].origin = (-409.769, 1181.6, 68.6791); -/* 1:54 */waypoints[85].type = "stand"; -/* 1:54 */waypoints[85].children[0] = 24; -/* 1:54 */waypoints[85].children[1] = 86; -/* 1:54 */waypoints[86] = spawnstruct(); -/* 1:54 */waypoints[86].origin = (-165.999, 1178.28, 77.905); -/* 1:54 */waypoints[86].type = "stand"; -/* 1:54 */waypoints[86].children[0] = 85; -/* 1:54 */waypoints[86].children[1] = 87; -/* 1:54 */waypoints[86].children[2] = 88; -/* 1:54 */waypoints[87] = spawnstruct(); -/* 1:54 */waypoints[87].origin = (-141.099, 1305, 112.125); -/* 1:54 */waypoints[87].type = "crouch"; -/* 1:54 */waypoints[87].children[0] = 86; -/* 1:54 */waypoints[87].angles = (11.7542, -92.6257, 0); -/* 1:54 */waypoints[88] = spawnstruct(); -/* 1:54 */waypoints[88].origin = (54.1837, 1154.28, 85.3308); -/* 1:54 */waypoints[88].type = "stand"; -/* 1:54 */waypoints[88].children[0] = 86; -/* 1:54 */waypoints[88].children[1] = 89; -/* 1:54 */waypoints[89] = spawnstruct(); -/* 1:54 */waypoints[89].origin = (149.727, 1156.76, 89.7882); -/* 1:54 */waypoints[89].type = "stand"; -/* 1:54 */waypoints[89].children[0] = 88; -/* 1:54 */waypoints[89].children[1] = 90; -/* 1:54 */waypoints[89].children[2] = 91; -/* 1:54 */waypoints[89].children[3] = 92; -/* 1:54 */waypoints[90] = spawnstruct(); -/* 1:54 */waypoints[90].origin = (132.125, 1260.88, 88.9296); -/* 1:54 */waypoints[90].type = "claymore"; -/* 1:54 */waypoints[90].children[0] = 89; -/* 1:54 */waypoints[90].angles = (8.06824, -87.9675, 0); -/* 1:54 */waypoints[91] = spawnstruct(); -/* 1:54 */waypoints[91].origin = (137.236, 1036.16, 91.1789); -/* 1:54 */waypoints[91].type = "claymore"; -/* 1:54 */waypoints[91].children[0] = 89; -/* 1:54 */waypoints[91].children[1] = 147; -/* 1:54 */waypoints[91].angles = (12.8967, 86.3855, 0); -/* 1:54 */waypoints[92] = spawnstruct(); -/* 1:54 */waypoints[92].origin = (383.158, 1054.73, 122.632); -/* 1:54 */waypoints[92].type = "stand"; -/* 1:54 */waypoints[92].children[0] = 89; -/* 1:54 */waypoints[92].children[1] = 93; -/* 1:54 */waypoints[92].children[2] = 137; -/* 1:54 */waypoints[92].children[3] = 147; -/* 1:54 */waypoints[92].children[4] = 146; -/* 1:54 */waypoints[93] = spawnstruct(); -/* 1:54 */waypoints[93].origin = (308.794, 737.761, 152.125); -/* 1:54 */waypoints[93].type = "stand"; -/* 1:54 */waypoints[93].children[0] = 92; -/* 1:54 */waypoints[93].children[1] = 94; -/* 1:54 */waypoints[93].children[2] = 146; -/* 1:54 */waypoints[93].children[3] = 147; -/* 1:54 */waypoints[94] = spawnstruct(); -/* 1:54 */waypoints[94].origin = (344.198, 504.627, 208.125); -/* 1:54 */waypoints[94].type = "stand"; -/* 1:54 */waypoints[94].children[0] = 93; -/* 1:54 */waypoints[94].children[1] = 0; -/* 1:54 */waypoints[94].children[2] = 95; -/* 1:54 */waypoints[95] = spawnstruct(); -/* 1:54 */waypoints[95].origin = (262.72, 357.555, 208.125); -/* 1:54 */waypoints[95].type = "stand"; -/* 1:54 */waypoints[95].children[0] = 94; -/* 1:54 */waypoints[95].children[1] = 96; -/* 1:54 */waypoints[96] = spawnstruct(); -/* 1:54 */waypoints[96].origin = (261.378, 243.971, 208.125); -/* 1:54 */waypoints[96].type = "stand"; -/* 1:54 */waypoints[96].children[0] = 95; -/* 1:54 */waypoints[96].children[1] = 97; -/* 1:54 */waypoints[96].children[2] = 148; -/* 1:54 */waypoints[97] = spawnstruct(); -/* 1:54 */waypoints[97].origin = (394.31, 220.458, 208.125); -/* 1:54 */waypoints[97].type = "stand"; -/* 1:54 */waypoints[97].children[0] = 96; -/* 1:54 */waypoints[97].children[1] = 98; -/* 1:54 */waypoints[98] = spawnstruct(); -/* 1:54 */waypoints[98].origin = (417.727, 87.1448, 208.125); -/* 1:54 */waypoints[98].type = "stand"; -/* 1:54 */waypoints[98].children[0] = 97; -/* 1:54 */waypoints[98].children[1] = 99; -/* 1:54 */waypoints[98].children[2] = 291; -/* 1:54 */waypoints[99] = spawnstruct(); -/* 1:54 */waypoints[99].origin = (417.741, -59.3928, 248.125); -/* 1:54 */waypoints[99].type = "stand"; -/* 1:54 */waypoints[99].children[0] = 98; -/* 1:54 */waypoints[99].children[1] = 100; -/* 1:54 */waypoints[99].children[2] = 101; -/* 1:54 */waypoints[100] = spawnstruct(); -/* 1:54 */waypoints[100].origin = (464.125, -43.1455, 248.125); -/* 1:54 */waypoints[100].type = "claymore"; -/* 1:54 */waypoints[100].children[0] = 99; -/* 1:54 */waypoints[100].angles = (23.7073, -178.627, 0); -/* 1:54 */waypoints[101] = spawnstruct(); -/* 1:54 */waypoints[101].origin = (563.644, -101.521, 248.125); -/* 1:54 */waypoints[101].type = "stand"; -/* 1:54 */waypoints[101].children[0] = 99; -/* 1:54 */waypoints[101].children[1] = 102; -/* 1:54 */waypoints[102] = spawnstruct(); -/* 1:54 */waypoints[102].origin = (772.628, -101.494, 248.125); -/* 1:54 */waypoints[102].type = "stand"; -/* 1:54 */waypoints[102].children[0] = 101; -/* 1:54 */waypoints[102].children[1] = 103; -/* 1:54 */waypoints[102].children[2] = 112; -/* 1:54 */waypoints[103] = spawnstruct(); -/* 1:54 */waypoints[103].origin = (924.211, -120.871, 248.125); -/* 1:54 */waypoints[103].type = "stand"; -/* 1:54 */waypoints[103].children[0] = 102; -/* 1:54 */waypoints[103].children[1] = 104; -/* 1:54 */waypoints[103].children[2] = 111; -/* 1:54 */waypoints[104] = spawnstruct(); -/* 1:54 */waypoints[104].origin = (993.873, -46.7099, 248.125); -/* 1:54 */waypoints[104].type = "climb"; -/* 1:54 */waypoints[104].children[0] = 103; -/* 1:54 */waypoints[104].children[1] = 105; -/* 1:54 */waypoints[104].angles = (27.1515, 1.31287, 0); -/* 1:54 */waypoints[105] = spawnstruct(); -/* 1:54 */waypoints[105].origin = (1012.11, -46.9633, 280.125); -/* 1:54 */waypoints[105].type = "stand"; -/* 1:54 */waypoints[105].children[0] = 104; -/* 1:54 */waypoints[105].children[1] = 106; -/* 1:54 */waypoints[106] = spawnstruct(); -/* 1:54 */waypoints[106].origin = (1032.13, -56.5955, 230.064); -/* 1:54 */waypoints[106].type = "climb"; -/* 1:54 */waypoints[106].children[0] = 105; -/* 1:54 */waypoints[106].children[1] = 107; -/* 1:54 */waypoints[106].children[2] = 293; -/* 1:54 */waypoints[106].angles = (2.84973, -178.484, 0); -/* 1:54 */waypoints[107] = spawnstruct(); -/* 1:54 */waypoints[107].origin = (1059.15, -221.774, 232.125); -/* 1:54 */waypoints[107].type = "stand"; -/* 1:54 */waypoints[107].children[0] = 106; -/* 1:54 */waypoints[107].children[1] = 108; -/* 1:54 */waypoints[107].children[2] = 109; -/* 1:54 */waypoints[107].children[3] = 117; -/* 1:54 */waypoints[108] = spawnstruct(); -/* 1:54 */waypoints[108].origin = (1060.25, -412.076, 232.125); -/* 1:54 */waypoints[108].type = "stand"; -/* 1:54 */waypoints[108].children[0] = 107; -/* 1:54 */waypoints[108].children[1] = 113; -/* 1:54 */waypoints[108].children[2] = 288; -/* 1:54 */waypoints[108].children[3] = 117; -/* 1:54 */waypoints[109] = spawnstruct(); -/* 1:54 */waypoints[109].origin = (1032.34, -216.529, 232.125); -/* 1:54 */waypoints[109].type = "climb"; -/* 1:54 */waypoints[109].children[0] = 107; -/* 1:54 */waypoints[109].children[1] = 110; -/* 1:54 */waypoints[109].angles = (7.34863, 178.885, 0); -/* 1:54 */waypoints[110] = spawnstruct(); -/* 1:54 */waypoints[110].origin = (1016.03, -216.529, 280.124); -/* 1:54 */waypoints[110].type = "stand"; -/* 1:54 */waypoints[110].children[0] = 109; -/* 1:54 */waypoints[110].children[1] = 111; -/* 1:54 */waypoints[111] = spawnstruct(); -/* 1:54 */waypoints[111].origin = (993.861, -217.628, 248.125); -/* 1:54 */waypoints[111].type = "climb"; -/* 1:54 */waypoints[111].children[0] = 110; -/* 1:54 */waypoints[111].children[1] = 103; -/* 1:54 */waypoints[111].angles = (10.3369, -2.71912, 0); -/* 1:54 */waypoints[112] = spawnstruct(); -/* 1:54 */waypoints[112].origin = (745.113, -212.155, 248.125); -/* 1:54 */waypoints[112].type = "stand"; -/* 1:54 */waypoints[112].children[0] = 102; -/* 1:54 */waypoints[112].children[1] = 113; -/* 1:54 */waypoints[113] = spawnstruct(); -/* 1:54 */waypoints[113].origin = (745.029, -404.927, 166.125); -/* 1:54 */waypoints[113].type = "stand"; -/* 1:54 */waypoints[113].children[0] = 112; -/* 1:54 */waypoints[113].children[1] = 108; -/* 1:54 */waypoints[113].children[2] = 114; -/* 1:54 */waypoints[114] = spawnstruct(); -/* 1:54 */waypoints[114].origin = (438.699, -407.297, 167.125); -/* 1:54 */waypoints[114].type = "stand"; -/* 1:54 */waypoints[114].children[0] = 113; -/* 1:54 */waypoints[114].children[1] = 115; -/* 1:54 */waypoints[114].children[2] = 224; -/* 1:54 */waypoints[115] = spawnstruct(); -/* 1:54 */waypoints[115].origin = (59.3499, -350.625, 170.125); -/* 1:54 */waypoints[115].type = "stand"; -/* 1:54 */waypoints[115].children[0] = 114; -/* 1:54 */waypoints[115].children[1] = 151; -/* 1:54 */waypoints[116] = spawnstruct(); -/* 1:54 */waypoints[116].origin = (18.1194, 149.725, 170.125); -/* 1:54 */waypoints[116].type = "stand"; -/* 1:54 */waypoints[116].children[0] = 149; -/* 1:54 */waypoints[116].children[1] = 152; -/* 1:54 */waypoints[117] = spawnstruct(); -/* 1:54 */waypoints[117].origin = (1237.19, -154.42, 230.982); -/* 1:54 */waypoints[117].type = "stand"; -/* 1:54 */waypoints[117].children[0] = 107; -/* 1:54 */waypoints[117].children[1] = 118; -/* 1:54 */waypoints[117].children[2] = 124; -/* 1:54 */waypoints[117].children[3] = 108; -/* 1:54 */waypoints[118] = spawnstruct(); -/* 1:54 */waypoints[118].origin = (1237.25, -2.83976, 230.98); -/* 1:54 */waypoints[118].type = "stand"; -/* 1:54 */waypoints[118].children[0] = 117; -/* 1:54 */waypoints[118].children[1] = 119; -/* 1:54 */waypoints[118].children[2] = 123; -/* 1:54 */waypoints[119] = spawnstruct(); -/* 1:54 */waypoints[119].origin = (1237.37, 140.805, 230.936); -/* 1:54 */waypoints[119].type = "stand"; -/* 1:54 */waypoints[119].children[0] = 118; -/* 1:54 */waypoints[119].children[1] = 120; -/* 1:54 */waypoints[119].children[2] = 122; -/* 1:54 */waypoints[120] = spawnstruct(); -/* 1:54 */waypoints[120].origin = (1237.51, 298.876, 230.125); -/* 1:54 */waypoints[120].type = "stand"; -/* 1:54 */waypoints[120].children[0] = 119; -/* 1:54 */waypoints[120].children[1] = 121; -/* 1:54 */waypoints[120].children[2] = 127; -/* 1:54 */waypoints[120].children[3] = 293; -/* 1:54 */waypoints[121] = spawnstruct(); -/* 1:54 */waypoints[121].origin = (1381.78, 317.644, 234.125); -/* 1:54 */waypoints[121].type = "stand"; -/* 1:54 */waypoints[121].children[0] = 120; -/* 1:54 */waypoints[121].children[1] = 122; -/* 1:54 */waypoints[122] = spawnstruct(); -/* 1:54 */waypoints[122].origin = (1381.82, 166.391, 234.125); -/* 1:54 */waypoints[122].type = "stand"; -/* 1:54 */waypoints[122].children[0] = 121; -/* 1:54 */waypoints[122].children[1] = 123; -/* 1:54 */waypoints[122].children[2] = 119; -/* 1:54 */waypoints[123] = spawnstruct(); -/* 1:54 */waypoints[123].origin = (1381.78, 15.5238, 234.125); -/* 1:54 */waypoints[123].type = "stand"; -/* 1:54 */waypoints[123].children[0] = 122; -/* 1:54 */waypoints[123].children[1] = 124; -/* 1:54 */waypoints[123].children[2] = 126; -/* 1:54 */waypoints[123].children[3] = 118; -/* 1:54 */waypoints[124] = spawnstruct(); -/* 1:54 */waypoints[124].origin = (1381.75, -134.601, 234.125); -/* 1:54 */waypoints[124].type = "stand"; -/* 1:54 */waypoints[124].children[0] = 123; -/* 1:54 */waypoints[124].children[1] = 125; -/* 1:54 */waypoints[124].children[2] = 117; -/* 1:54 */waypoints[125] = spawnstruct(); -/* 1:54 */waypoints[125].origin = (1502.88, -205.875, 234.125); -/* 1:54 */waypoints[125].type = "crouch"; -/* 1:54 */waypoints[125].children[0] = 124; -/* 1:54 */waypoints[125].angles = (15.0238, 154.786, 0); -/* 1:54 */waypoints[126] = spawnstruct(); -/* 1:54 */waypoints[126].origin = (1502.88, 28.875, 234.125); -/* 1:54 */waypoints[126].type = "crouch"; -/* 1:54 */waypoints[126].children[0] = 123; -/* 1:54 */waypoints[126].angles = (18.5394, -151.408, 0); -/* 1:54 */waypoints[127] = spawnstruct(); -/* 1:54 */waypoints[127].origin = (1222.89, 520.928, 173); -/* 1:54 */waypoints[127].type = "stand"; -/* 1:54 */waypoints[127].children[0] = 120; -/* 1:54 */waypoints[127].children[1] = 128; -/* 1:54 */waypoints[127].children[2] = 142; -/* 1:54 */waypoints[128] = spawnstruct(); -/* 1:54 */waypoints[128].origin = (1179.9, 812.072, 162.187); -/* 1:54 */waypoints[128].type = "stand"; -/* 1:54 */waypoints[128].children[0] = 127; -/* 1:54 */waypoints[128].children[1] = 129; -/* 1:54 */waypoints[128].children[2] = 139; -/* 1:54 */waypoints[128].children[3] = 140; -/* 1:54 */waypoints[128].children[4] = 142; -/* 1:54 */waypoints[129] = spawnstruct(); -/* 1:54 */waypoints[129].origin = (979.507, 959.312, 171.122); -/* 1:54 */waypoints[129].type = "stand"; -/* 1:54 */waypoints[129].children[0] = 128; -/* 1:54 */waypoints[129].children[1] = 130; -/* 1:54 */waypoints[129].children[2] = 131; -/* 1:54 */waypoints[129].children[3] = 138; -/* 1:54 */waypoints[129].children[4] = 142; -/* 1:54 */waypoints[129].children[5] = 144; -/* 1:54 */waypoints[129].children[6] = 139; -/* 1:54 */waypoints[130] = spawnstruct(); -/* 1:54 */waypoints[130].origin = (766.856, 867.259, 165.02); -/* 1:54 */waypoints[130].type = "stand"; -/* 1:54 */waypoints[130].children[0] = 129; -/* 1:54 */waypoints[130].children[1] = 133; -/* 1:54 */waypoints[130].children[2] = 134; -/* 1:54 */waypoints[130].children[3] = 135; -/* 1:54 */waypoints[130].children[4] = 136; -/* 1:54 */waypoints[130].children[5] = 142; -/* 1:54 */waypoints[131] = spawnstruct(); -/* 1:54 */waypoints[131].origin = (738.526, 1100.24, 161.913); -/* 1:54 */waypoints[131].type = "stand"; -/* 1:54 */waypoints[131].children[0] = 129; -/* 1:54 */waypoints[131].children[1] = 132; -/* 1:54 */waypoints[131].children[2] = 137; -/* 1:54 */waypoints[131].children[3] = 144; -/* 1:54 */waypoints[132] = spawnstruct(); -/* 1:54 */waypoints[132].origin = (737.462, 992.673, 162.978); -/* 1:54 */waypoints[132].type = "claymore"; -/* 1:54 */waypoints[132].children[0] = 131; -/* 1:54 */waypoints[132].angles = (17.8363, 91.0876, 0); -/* 1:54 */waypoints[133] = spawnstruct(); -/* 1:54 */waypoints[133].origin = (731.125, 743.125, 170.585); -/* 1:54 */waypoints[133].type = "crouch"; -/* 1:54 */waypoints[133].children[0] = 130; -/* 1:54 */waypoints[133].angles = (9.83826, 83.7048, 0); -/* 1:54 */waypoints[134] = spawnstruct(); -/* 1:54 */waypoints[134].origin = (731.125, 766.619, 169.95); -/* 1:54 */waypoints[134].type = "claymore"; -/* 1:54 */waypoints[134].children[0] = 130; -/* 1:54 */waypoints[134].angles = (13.266, 87.3962, 0); -/* 1:54 */waypoints[135] = spawnstruct(); -/* 1:54 */waypoints[135].origin = (731.165, 978.819, 161.708); -/* 1:54 */waypoints[135].type = "claymore"; -/* 1:54 */waypoints[135].children[0] = 130; -/* 1:54 */waypoints[135].angles = (19.8578, -94.1583, 0); -/* 1:54 */waypoints[136] = spawnstruct(); -/* 1:54 */waypoints[136].origin = (593.345, 866.646, 152.428); -/* 1:54 */waypoints[136].type = "stand"; -/* 1:54 */waypoints[136].children[0] = 130; -/* 1:54 */waypoints[136].children[1] = 137; -/* 1:54 */waypoints[136].children[2] = 146; -/* 1:54 */waypoints[137] = spawnstruct(); -/* 1:54 */waypoints[137].origin = (542.318, 1093.81, 141.393); -/* 1:54 */waypoints[137].type = "stand"; -/* 1:54 */waypoints[137].children[0] = 136; -/* 1:54 */waypoints[137].children[1] = 92; -/* 1:54 */waypoints[137].children[2] = 131; -/* 1:54 */waypoints[137].children[3] = 146; -/* 1:54 */waypoints[138] = spawnstruct(); -/* 1:54 */waypoints[138].origin = (1139.75, 1187, 169.878); -/* 1:54 */waypoints[138].type = "stand"; -/* 1:54 */waypoints[138].children[0] = 129; -/* 1:54 */waypoints[138].children[1] = 139; -/* 1:54 */waypoints[138].children[2] = 144; -/* 1:54 */waypoints[139] = spawnstruct(); -/* 1:54 */waypoints[139].origin = (1366.6, 1001.13, 166.742); -/* 1:54 */waypoints[139].type = "stand"; -/* 1:54 */waypoints[139].children[0] = 138; -/* 1:54 */waypoints[139].children[1] = 140; -/* 1:54 */waypoints[139].children[2] = 128; -/* 1:54 */waypoints[139].children[3] = 129; -/* 1:54 */waypoints[140] = spawnstruct(); -/* 1:54 */waypoints[140].origin = (1362.46, 648.367, 178.782); -/* 1:54 */waypoints[140].type = "stand"; -/* 1:54 */waypoints[140].children[0] = 139; -/* 1:54 */waypoints[140].children[1] = 141; -/* 1:54 */waypoints[140].children[2] = 128; -/* 1:54 */waypoints[141] = spawnstruct(); -/* 1:54 */waypoints[141].origin = (1398.88, 559.125, 172.857); -/* 1:54 */waypoints[141].type = "crouch"; -/* 1:54 */waypoints[141].children[0] = 140; -/* 1:54 */waypoints[141].angles = (16.5179, 168.492, 0); -/* 1:54 */waypoints[142] = spawnstruct(); -/* 1:54 */waypoints[142].origin = (1032.98, 687.96, 168.606); -/* 1:54 */waypoints[142].type = "stand"; -/* 1:54 */waypoints[142].children[0] = 128; -/* 1:54 */waypoints[142].children[1] = 143; -/* 1:54 */waypoints[142].children[2] = 127; -/* 1:54 */waypoints[142].children[3] = 129; -/* 1:54 */waypoints[142].children[4] = 130; -/* 1:54 */waypoints[143] = spawnstruct(); -/* 1:54 */waypoints[143].origin = (916.125, 559.125, 170.125); -/* 1:54 */waypoints[143].type = "crouch"; -/* 1:54 */waypoints[143].children[0] = 142; -/* 1:54 */waypoints[143].angles = (5.09766, 46.0107, 0); -/* 1:54 */waypoints[144] = spawnstruct(); -/* 1:54 */waypoints[144].origin = (978.048, 1208.22, 169.294); -/* 1:54 */waypoints[144].type = "stand"; -/* 1:54 */waypoints[144].children[0] = 131; -/* 1:54 */waypoints[144].children[1] = 138; -/* 1:54 */waypoints[144].children[2] = 145; -/* 1:54 */waypoints[144].children[3] = 129; -/* 1:54 */waypoints[145] = spawnstruct(); -/* 1:54 */waypoints[145].origin = (1045.88, 1324.88, 170.586); -/* 1:54 */waypoints[145].type = "crouch"; -/* 1:54 */waypoints[145].children[0] = 144; -/* 1:54 */waypoints[145].angles = (7.55859, -126.546, 0); -/* 1:54 */waypoints[146] = spawnstruct(); -/* 1:54 */waypoints[146].origin = (444.5, 866.788, 135.993); -/* 1:54 */waypoints[146].type = "stand"; -/* 1:54 */waypoints[146].children[0] = 136; -/* 1:54 */waypoints[146].children[1] = 93; -/* 1:54 */waypoints[146].children[2] = 92; -/* 1:54 */waypoints[146].children[3] = 137; -/* 1:54 */waypoints[147] = spawnstruct(); -/* 1:54 */waypoints[147].origin = (132.125, 779.125, 126.112); -/* 1:54 */waypoints[147].type = "crouch"; -/* 1:54 */waypoints[147].children[0] = 93; -/* 1:54 */waypoints[147].children[1] = 91; -/* 1:54 */waypoints[147].children[2] = 92; -/* 1:54 */waypoints[148] = spawnstruct(); -/* 1:54 */waypoints[148].origin = (107.645, 241.55, 168.125); -/* 1:54 */waypoints[148].type = "stand"; -/* 1:54 */waypoints[148].children[0] = 96; -/* 1:54 */waypoints[148].children[1] = 149; -/* 1:54 */waypoints[149] = spawnstruct(); -/* 1:54 */waypoints[149].origin = (-4.2525, 240.898, 165.125); -/* 1:54 */waypoints[149].type = "stand"; -/* 1:54 */waypoints[149].children[0] = 148; -/* 1:54 */waypoints[149].children[1] = 150; -/* 1:54 */waypoints[149].children[2] = 116; -/* 1:54 */waypoints[149].children[3] = 151; -/* 1:54 */waypoints[150] = spawnstruct(); -/* 1:54 */waypoints[150].origin = (-410.643, 237.67, 166.125); -/* 1:54 */waypoints[150].type = "stand"; -/* 1:54 */waypoints[150].children[0] = 149; -/* 1:54 */waypoints[150].children[1] = 170; -/* 1:54 */waypoints[150].children[2] = 175; -/* 1:54 */waypoints[151] = spawnstruct(); -/* 1:54 */waypoints[151].origin = (-53.4301, -133.034, 170.125); -/* 1:54 */waypoints[151].type = "stand"; -/* 1:54 */waypoints[151].children[0] = 115; -/* 1:54 */waypoints[151].children[1] = 152; -/* 1:54 */waypoints[151].children[2] = 153; -/* 1:54 */waypoints[151].children[3] = 149; -/* 1:54 */waypoints[152] = spawnstruct(); -/* 1:54 */waypoints[152].origin = (9.41021, 33.3786, 170.125); -/* 1:54 */waypoints[152].type = "stand"; -/* 1:54 */waypoints[152].children[0] = 151; -/* 1:54 */waypoints[152].children[1] = 116; -/* 1:54 */waypoints[153] = spawnstruct(); -/* 1:54 */waypoints[153].origin = (-48.875, -278.875, 170.125); -/* 1:54 */waypoints[153].type = "crouch"; -/* 1:54 */waypoints[153].children[0] = 151; -/* 1:54 */waypoints[153].children[1] = 154; -/* 1:54 */waypoints[154] = spawnstruct(); -/* 1:54 */waypoints[154].origin = (93.3833, 326.034, 169.125); -/* 1:54 */waypoints[154].type = "stand"; -/* 1:54 */waypoints[154].children[0] = 153; -/* 1:54 */waypoints[154].children[1] = 155; -/* 1:54 */waypoints[154].children[2] = 157; -/* 1:54 */waypoints[155] = spawnstruct(); -/* 1:54 */waypoints[155].origin = (61.2963, 483.681, 168.125); -/* 1:54 */waypoints[155].type = "stand"; -/* 1:54 */waypoints[155].children[0] = 154; -/* 1:54 */waypoints[155].children[1] = 156; -/* 1:54 */waypoints[155].children[2] = 157; -/* 1:54 */waypoints[156] = spawnstruct(); -/* 1:54 */waypoints[156].origin = (-37.1158, 637.831, 168.125); -/* 1:54 */waypoints[156].type = "stand"; -/* 1:54 */waypoints[156].children[0] = 155; -/* 1:54 */waypoints[156].children[1] = 20; -/* 1:54 */waypoints[156].children[2] = 160; -/* 1:54 */waypoints[157] = spawnstruct(); -/* 1:54 */waypoints[157].origin = (147.233, 418.74, 168.125); -/* 1:54 */waypoints[157].type = "stand"; -/* 1:54 */waypoints[157].children[0] = 155; -/* 1:54 */waypoints[157].children[1] = 154; -/* 1:54 */waypoints[157].children[2] = 158; -/* 1:54 */waypoints[158] = spawnstruct(); -/* 1:54 */waypoints[158].origin = (173.871, 355.125, 168.125); -/* 1:54 */waypoints[158].type = "claymore"; -/* 1:54 */waypoints[158].children[0] = 157; -/* 1:54 */waypoints[158].children[1] = 159; -/* 1:54 */waypoints[158].angles = (24.6863, 173.112, 0); -/* 1:54 */waypoints[159] = spawnstruct(); -/* 1:54 */waypoints[159].origin = (173.871, 355.125, 168.125); -/* 1:54 */waypoints[159].type = "crouch"; -/* 1:54 */waypoints[159].children[0] = 158; -/* 1:54 */waypoints[159].angles = (23.7195, 172.76, 0); -/* 1:54 */waypoints[160] = spawnstruct(); -/* 1:54 */waypoints[160].origin = (173.875, 707.88, 187.125); -/* 1:54 */waypoints[160].type = "crouch"; -/* 1:54 */waypoints[160].children[0] = 156; -/* 1:54 */waypoints[160].angles = (16.7816, -168.519, 0); -/* 1:54 */waypoints[161] = spawnstruct(); -/* 1:54 */waypoints[161].origin = (-668.86, 613.995, 168.125); -/* 1:54 */waypoints[161].type = "stand"; -/* 1:54 */waypoints[161].children[0] = 22; -/* 1:54 */waypoints[161].children[1] = 162; -/* 1:54 */waypoints[162] = spawnstruct(); -/* 1:54 */waypoints[162].origin = (-666.12, 468.24, 166.125); -/* 1:54 */waypoints[162].type = "stand"; -/* 1:54 */waypoints[162].children[0] = 161; -/* 1:54 */waypoints[162].children[1] = 163; -/* 1:54 */waypoints[162].children[2] = 164; -/* 1:54 */waypoints[162].children[3] = 169; -/* 1:54 */waypoints[163] = spawnstruct(); -/* 1:54 */waypoints[163].origin = (-454.125, 530.141, 166.792); -/* 1:54 */waypoints[163].type = "crouch"; -/* 1:54 */waypoints[163].children[0] = 162; -/* 1:54 */waypoints[163].angles = (19.2426, -150.776, 0); -/* 1:54 */waypoints[164] = spawnstruct(); -/* 1:54 */waypoints[164].origin = (-907.051, 468.668, 166.125); -/* 1:54 */waypoints[164].type = "stand"; -/* 1:54 */waypoints[164].children[0] = 162; -/* 1:54 */waypoints[164].children[1] = 165; -/* 1:54 */waypoints[164].children[2] = 168; -/* 1:54 */waypoints[165] = spawnstruct(); -/* 1:54 */waypoints[165].origin = (-1138.44, 450.357, 166.13); -/* 1:54 */waypoints[165].type = "stand"; -/* 1:54 */waypoints[165].children[0] = 164; -/* 1:54 */waypoints[165].children[1] = 166; -/* 1:54 */waypoints[165].children[2] = 171; -/* 1:54 */waypoints[166] = spawnstruct(); -/* 1:54 */waypoints[166].origin = (-1107.47, 69.0025, 166.125); -/* 1:54 */waypoints[166].type = "stand"; -/* 1:54 */waypoints[166].children[0] = 165; -/* 1:54 */waypoints[166].children[1] = 167; -/* 1:54 */waypoints[166].children[2] = 171; -/* 1:54 */waypoints[167] = spawnstruct(); -/* 1:54 */waypoints[167].origin = (-915.056, 15.7288, 168.125); -/* 1:54 */waypoints[167].type = "stand"; -/* 1:54 */waypoints[167].children[0] = 166; -/* 1:54 */waypoints[167].children[1] = 168; -/* 1:54 */waypoints[167].children[2] = 172; -/* 1:54 */waypoints[168] = spawnstruct(); -/* 1:54 */waypoints[168].origin = (-894.291, 234.209, 166.125); -/* 1:54 */waypoints[168].type = "stand"; -/* 1:54 */waypoints[168].children[0] = 167; -/* 1:54 */waypoints[168].children[1] = 169; -/* 1:54 */waypoints[168].children[2] = 164; -/* 1:54 */waypoints[168].children[3] = 171; -/* 1:54 */waypoints[169] = spawnstruct(); -/* 1:54 */waypoints[169].origin = (-692.064, 277.587, 166.125); -/* 1:54 */waypoints[169].type = "stand"; -/* 1:54 */waypoints[169].children[0] = 168; -/* 1:54 */waypoints[169].children[1] = 170; -/* 1:54 */waypoints[169].children[2] = 162; -/* 1:54 */waypoints[169].children[3] = 173; -/* 1:54 */waypoints[170] = spawnstruct(); -/* 1:54 */waypoints[170].origin = (-493.478, 247.963, 168.125); -/* 1:54 */waypoints[170].type = "stand"; -/* 1:54 */waypoints[170].children[0] = 169; -/* 1:54 */waypoints[170].children[1] = 150; -/* 1:54 */waypoints[171] = spawnstruct(); -/* 1:54 */waypoints[171].origin = (-1051.86, 237.981, 166.125); -/* 1:54 */waypoints[171].type = "stand"; -/* 1:54 */waypoints[171].children[0] = 168; -/* 1:54 */waypoints[171].children[1] = 166; -/* 1:54 */waypoints[171].children[2] = 165; -/* 1:54 */waypoints[172] = spawnstruct(); -/* 1:54 */waypoints[172].origin = (-911.924, -224.285, 166.125); -/* 1:54 */waypoints[172].type = "stand"; -/* 1:54 */waypoints[172].children[0] = 167; -/* 1:54 */waypoints[172].children[1] = 173; -/* 1:54 */waypoints[172].children[2] = 183; -/* 1:54 */waypoints[172].children[3] = 184; -/* 1:54 */waypoints[173] = spawnstruct(); -/* 1:54 */waypoints[173].origin = (-644.081, -213.711, 166.125); -/* 1:54 */waypoints[173].type = "stand"; -/* 1:54 */waypoints[173].children[0] = 172; -/* 1:54 */waypoints[173].children[1] = 174; -/* 1:54 */waypoints[173].children[2] = 182; -/* 1:54 */waypoints[173].children[3] = 169; -/* 1:54 */waypoints[174] = spawnstruct(); -/* 1:54 */waypoints[174].origin = (-405.368, -208.33, 166.125); -/* 1:54 */waypoints[174].type = "stand"; -/* 1:54 */waypoints[174].children[0] = 173; -/* 1:54 */waypoints[174].children[1] = 175; -/* 1:54 */waypoints[174].children[2] = 179; -/* 1:54 */waypoints[174].children[3] = 177; -/* 1:54 */waypoints[175] = spawnstruct(); -/* 1:54 */waypoints[175].origin = (-416.568, 57.519, 166.223); -/* 1:54 */waypoints[175].type = "stand"; -/* 1:54 */waypoints[175].children[0] = 174; -/* 1:54 */waypoints[175].children[1] = 150; -/* 1:54 */waypoints[175].children[2] = 176; -/* 1:54 */waypoints[176] = spawnstruct(); -/* 1:54 */waypoints[176].origin = (-274.486, 57.4151, 166.125); -/* 1:54 */waypoints[176].type = "stand"; -/* 1:54 */waypoints[176].children[0] = 175; -/* 1:54 */waypoints[176].children[1] = 177; -/* 1:54 */waypoints[177] = spawnstruct(); -/* 1:54 */waypoints[177].origin = (-243.143, -123.441, 166.125); -/* 1:54 */waypoints[177].type = "stand"; -/* 1:54 */waypoints[177].children[0] = 176; -/* 1:54 */waypoints[177].children[1] = 178; -/* 1:54 */waypoints[177].children[2] = 174; -/* 1:54 */waypoints[178] = spawnstruct(); -/* 1:54 */waypoints[178].origin = (-254.552, -368.835, 166.125); -/* 1:54 */waypoints[178].type = "stand"; -/* 1:54 */waypoints[178].children[0] = 177; -/* 1:54 */waypoints[178].children[1] = 179; -/* 1:54 */waypoints[179] = spawnstruct(); -/* 1:54 */waypoints[179].origin = (-415.448, -368.788, 166.125); -/* 1:54 */waypoints[179].type = "stand"; -/* 1:54 */waypoints[179].children[0] = 178; -/* 1:54 */waypoints[179].children[1] = 174; -/* 1:54 */waypoints[179].children[2] = 180; -/* 1:54 */waypoints[180] = spawnstruct(); -/* 1:54 */waypoints[180].origin = (-435.97, -547.846, 168.125); -/* 1:54 */waypoints[180].type = "stand"; -/* 1:54 */waypoints[180].children[0] = 179; -/* 1:54 */waypoints[180].children[1] = 181; -/* 1:54 */waypoints[180].children[2] = 182; -/* 1:54 */waypoints[181] = spawnstruct(); -/* 1:54 */waypoints[181].origin = (-436.051, -754.541, 200.125); -/* 1:54 */waypoints[181].type = "stand"; -/* 1:54 */waypoints[181].children[0] = 180; -/* 1:54 */waypoints[181].children[1] = 243; -/* 1:54 */waypoints[182] = spawnstruct(); -/* 1:54 */waypoints[182].origin = (-676.511, -539.551, 168.125); -/* 1:54 */waypoints[182].type = "stand"; -/* 1:54 */waypoints[182].children[0] = 180; -/* 1:54 */waypoints[182].children[1] = 183; -/* 1:54 */waypoints[182].children[2] = 173; -/* 1:54 */waypoints[183] = spawnstruct(); -/* 1:54 */waypoints[183].origin = (-944.821, -478.529, 168.125); -/* 1:54 */waypoints[183].type = "stand"; -/* 1:54 */waypoints[183].children[0] = 182; -/* 1:54 */waypoints[183].children[1] = 172; -/* 1:54 */waypoints[184] = spawnstruct(); -/* 1:54 */waypoints[184].origin = (-1137.04, -238.632, 168.125); -/* 1:54 */waypoints[184].type = "stand"; -/* 1:54 */waypoints[184].children[0] = 172; -/* 1:54 */waypoints[184].children[1] = 57; -/* 1:54 */waypoints[185] = spawnstruct(); -/* 1:54 */waypoints[185].origin = (-1506.91, -471.816, 144.125); -/* 1:54 */waypoints[185].type = "stand"; -/* 1:54 */waypoints[185].children[0] = 57; -/* 1:54 */waypoints[185].children[1] = 186; -/* 1:54 */waypoints[186] = spawnstruct(); -/* 1:54 */waypoints[186].origin = (-1667.77, -535.827, 112.125); -/* 1:54 */waypoints[186].type = "stand"; -/* 1:54 */waypoints[186].children[0] = 185; -/* 1:54 */waypoints[186].children[1] = 187; -/* 1:54 */waypoints[186].children[2] = 188; -/* 1:54 */waypoints[187] = spawnstruct(); -/* 1:54 */waypoints[187].origin = (-1714.88, -443.125, 112.125); -/* 1:54 */waypoints[187].type = "crouch"; -/* 1:54 */waypoints[187].children[0] = 186; -/* 1:54 */waypoints[187].angles = (27.5867, -63.501, 0); -/* 1:54 */waypoints[188] = spawnstruct(); -/* 1:54 */waypoints[188].origin = (-1651.14, -888.979, 152.125); -/* 1:54 */waypoints[188].type = "stand"; -/* 1:54 */waypoints[188].children[0] = 186; -/* 1:54 */waypoints[188].children[1] = 189; -/* 1:54 */waypoints[188].children[2] = 258; -/* 1:54 */waypoints[188].children[3] = 271; -/* 1:54 */waypoints[189] = spawnstruct(); -/* 1:54 */waypoints[189].origin = (-1761.28, -1114.39, 151.025); -/* 1:54 */waypoints[189].type = "stand"; -/* 1:54 */waypoints[189].children[0] = 188; -/* 1:54 */waypoints[189].children[1] = 190; -/* 1:54 */waypoints[189].children[2] = 258; -/* 1:54 */waypoints[189].children[3] = 271; -/* 1:54 */waypoints[190] = spawnstruct(); -/* 1:54 */waypoints[190].origin = (-1798.71, -1330.37, 155.104); -/* 1:54 */waypoints[190].type = "stand"; -/* 1:54 */waypoints[190].children[0] = 189; -/* 1:54 */waypoints[190].children[1] = 191; -/* 1:54 */waypoints[190].children[2] = 192; -/* 1:54 */waypoints[191] = spawnstruct(); -/* 1:54 */waypoints[191].origin = (-1725.87, -1312.78, 152.125); -/* 1:54 */waypoints[191].type = "claymore"; -/* 1:54 */waypoints[191].children[0] = 190; -/* 1:54 */waypoints[191].angles = (21.4398, -176.265, 0); -/* 1:54 */waypoints[192] = spawnstruct(); -/* 1:54 */waypoints[192].origin = (-1789.98, -1488.15, 152.125); -/* 1:54 */waypoints[192].type = "stand"; -/* 1:54 */waypoints[192].children[0] = 190; -/* 1:54 */waypoints[192].children[1] = 193; -/* 1:54 */waypoints[192].children[2] = 266; -/* 1:54 */waypoints[193] = spawnstruct(); -/* 1:54 */waypoints[193].origin = (-1751.19, -1709.09, 152.125); -/* 1:54 */waypoints[193].type = "stand"; -/* 1:54 */waypoints[193].children[0] = 192; -/* 1:54 */waypoints[193].children[1] = 194; -/* 1:54 */waypoints[193].children[2] = 265; -/* 1:54 */waypoints[194] = spawnstruct(); -/* 1:54 */waypoints[194].origin = (-2046.02, -1704.34, 288.125); -/* 1:54 */waypoints[194].type = "stand"; -/* 1:54 */waypoints[194].children[0] = 193; -/* 1:54 */waypoints[194].children[1] = 195; -/* 1:54 */waypoints[195] = spawnstruct(); -/* 1:54 */waypoints[195].origin = (-2193.5, -1549.86, 288.125); -/* 1:54 */waypoints[195].type = "stand"; -/* 1:54 */waypoints[195].children[0] = 194; -/* 1:54 */waypoints[195].children[1] = 196; -/* 1:54 */waypoints[195].children[2] = 198; -/* 1:54 */waypoints[195].children[3] = 205; -/* 1:54 */waypoints[196] = spawnstruct(); -/* 1:54 */waypoints[196].origin = (-1840.65, -1354.84, 290.125); -/* 1:54 */waypoints[196].type = "stand"; -/* 1:54 */waypoints[196].children[0] = 195; -/* 1:54 */waypoints[196].children[1] = 197; -/* 1:54 */waypoints[197] = spawnstruct(); -/* 1:54 */waypoints[197].origin = (-1579.13, -1354.94, 288.125); -/* 1:54 */waypoints[197].type = "crouch"; -/* 1:54 */waypoints[197].children[0] = 196; -/* 1:54 */waypoints[197].angles = (29.6082, -1.1261, 0); -/* 1:54 */waypoints[198] = spawnstruct(); -/* 1:54 */waypoints[198].origin = (-2285.74, -1308.12, 288.125); -/* 1:54 */waypoints[198].type = "stand"; -/* 1:54 */waypoints[198].children[0] = 195; -/* 1:54 */waypoints[198].children[1] = 199; -/* 1:54 */waypoints[198].children[2] = 204; -/* 1:54 */waypoints[199] = spawnstruct(); -/* 1:54 */waypoints[199].origin = (-2285.69, -1151.52, 291.117); -/* 1:54 */waypoints[199].type = "stand"; -/* 1:54 */waypoints[199].children[0] = 198; -/* 1:54 */waypoints[199].children[1] = 200; -/* 1:54 */waypoints[199].children[2] = 201; -/* 1:54 */waypoints[200] = spawnstruct(); -/* 1:54 */waypoints[200].origin = (-2112.35, -1133.19, 288.125); -/* 1:54 */waypoints[200].type = "crouch"; -/* 1:54 */waypoints[200].children[0] = 199; -/* 1:54 */waypoints[200].angles = (13.0902, 10.6897, 0); -/* 1:54 */waypoints[201] = spawnstruct(); -/* 1:54 */waypoints[201].origin = (-2396.53, -1093.16, 288.125); -/* 1:54 */waypoints[201].type = "stand"; -/* 1:54 */waypoints[201].children[0] = 199; -/* 1:54 */waypoints[201].children[1] = 202; -/* 1:54 */waypoints[202] = spawnstruct(); -/* 1:54 */waypoints[202].origin = (-2446.09, -920.857, 265.125); -/* 1:54 */waypoints[202].type = "stand"; -/* 1:54 */waypoints[202].children[0] = 201; -/* 1:54 */waypoints[202].children[1] = 203; -/* 1:54 */waypoints[203] = spawnstruct(); -/* 1:54 */waypoints[203].origin = (-2478.48, -593.455, 265.125); -/* 1:54 */waypoints[203].type = "stand"; -/* 1:54 */waypoints[203].children[0] = 202; -/* 1:54 */waypoints[203].children[1] = 60; -/* 1:54 */waypoints[204] = spawnstruct(); -/* 1:54 */waypoints[204].origin = (-2449.88, -1263.13, 288.125); -/* 1:54 */waypoints[204].type = "crouch"; -/* 1:54 */waypoints[204].children[0] = 198; -/* 1:54 */waypoints[204].angles = (16.9574, -29.0259, 0); -/* 1:54 */waypoints[205] = spawnstruct(); -/* 1:54 */waypoints[205].origin = (-2252.05, -1834.63, 291.121); -/* 1:54 */waypoints[205].type = "stand"; -/* 1:54 */waypoints[205].children[0] = 195; -/* 1:54 */waypoints[205].children[1] = 206; -/* 1:54 */waypoints[206] = spawnstruct(); -/* 1:54 */waypoints[206].origin = (-1878.1, -1867.36, 152.125); -/* 1:54 */waypoints[206].type = "stand"; -/* 1:54 */waypoints[206].children[0] = 205; -/* 1:54 */waypoints[206].children[1] = 207; -/* 1:54 */waypoints[207] = spawnstruct(); -/* 1:54 */waypoints[207].origin = (-1469.3, -1831.17, 152.125); -/* 1:54 */waypoints[207].type = "stand"; -/* 1:54 */waypoints[207].children[0] = 206; -/* 1:54 */waypoints[207].children[1] = 208; -/* 1:54 */waypoints[208] = spawnstruct(); -/* 1:54 */waypoints[208].origin = (-1310.38, -1838.6, 152.125); -/* 1:54 */waypoints[208].type = "stand"; -/* 1:54 */waypoints[208].children[0] = 207; -/* 1:54 */waypoints[208].children[1] = 209; -/* 1:54 */waypoints[208].children[2] = 213; -/* 1:54 */waypoints[209] = spawnstruct(); -/* 1:54 */waypoints[209].origin = (-949.577, -1825.33, 152.125); -/* 1:54 */waypoints[209].type = "stand"; -/* 1:54 */waypoints[209].children[0] = 208; -/* 1:54 */waypoints[209].children[1] = 210; -/* 1:54 */waypoints[209].children[2] = 212; -/* 1:54 */waypoints[210] = spawnstruct(); -/* 1:54 */waypoints[210].origin = (-643.59, -1821.47, 152.125); -/* 1:54 */waypoints[210].type = "stand"; -/* 1:54 */waypoints[210].children[0] = 209; -/* 1:54 */waypoints[210].children[1] = 211; -/* 1:54 */waypoints[211] = spawnstruct(); -/* 1:54 */waypoints[211].origin = (-621.166, -1650.31, 144.125); -/* 1:54 */waypoints[211].type = "stand"; -/* 1:54 */waypoints[211].children[0] = 210; -/* 1:54 */waypoints[211].children[1] = 212; -/* 1:54 */waypoints[211].children[2] = 214; -/* 1:54 */waypoints[212] = spawnstruct(); -/* 1:54 */waypoints[212].origin = (-932.542, -1650.37, 144.125); -/* 1:54 */waypoints[212].type = "stand"; -/* 1:54 */waypoints[212].children[0] = 211; -/* 1:54 */waypoints[212].children[1] = 213; -/* 1:54 */waypoints[212].children[2] = 209; -/* 1:54 */waypoints[212].children[3] = 261; -/* 1:54 */waypoints[213] = spawnstruct(); -/* 1:54 */waypoints[213].origin = (-1256.58, -1650.86, 144.125); -/* 1:54 */waypoints[213].type = "stand"; -/* 1:54 */waypoints[213].children[0] = 212; -/* 1:54 */waypoints[213].children[1] = 208; -/* 1:54 */waypoints[213].children[2] = 262; -/* 1:54 */waypoints[214] = spawnstruct(); -/* 1:54 */waypoints[214].origin = (-519.869, -1455.32, 156.7); -/* 1:54 */waypoints[214].type = "stand"; -/* 1:54 */waypoints[214].children[0] = 211; -/* 1:54 */waypoints[214].children[1] = 215; -/* 1:54 */waypoints[214].children[2] = 237; -/* 1:54 */waypoints[215] = spawnstruct(); -/* 1:54 */waypoints[215].origin = (-168.063, -1557.12, 198.945); -/* 1:54 */waypoints[215].type = "stand"; -/* 1:54 */waypoints[215].children[0] = 214; -/* 1:54 */waypoints[215].children[1] = 216; -/* 1:54 */waypoints[216] = spawnstruct(); -/* 1:54 */waypoints[216].origin = (-81.1603, -1411.26, 199.728); -/* 1:54 */waypoints[216].type = "stand"; -/* 1:54 */waypoints[216].children[0] = 215; -/* 1:54 */waypoints[216].children[1] = 217; -/* 1:54 */waypoints[216].children[2] = 235; -/* 1:54 */waypoints[217] = spawnstruct(); -/* 1:54 */waypoints[217].origin = (-190.696, -1170.3, 208.125); -/* 1:54 */waypoints[217].type = "stand"; -/* 1:54 */waypoints[217].children[0] = 216; -/* 1:54 */waypoints[217].children[1] = 218; -/* 1:54 */waypoints[217].children[2] = 236; -/* 1:54 */waypoints[217].children[3] = 238; -/* 1:54 */waypoints[218] = spawnstruct(); -/* 1:54 */waypoints[218].origin = (-57.2164, -1021.91, 208.125); -/* 1:54 */waypoints[218].type = "stand"; -/* 1:54 */waypoints[218].children[0] = 217; -/* 1:54 */waypoints[218].children[1] = 219; -/* 1:54 */waypoints[218].children[2] = 220; -/* 1:54 */waypoints[219] = spawnstruct(); -/* 1:54 */waypoints[219].origin = (66.4044, -869.065, 208.125); -/* 1:54 */waypoints[219].type = "stand"; -/* 1:54 */waypoints[219].children[0] = 218; -/* 1:54 */waypoints[219].children[1] = 224; -/* 1:54 */waypoints[220] = spawnstruct(); -/* 1:54 */waypoints[220].origin = (44.516, -1092.51, 208.125); -/* 1:54 */waypoints[220].type = "stand"; -/* 1:54 */waypoints[220].children[0] = 218; -/* 1:54 */waypoints[220].children[1] = 221; -/* 1:54 */waypoints[221] = spawnstruct(); -/* 1:54 */waypoints[221].origin = (308.434, -1116.63, 208.125); -/* 1:54 */waypoints[221].type = "stand"; -/* 1:54 */waypoints[221].children[0] = 220; -/* 1:54 */waypoints[221].children[1] = 222; -/* 1:54 */waypoints[221].children[2] = 231; -/* 1:54 */waypoints[222] = spawnstruct(); -/* 1:54 */waypoints[222].origin = (450.402, -1116.55, 208.125); -/* 1:54 */waypoints[222].type = "stand"; -/* 1:54 */waypoints[222].children[0] = 221; -/* 1:54 */waypoints[222].children[1] = 223; -/* 1:54 */waypoints[222].children[2] = 227; -/* 1:54 */waypoints[222].children[3] = 229; -/* 1:54 */waypoints[223] = spawnstruct(); -/* 1:54 */waypoints[223].origin = (464.255, -961.957, 208.125); -/* 1:54 */waypoints[223].type = "stand"; -/* 1:54 */waypoints[223].children[0] = 222; -/* 1:54 */waypoints[223].children[1] = 224; -/* 1:54 */waypoints[223].children[2] = 225; -/* 1:54 */waypoints[224] = spawnstruct(); -/* 1:54 */waypoints[224].origin = (466.237, -822.843, 208.125); -/* 1:54 */waypoints[224].type = "stand"; -/* 1:54 */waypoints[224].children[0] = 223; -/* 1:54 */waypoints[224].children[1] = 226; -/* 1:54 */waypoints[224].children[2] = 219; -/* 1:54 */waypoints[224].children[3] = 114; -/* 1:54 */waypoints[225] = spawnstruct(); -/* 1:54 */waypoints[225].origin = (591.49, -972.959, 208.125); -/* 1:54 */waypoints[225].type = "stand"; -/* 1:54 */waypoints[225].children[0] = 223; -/* 1:54 */waypoints[225].children[1] = 226; -/* 1:54 */waypoints[225].children[2] = 227; -/* 1:54 */waypoints[225].children[3] = 281; -/* 1:54 */waypoints[226] = spawnstruct(); -/* 1:54 */waypoints[226].origin = (599.421, -820.096, 208.125); -/* 1:54 */waypoints[226].type = "stand"; -/* 1:54 */waypoints[226].children[0] = 225; -/* 1:54 */waypoints[226].children[1] = 224; -/* 1:54 */waypoints[227] = spawnstruct(); -/* 1:54 */waypoints[227].origin = (594.414, -1132.16, 208.125); -/* 1:54 */waypoints[227].type = "stand"; -/* 1:54 */waypoints[227].children[0] = 225; -/* 1:54 */waypoints[227].children[1] = 228; -/* 1:54 */waypoints[227].children[2] = 282; -/* 1:54 */waypoints[227].children[3] = 222; -/* 1:54 */waypoints[228] = spawnstruct(); -/* 1:54 */waypoints[228].origin = (593.92, -1282.2, 208.125); -/* 1:54 */waypoints[228].type = "stand"; -/* 1:54 */waypoints[228].children[0] = 227; -/* 1:54 */waypoints[228].children[1] = 229; -/* 1:54 */waypoints[229] = spawnstruct(); -/* 1:54 */waypoints[229].origin = (473.5, -1275.18, 208.125); -/* 1:54 */waypoints[229].type = "stand"; -/* 1:54 */waypoints[229].children[0] = 228; -/* 1:54 */waypoints[229].children[1] = 230; -/* 1:54 */waypoints[229].children[2] = 222; -/* 1:54 */waypoints[230] = spawnstruct(); -/* 1:54 */waypoints[230].origin = (317.248, -1275.1, 208.125); -/* 1:54 */waypoints[230].type = "stand"; -/* 1:54 */waypoints[230].children[0] = 229; -/* 1:54 */waypoints[230].children[1] = 231; -/* 1:54 */waypoints[231] = spawnstruct(); -/* 1:54 */waypoints[231].origin = (261.66, -1305.98, 208.125); -/* 1:54 */waypoints[231].type = "stand"; -/* 1:54 */waypoints[231].children[0] = 230; -/* 1:54 */waypoints[231].children[1] = 232; -/* 1:54 */waypoints[231].children[2] = 221; -/* 1:54 */waypoints[232] = spawnstruct(); -/* 1:54 */waypoints[232].origin = (180.105, -1307.13, 208.125); -/* 1:54 */waypoints[232].type = "stand"; -/* 1:54 */waypoints[232].children[0] = 231; -/* 1:54 */waypoints[232].children[1] = 233; -/* 1:54 */waypoints[232].children[2] = 234; -/* 1:54 */waypoints[232].children[3] = 235; -/* 1:54 */waypoints[233] = spawnstruct(); -/* 1:54 */waypoints[233].origin = (199.875, -1251.13, 208.125); -/* 1:54 */waypoints[233].type = "claymore"; -/* 1:54 */waypoints[233].children[0] = 232; -/* 1:54 */waypoints[233].angles = (8.08044, -92.1478, 0); -/* 1:54 */waypoints[234] = spawnstruct(); -/* 1:54 */waypoints[234].origin = (199.875, -1508.88, 208.125); -/* 1:54 */waypoints[234].type = "crouch"; -/* 1:54 */waypoints[234].children[0] = 232; -/* 1:54 */waypoints[234].angles = (23.8074, 111.286, 0); -/* 1:54 */waypoints[235] = spawnstruct(); -/* 1:54 */waypoints[235].origin = (32.6311, -1393.16, 208.125); -/* 1:54 */waypoints[235].type = "stand"; -/* 1:54 */waypoints[235].children[0] = 232; -/* 1:54 */waypoints[235].children[1] = 216; -/* 1:54 */waypoints[236] = spawnstruct(); -/* 1:54 */waypoints[236].origin = (-253.838, -1270.58, 198.172); -/* 1:54 */waypoints[236].type = "stand"; -/* 1:54 */waypoints[236].children[0] = 217; -/* 1:54 */waypoints[236].children[1] = 237; -/* 1:54 */waypoints[237] = spawnstruct(); -/* 1:54 */waypoints[237].origin = (-525.952, -1327.79, 157.269); -/* 1:54 */waypoints[237].type = "stand"; -/* 1:54 */waypoints[237].children[0] = 236; -/* 1:54 */waypoints[237].children[1] = 214; -/* 1:54 */waypoints[237].children[2] = 244; -/* 1:54 */waypoints[238] = spawnstruct(); -/* 1:54 */waypoints[238].origin = (-283.875, -1177.89, 208.125); -/* 1:54 */waypoints[238].type = "climb"; -/* 1:54 */waypoints[238].children[0] = 217; -/* 1:54 */waypoints[238].children[1] = 239; -/* 1:54 */waypoints[238].angles = (9.3988, -179.121, 0); -/* 1:54 */waypoints[239] = spawnstruct(); -/* 1:54 */waypoints[239].origin = (-287.148, -1177.99, 232.125); -/* 1:54 */waypoints[239].type = "stand"; -/* 1:54 */waypoints[239].children[0] = 238; -/* 1:54 */waypoints[239].children[1] = 240; -/* 1:54 */waypoints[240] = spawnstruct(); -/* 1:54 */waypoints[240].origin = (-315.875, -1178.02, 232.125); -/* 1:54 */waypoints[240].type = "climb"; -/* 1:54 */waypoints[240].children[0] = 239; -/* 1:54 */waypoints[240].children[1] = 241; -/* 1:54 */waypoints[240].angles = (9.48669, -179.121, 0); -/* 1:54 */waypoints[241] = spawnstruct(); -/* 1:54 */waypoints[241].origin = (-332.447, -1177.99, 276.125); -/* 1:54 */waypoints[241].type = "stand"; -/* 1:54 */waypoints[241].children[0] = 240; -/* 1:54 */waypoints[241].children[1] = 242; -/* 1:54 */waypoints[242] = spawnstruct(); -/* 1:54 */waypoints[242].origin = (-355.807, -1176.74, 200.125); -/* 1:54 */waypoints[242].type = "climb"; -/* 1:54 */waypoints[242].children[0] = 241; -/* 1:54 */waypoints[242].children[1] = 243; -/* 1:54 */waypoints[242].angles = (0.966797, -4.11438, 0); -/* 1:54 */waypoints[243] = spawnstruct(); -/* 1:54 */waypoints[243].origin = (-471.705, -1145.26, 200.125); -/* 1:54 */waypoints[243].type = "stand"; -/* 1:54 */waypoints[243].children[0] = 242; -/* 1:54 */waypoints[243].children[1] = 181; -/* 1:54 */waypoints[243].children[2] = 244; -/* 1:54 */waypoints[244] = spawnstruct(); -/* 1:54 */waypoints[244].origin = (-791.427, -1132.25, 152.099); -/* 1:54 */waypoints[244].type = "stand"; -/* 1:54 */waypoints[244].children[0] = 243; -/* 1:54 */waypoints[244].children[1] = 237; -/* 1:54 */waypoints[244].children[2] = 245; -/* 1:54 */waypoints[244].children[3] = 259; -/* 1:54 */waypoints[245] = spawnstruct(); -/* 1:54 */waypoints[245].origin = (-809.008, -1078.75, 151.866); -/* 1:54 */waypoints[245].type = "stand"; -/* 1:54 */waypoints[245].children[0] = 244; -/* 1:54 */waypoints[245].children[1] = 246; -/* 1:54 */waypoints[246] = spawnstruct(); -/* 1:54 */waypoints[246].origin = (-832.61, -955.32, 168.125); -/* 1:54 */waypoints[246].type = "stand"; -/* 1:54 */waypoints[246].children[0] = 245; -/* 1:54 */waypoints[246].children[1] = 247; -/* 1:54 */waypoints[246].children[2] = 248; -/* 1:54 */waypoints[247] = spawnstruct(); -/* 1:54 */waypoints[247].origin = (-965.875, -999.715, 168.125); -/* 1:54 */waypoints[247].type = "crouch"; -/* 1:54 */waypoints[247].children[0] = 246; -/* 1:54 */waypoints[247].angles = (27.2186, 23.0878, 0); -/* 1:54 */waypoints[248] = spawnstruct(); -/* 1:54 */waypoints[248].origin = (-908.819, -837.57, 168.125); -/* 1:54 */waypoints[248].type = "stand"; -/* 1:54 */waypoints[248].children[0] = 246; -/* 1:54 */waypoints[248].children[1] = 249; -/* 1:54 */waypoints[249] = spawnstruct(); -/* 1:54 */waypoints[249].origin = (-1073.94, -857.662, 168.125); -/* 1:54 */waypoints[249].type = "stand"; -/* 1:54 */waypoints[249].children[0] = 248; -/* 1:54 */waypoints[249].children[1] = 250; -/* 1:54 */waypoints[250] = spawnstruct(); -/* 1:54 */waypoints[250].origin = (-1063.01, -666.39, 232.125); -/* 1:54 */waypoints[250].type = "stand"; -/* 1:54 */waypoints[250].children[0] = 249; -/* 1:54 */waypoints[250].children[1] = 251; -/* 1:54 */waypoints[251] = spawnstruct(); -/* 1:54 */waypoints[251].origin = (-847.756, -660.346, 304.125); -/* 1:54 */waypoints[251].type = "stand"; -/* 1:54 */waypoints[251].children[0] = 250; -/* 1:54 */waypoints[251].children[1] = 252; -/* 1:54 */waypoints[252] = spawnstruct(); -/* 1:54 */waypoints[252].origin = (-873.175, -910.498, 304.125); -/* 1:54 */waypoints[252].type = "stand"; -/* 1:54 */waypoints[252].children[0] = 251; -/* 1:54 */waypoints[252].children[1] = 253; -/* 1:54 */waypoints[253] = spawnstruct(); -/* 1:54 */waypoints[253].origin = (-1023.02, -942.343, 304.125); -/* 1:54 */waypoints[253].type = "crouch"; -/* 1:54 */waypoints[253].children[0] = 252; -/* 1:54 */waypoints[253].children[1] = 254; -/* 1:54 */waypoints[254] = spawnstruct(); -/* 1:54 */waypoints[254].origin = (-1083.88, -943.456, 304.125); -/* 1:54 */waypoints[254].type = "climb"; -/* 1:54 */waypoints[254].children[0] = 253; -/* 1:54 */waypoints[254].children[1] = 255; -/* 1:54 */waypoints[254].angles = (22.3846, 179.868, 0); -/* 1:54 */waypoints[255] = spawnstruct(); -/* 1:54 */waypoints[255].origin = (-1100.5, -943.456, 336.125); -/* 1:54 */waypoints[255].type = "stand"; -/* 1:54 */waypoints[255].children[0] = 254; -/* 1:54 */waypoints[255].children[1] = 256; -/* 1:54 */waypoints[256] = spawnstruct(); -/* 1:54 */waypoints[256].origin = (-1136.14, -949.099, 152.125); -/* 1:54 */waypoints[256].type = "climb"; -/* 1:54 */waypoints[256].children[0] = 255; -/* 1:54 */waypoints[256].children[1] = 257; -/* 1:54 */waypoints[256].angles = (0.247192, -1.42822, 0); -/* 1:54 */waypoints[257] = spawnstruct(); -/* 1:54 */waypoints[257].origin = (-1359.12, -993.193, 151.976); -/* 1:54 */waypoints[257].type = "stand"; -/* 1:54 */waypoints[257].children[0] = 256; -/* 1:54 */waypoints[257].children[1] = 258; -/* 1:54 */waypoints[258] = spawnstruct(); -/* 1:54 */waypoints[258].origin = (-1603.92, -1112.56, 150.271); -/* 1:54 */waypoints[258].type = "stand"; -/* 1:54 */waypoints[258].children[0] = 257; -/* 1:54 */waypoints[258].children[1] = 189; -/* 1:54 */waypoints[258].children[2] = 188; -/* 1:54 */waypoints[258].children[3] = 259; -/* 1:54 */waypoints[258].children[4] = 264; -/* 1:54 */waypoints[259] = spawnstruct(); -/* 1:54 */waypoints[259].origin = (-1213.78, -1156.33, 153.339); -/* 1:54 */waypoints[259].type = "stand"; -/* 1:54 */waypoints[259].children[0] = 258; -/* 1:54 */waypoints[259].children[1] = 244; -/* 1:54 */waypoints[259].children[2] = 260; -/* 1:54 */waypoints[260] = spawnstruct(); -/* 1:54 */waypoints[260].origin = (-1140.28, -1276.42, 147.248); -/* 1:54 */waypoints[260].type = "stand"; -/* 1:54 */waypoints[260].children[0] = 259; -/* 1:54 */waypoints[260].children[1] = 261; -/* 1:54 */waypoints[260].children[2] = 262; -/* 1:54 */waypoints[261] = spawnstruct(); -/* 1:54 */waypoints[261].origin = (-913.021, -1467.5, 144.117); -/* 1:54 */waypoints[261].type = "stand"; -/* 1:54 */waypoints[261].children[0] = 260; -/* 1:54 */waypoints[261].children[1] = 212; -/* 1:54 */waypoints[262] = spawnstruct(); -/* 1:54 */waypoints[262].origin = (-1236.18, -1450.01, 144.005); -/* 1:54 */waypoints[262].type = "stand"; -/* 1:54 */waypoints[262].children[0] = 260; -/* 1:54 */waypoints[262].children[1] = 213; -/* 1:54 */waypoints[262].children[2] = 263; -/* 1:54 */waypoints[262].children[3] = 264; -/* 1:54 */waypoints[263] = spawnstruct(); -/* 1:54 */waypoints[263].origin = (-1480.88, -1696.88, 154.998); -/* 1:54 */waypoints[263].type = "crouch"; -/* 1:54 */waypoints[263].children[0] = 262; -/* 1:54 */waypoints[263].angles = (17.6166, 42.6709, 0); -/* 1:54 */waypoints[264] = spawnstruct(); -/* 1:54 */waypoints[264].origin = (-1467.54, -1317.05, 153.001); -/* 1:54 */waypoints[264].type = "stand"; -/* 1:54 */waypoints[264].children[0] = 262; -/* 1:54 */waypoints[264].children[1] = 258; -/* 1:54 */waypoints[265] = spawnstruct(); -/* 1:54 */waypoints[265].origin = (-1579.12, -1718.05, 152.125); -/* 1:54 */waypoints[265].type = "crouch"; -/* 1:54 */waypoints[265].children[0] = 193; -/* 1:54 */waypoints[265].angles = (11.6455, 169.442, 0); -/* 1:54 */waypoints[266] = spawnstruct(); -/* 1:54 */waypoints[266].origin = (-1958.3, -1479.22, 152.125); -/* 1:54 */waypoints[266].type = "stand"; -/* 1:54 */waypoints[266].children[0] = 192; -/* 1:54 */waypoints[266].children[1] = 267; -/* 1:54 */waypoints[267] = spawnstruct(); -/* 1:54 */waypoints[267].origin = (-2234.27, -1473.94, 152.125); -/* 1:54 */waypoints[267].type = "stand"; -/* 1:54 */waypoints[267].children[0] = 266; -/* 1:54 */waypoints[267].children[1] = 268; -/* 1:54 */waypoints[268] = spawnstruct(); -/* 1:54 */waypoints[268].origin = (-2225.57, -1126.53, 152.125); -/* 1:54 */waypoints[268].type = "stand"; -/* 1:54 */waypoints[268].children[0] = 267; -/* 1:54 */waypoints[268].children[1] = 269; -/* 1:54 */waypoints[269] = spawnstruct(); -/* 1:54 */waypoints[269].origin = (-2225.47, -973.996, 152.125); -/* 1:54 */waypoints[269].type = "stand"; -/* 1:54 */waypoints[269].children[0] = 268; -/* 1:54 */waypoints[269].children[1] = 270; -/* 1:54 */waypoints[269].children[2] = 296; -/* 1:54 */waypoints[270] = spawnstruct(); -/* 1:54 */waypoints[270].origin = (-2048.56, -967.637, 152.125); -/* 1:54 */waypoints[270].type = "stand"; -/* 1:54 */waypoints[270].children[0] = 269; -/* 1:54 */waypoints[270].children[1] = 271; -/* 1:54 */waypoints[270].children[2] = 272; -/* 1:54 */waypoints[271] = spawnstruct(); -/* 1:54 */waypoints[271].origin = (-1826.36, -980.793, 152.125); -/* 1:54 */waypoints[271].type = "stand"; -/* 1:54 */waypoints[271].children[0] = 270; -/* 1:54 */waypoints[271].children[1] = 189; -/* 1:54 */waypoints[271].children[2] = 188; -/* 1:54 */waypoints[272] = spawnstruct(); -/* 1:54 */waypoints[272].origin = (-2056.1, -722.667, 112.125); -/* 1:54 */waypoints[272].type = "stand"; -/* 1:54 */waypoints[272].children[0] = 270; -/* 1:54 */waypoints[272].children[1] = 273; -/* 1:54 */waypoints[272].children[2] = 298; -/* 1:54 */waypoints[273] = spawnstruct(); -/* 1:54 */waypoints[273].origin = (-2064.62, -440.893, 188.125); -/* 1:54 */waypoints[273].type = "stand"; -/* 1:54 */waypoints[273].children[0] = 272; -/* 1:54 */waypoints[273].children[1] = 59; -/* 1:54 */waypoints[273].children[2] = 60; -/* 1:54 */waypoints[274] = spawnstruct(); -/* 1:54 */waypoints[274].origin = (-1989, 191.296, 188.125); -/* 1:54 */waypoints[274].type = "stand"; -/* 1:54 */waypoints[274].children[0] = 58; -/* 1:54 */waypoints[274].children[1] = 63; -/* 1:54 */waypoints[274].children[2] = 59; -/* 1:54 */waypoints[275] = spawnstruct(); -/* 1:54 */waypoints[275].origin = (-883.132, 465.491, 304.125); -/* 1:54 */waypoints[275].type = "stand"; -/* 1:54 */waypoints[275].children[0] = 50; -/* 1:54 */waypoints[275].children[1] = 276; -/* 1:54 */waypoints[276] = spawnstruct(); -/* 1:54 */waypoints[276].origin = (-549.247, 482.953, 304.125); -/* 1:54 */waypoints[276].type = "stand"; -/* 1:54 */waypoints[276].children[0] = 275; -/* 1:54 */waypoints[276].children[1] = 277; -/* 1:54 */waypoints[277] = spawnstruct(); -/* 1:54 */waypoints[277].origin = (-370.582, 492.83, 320.125); -/* 1:54 */waypoints[277].type = "stand"; -/* 1:54 */waypoints[277].children[0] = 276; -/* 1:54 */waypoints[277].children[1] = 278; -/* 1:54 */waypoints[278] = spawnstruct(); -/* 1:54 */waypoints[278].origin = (-343.215, 371.566, 320.125); -/* 1:54 */waypoints[278].type = "crouch"; -/* 1:54 */waypoints[278].children[0] = 277; -/* 1:54 */waypoints[278].children[1] = 279; -/* 1:54 */waypoints[279] = spawnstruct(); -/* 1:54 */waypoints[279].origin = (20.8969, 390.657, 320.125); -/* 1:54 */waypoints[279].type = "stand"; -/* 1:54 */waypoints[279].children[0] = 278; -/* 1:54 */waypoints[279].children[1] = 5; -/* 1:54 */waypoints[280] = spawnstruct(); -/* 1:54 */waypoints[280].origin = (164.061, 714.625, 320.125); -/* 1:54 */waypoints[280].type = "crouch"; -/* 1:54 */waypoints[280].children[0] = 7; -/* 1:54 */waypoints[280].angles = (19.9017, 5.83923, 0); -/* 1:54 */waypoints[281] = spawnstruct(); -/* 1:54 */waypoints[281].origin = (804.139, -994.244, 208.125); -/* 1:54 */waypoints[281].type = "stand"; -/* 1:54 */waypoints[281].children[0] = 225; -/* 1:54 */waypoints[281].children[1] = 282; -/* 1:54 */waypoints[282] = spawnstruct(); -/* 1:54 */waypoints[282].origin = (971.962, -1085.06, 208.125); -/* 1:54 */waypoints[282].type = "stand"; -/* 1:54 */waypoints[282].children[0] = 281; -/* 1:54 */waypoints[282].children[1] = 283; -/* 1:54 */waypoints[282].children[2] = 227; -/* 1:54 */waypoints[283] = spawnstruct(); -/* 1:54 */waypoints[283].origin = (1099.98, -1283.91, 208.125); -/* 1:54 */waypoints[283].type = "stand"; -/* 1:54 */waypoints[283].children[0] = 282; -/* 1:54 */waypoints[283].children[1] = 284; -/* 1:54 */waypoints[284] = spawnstruct(); -/* 1:54 */waypoints[284].origin = (1279.82, -1191.86, 204.125); -/* 1:54 */waypoints[284].type = "stand"; -/* 1:54 */waypoints[284].children[0] = 283; -/* 1:54 */waypoints[284].children[1] = 285; -/* 1:54 */waypoints[285] = spawnstruct(); -/* 1:54 */waypoints[285].origin = (1246.24, -1007.65, 208.125); -/* 1:54 */waypoints[285].type = "stand"; -/* 1:54 */waypoints[285].children[0] = 284; -/* 1:54 */waypoints[285].children[1] = 286; -/* 1:54 */waypoints[285].children[2] = 290; -/* 1:54 */waypoints[286] = spawnstruct(); -/* 1:54 */waypoints[286].origin = (1055.97, -976.429, 208.125); -/* 1:54 */waypoints[286].type = "stand"; -/* 1:54 */waypoints[286].children[0] = 285; -/* 1:54 */waypoints[286].children[1] = 287; -/* 1:54 */waypoints[287] = spawnstruct(); -/* 1:54 */waypoints[287].origin = (1047.35, -829.142, 208.125); -/* 1:54 */waypoints[287].type = "stand"; -/* 1:54 */waypoints[287].children[0] = 286; -/* 1:54 */waypoints[287].children[1] = 288; -/* 1:54 */waypoints[288] = spawnstruct(); -/* 1:54 */waypoints[288].origin = (1050.09, -606.572, 232.125); -/* 1:54 */waypoints[288].type = "stand"; -/* 1:54 */waypoints[288].children[0] = 287; -/* 1:54 */waypoints[288].children[1] = 108; -/* 1:54 */waypoints[288].children[2] = 289; -/* 1:54 */waypoints[289] = spawnstruct(); -/* 1:54 */waypoints[289].origin = (1255.05, -702.843, 232.125); -/* 1:54 */waypoints[289].type = "stand"; -/* 1:54 */waypoints[289].children[0] = 288; -/* 1:54 */waypoints[289].children[1] = 290; -/* 1:54 */waypoints[290] = spawnstruct(); -/* 1:54 */waypoints[290].origin = (1312.69, -859.375, 208.125); -/* 1:54 */waypoints[290].type = "stand"; -/* 1:54 */waypoints[290].children[0] = 289; -/* 1:54 */waypoints[290].children[1] = 285; -/* 1:54 */waypoints[291] = spawnstruct(); -/* 1:54 */waypoints[291].origin = (628.691, 90.1666, 208.125); -/* 1:54 */waypoints[291].type = "stand"; -/* 1:54 */waypoints[291].children[0] = 98; -/* 1:54 */waypoints[291].children[1] = 292; -/* 1:54 */waypoints[292] = spawnstruct(); -/* 1:54 */waypoints[292].origin = (921.166, 103.956, 208.125); -/* 1:54 */waypoints[292].type = "stand"; -/* 1:54 */waypoints[292].children[0] = 291; -/* 1:54 */waypoints[292].children[1] = 293; -/* 1:54 */waypoints[293] = spawnstruct(); -/* 1:54 */waypoints[293].origin = (1030.68, 162.674, 228.737); -/* 1:54 */waypoints[293].type = "stand"; -/* 1:54 */waypoints[293].children[0] = 292; -/* 1:54 */waypoints[293].children[1] = 120; -/* 1:54 */waypoints[293].children[2] = 106; -/* 1:54 */waypoints[294] = spawnstruct(); -/* 1:54 */waypoints[294].origin = (-1810.88, 898.049, -27.6879); -/* 1:54 */waypoints[294].type = "crouch"; -/* 1:54 */waypoints[294].children[0] = 28; -/* 1:54 */waypoints[294].angles = (5.31738, 18.5229, 0); -/* 1:54 */waypoints[295] = spawnstruct(); -/* 1:54 */waypoints[295].origin = (-1382.59, 1295.4, 25.146); -/* 1:54 */waypoints[295].type = "crouch"; -/* 1:54 */waypoints[295].children[0] = 28; -/* 1:54 */waypoints[295].children[1] = 25; -/* 1:54 */waypoints[296] = spawnstruct(); -/* 1:54 */waypoints[296].origin = (-2267.61, -747.799, 143.04); -/* 1:54 */waypoints[296].type = "stand"; -/* 1:54 */waypoints[296].children[0] = 269; -/* 1:54 */waypoints[296].children[1] = 297; -/* 1:54 */waypoints[296].children[2] = 299; -/* 1:54 */waypoints[297] = spawnstruct(); -/* 1:54 */waypoints[297].origin = (-2351.92, -508.791, 200.125); -/* 1:54 */waypoints[297].type = "stand"; -/* 1:54 */waypoints[297].children[0] = 296; -/* 1:54 */waypoints[297].children[1] = 60; -/* 1:54 */waypoints[298] = spawnstruct(); -/* 1:54 */waypoints[298].origin = (-2108.68, -722.209, 112.125); -/* 1:54 */waypoints[298].type = "climb"; -/* 1:54 */waypoints[298].children[0] = 272; -/* 1:54 */waypoints[298].children[1] = 299; -/* 1:54 */waypoints[298].angles = (12.2552, -179.918, 0); -/* 1:54 */waypoints[299] = spawnstruct(); -/* 1:54 */waypoints[299].origin = (-2125.7, -722.21, 158.125); -/* 1:54 */waypoints[299].type = "stand"; -/* 1:54 */waypoints[299].children[0] = 298; -/* 1:54 */waypoints[299].children[1] = 296; -/* 1:54 */return waypoints; -} +Seatown() +{ +/* 1:54 */waypoints = []; +/* 1:54 */waypoints[0] = spawnstruct(); +/* 1:54 */waypoints[0].origin = (274.125, 508.147, 208.125); +/* 1:54 */waypoints[0].type = "climb"; +/* 1:54 */waypoints[0].children[0] = 1; +/* 1:54 */waypoints[0].children[1] = 94; +/* 1:54 */waypoints[0].angles = (3.19031, 179.72, 0); +/* 1:54 */waypoints[1] = spawnstruct(); +/* 1:54 */waypoints[1].origin = (254.987, 490.885, 265.178); +/* 1:54 */waypoints[1].type = "stand"; +/* 1:54 */waypoints[1].children[0] = 0; +/* 1:54 */waypoints[1].children[1] = 2; +/* 1:54 */waypoints[2] = spawnstruct(); +/* 1:54 */waypoints[2].origin = (212.125, 490.913, 273.45); +/* 1:54 */waypoints[2].type = "climb"; +/* 1:54 */waypoints[2].children[0] = 1; +/* 1:54 */waypoints[2].children[1] = 3; +/* 1:54 */waypoints[2].angles = (4.42078, 179.896, 0); +/* 1:54 */waypoints[3] = spawnstruct(); +/* 1:54 */waypoints[3].origin = (196.098, 490.913, 352.125); +/* 1:54 */waypoints[3].type = "stand"; +/* 1:54 */waypoints[3].children[0] = 2; +/* 1:54 */waypoints[3].children[1] = 4; +/* 1:54 */waypoints[4] = spawnstruct(); +/* 1:54 */waypoints[4].origin = (173.875, 490.919, 320.125); +/* 1:54 */waypoints[4].type = "climb"; +/* 1:54 */waypoints[4].children[0] = 3; +/* 1:54 */waypoints[4].children[1] = 5; +/* 1:54 */waypoints[4].angles = (17.2473, -1.04919, 0); +/* 1:54 */waypoints[5] = spawnstruct(); +/* 1:54 */waypoints[5].origin = (17.3134, 491.224, 320.125); +/* 1:54 */waypoints[5].type = "stand"; +/* 1:54 */waypoints[5].children[0] = 4; +/* 1:54 */waypoints[5].children[1] = 6; +/* 1:54 */waypoints[5].children[2] = 17; +/* 1:54 */waypoints[5].children[3] = 279; +/* 1:54 */waypoints[6] = spawnstruct(); +/* 1:54 */waypoints[6].origin = (27.0443, 618.823, 320.625); +/* 1:54 */waypoints[6].type = "stand"; +/* 1:54 */waypoints[6].children[0] = 5; +/* 1:54 */waypoints[6].children[1] = 7; +/* 1:54 */waypoints[6].children[2] = 12; +/* 1:54 */waypoints[7] = spawnstruct(); +/* 1:54 */waypoints[7].origin = (64.6581, 742.875, 322.125); +/* 1:54 */waypoints[7].type = "climb"; +/* 1:54 */waypoints[7].children[0] = 6; +/* 1:54 */waypoints[7].children[1] = 8; +/* 1:54 */waypoints[7].children[2] = 280; +/* 1:54 */waypoints[7].angles = (17.0551, 89.3188, 0); +/* 1:54 */waypoints[8] = spawnstruct(); +/* 1:54 */waypoints[8].origin = (64.661, 760.034, 356.125); +/* 1:54 */waypoints[8].type = "stand"; +/* 1:54 */waypoints[8].children[0] = 7; +/* 1:54 */waypoints[8].children[1] = 9; +/* 1:54 */waypoints[9] = spawnstruct(); +/* 1:54 */waypoints[9].origin = (73.0425, 777.138, 322.125); +/* 1:54 */waypoints[9].type = "climb"; +/* 1:54 */waypoints[9].children[0] = 8; +/* 1:54 */waypoints[9].children[1] = 10; +/* 1:54 */waypoints[9].angles = (11.7102, -92.4609, 0); +/* 1:54 */waypoints[10] = spawnstruct(); +/* 1:54 */waypoints[10].origin = (73.5488, 905.462, 322.125); +/* 1:54 */waypoints[10].type = "stand"; +/* 1:54 */waypoints[10].children[0] = 9; +/* 1:54 */waypoints[10].children[1] = 11; +/* 1:54 */waypoints[11] = spawnstruct(); +/* 1:54 */waypoints[11].origin = (71.4178, 1189.72, 322.125); +/* 1:54 */waypoints[11].type = "crouch"; +/* 1:54 */waypoints[11].children[0] = 10; +/* 1:54 */waypoints[11].angles = (18.5986, -148.903, 0); +/* 1:54 */waypoints[12] = spawnstruct(); +/* 1:54 */waypoints[12].origin = (-134.681, 672.431, 320.125); +/* 1:54 */waypoints[12].type = "stand"; +/* 1:54 */waypoints[12].children[0] = 6; +/* 1:54 */waypoints[12].children[1] = 13; +/* 1:54 */waypoints[12].children[2] = 16; +/* 1:54 */waypoints[13] = spawnstruct(); +/* 1:54 */waypoints[13].origin = (-171.875, 672.452, 320.125); +/* 1:54 */waypoints[13].type = "climb"; +/* 1:54 */waypoints[13].children[0] = 12; +/* 1:54 */waypoints[13].children[1] = 14; +/* 1:54 */waypoints[13].angles = (25.7892, 178.693, 0); +/* 1:54 */waypoints[14] = spawnstruct(); +/* 1:54 */waypoints[14].origin = (-188.74, 672.458, 356.125); +/* 1:54 */waypoints[14].type = "stand"; +/* 1:54 */waypoints[14].children[0] = 13; +/* 1:54 */waypoints[14].children[1] = 15; +/* 1:54 */waypoints[15] = spawnstruct(); +/* 1:54 */waypoints[15].origin = (-302.975, 670.183, 344.143); +/* 1:54 */waypoints[15].type = "crouch"; +/* 1:54 */waypoints[15].children[0] = 14; +/* 1:54 */waypoints[15].angles = (26.4923, 178.693, 0); +/* 1:54 */waypoints[16] = spawnstruct(); +/* 1:54 */waypoints[16].origin = (-116.378, 639.139, 320.125); +/* 1:54 */waypoints[16].type = "claymore"; +/* 1:54 */waypoints[16].children[0] = 12; +/* 1:54 */waypoints[16].angles = (13.8361, -6.87195, 0); +/* 1:54 */waypoints[17] = spawnstruct(); +/* 1:54 */waypoints[17].origin = (-104.261, 484.913, 320.125); +/* 1:54 */waypoints[17].type = "stand"; +/* 1:54 */waypoints[17].children[0] = 5; +/* 1:54 */waypoints[17].children[1] = 18; +/* 1:54 */waypoints[18] = spawnstruct(); +/* 1:54 */waypoints[18].origin = (-238.436, 489.518, 248.125); +/* 1:54 */waypoints[18].type = "stand"; +/* 1:54 */waypoints[18].children[0] = 17; +/* 1:54 */waypoints[18].children[1] = 19; +/* 1:54 */waypoints[19] = spawnstruct(); +/* 1:54 */waypoints[19].origin = (-246.869, 652.549, 168.125); +/* 1:54 */waypoints[19].type = "stand"; +/* 1:54 */waypoints[19].children[0] = 18; +/* 1:54 */waypoints[19].children[1] = 20; +/* 1:54 */waypoints[19].children[2] = 21; +/* 1:54 */waypoints[20] = spawnstruct(); +/* 1:54 */waypoints[20].origin = (-101.312, 683.22, 168.125); +/* 1:54 */waypoints[20].type = "stand"; +/* 1:54 */waypoints[20].children[0] = 19; +/* 1:54 */waypoints[20].children[1] = 156; +/* 1:54 */waypoints[21] = spawnstruct(); +/* 1:54 */waypoints[21].origin = (-443.473, 662.611, 100.125); +/* 1:54 */waypoints[21].type = "stand"; +/* 1:54 */waypoints[21].children[0] = 19; +/* 1:54 */waypoints[21].children[1] = 22; +/* 1:54 */waypoints[22] = spawnstruct(); +/* 1:54 */waypoints[22].origin = (-677.535, 784.091, 86.1192); +/* 1:54 */waypoints[22].type = "stand"; +/* 1:54 */waypoints[22].children[0] = 21; +/* 1:54 */waypoints[22].children[1] = 23; +/* 1:54 */waypoints[22].children[2] = 161; +/* 1:54 */waypoints[23] = spawnstruct(); +/* 1:54 */waypoints[23].origin = (-986.45, 1007.4, 31.5662); +/* 1:54 */waypoints[23].type = "stand"; +/* 1:54 */waypoints[23].children[0] = 22; +/* 1:54 */waypoints[23].children[1] = 24; +/* 1:54 */waypoints[23].children[2] = 25; +/* 1:54 */waypoints[24] = spawnstruct(); +/* 1:54 */waypoints[24].origin = (-660.472, 1237.22, 54.9324); +/* 1:54 */waypoints[24].type = "stand"; +/* 1:54 */waypoints[24].children[0] = 23; +/* 1:54 */waypoints[24].children[1] = 83; +/* 1:54 */waypoints[24].children[2] = 85; +/* 1:54 */waypoints[25] = spawnstruct(); +/* 1:54 */waypoints[25].origin = (-1247.54, 1030.34, 18.7169); +/* 1:54 */waypoints[25].type = "stand"; +/* 1:54 */waypoints[25].children[0] = 23; +/* 1:54 */waypoints[25].children[1] = 26; +/* 1:54 */waypoints[25].children[2] = 27; +/* 1:54 */waypoints[25].children[3] = 28; +/* 1:54 */waypoints[25].children[4] = 295; +/* 1:54 */waypoints[26] = spawnstruct(); +/* 1:54 */waypoints[26].origin = (-1242.29, 835.146, 43.2297); +/* 1:54 */waypoints[26].type = "crouch"; +/* 1:54 */waypoints[26].children[0] = 25; +/* 1:54 */waypoints[26].angles = (10.1501, 89.599, 0); +/* 1:54 */waypoints[27] = spawnstruct(); +/* 1:54 */waypoints[27].origin = (-1239.13, 1242.38, 53.1472); +/* 1:54 */waypoints[27].type = "crouch"; +/* 1:54 */waypoints[27].children[0] = 25; +/* 1:54 */waypoints[27].angles = (15.9454, -93.9386, 0); +/* 1:54 */waypoints[28] = spawnstruct(); +/* 1:54 */waypoints[28].origin = (-1467.26, 1055.12, 9.69966); +/* 1:54 */waypoints[28].type = "stand"; +/* 1:54 */waypoints[28].children[0] = 25; +/* 1:54 */waypoints[28].children[1] = 29; +/* 1:54 */waypoints[28].children[2] = 294; +/* 1:54 */waypoints[28].children[3] = 295; +/* 1:54 */waypoints[28].children[4] = 33; +/* 1:54 */waypoints[29] = spawnstruct(); +/* 1:54 */waypoints[29].origin = (-1662.44, 1169.64, 33.7564); +/* 1:54 */waypoints[29].type = "stand"; +/* 1:54 */waypoints[29].children[0] = 28; +/* 1:54 */waypoints[29].children[1] = 30; +/* 1:54 */waypoints[30] = spawnstruct(); +/* 1:54 */waypoints[30].origin = (-1919.46, 1371.78, 51.3662); +/* 1:54 */waypoints[30].type = "stand"; +/* 1:54 */waypoints[30].children[0] = 29; +/* 1:54 */waypoints[30].children[1] = 31; +/* 1:54 */waypoints[30].children[2] = 32; +/* 1:54 */waypoints[31] = spawnstruct(); +/* 1:54 */waypoints[31].origin = (-2063.61, 1519.6, 48.125); +/* 1:54 */waypoints[31].type = "crouch"; +/* 1:54 */waypoints[31].children[0] = 30; +/* 1:54 */waypoints[31].angles = (10.7654, -51.7291, 0); +/* 1:54 */waypoints[32] = spawnstruct(); +/* 1:54 */waypoints[32].origin = (-1955.52, 1552.15, 128.125); +/* 1:54 */waypoints[32].type = "stand"; +/* 1:54 */waypoints[32].children[0] = 30; +/* 1:54 */waypoints[32].children[1] = 33; +/* 1:54 */waypoints[33] = spawnstruct(); +/* 1:54 */waypoints[33].origin = (-2125.41, 1461.87, 200.125); +/* 1:54 */waypoints[33].type = "stand"; +/* 1:54 */waypoints[33].children[0] = 32; +/* 1:54 */waypoints[33].children[1] = 34; +/* 1:54 */waypoints[33].children[2] = 44; +/* 1:54 */waypoints[33].children[3] = 28; +/* 1:54 */waypoints[34] = spawnstruct(); +/* 1:54 */waypoints[34].origin = (-2120.17, 1299, 200.125); +/* 1:54 */waypoints[34].type = "stand"; +/* 1:54 */waypoints[34].children[0] = 33; +/* 1:54 */waypoints[34].children[1] = 35; +/* 1:54 */waypoints[35] = spawnstruct(); +/* 1:54 */waypoints[35].origin = (-2050.7, 1170.51, 200.125); +/* 1:54 */waypoints[35].type = "stand"; +/* 1:54 */waypoints[35].children[0] = 34; +/* 1:54 */waypoints[35].children[1] = 36; +/* 1:54 */waypoints[35].children[2] = 37; +/* 1:54 */waypoints[35].children[3] = 72; +/* 1:54 */waypoints[35].children[4] = 77; +/* 1:54 */waypoints[36] = spawnstruct(); +/* 1:54 */waypoints[36].origin = (-2244.1, 1157.56, 200.125); +/* 1:54 */waypoints[36].type = "crouch"; +/* 1:54 */waypoints[36].children[0] = 35; +/* 1:54 */waypoints[36].angles = (16.0333, 8.94287, 0); +/* 1:54 */waypoints[37] = spawnstruct(); +/* 1:54 */waypoints[37].origin = (-1905.17, 1172.86, 200.125); +/* 1:54 */waypoints[37].type = "stand"; +/* 1:54 */waypoints[37].children[0] = 35; +/* 1:54 */waypoints[37].children[1] = 38; +/* 1:54 */waypoints[37].children[2] = 39; +/* 1:54 */waypoints[37].children[3] = 76; +/* 1:54 */waypoints[38] = spawnstruct(); +/* 1:54 */waypoints[38].origin = (-1933.37, 1119.12, 200.125); +/* 1:54 */waypoints[38].type = "claymore"; +/* 1:54 */waypoints[38].children[0] = 37; +/* 1:54 */waypoints[38].angles = (14.0997, 150.172, 0); +/* 1:54 */waypoints[39] = spawnstruct(); +/* 1:54 */waypoints[39].origin = (-1813.8, 1260.04, 200.125); +/* 1:54 */waypoints[39].type = "stand"; +/* 1:54 */waypoints[39].children[0] = 37; +/* 1:54 */waypoints[39].children[1] = 40; +/* 1:54 */waypoints[40] = spawnstruct(); +/* 1:54 */waypoints[40].origin = (-1674.39, 1444.7, 200.125); +/* 1:54 */waypoints[40].type = "stand"; +/* 1:54 */waypoints[40].children[0] = 39; +/* 1:54 */waypoints[40].children[1] = 41; +/* 1:54 */waypoints[40].children[2] = 42; +/* 1:54 */waypoints[40].children[3] = 45; +/* 1:54 */waypoints[41] = spawnstruct(); +/* 1:54 */waypoints[41].origin = (-1584.3, 1577.72, 200.125); +/* 1:54 */waypoints[41].type = "crouch"; +/* 1:54 */waypoints[41].children[0] = 40; +/* 1:54 */waypoints[41].angles = (14.0118, -135.813, 0); +/* 1:54 */waypoints[42] = spawnstruct(); +/* 1:54 */waypoints[42].origin = (-1774.71, 1601.75, 200.125); +/* 1:54 */waypoints[42].type = "stand"; +/* 1:54 */waypoints[42].children[0] = 40; +/* 1:54 */waypoints[42].children[1] = 43; +/* 1:54 */waypoints[43] = spawnstruct(); +/* 1:54 */waypoints[43].origin = (-2048.46, 1741.24, 239.615); +/* 1:54 */waypoints[43].type = "stand"; +/* 1:54 */waypoints[43].children[0] = 42; +/* 1:54 */waypoints[43].children[1] = 44; +/* 1:54 */waypoints[44] = spawnstruct(); +/* 1:54 */waypoints[44].origin = (-2235.12, 1601.79, 200.125); +/* 1:54 */waypoints[44].type = "stand"; +/* 1:54 */waypoints[44].children[0] = 43; +/* 1:54 */waypoints[44].children[1] = 33; +/* 1:54 */waypoints[45] = spawnstruct(); +/* 1:54 */waypoints[45].origin = (-1442.22, 1456.48, 205.189); +/* 1:54 */waypoints[45].type = "stand"; +/* 1:54 */waypoints[45].children[0] = 40; +/* 1:54 */waypoints[45].children[1] = 46; +/* 1:54 */waypoints[46] = spawnstruct(); +/* 1:54 */waypoints[46].origin = (-1116.27, 1446.53, 236.37); +/* 1:54 */waypoints[46].type = "stand"; +/* 1:54 */waypoints[46].children[0] = 45; +/* 1:54 */waypoints[46].children[1] = 47; +/* 1:54 */waypoints[46].children[2] = 81; +/* 1:54 */waypoints[46].children[3] = 82; +/* 1:54 */waypoints[47] = spawnstruct(); +/* 1:54 */waypoints[47].origin = (-1095.75, 1209.61, 246.776); +/* 1:54 */waypoints[47].type = "stand"; +/* 1:54 */waypoints[47].children[0] = 46; +/* 1:54 */waypoints[47].children[1] = 48; +/* 1:54 */waypoints[48] = spawnstruct(); +/* 1:54 */waypoints[48].origin = (-1093.37, 848.261, 292.768); +/* 1:54 */waypoints[48].type = "stand"; +/* 1:54 */waypoints[48].children[0] = 47; +/* 1:54 */waypoints[48].children[1] = 49; +/* 1:54 */waypoints[49] = spawnstruct(); +/* 1:54 */waypoints[49].origin = (-1090.85, 554.352, 304.125); +/* 1:54 */waypoints[49].type = "stand"; +/* 1:54 */waypoints[49].children[0] = 48; +/* 1:54 */waypoints[49].children[1] = 50; +/* 1:54 */waypoints[50] = spawnstruct(); +/* 1:54 */waypoints[50].origin = (-1090.8, 481.513, 304.125); +/* 1:54 */waypoints[50].type = "stand"; +/* 1:54 */waypoints[50].children[0] = 49; +/* 1:54 */waypoints[50].children[1] = 51; +/* 1:54 */waypoints[50].children[2] = 275; +/* 1:54 */waypoints[51] = spawnstruct(); +/* 1:54 */waypoints[51].origin = (-1191.84, 476.016, 304.125); +/* 1:54 */waypoints[51].type = "climb"; +/* 1:54 */waypoints[51].children[0] = 50; +/* 1:54 */waypoints[51].children[1] = 52; +/* 1:54 */waypoints[51].angles = (15.6982, 179.824, 0); +/* 1:54 */waypoints[52] = spawnstruct(); +/* 1:54 */waypoints[52].origin = (-1219.52, 476.823, 336.125); +/* 1:54 */waypoints[52].type = "stand"; +/* 1:54 */waypoints[52].children[0] = 51; +/* 1:54 */waypoints[52].children[1] = 53; +/* 1:54 */waypoints[53] = spawnstruct(); +/* 1:54 */waypoints[53].origin = (-1244.15, 484.429, 168.125); +/* 1:54 */waypoints[53].type = "climb"; +/* 1:54 */waypoints[53].children[0] = 52; +/* 1:54 */waypoints[53].children[1] = 54; +/* 1:54 */waypoints[53].angles = (-50.9229, -1.12061, 0); +/* 1:54 */waypoints[54] = spawnstruct(); +/* 1:54 */waypoints[54].origin = (-1364.94, 474.427, 168.004); +/* 1:54 */waypoints[54].type = "stand"; +/* 1:54 */waypoints[54].children[0] = 53; +/* 1:54 */waypoints[54].children[1] = 55; +/* 1:54 */waypoints[54].children[2] = 64; +/* 1:54 */waypoints[54].children[3] = 65; +/* 1:54 */waypoints[54].children[4] = 66; +/* 1:54 */waypoints[54].children[5] = 67; +/* 1:54 */waypoints[55] = spawnstruct(); +/* 1:54 */waypoints[55].origin = (-1467.72, 274.409, 168.125); +/* 1:54 */waypoints[55].type = "stand"; +/* 1:54 */waypoints[55].children[0] = 54; +/* 1:54 */waypoints[55].children[1] = 56; +/* 1:54 */waypoints[56] = spawnstruct(); +/* 1:54 */waypoints[56].origin = (-1537.02, 99.5108, 168.125); +/* 1:54 */waypoints[56].type = "stand"; +/* 1:54 */waypoints[56].children[0] = 55; +/* 1:54 */waypoints[56].children[1] = 57; +/* 1:54 */waypoints[56].children[2] = 58; +/* 1:54 */waypoints[57] = spawnstruct(); +/* 1:54 */waypoints[57].origin = (-1445.13, -214.138, 168.125); +/* 1:54 */waypoints[57].type = "stand"; +/* 1:54 */waypoints[57].children[0] = 56; +/* 1:54 */waypoints[57].children[1] = 184; +/* 1:54 */waypoints[57].children[2] = 185; +/* 1:54 */waypoints[58] = spawnstruct(); +/* 1:54 */waypoints[58].origin = (-1889.85, 69.8914, 188.125); +/* 1:54 */waypoints[58].type = "stand"; +/* 1:54 */waypoints[58].children[0] = 56; +/* 1:54 */waypoints[58].children[1] = 59; +/* 1:54 */waypoints[58].children[2] = 274; +/* 1:54 */waypoints[59] = spawnstruct(); +/* 1:54 */waypoints[59].origin = (-2072.83, -280.958, 188.125); +/* 1:54 */waypoints[59].type = "stand"; +/* 1:54 */waypoints[59].children[0] = 58; +/* 1:54 */waypoints[59].children[1] = 60; +/* 1:54 */waypoints[59].children[2] = 273; +/* 1:54 */waypoints[59].children[3] = 274; +/* 1:54 */waypoints[60] = spawnstruct(); +/* 1:54 */waypoints[60].origin = (-2451.8, -328.837, 188.165); +/* 1:54 */waypoints[60].type = "stand"; +/* 1:54 */waypoints[60].children[0] = 59; +/* 1:54 */waypoints[60].children[1] = 61; +/* 1:54 */waypoints[60].children[2] = 203; +/* 1:54 */waypoints[60].children[3] = 297; +/* 1:54 */waypoints[60].children[4] = 273; +/* 1:54 */waypoints[61] = spawnstruct(); +/* 1:54 */waypoints[61].origin = (-2543.37, 95.6241, 188.294); +/* 1:54 */waypoints[61].type = "stand"; +/* 1:54 */waypoints[61].children[0] = 60; +/* 1:54 */waypoints[61].children[1] = 62; +/* 1:54 */waypoints[62] = spawnstruct(); +/* 1:54 */waypoints[62].origin = (-2433.08, 523.439, 188.125); +/* 1:54 */waypoints[62].type = "stand"; +/* 1:54 */waypoints[62].children[0] = 61; +/* 1:54 */waypoints[62].children[1] = 63; +/* 1:54 */waypoints[63] = spawnstruct(); +/* 1:54 */waypoints[63].origin = (-1992.49, 505.632, 189.369); +/* 1:54 */waypoints[63].type = "stand"; +/* 1:54 */waypoints[63].children[0] = 62; +/* 1:54 */waypoints[63].children[1] = 64; +/* 1:54 */waypoints[63].children[2] = 69; +/* 1:54 */waypoints[63].children[3] = 274; +/* 1:54 */waypoints[64] = spawnstruct(); +/* 1:54 */waypoints[64].origin = (-1641.45, 675.679, 220.125); +/* 1:54 */waypoints[64].type = "stand"; +/* 1:54 */waypoints[64].children[0] = 63; +/* 1:54 */waypoints[64].children[1] = 54; +/* 1:54 */waypoints[64].children[2] = 67; +/* 1:54 */waypoints[65] = spawnstruct(); +/* 1:54 */waypoints[65].origin = (-1240.13, 365.125, 168.125); +/* 1:54 */waypoints[65].type = "crouch"; +/* 1:54 */waypoints[65].children[0] = 54; +/* 1:54 */waypoints[65].angles = (10.3149, 132.281, 0); +/* 1:54 */waypoints[66] = spawnstruct(); +/* 1:54 */waypoints[66].origin = (-1240.12, 564.875, 168.125); +/* 1:54 */waypoints[66].type = "crouch"; +/* 1:54 */waypoints[66].children[0] = 54; +/* 1:54 */waypoints[66].angles = (9.7876, -150.672, 0); +/* 1:54 */waypoints[67] = spawnstruct(); +/* 1:54 */waypoints[67].origin = (-1405.17, 717.823, 168.19); +/* 1:54 */waypoints[67].type = "stand"; +/* 1:54 */waypoints[67].children[0] = 54; +/* 1:54 */waypoints[67].children[1] = 68; +/* 1:54 */waypoints[67].children[2] = 64; +/* 1:54 */waypoints[68] = spawnstruct(); +/* 1:54 */waypoints[68].origin = (-1266.13, 740.147, 168.895); +/* 1:54 */waypoints[68].type = "crouch"; +/* 1:54 */waypoints[68].children[0] = 67; +/* 1:54 */waypoints[68].angles = (8.02979, -168.503, 0); +/* 1:54 */waypoints[69] = spawnstruct(); +/* 1:54 */waypoints[69].origin = (-1960.28, 728.521, 192.044); +/* 1:54 */waypoints[69].type = "stand"; +/* 1:54 */waypoints[69].children[0] = 63; +/* 1:54 */waypoints[69].children[1] = 70; +/* 1:54 */waypoints[70] = spawnstruct(); +/* 1:54 */waypoints[70].origin = (-1970.28, 939.679, 192.746); +/* 1:54 */waypoints[70].type = "stand"; +/* 1:54 */waypoints[70].children[0] = 69; +/* 1:54 */waypoints[70].children[1] = 71; +/* 1:54 */waypoints[70].children[2] = 73; +/* 1:54 */waypoints[70].children[3] = 80; +/* 1:54 */waypoints[71] = spawnstruct(); +/* 1:54 */waypoints[71].origin = (-1976.85, 1012.92, 200.125); +/* 1:54 */waypoints[71].type = "stand"; +/* 1:54 */waypoints[71].children[0] = 70; +/* 1:54 */waypoints[71].children[1] = 72; +/* 1:54 */waypoints[72] = spawnstruct(); +/* 1:54 */waypoints[72].origin = (-2027.63, 1100.88, 200.125); +/* 1:54 */waypoints[72].type = "stand"; +/* 1:54 */waypoints[72].children[0] = 71; +/* 1:54 */waypoints[72].children[1] = 35; +/* 1:54 */waypoints[73] = spawnstruct(); +/* 1:54 */waypoints[73].origin = (-1867.16, 958.385, 191.302); +/* 1:54 */waypoints[73].type = "stand"; +/* 1:54 */waypoints[73].children[0] = 70; +/* 1:54 */waypoints[73].children[1] = 74; +/* 1:54 */waypoints[74] = spawnstruct(); +/* 1:54 */waypoints[74].origin = (-1873.26, 1007.25, 200.04); +/* 1:54 */waypoints[74].type = "climb"; +/* 1:54 */waypoints[74].children[0] = 73; +/* 1:54 */waypoints[74].children[1] = 75; +/* 1:54 */waypoints[74].angles = (15.5334, 91.225, 0); +/* 1:54 */waypoints[75] = spawnstruct(); +/* 1:54 */waypoints[75].origin = (-1873.27, 1066.24, 236.125); +/* 1:54 */waypoints[75].type = "stand"; +/* 1:54 */waypoints[75].children[0] = 74; +/* 1:54 */waypoints[75].children[1] = 76; +/* 1:54 */waypoints[76] = spawnstruct(); +/* 1:54 */waypoints[76].origin = (-1873.94, 1123.17, 200.125); +/* 1:54 */waypoints[76].type = "climb"; +/* 1:54 */waypoints[76].children[0] = 75; +/* 1:54 */waypoints[76].children[1] = 37; +/* 1:54 */waypoints[76].angles = (10.26, -88.8025, 0); +/* 1:54 */waypoints[77] = spawnstruct(); +/* 1:54 */waypoints[77].origin = (-2129.51, 1122.93, 200.125); +/* 1:54 */waypoints[77].type = "climb"; +/* 1:54 */waypoints[77].children[0] = 35; +/* 1:54 */waypoints[77].children[1] = 78; +/* 1:54 */waypoints[77].angles = (14.9347, -92.3126, 0); +/* 1:54 */waypoints[78] = spawnstruct(); +/* 1:54 */waypoints[78].origin = (-2129.53, 1073.06, 236.125); +/* 1:54 */waypoints[78].type = "stand"; +/* 1:54 */waypoints[78].children[0] = 77; +/* 1:54 */waypoints[78].children[1] = 79; +/* 1:54 */waypoints[79] = spawnstruct(); +/* 1:54 */waypoints[79].origin = (-2129.95, 1007.46, 199.986); +/* 1:54 */waypoints[79].type = "climb"; +/* 1:54 */waypoints[79].children[0] = 78; +/* 1:54 */waypoints[79].children[1] = 80; +/* 1:54 */waypoints[79].angles = (8.85925, 88.8464, 0); +/* 1:54 */waypoints[80] = spawnstruct(); +/* 1:54 */waypoints[80].origin = (-2136.88, 907.407, 192.48); +/* 1:54 */waypoints[80].type = "stand"; +/* 1:54 */waypoints[80].children[0] = 79; +/* 1:54 */waypoints[80].children[1] = 70; +/* 1:54 */waypoints[81] = spawnstruct(); +/* 1:54 */waypoints[81].origin = (-993.125, 1531.86, 237.701); +/* 1:54 */waypoints[81].type = "crouch"; +/* 1:54 */waypoints[81].children[0] = 46; +/* 1:54 */waypoints[81].angles = (15.2698, -132.55, 0); +/* 1:54 */waypoints[82] = spawnstruct(); +/* 1:54 */waypoints[82].origin = (-1014.69, 1362.58, 238.36); +/* 1:54 */waypoints[82].type = "stand"; +/* 1:54 */waypoints[82].children[0] = 46; +/* 1:54 */waypoints[82].children[1] = 83; +/* 1:54 */waypoints[83] = spawnstruct(); +/* 1:54 */waypoints[83].origin = (-670.348, 1354.02, 72.125); +/* 1:54 */waypoints[83].type = "stand"; +/* 1:54 */waypoints[83].children[0] = 82; +/* 1:54 */waypoints[83].children[1] = 84; +/* 1:54 */waypoints[83].children[2] = 24; +/* 1:54 */waypoints[84] = spawnstruct(); +/* 1:54 */waypoints[84].origin = (-775.694, 1297.13, 114.516); +/* 1:54 */waypoints[84].type = "claymore"; +/* 1:54 */waypoints[84].children[0] = 83; +/* 1:54 */waypoints[84].angles = (32.3151, 0.12085, 0); +/* 1:54 */waypoints[85] = spawnstruct(); +/* 1:54 */waypoints[85].origin = (-409.769, 1181.6, 68.6791); +/* 1:54 */waypoints[85].type = "stand"; +/* 1:54 */waypoints[85].children[0] = 24; +/* 1:54 */waypoints[85].children[1] = 86; +/* 1:54 */waypoints[86] = spawnstruct(); +/* 1:54 */waypoints[86].origin = (-165.999, 1178.28, 77.905); +/* 1:54 */waypoints[86].type = "stand"; +/* 1:54 */waypoints[86].children[0] = 85; +/* 1:54 */waypoints[86].children[1] = 87; +/* 1:54 */waypoints[86].children[2] = 88; +/* 1:54 */waypoints[87] = spawnstruct(); +/* 1:54 */waypoints[87].origin = (-141.099, 1305, 112.125); +/* 1:54 */waypoints[87].type = "crouch"; +/* 1:54 */waypoints[87].children[0] = 86; +/* 1:54 */waypoints[87].angles = (11.7542, -92.6257, 0); +/* 1:54 */waypoints[88] = spawnstruct(); +/* 1:54 */waypoints[88].origin = (54.1837, 1154.28, 85.3308); +/* 1:54 */waypoints[88].type = "stand"; +/* 1:54 */waypoints[88].children[0] = 86; +/* 1:54 */waypoints[88].children[1] = 89; +/* 1:54 */waypoints[89] = spawnstruct(); +/* 1:54 */waypoints[89].origin = (149.727, 1156.76, 89.7882); +/* 1:54 */waypoints[89].type = "stand"; +/* 1:54 */waypoints[89].children[0] = 88; +/* 1:54 */waypoints[89].children[1] = 90; +/* 1:54 */waypoints[89].children[2] = 91; +/* 1:54 */waypoints[89].children[3] = 92; +/* 1:54 */waypoints[90] = spawnstruct(); +/* 1:54 */waypoints[90].origin = (132.125, 1260.88, 88.9296); +/* 1:54 */waypoints[90].type = "claymore"; +/* 1:54 */waypoints[90].children[0] = 89; +/* 1:54 */waypoints[90].angles = (8.06824, -87.9675, 0); +/* 1:54 */waypoints[91] = spawnstruct(); +/* 1:54 */waypoints[91].origin = (137.236, 1036.16, 91.1789); +/* 1:54 */waypoints[91].type = "claymore"; +/* 1:54 */waypoints[91].children[0] = 89; +/* 1:54 */waypoints[91].children[1] = 147; +/* 1:54 */waypoints[91].angles = (12.8967, 86.3855, 0); +/* 1:54 */waypoints[92] = spawnstruct(); +/* 1:54 */waypoints[92].origin = (383.158, 1054.73, 122.632); +/* 1:54 */waypoints[92].type = "stand"; +/* 1:54 */waypoints[92].children[0] = 89; +/* 1:54 */waypoints[92].children[1] = 93; +/* 1:54 */waypoints[92].children[2] = 137; +/* 1:54 */waypoints[92].children[3] = 147; +/* 1:54 */waypoints[92].children[4] = 146; +/* 1:54 */waypoints[93] = spawnstruct(); +/* 1:54 */waypoints[93].origin = (308.794, 737.761, 152.125); +/* 1:54 */waypoints[93].type = "stand"; +/* 1:54 */waypoints[93].children[0] = 92; +/* 1:54 */waypoints[93].children[1] = 94; +/* 1:54 */waypoints[93].children[2] = 146; +/* 1:54 */waypoints[93].children[3] = 147; +/* 1:54 */waypoints[94] = spawnstruct(); +/* 1:54 */waypoints[94].origin = (344.198, 504.627, 208.125); +/* 1:54 */waypoints[94].type = "stand"; +/* 1:54 */waypoints[94].children[0] = 93; +/* 1:54 */waypoints[94].children[1] = 0; +/* 1:54 */waypoints[94].children[2] = 95; +/* 1:54 */waypoints[95] = spawnstruct(); +/* 1:54 */waypoints[95].origin = (262.72, 357.555, 208.125); +/* 1:54 */waypoints[95].type = "stand"; +/* 1:54 */waypoints[95].children[0] = 94; +/* 1:54 */waypoints[95].children[1] = 96; +/* 1:54 */waypoints[96] = spawnstruct(); +/* 1:54 */waypoints[96].origin = (261.378, 243.971, 208.125); +/* 1:54 */waypoints[96].type = "stand"; +/* 1:54 */waypoints[96].children[0] = 95; +/* 1:54 */waypoints[96].children[1] = 97; +/* 1:54 */waypoints[96].children[2] = 148; +/* 1:54 */waypoints[97] = spawnstruct(); +/* 1:54 */waypoints[97].origin = (394.31, 220.458, 208.125); +/* 1:54 */waypoints[97].type = "stand"; +/* 1:54 */waypoints[97].children[0] = 96; +/* 1:54 */waypoints[97].children[1] = 98; +/* 1:54 */waypoints[98] = spawnstruct(); +/* 1:54 */waypoints[98].origin = (417.727, 87.1448, 208.125); +/* 1:54 */waypoints[98].type = "stand"; +/* 1:54 */waypoints[98].children[0] = 97; +/* 1:54 */waypoints[98].children[1] = 99; +/* 1:54 */waypoints[98].children[2] = 291; +/* 1:54 */waypoints[99] = spawnstruct(); +/* 1:54 */waypoints[99].origin = (417.741, -59.3928, 248.125); +/* 1:54 */waypoints[99].type = "stand"; +/* 1:54 */waypoints[99].children[0] = 98; +/* 1:54 */waypoints[99].children[1] = 100; +/* 1:54 */waypoints[99].children[2] = 101; +/* 1:54 */waypoints[100] = spawnstruct(); +/* 1:54 */waypoints[100].origin = (464.125, -43.1455, 248.125); +/* 1:54 */waypoints[100].type = "claymore"; +/* 1:54 */waypoints[100].children[0] = 99; +/* 1:54 */waypoints[100].angles = (23.7073, -178.627, 0); +/* 1:54 */waypoints[101] = spawnstruct(); +/* 1:54 */waypoints[101].origin = (563.644, -101.521, 248.125); +/* 1:54 */waypoints[101].type = "stand"; +/* 1:54 */waypoints[101].children[0] = 99; +/* 1:54 */waypoints[101].children[1] = 102; +/* 1:54 */waypoints[102] = spawnstruct(); +/* 1:54 */waypoints[102].origin = (772.628, -101.494, 248.125); +/* 1:54 */waypoints[102].type = "stand"; +/* 1:54 */waypoints[102].children[0] = 101; +/* 1:54 */waypoints[102].children[1] = 103; +/* 1:54 */waypoints[102].children[2] = 112; +/* 1:54 */waypoints[103] = spawnstruct(); +/* 1:54 */waypoints[103].origin = (924.211, -120.871, 248.125); +/* 1:54 */waypoints[103].type = "stand"; +/* 1:54 */waypoints[103].children[0] = 102; +/* 1:54 */waypoints[103].children[1] = 104; +/* 1:54 */waypoints[103].children[2] = 111; +/* 1:54 */waypoints[104] = spawnstruct(); +/* 1:54 */waypoints[104].origin = (993.873, -46.7099, 248.125); +/* 1:54 */waypoints[104].type = "climb"; +/* 1:54 */waypoints[104].children[0] = 103; +/* 1:54 */waypoints[104].children[1] = 105; +/* 1:54 */waypoints[104].angles = (27.1515, 1.31287, 0); +/* 1:54 */waypoints[105] = spawnstruct(); +/* 1:54 */waypoints[105].origin = (1012.11, -46.9633, 280.125); +/* 1:54 */waypoints[105].type = "stand"; +/* 1:54 */waypoints[105].children[0] = 104; +/* 1:54 */waypoints[105].children[1] = 106; +/* 1:54 */waypoints[106] = spawnstruct(); +/* 1:54 */waypoints[106].origin = (1032.13, -56.5955, 230.064); +/* 1:54 */waypoints[106].type = "climb"; +/* 1:54 */waypoints[106].children[0] = 105; +/* 1:54 */waypoints[106].children[1] = 107; +/* 1:54 */waypoints[106].children[2] = 293; +/* 1:54 */waypoints[106].angles = (2.84973, -178.484, 0); +/* 1:54 */waypoints[107] = spawnstruct(); +/* 1:54 */waypoints[107].origin = (1059.15, -221.774, 232.125); +/* 1:54 */waypoints[107].type = "stand"; +/* 1:54 */waypoints[107].children[0] = 106; +/* 1:54 */waypoints[107].children[1] = 108; +/* 1:54 */waypoints[107].children[2] = 109; +/* 1:54 */waypoints[107].children[3] = 117; +/* 1:54 */waypoints[108] = spawnstruct(); +/* 1:54 */waypoints[108].origin = (1060.25, -412.076, 232.125); +/* 1:54 */waypoints[108].type = "stand"; +/* 1:54 */waypoints[108].children[0] = 107; +/* 1:54 */waypoints[108].children[1] = 113; +/* 1:54 */waypoints[108].children[2] = 288; +/* 1:54 */waypoints[108].children[3] = 117; +/* 1:54 */waypoints[109] = spawnstruct(); +/* 1:54 */waypoints[109].origin = (1032.34, -216.529, 232.125); +/* 1:54 */waypoints[109].type = "climb"; +/* 1:54 */waypoints[109].children[0] = 107; +/* 1:54 */waypoints[109].children[1] = 110; +/* 1:54 */waypoints[109].angles = (7.34863, 178.885, 0); +/* 1:54 */waypoints[110] = spawnstruct(); +/* 1:54 */waypoints[110].origin = (1016.03, -216.529, 280.124); +/* 1:54 */waypoints[110].type = "stand"; +/* 1:54 */waypoints[110].children[0] = 109; +/* 1:54 */waypoints[110].children[1] = 111; +/* 1:54 */waypoints[111] = spawnstruct(); +/* 1:54 */waypoints[111].origin = (993.861, -217.628, 248.125); +/* 1:54 */waypoints[111].type = "climb"; +/* 1:54 */waypoints[111].children[0] = 110; +/* 1:54 */waypoints[111].children[1] = 103; +/* 1:54 */waypoints[111].angles = (10.3369, -2.71912, 0); +/* 1:54 */waypoints[112] = spawnstruct(); +/* 1:54 */waypoints[112].origin = (745.113, -212.155, 248.125); +/* 1:54 */waypoints[112].type = "stand"; +/* 1:54 */waypoints[112].children[0] = 102; +/* 1:54 */waypoints[112].children[1] = 113; +/* 1:54 */waypoints[113] = spawnstruct(); +/* 1:54 */waypoints[113].origin = (745.029, -404.927, 166.125); +/* 1:54 */waypoints[113].type = "stand"; +/* 1:54 */waypoints[113].children[0] = 112; +/* 1:54 */waypoints[113].children[1] = 108; +/* 1:54 */waypoints[113].children[2] = 114; +/* 1:54 */waypoints[114] = spawnstruct(); +/* 1:54 */waypoints[114].origin = (438.699, -407.297, 167.125); +/* 1:54 */waypoints[114].type = "stand"; +/* 1:54 */waypoints[114].children[0] = 113; +/* 1:54 */waypoints[114].children[1] = 115; +/* 1:54 */waypoints[114].children[2] = 224; +/* 1:54 */waypoints[115] = spawnstruct(); +/* 1:54 */waypoints[115].origin = (59.3499, -350.625, 170.125); +/* 1:54 */waypoints[115].type = "stand"; +/* 1:54 */waypoints[115].children[0] = 114; +/* 1:54 */waypoints[115].children[1] = 151; +/* 1:54 */waypoints[116] = spawnstruct(); +/* 1:54 */waypoints[116].origin = (18.1194, 149.725, 170.125); +/* 1:54 */waypoints[116].type = "stand"; +/* 1:54 */waypoints[116].children[0] = 149; +/* 1:54 */waypoints[116].children[1] = 152; +/* 1:54 */waypoints[117] = spawnstruct(); +/* 1:54 */waypoints[117].origin = (1237.19, -154.42, 230.982); +/* 1:54 */waypoints[117].type = "stand"; +/* 1:54 */waypoints[117].children[0] = 107; +/* 1:54 */waypoints[117].children[1] = 118; +/* 1:54 */waypoints[117].children[2] = 124; +/* 1:54 */waypoints[117].children[3] = 108; +/* 1:54 */waypoints[118] = spawnstruct(); +/* 1:54 */waypoints[118].origin = (1237.25, -2.83976, 230.98); +/* 1:54 */waypoints[118].type = "stand"; +/* 1:54 */waypoints[118].children[0] = 117; +/* 1:54 */waypoints[118].children[1] = 119; +/* 1:54 */waypoints[118].children[2] = 123; +/* 1:54 */waypoints[119] = spawnstruct(); +/* 1:54 */waypoints[119].origin = (1237.37, 140.805, 230.936); +/* 1:54 */waypoints[119].type = "stand"; +/* 1:54 */waypoints[119].children[0] = 118; +/* 1:54 */waypoints[119].children[1] = 120; +/* 1:54 */waypoints[119].children[2] = 122; +/* 1:54 */waypoints[120] = spawnstruct(); +/* 1:54 */waypoints[120].origin = (1237.51, 298.876, 230.125); +/* 1:54 */waypoints[120].type = "stand"; +/* 1:54 */waypoints[120].children[0] = 119; +/* 1:54 */waypoints[120].children[1] = 121; +/* 1:54 */waypoints[120].children[2] = 127; +/* 1:54 */waypoints[120].children[3] = 293; +/* 1:54 */waypoints[121] = spawnstruct(); +/* 1:54 */waypoints[121].origin = (1381.78, 317.644, 234.125); +/* 1:54 */waypoints[121].type = "stand"; +/* 1:54 */waypoints[121].children[0] = 120; +/* 1:54 */waypoints[121].children[1] = 122; +/* 1:54 */waypoints[122] = spawnstruct(); +/* 1:54 */waypoints[122].origin = (1381.82, 166.391, 234.125); +/* 1:54 */waypoints[122].type = "stand"; +/* 1:54 */waypoints[122].children[0] = 121; +/* 1:54 */waypoints[122].children[1] = 123; +/* 1:54 */waypoints[122].children[2] = 119; +/* 1:54 */waypoints[123] = spawnstruct(); +/* 1:54 */waypoints[123].origin = (1381.78, 15.5238, 234.125); +/* 1:54 */waypoints[123].type = "stand"; +/* 1:54 */waypoints[123].children[0] = 122; +/* 1:54 */waypoints[123].children[1] = 124; +/* 1:54 */waypoints[123].children[2] = 126; +/* 1:54 */waypoints[123].children[3] = 118; +/* 1:54 */waypoints[124] = spawnstruct(); +/* 1:54 */waypoints[124].origin = (1381.75, -134.601, 234.125); +/* 1:54 */waypoints[124].type = "stand"; +/* 1:54 */waypoints[124].children[0] = 123; +/* 1:54 */waypoints[124].children[1] = 125; +/* 1:54 */waypoints[124].children[2] = 117; +/* 1:54 */waypoints[125] = spawnstruct(); +/* 1:54 */waypoints[125].origin = (1502.88, -205.875, 234.125); +/* 1:54 */waypoints[125].type = "crouch"; +/* 1:54 */waypoints[125].children[0] = 124; +/* 1:54 */waypoints[125].angles = (15.0238, 154.786, 0); +/* 1:54 */waypoints[126] = spawnstruct(); +/* 1:54 */waypoints[126].origin = (1502.88, 28.875, 234.125); +/* 1:54 */waypoints[126].type = "crouch"; +/* 1:54 */waypoints[126].children[0] = 123; +/* 1:54 */waypoints[126].angles = (18.5394, -151.408, 0); +/* 1:54 */waypoints[127] = spawnstruct(); +/* 1:54 */waypoints[127].origin = (1222.89, 520.928, 173); +/* 1:54 */waypoints[127].type = "stand"; +/* 1:54 */waypoints[127].children[0] = 120; +/* 1:54 */waypoints[127].children[1] = 128; +/* 1:54 */waypoints[127].children[2] = 142; +/* 1:54 */waypoints[128] = spawnstruct(); +/* 1:54 */waypoints[128].origin = (1179.9, 812.072, 162.187); +/* 1:54 */waypoints[128].type = "stand"; +/* 1:54 */waypoints[128].children[0] = 127; +/* 1:54 */waypoints[128].children[1] = 129; +/* 1:54 */waypoints[128].children[2] = 139; +/* 1:54 */waypoints[128].children[3] = 140; +/* 1:54 */waypoints[128].children[4] = 142; +/* 1:54 */waypoints[129] = spawnstruct(); +/* 1:54 */waypoints[129].origin = (979.507, 959.312, 171.122); +/* 1:54 */waypoints[129].type = "stand"; +/* 1:54 */waypoints[129].children[0] = 128; +/* 1:54 */waypoints[129].children[1] = 130; +/* 1:54 */waypoints[129].children[2] = 131; +/* 1:54 */waypoints[129].children[3] = 138; +/* 1:54 */waypoints[129].children[4] = 142; +/* 1:54 */waypoints[129].children[5] = 144; +/* 1:54 */waypoints[129].children[6] = 139; +/* 1:54 */waypoints[130] = spawnstruct(); +/* 1:54 */waypoints[130].origin = (766.856, 867.259, 165.02); +/* 1:54 */waypoints[130].type = "stand"; +/* 1:54 */waypoints[130].children[0] = 129; +/* 1:54 */waypoints[130].children[1] = 133; +/* 1:54 */waypoints[130].children[2] = 134; +/* 1:54 */waypoints[130].children[3] = 135; +/* 1:54 */waypoints[130].children[4] = 136; +/* 1:54 */waypoints[130].children[5] = 142; +/* 1:54 */waypoints[131] = spawnstruct(); +/* 1:54 */waypoints[131].origin = (738.526, 1100.24, 161.913); +/* 1:54 */waypoints[131].type = "stand"; +/* 1:54 */waypoints[131].children[0] = 129; +/* 1:54 */waypoints[131].children[1] = 132; +/* 1:54 */waypoints[131].children[2] = 137; +/* 1:54 */waypoints[131].children[3] = 144; +/* 1:54 */waypoints[132] = spawnstruct(); +/* 1:54 */waypoints[132].origin = (737.462, 992.673, 162.978); +/* 1:54 */waypoints[132].type = "claymore"; +/* 1:54 */waypoints[132].children[0] = 131; +/* 1:54 */waypoints[132].angles = (17.8363, 91.0876, 0); +/* 1:54 */waypoints[133] = spawnstruct(); +/* 1:54 */waypoints[133].origin = (731.125, 743.125, 170.585); +/* 1:54 */waypoints[133].type = "crouch"; +/* 1:54 */waypoints[133].children[0] = 130; +/* 1:54 */waypoints[133].angles = (9.83826, 83.7048, 0); +/* 1:54 */waypoints[134] = spawnstruct(); +/* 1:54 */waypoints[134].origin = (731.125, 766.619, 169.95); +/* 1:54 */waypoints[134].type = "claymore"; +/* 1:54 */waypoints[134].children[0] = 130; +/* 1:54 */waypoints[134].angles = (13.266, 87.3962, 0); +/* 1:54 */waypoints[135] = spawnstruct(); +/* 1:54 */waypoints[135].origin = (731.165, 978.819, 161.708); +/* 1:54 */waypoints[135].type = "claymore"; +/* 1:54 */waypoints[135].children[0] = 130; +/* 1:54 */waypoints[135].angles = (19.8578, -94.1583, 0); +/* 1:54 */waypoints[136] = spawnstruct(); +/* 1:54 */waypoints[136].origin = (593.345, 866.646, 152.428); +/* 1:54 */waypoints[136].type = "stand"; +/* 1:54 */waypoints[136].children[0] = 130; +/* 1:54 */waypoints[136].children[1] = 137; +/* 1:54 */waypoints[136].children[2] = 146; +/* 1:54 */waypoints[137] = spawnstruct(); +/* 1:54 */waypoints[137].origin = (542.318, 1093.81, 141.393); +/* 1:54 */waypoints[137].type = "stand"; +/* 1:54 */waypoints[137].children[0] = 136; +/* 1:54 */waypoints[137].children[1] = 92; +/* 1:54 */waypoints[137].children[2] = 131; +/* 1:54 */waypoints[137].children[3] = 146; +/* 1:54 */waypoints[138] = spawnstruct(); +/* 1:54 */waypoints[138].origin = (1139.75, 1187, 169.878); +/* 1:54 */waypoints[138].type = "stand"; +/* 1:54 */waypoints[138].children[0] = 129; +/* 1:54 */waypoints[138].children[1] = 139; +/* 1:54 */waypoints[138].children[2] = 144; +/* 1:54 */waypoints[139] = spawnstruct(); +/* 1:54 */waypoints[139].origin = (1366.6, 1001.13, 166.742); +/* 1:54 */waypoints[139].type = "stand"; +/* 1:54 */waypoints[139].children[0] = 138; +/* 1:54 */waypoints[139].children[1] = 140; +/* 1:54 */waypoints[139].children[2] = 128; +/* 1:54 */waypoints[139].children[3] = 129; +/* 1:54 */waypoints[140] = spawnstruct(); +/* 1:54 */waypoints[140].origin = (1362.46, 648.367, 178.782); +/* 1:54 */waypoints[140].type = "stand"; +/* 1:54 */waypoints[140].children[0] = 139; +/* 1:54 */waypoints[140].children[1] = 141; +/* 1:54 */waypoints[140].children[2] = 128; +/* 1:54 */waypoints[141] = spawnstruct(); +/* 1:54 */waypoints[141].origin = (1398.88, 559.125, 172.857); +/* 1:54 */waypoints[141].type = "crouch"; +/* 1:54 */waypoints[141].children[0] = 140; +/* 1:54 */waypoints[141].angles = (16.5179, 168.492, 0); +/* 1:54 */waypoints[142] = spawnstruct(); +/* 1:54 */waypoints[142].origin = (1032.98, 687.96, 168.606); +/* 1:54 */waypoints[142].type = "stand"; +/* 1:54 */waypoints[142].children[0] = 128; +/* 1:54 */waypoints[142].children[1] = 143; +/* 1:54 */waypoints[142].children[2] = 127; +/* 1:54 */waypoints[142].children[3] = 129; +/* 1:54 */waypoints[142].children[4] = 130; +/* 1:54 */waypoints[143] = spawnstruct(); +/* 1:54 */waypoints[143].origin = (916.125, 559.125, 170.125); +/* 1:54 */waypoints[143].type = "crouch"; +/* 1:54 */waypoints[143].children[0] = 142; +/* 1:54 */waypoints[143].angles = (5.09766, 46.0107, 0); +/* 1:54 */waypoints[144] = spawnstruct(); +/* 1:54 */waypoints[144].origin = (978.048, 1208.22, 169.294); +/* 1:54 */waypoints[144].type = "stand"; +/* 1:54 */waypoints[144].children[0] = 131; +/* 1:54 */waypoints[144].children[1] = 138; +/* 1:54 */waypoints[144].children[2] = 145; +/* 1:54 */waypoints[144].children[3] = 129; +/* 1:54 */waypoints[145] = spawnstruct(); +/* 1:54 */waypoints[145].origin = (1045.88, 1324.88, 170.586); +/* 1:54 */waypoints[145].type = "crouch"; +/* 1:54 */waypoints[145].children[0] = 144; +/* 1:54 */waypoints[145].angles = (7.55859, -126.546, 0); +/* 1:54 */waypoints[146] = spawnstruct(); +/* 1:54 */waypoints[146].origin = (444.5, 866.788, 135.993); +/* 1:54 */waypoints[146].type = "stand"; +/* 1:54 */waypoints[146].children[0] = 136; +/* 1:54 */waypoints[146].children[1] = 93; +/* 1:54 */waypoints[146].children[2] = 92; +/* 1:54 */waypoints[146].children[3] = 137; +/* 1:54 */waypoints[147] = spawnstruct(); +/* 1:54 */waypoints[147].origin = (132.125, 779.125, 126.112); +/* 1:54 */waypoints[147].type = "crouch"; +/* 1:54 */waypoints[147].children[0] = 93; +/* 1:54 */waypoints[147].children[1] = 91; +/* 1:54 */waypoints[147].children[2] = 92; +/* 1:54 */waypoints[148] = spawnstruct(); +/* 1:54 */waypoints[148].origin = (107.645, 241.55, 168.125); +/* 1:54 */waypoints[148].type = "stand"; +/* 1:54 */waypoints[148].children[0] = 96; +/* 1:54 */waypoints[148].children[1] = 149; +/* 1:54 */waypoints[149] = spawnstruct(); +/* 1:54 */waypoints[149].origin = (-4.2525, 240.898, 165.125); +/* 1:54 */waypoints[149].type = "stand"; +/* 1:54 */waypoints[149].children[0] = 148; +/* 1:54 */waypoints[149].children[1] = 150; +/* 1:54 */waypoints[149].children[2] = 116; +/* 1:54 */waypoints[149].children[3] = 151; +/* 1:54 */waypoints[150] = spawnstruct(); +/* 1:54 */waypoints[150].origin = (-410.643, 237.67, 166.125); +/* 1:54 */waypoints[150].type = "stand"; +/* 1:54 */waypoints[150].children[0] = 149; +/* 1:54 */waypoints[150].children[1] = 170; +/* 1:54 */waypoints[150].children[2] = 175; +/* 1:54 */waypoints[151] = spawnstruct(); +/* 1:54 */waypoints[151].origin = (-53.4301, -133.034, 170.125); +/* 1:54 */waypoints[151].type = "stand"; +/* 1:54 */waypoints[151].children[0] = 115; +/* 1:54 */waypoints[151].children[1] = 152; +/* 1:54 */waypoints[151].children[2] = 153; +/* 1:54 */waypoints[151].children[3] = 149; +/* 1:54 */waypoints[152] = spawnstruct(); +/* 1:54 */waypoints[152].origin = (9.41021, 33.3786, 170.125); +/* 1:54 */waypoints[152].type = "stand"; +/* 1:54 */waypoints[152].children[0] = 151; +/* 1:54 */waypoints[152].children[1] = 116; +/* 1:54 */waypoints[153] = spawnstruct(); +/* 1:54 */waypoints[153].origin = (-48.875, -278.875, 170.125); +/* 1:54 */waypoints[153].type = "crouch"; +/* 1:54 */waypoints[153].children[0] = 151; +/* 1:54 */waypoints[153].children[1] = 154; +/* 1:54 */waypoints[154] = spawnstruct(); +/* 1:54 */waypoints[154].origin = (93.3833, 326.034, 169.125); +/* 1:54 */waypoints[154].type = "stand"; +/* 1:54 */waypoints[154].children[0] = 153; +/* 1:54 */waypoints[154].children[1] = 155; +/* 1:54 */waypoints[154].children[2] = 157; +/* 1:54 */waypoints[155] = spawnstruct(); +/* 1:54 */waypoints[155].origin = (61.2963, 483.681, 168.125); +/* 1:54 */waypoints[155].type = "stand"; +/* 1:54 */waypoints[155].children[0] = 154; +/* 1:54 */waypoints[155].children[1] = 156; +/* 1:54 */waypoints[155].children[2] = 157; +/* 1:54 */waypoints[156] = spawnstruct(); +/* 1:54 */waypoints[156].origin = (-37.1158, 637.831, 168.125); +/* 1:54 */waypoints[156].type = "stand"; +/* 1:54 */waypoints[156].children[0] = 155; +/* 1:54 */waypoints[156].children[1] = 20; +/* 1:54 */waypoints[156].children[2] = 160; +/* 1:54 */waypoints[157] = spawnstruct(); +/* 1:54 */waypoints[157].origin = (147.233, 418.74, 168.125); +/* 1:54 */waypoints[157].type = "stand"; +/* 1:54 */waypoints[157].children[0] = 155; +/* 1:54 */waypoints[157].children[1] = 154; +/* 1:54 */waypoints[157].children[2] = 158; +/* 1:54 */waypoints[158] = spawnstruct(); +/* 1:54 */waypoints[158].origin = (173.871, 355.125, 168.125); +/* 1:54 */waypoints[158].type = "claymore"; +/* 1:54 */waypoints[158].children[0] = 157; +/* 1:54 */waypoints[158].children[1] = 159; +/* 1:54 */waypoints[158].angles = (24.6863, 173.112, 0); +/* 1:54 */waypoints[159] = spawnstruct(); +/* 1:54 */waypoints[159].origin = (173.871, 355.125, 168.125); +/* 1:54 */waypoints[159].type = "crouch"; +/* 1:54 */waypoints[159].children[0] = 158; +/* 1:54 */waypoints[159].angles = (23.7195, 172.76, 0); +/* 1:54 */waypoints[160] = spawnstruct(); +/* 1:54 */waypoints[160].origin = (173.875, 707.88, 187.125); +/* 1:54 */waypoints[160].type = "crouch"; +/* 1:54 */waypoints[160].children[0] = 156; +/* 1:54 */waypoints[160].angles = (16.7816, -168.519, 0); +/* 1:54 */waypoints[161] = spawnstruct(); +/* 1:54 */waypoints[161].origin = (-668.86, 613.995, 168.125); +/* 1:54 */waypoints[161].type = "stand"; +/* 1:54 */waypoints[161].children[0] = 22; +/* 1:54 */waypoints[161].children[1] = 162; +/* 1:54 */waypoints[162] = spawnstruct(); +/* 1:54 */waypoints[162].origin = (-666.12, 468.24, 166.125); +/* 1:54 */waypoints[162].type = "stand"; +/* 1:54 */waypoints[162].children[0] = 161; +/* 1:54 */waypoints[162].children[1] = 163; +/* 1:54 */waypoints[162].children[2] = 164; +/* 1:54 */waypoints[162].children[3] = 169; +/* 1:54 */waypoints[163] = spawnstruct(); +/* 1:54 */waypoints[163].origin = (-454.125, 530.141, 166.792); +/* 1:54 */waypoints[163].type = "crouch"; +/* 1:54 */waypoints[163].children[0] = 162; +/* 1:54 */waypoints[163].angles = (19.2426, -150.776, 0); +/* 1:54 */waypoints[164] = spawnstruct(); +/* 1:54 */waypoints[164].origin = (-907.051, 468.668, 166.125); +/* 1:54 */waypoints[164].type = "stand"; +/* 1:54 */waypoints[164].children[0] = 162; +/* 1:54 */waypoints[164].children[1] = 165; +/* 1:54 */waypoints[164].children[2] = 168; +/* 1:54 */waypoints[165] = spawnstruct(); +/* 1:54 */waypoints[165].origin = (-1138.44, 450.357, 166.13); +/* 1:54 */waypoints[165].type = "stand"; +/* 1:54 */waypoints[165].children[0] = 164; +/* 1:54 */waypoints[165].children[1] = 166; +/* 1:54 */waypoints[165].children[2] = 171; +/* 1:54 */waypoints[166] = spawnstruct(); +/* 1:54 */waypoints[166].origin = (-1107.47, 69.0025, 166.125); +/* 1:54 */waypoints[166].type = "stand"; +/* 1:54 */waypoints[166].children[0] = 165; +/* 1:54 */waypoints[166].children[1] = 167; +/* 1:54 */waypoints[166].children[2] = 171; +/* 1:54 */waypoints[167] = spawnstruct(); +/* 1:54 */waypoints[167].origin = (-915.056, 15.7288, 168.125); +/* 1:54 */waypoints[167].type = "stand"; +/* 1:54 */waypoints[167].children[0] = 166; +/* 1:54 */waypoints[167].children[1] = 168; +/* 1:54 */waypoints[167].children[2] = 172; +/* 1:54 */waypoints[168] = spawnstruct(); +/* 1:54 */waypoints[168].origin = (-894.291, 234.209, 166.125); +/* 1:54 */waypoints[168].type = "stand"; +/* 1:54 */waypoints[168].children[0] = 167; +/* 1:54 */waypoints[168].children[1] = 169; +/* 1:54 */waypoints[168].children[2] = 164; +/* 1:54 */waypoints[168].children[3] = 171; +/* 1:54 */waypoints[169] = spawnstruct(); +/* 1:54 */waypoints[169].origin = (-692.064, 277.587, 166.125); +/* 1:54 */waypoints[169].type = "stand"; +/* 1:54 */waypoints[169].children[0] = 168; +/* 1:54 */waypoints[169].children[1] = 170; +/* 1:54 */waypoints[169].children[2] = 162; +/* 1:54 */waypoints[169].children[3] = 173; +/* 1:54 */waypoints[170] = spawnstruct(); +/* 1:54 */waypoints[170].origin = (-493.478, 247.963, 168.125); +/* 1:54 */waypoints[170].type = "stand"; +/* 1:54 */waypoints[170].children[0] = 169; +/* 1:54 */waypoints[170].children[1] = 150; +/* 1:54 */waypoints[171] = spawnstruct(); +/* 1:54 */waypoints[171].origin = (-1051.86, 237.981, 166.125); +/* 1:54 */waypoints[171].type = "stand"; +/* 1:54 */waypoints[171].children[0] = 168; +/* 1:54 */waypoints[171].children[1] = 166; +/* 1:54 */waypoints[171].children[2] = 165; +/* 1:54 */waypoints[172] = spawnstruct(); +/* 1:54 */waypoints[172].origin = (-911.924, -224.285, 166.125); +/* 1:54 */waypoints[172].type = "stand"; +/* 1:54 */waypoints[172].children[0] = 167; +/* 1:54 */waypoints[172].children[1] = 173; +/* 1:54 */waypoints[172].children[2] = 183; +/* 1:54 */waypoints[172].children[3] = 184; +/* 1:54 */waypoints[173] = spawnstruct(); +/* 1:54 */waypoints[173].origin = (-644.081, -213.711, 166.125); +/* 1:54 */waypoints[173].type = "stand"; +/* 1:54 */waypoints[173].children[0] = 172; +/* 1:54 */waypoints[173].children[1] = 174; +/* 1:54 */waypoints[173].children[2] = 182; +/* 1:54 */waypoints[173].children[3] = 169; +/* 1:54 */waypoints[174] = spawnstruct(); +/* 1:54 */waypoints[174].origin = (-405.368, -208.33, 166.125); +/* 1:54 */waypoints[174].type = "stand"; +/* 1:54 */waypoints[174].children[0] = 173; +/* 1:54 */waypoints[174].children[1] = 175; +/* 1:54 */waypoints[174].children[2] = 179; +/* 1:54 */waypoints[174].children[3] = 177; +/* 1:54 */waypoints[175] = spawnstruct(); +/* 1:54 */waypoints[175].origin = (-416.568, 57.519, 166.223); +/* 1:54 */waypoints[175].type = "stand"; +/* 1:54 */waypoints[175].children[0] = 174; +/* 1:54 */waypoints[175].children[1] = 150; +/* 1:54 */waypoints[175].children[2] = 176; +/* 1:54 */waypoints[176] = spawnstruct(); +/* 1:54 */waypoints[176].origin = (-274.486, 57.4151, 166.125); +/* 1:54 */waypoints[176].type = "stand"; +/* 1:54 */waypoints[176].children[0] = 175; +/* 1:54 */waypoints[176].children[1] = 177; +/* 1:54 */waypoints[177] = spawnstruct(); +/* 1:54 */waypoints[177].origin = (-243.143, -123.441, 166.125); +/* 1:54 */waypoints[177].type = "stand"; +/* 1:54 */waypoints[177].children[0] = 176; +/* 1:54 */waypoints[177].children[1] = 178; +/* 1:54 */waypoints[177].children[2] = 174; +/* 1:54 */waypoints[178] = spawnstruct(); +/* 1:54 */waypoints[178].origin = (-254.552, -368.835, 166.125); +/* 1:54 */waypoints[178].type = "stand"; +/* 1:54 */waypoints[178].children[0] = 177; +/* 1:54 */waypoints[178].children[1] = 179; +/* 1:54 */waypoints[179] = spawnstruct(); +/* 1:54 */waypoints[179].origin = (-415.448, -368.788, 166.125); +/* 1:54 */waypoints[179].type = "stand"; +/* 1:54 */waypoints[179].children[0] = 178; +/* 1:54 */waypoints[179].children[1] = 174; +/* 1:54 */waypoints[179].children[2] = 180; +/* 1:54 */waypoints[180] = spawnstruct(); +/* 1:54 */waypoints[180].origin = (-435.97, -547.846, 168.125); +/* 1:54 */waypoints[180].type = "stand"; +/* 1:54 */waypoints[180].children[0] = 179; +/* 1:54 */waypoints[180].children[1] = 181; +/* 1:54 */waypoints[180].children[2] = 182; +/* 1:54 */waypoints[181] = spawnstruct(); +/* 1:54 */waypoints[181].origin = (-436.051, -754.541, 200.125); +/* 1:54 */waypoints[181].type = "stand"; +/* 1:54 */waypoints[181].children[0] = 180; +/* 1:54 */waypoints[181].children[1] = 243; +/* 1:54 */waypoints[182] = spawnstruct(); +/* 1:54 */waypoints[182].origin = (-676.511, -539.551, 168.125); +/* 1:54 */waypoints[182].type = "stand"; +/* 1:54 */waypoints[182].children[0] = 180; +/* 1:54 */waypoints[182].children[1] = 183; +/* 1:54 */waypoints[182].children[2] = 173; +/* 1:54 */waypoints[183] = spawnstruct(); +/* 1:54 */waypoints[183].origin = (-944.821, -478.529, 168.125); +/* 1:54 */waypoints[183].type = "stand"; +/* 1:54 */waypoints[183].children[0] = 182; +/* 1:54 */waypoints[183].children[1] = 172; +/* 1:54 */waypoints[184] = spawnstruct(); +/* 1:54 */waypoints[184].origin = (-1137.04, -238.632, 168.125); +/* 1:54 */waypoints[184].type = "stand"; +/* 1:54 */waypoints[184].children[0] = 172; +/* 1:54 */waypoints[184].children[1] = 57; +/* 1:54 */waypoints[185] = spawnstruct(); +/* 1:54 */waypoints[185].origin = (-1506.91, -471.816, 144.125); +/* 1:54 */waypoints[185].type = "stand"; +/* 1:54 */waypoints[185].children[0] = 57; +/* 1:54 */waypoints[185].children[1] = 186; +/* 1:54 */waypoints[186] = spawnstruct(); +/* 1:54 */waypoints[186].origin = (-1667.77, -535.827, 112.125); +/* 1:54 */waypoints[186].type = "stand"; +/* 1:54 */waypoints[186].children[0] = 185; +/* 1:54 */waypoints[186].children[1] = 187; +/* 1:54 */waypoints[186].children[2] = 188; +/* 1:54 */waypoints[187] = spawnstruct(); +/* 1:54 */waypoints[187].origin = (-1714.88, -443.125, 112.125); +/* 1:54 */waypoints[187].type = "crouch"; +/* 1:54 */waypoints[187].children[0] = 186; +/* 1:54 */waypoints[187].angles = (27.5867, -63.501, 0); +/* 1:54 */waypoints[188] = spawnstruct(); +/* 1:54 */waypoints[188].origin = (-1651.14, -888.979, 152.125); +/* 1:54 */waypoints[188].type = "stand"; +/* 1:54 */waypoints[188].children[0] = 186; +/* 1:54 */waypoints[188].children[1] = 189; +/* 1:54 */waypoints[188].children[2] = 258; +/* 1:54 */waypoints[188].children[3] = 271; +/* 1:54 */waypoints[189] = spawnstruct(); +/* 1:54 */waypoints[189].origin = (-1761.28, -1114.39, 151.025); +/* 1:54 */waypoints[189].type = "stand"; +/* 1:54 */waypoints[189].children[0] = 188; +/* 1:54 */waypoints[189].children[1] = 190; +/* 1:54 */waypoints[189].children[2] = 258; +/* 1:54 */waypoints[189].children[3] = 271; +/* 1:54 */waypoints[190] = spawnstruct(); +/* 1:54 */waypoints[190].origin = (-1798.71, -1330.37, 155.104); +/* 1:54 */waypoints[190].type = "stand"; +/* 1:54 */waypoints[190].children[0] = 189; +/* 1:54 */waypoints[190].children[1] = 191; +/* 1:54 */waypoints[190].children[2] = 192; +/* 1:54 */waypoints[191] = spawnstruct(); +/* 1:54 */waypoints[191].origin = (-1725.87, -1312.78, 152.125); +/* 1:54 */waypoints[191].type = "claymore"; +/* 1:54 */waypoints[191].children[0] = 190; +/* 1:54 */waypoints[191].angles = (21.4398, -176.265, 0); +/* 1:54 */waypoints[192] = spawnstruct(); +/* 1:54 */waypoints[192].origin = (-1789.98, -1488.15, 152.125); +/* 1:54 */waypoints[192].type = "stand"; +/* 1:54 */waypoints[192].children[0] = 190; +/* 1:54 */waypoints[192].children[1] = 193; +/* 1:54 */waypoints[192].children[2] = 266; +/* 1:54 */waypoints[193] = spawnstruct(); +/* 1:54 */waypoints[193].origin = (-1751.19, -1709.09, 152.125); +/* 1:54 */waypoints[193].type = "stand"; +/* 1:54 */waypoints[193].children[0] = 192; +/* 1:54 */waypoints[193].children[1] = 194; +/* 1:54 */waypoints[193].children[2] = 265; +/* 1:54 */waypoints[194] = spawnstruct(); +/* 1:54 */waypoints[194].origin = (-2046.02, -1704.34, 288.125); +/* 1:54 */waypoints[194].type = "stand"; +/* 1:54 */waypoints[194].children[0] = 193; +/* 1:54 */waypoints[194].children[1] = 195; +/* 1:54 */waypoints[195] = spawnstruct(); +/* 1:54 */waypoints[195].origin = (-2193.5, -1549.86, 288.125); +/* 1:54 */waypoints[195].type = "stand"; +/* 1:54 */waypoints[195].children[0] = 194; +/* 1:54 */waypoints[195].children[1] = 196; +/* 1:54 */waypoints[195].children[2] = 198; +/* 1:54 */waypoints[195].children[3] = 205; +/* 1:54 */waypoints[196] = spawnstruct(); +/* 1:54 */waypoints[196].origin = (-1840.65, -1354.84, 290.125); +/* 1:54 */waypoints[196].type = "stand"; +/* 1:54 */waypoints[196].children[0] = 195; +/* 1:54 */waypoints[196].children[1] = 197; +/* 1:54 */waypoints[197] = spawnstruct(); +/* 1:54 */waypoints[197].origin = (-1579.13, -1354.94, 288.125); +/* 1:54 */waypoints[197].type = "crouch"; +/* 1:54 */waypoints[197].children[0] = 196; +/* 1:54 */waypoints[197].angles = (29.6082, -1.1261, 0); +/* 1:54 */waypoints[198] = spawnstruct(); +/* 1:54 */waypoints[198].origin = (-2285.74, -1308.12, 288.125); +/* 1:54 */waypoints[198].type = "stand"; +/* 1:54 */waypoints[198].children[0] = 195; +/* 1:54 */waypoints[198].children[1] = 199; +/* 1:54 */waypoints[198].children[2] = 204; +/* 1:54 */waypoints[199] = spawnstruct(); +/* 1:54 */waypoints[199].origin = (-2285.69, -1151.52, 291.117); +/* 1:54 */waypoints[199].type = "stand"; +/* 1:54 */waypoints[199].children[0] = 198; +/* 1:54 */waypoints[199].children[1] = 200; +/* 1:54 */waypoints[199].children[2] = 201; +/* 1:54 */waypoints[200] = spawnstruct(); +/* 1:54 */waypoints[200].origin = (-2112.35, -1133.19, 288.125); +/* 1:54 */waypoints[200].type = "crouch"; +/* 1:54 */waypoints[200].children[0] = 199; +/* 1:54 */waypoints[200].angles = (13.0902, 10.6897, 0); +/* 1:54 */waypoints[201] = spawnstruct(); +/* 1:54 */waypoints[201].origin = (-2396.53, -1093.16, 288.125); +/* 1:54 */waypoints[201].type = "stand"; +/* 1:54 */waypoints[201].children[0] = 199; +/* 1:54 */waypoints[201].children[1] = 202; +/* 1:54 */waypoints[202] = spawnstruct(); +/* 1:54 */waypoints[202].origin = (-2446.09, -920.857, 265.125); +/* 1:54 */waypoints[202].type = "stand"; +/* 1:54 */waypoints[202].children[0] = 201; +/* 1:54 */waypoints[202].children[1] = 203; +/* 1:54 */waypoints[203] = spawnstruct(); +/* 1:54 */waypoints[203].origin = (-2478.48, -593.455, 265.125); +/* 1:54 */waypoints[203].type = "stand"; +/* 1:54 */waypoints[203].children[0] = 202; +/* 1:54 */waypoints[203].children[1] = 60; +/* 1:54 */waypoints[204] = spawnstruct(); +/* 1:54 */waypoints[204].origin = (-2449.88, -1263.13, 288.125); +/* 1:54 */waypoints[204].type = "crouch"; +/* 1:54 */waypoints[204].children[0] = 198; +/* 1:54 */waypoints[204].angles = (16.9574, -29.0259, 0); +/* 1:54 */waypoints[205] = spawnstruct(); +/* 1:54 */waypoints[205].origin = (-2252.05, -1834.63, 291.121); +/* 1:54 */waypoints[205].type = "stand"; +/* 1:54 */waypoints[205].children[0] = 195; +/* 1:54 */waypoints[205].children[1] = 206; +/* 1:54 */waypoints[206] = spawnstruct(); +/* 1:54 */waypoints[206].origin = (-1878.1, -1867.36, 152.125); +/* 1:54 */waypoints[206].type = "stand"; +/* 1:54 */waypoints[206].children[0] = 205; +/* 1:54 */waypoints[206].children[1] = 207; +/* 1:54 */waypoints[207] = spawnstruct(); +/* 1:54 */waypoints[207].origin = (-1469.3, -1831.17, 152.125); +/* 1:54 */waypoints[207].type = "stand"; +/* 1:54 */waypoints[207].children[0] = 206; +/* 1:54 */waypoints[207].children[1] = 208; +/* 1:54 */waypoints[208] = spawnstruct(); +/* 1:54 */waypoints[208].origin = (-1310.38, -1838.6, 152.125); +/* 1:54 */waypoints[208].type = "stand"; +/* 1:54 */waypoints[208].children[0] = 207; +/* 1:54 */waypoints[208].children[1] = 209; +/* 1:54 */waypoints[208].children[2] = 213; +/* 1:54 */waypoints[209] = spawnstruct(); +/* 1:54 */waypoints[209].origin = (-949.577, -1825.33, 152.125); +/* 1:54 */waypoints[209].type = "stand"; +/* 1:54 */waypoints[209].children[0] = 208; +/* 1:54 */waypoints[209].children[1] = 210; +/* 1:54 */waypoints[209].children[2] = 212; +/* 1:54 */waypoints[210] = spawnstruct(); +/* 1:54 */waypoints[210].origin = (-643.59, -1821.47, 152.125); +/* 1:54 */waypoints[210].type = "stand"; +/* 1:54 */waypoints[210].children[0] = 209; +/* 1:54 */waypoints[210].children[1] = 211; +/* 1:54 */waypoints[211] = spawnstruct(); +/* 1:54 */waypoints[211].origin = (-621.166, -1650.31, 144.125); +/* 1:54 */waypoints[211].type = "stand"; +/* 1:54 */waypoints[211].children[0] = 210; +/* 1:54 */waypoints[211].children[1] = 212; +/* 1:54 */waypoints[211].children[2] = 214; +/* 1:54 */waypoints[212] = spawnstruct(); +/* 1:54 */waypoints[212].origin = (-932.542, -1650.37, 144.125); +/* 1:54 */waypoints[212].type = "stand"; +/* 1:54 */waypoints[212].children[0] = 211; +/* 1:54 */waypoints[212].children[1] = 213; +/* 1:54 */waypoints[212].children[2] = 209; +/* 1:54 */waypoints[212].children[3] = 261; +/* 1:54 */waypoints[213] = spawnstruct(); +/* 1:54 */waypoints[213].origin = (-1256.58, -1650.86, 144.125); +/* 1:54 */waypoints[213].type = "stand"; +/* 1:54 */waypoints[213].children[0] = 212; +/* 1:54 */waypoints[213].children[1] = 208; +/* 1:54 */waypoints[213].children[2] = 262; +/* 1:54 */waypoints[214] = spawnstruct(); +/* 1:54 */waypoints[214].origin = (-519.869, -1455.32, 156.7); +/* 1:54 */waypoints[214].type = "stand"; +/* 1:54 */waypoints[214].children[0] = 211; +/* 1:54 */waypoints[214].children[1] = 215; +/* 1:54 */waypoints[214].children[2] = 237; +/* 1:54 */waypoints[215] = spawnstruct(); +/* 1:54 */waypoints[215].origin = (-168.063, -1557.12, 198.945); +/* 1:54 */waypoints[215].type = "stand"; +/* 1:54 */waypoints[215].children[0] = 214; +/* 1:54 */waypoints[215].children[1] = 216; +/* 1:54 */waypoints[216] = spawnstruct(); +/* 1:54 */waypoints[216].origin = (-81.1603, -1411.26, 199.728); +/* 1:54 */waypoints[216].type = "stand"; +/* 1:54 */waypoints[216].children[0] = 215; +/* 1:54 */waypoints[216].children[1] = 217; +/* 1:54 */waypoints[216].children[2] = 235; +/* 1:54 */waypoints[217] = spawnstruct(); +/* 1:54 */waypoints[217].origin = (-190.696, -1170.3, 208.125); +/* 1:54 */waypoints[217].type = "stand"; +/* 1:54 */waypoints[217].children[0] = 216; +/* 1:54 */waypoints[217].children[1] = 218; +/* 1:54 */waypoints[217].children[2] = 236; +/* 1:54 */waypoints[217].children[3] = 238; +/* 1:54 */waypoints[218] = spawnstruct(); +/* 1:54 */waypoints[218].origin = (-57.2164, -1021.91, 208.125); +/* 1:54 */waypoints[218].type = "stand"; +/* 1:54 */waypoints[218].children[0] = 217; +/* 1:54 */waypoints[218].children[1] = 219; +/* 1:54 */waypoints[218].children[2] = 220; +/* 1:54 */waypoints[219] = spawnstruct(); +/* 1:54 */waypoints[219].origin = (66.4044, -869.065, 208.125); +/* 1:54 */waypoints[219].type = "stand"; +/* 1:54 */waypoints[219].children[0] = 218; +/* 1:54 */waypoints[219].children[1] = 224; +/* 1:54 */waypoints[220] = spawnstruct(); +/* 1:54 */waypoints[220].origin = (44.516, -1092.51, 208.125); +/* 1:54 */waypoints[220].type = "stand"; +/* 1:54 */waypoints[220].children[0] = 218; +/* 1:54 */waypoints[220].children[1] = 221; +/* 1:54 */waypoints[221] = spawnstruct(); +/* 1:54 */waypoints[221].origin = (308.434, -1116.63, 208.125); +/* 1:54 */waypoints[221].type = "stand"; +/* 1:54 */waypoints[221].children[0] = 220; +/* 1:54 */waypoints[221].children[1] = 222; +/* 1:54 */waypoints[221].children[2] = 231; +/* 1:54 */waypoints[222] = spawnstruct(); +/* 1:54 */waypoints[222].origin = (450.402, -1116.55, 208.125); +/* 1:54 */waypoints[222].type = "stand"; +/* 1:54 */waypoints[222].children[0] = 221; +/* 1:54 */waypoints[222].children[1] = 223; +/* 1:54 */waypoints[222].children[2] = 227; +/* 1:54 */waypoints[222].children[3] = 229; +/* 1:54 */waypoints[223] = spawnstruct(); +/* 1:54 */waypoints[223].origin = (464.255, -961.957, 208.125); +/* 1:54 */waypoints[223].type = "stand"; +/* 1:54 */waypoints[223].children[0] = 222; +/* 1:54 */waypoints[223].children[1] = 224; +/* 1:54 */waypoints[223].children[2] = 225; +/* 1:54 */waypoints[224] = spawnstruct(); +/* 1:54 */waypoints[224].origin = (466.237, -822.843, 208.125); +/* 1:54 */waypoints[224].type = "stand"; +/* 1:54 */waypoints[224].children[0] = 223; +/* 1:54 */waypoints[224].children[1] = 226; +/* 1:54 */waypoints[224].children[2] = 219; +/* 1:54 */waypoints[224].children[3] = 114; +/* 1:54 */waypoints[225] = spawnstruct(); +/* 1:54 */waypoints[225].origin = (591.49, -972.959, 208.125); +/* 1:54 */waypoints[225].type = "stand"; +/* 1:54 */waypoints[225].children[0] = 223; +/* 1:54 */waypoints[225].children[1] = 226; +/* 1:54 */waypoints[225].children[2] = 227; +/* 1:54 */waypoints[225].children[3] = 281; +/* 1:54 */waypoints[226] = spawnstruct(); +/* 1:54 */waypoints[226].origin = (599.421, -820.096, 208.125); +/* 1:54 */waypoints[226].type = "stand"; +/* 1:54 */waypoints[226].children[0] = 225; +/* 1:54 */waypoints[226].children[1] = 224; +/* 1:54 */waypoints[227] = spawnstruct(); +/* 1:54 */waypoints[227].origin = (594.414, -1132.16, 208.125); +/* 1:54 */waypoints[227].type = "stand"; +/* 1:54 */waypoints[227].children[0] = 225; +/* 1:54 */waypoints[227].children[1] = 228; +/* 1:54 */waypoints[227].children[2] = 282; +/* 1:54 */waypoints[227].children[3] = 222; +/* 1:54 */waypoints[228] = spawnstruct(); +/* 1:54 */waypoints[228].origin = (593.92, -1282.2, 208.125); +/* 1:54 */waypoints[228].type = "stand"; +/* 1:54 */waypoints[228].children[0] = 227; +/* 1:54 */waypoints[228].children[1] = 229; +/* 1:54 */waypoints[229] = spawnstruct(); +/* 1:54 */waypoints[229].origin = (473.5, -1275.18, 208.125); +/* 1:54 */waypoints[229].type = "stand"; +/* 1:54 */waypoints[229].children[0] = 228; +/* 1:54 */waypoints[229].children[1] = 230; +/* 1:54 */waypoints[229].children[2] = 222; +/* 1:54 */waypoints[230] = spawnstruct(); +/* 1:54 */waypoints[230].origin = (317.248, -1275.1, 208.125); +/* 1:54 */waypoints[230].type = "stand"; +/* 1:54 */waypoints[230].children[0] = 229; +/* 1:54 */waypoints[230].children[1] = 231; +/* 1:54 */waypoints[231] = spawnstruct(); +/* 1:54 */waypoints[231].origin = (261.66, -1305.98, 208.125); +/* 1:54 */waypoints[231].type = "stand"; +/* 1:54 */waypoints[231].children[0] = 230; +/* 1:54 */waypoints[231].children[1] = 232; +/* 1:54 */waypoints[231].children[2] = 221; +/* 1:54 */waypoints[232] = spawnstruct(); +/* 1:54 */waypoints[232].origin = (180.105, -1307.13, 208.125); +/* 1:54 */waypoints[232].type = "stand"; +/* 1:54 */waypoints[232].children[0] = 231; +/* 1:54 */waypoints[232].children[1] = 233; +/* 1:54 */waypoints[232].children[2] = 234; +/* 1:54 */waypoints[232].children[3] = 235; +/* 1:54 */waypoints[233] = spawnstruct(); +/* 1:54 */waypoints[233].origin = (199.875, -1251.13, 208.125); +/* 1:54 */waypoints[233].type = "claymore"; +/* 1:54 */waypoints[233].children[0] = 232; +/* 1:54 */waypoints[233].angles = (8.08044, -92.1478, 0); +/* 1:54 */waypoints[234] = spawnstruct(); +/* 1:54 */waypoints[234].origin = (199.875, -1508.88, 208.125); +/* 1:54 */waypoints[234].type = "crouch"; +/* 1:54 */waypoints[234].children[0] = 232; +/* 1:54 */waypoints[234].angles = (23.8074, 111.286, 0); +/* 1:54 */waypoints[235] = spawnstruct(); +/* 1:54 */waypoints[235].origin = (32.6311, -1393.16, 208.125); +/* 1:54 */waypoints[235].type = "stand"; +/* 1:54 */waypoints[235].children[0] = 232; +/* 1:54 */waypoints[235].children[1] = 216; +/* 1:54 */waypoints[236] = spawnstruct(); +/* 1:54 */waypoints[236].origin = (-253.838, -1270.58, 198.172); +/* 1:54 */waypoints[236].type = "stand"; +/* 1:54 */waypoints[236].children[0] = 217; +/* 1:54 */waypoints[236].children[1] = 237; +/* 1:54 */waypoints[237] = spawnstruct(); +/* 1:54 */waypoints[237].origin = (-525.952, -1327.79, 157.269); +/* 1:54 */waypoints[237].type = "stand"; +/* 1:54 */waypoints[237].children[0] = 236; +/* 1:54 */waypoints[237].children[1] = 214; +/* 1:54 */waypoints[237].children[2] = 244; +/* 1:54 */waypoints[238] = spawnstruct(); +/* 1:54 */waypoints[238].origin = (-283.875, -1177.89, 208.125); +/* 1:54 */waypoints[238].type = "climb"; +/* 1:54 */waypoints[238].children[0] = 217; +/* 1:54 */waypoints[238].children[1] = 239; +/* 1:54 */waypoints[238].angles = (9.3988, -179.121, 0); +/* 1:54 */waypoints[239] = spawnstruct(); +/* 1:54 */waypoints[239].origin = (-287.148, -1177.99, 232.125); +/* 1:54 */waypoints[239].type = "stand"; +/* 1:54 */waypoints[239].children[0] = 238; +/* 1:54 */waypoints[239].children[1] = 240; +/* 1:54 */waypoints[240] = spawnstruct(); +/* 1:54 */waypoints[240].origin = (-315.875, -1178.02, 232.125); +/* 1:54 */waypoints[240].type = "climb"; +/* 1:54 */waypoints[240].children[0] = 239; +/* 1:54 */waypoints[240].children[1] = 241; +/* 1:54 */waypoints[240].angles = (9.48669, -179.121, 0); +/* 1:54 */waypoints[241] = spawnstruct(); +/* 1:54 */waypoints[241].origin = (-332.447, -1177.99, 276.125); +/* 1:54 */waypoints[241].type = "stand"; +/* 1:54 */waypoints[241].children[0] = 240; +/* 1:54 */waypoints[241].children[1] = 242; +/* 1:54 */waypoints[242] = spawnstruct(); +/* 1:54 */waypoints[242].origin = (-355.807, -1176.74, 200.125); +/* 1:54 */waypoints[242].type = "climb"; +/* 1:54 */waypoints[242].children[0] = 241; +/* 1:54 */waypoints[242].children[1] = 243; +/* 1:54 */waypoints[242].angles = (0.966797, -4.11438, 0); +/* 1:54 */waypoints[243] = spawnstruct(); +/* 1:54 */waypoints[243].origin = (-471.705, -1145.26, 200.125); +/* 1:54 */waypoints[243].type = "stand"; +/* 1:54 */waypoints[243].children[0] = 242; +/* 1:54 */waypoints[243].children[1] = 181; +/* 1:54 */waypoints[243].children[2] = 244; +/* 1:54 */waypoints[244] = spawnstruct(); +/* 1:54 */waypoints[244].origin = (-791.427, -1132.25, 152.099); +/* 1:54 */waypoints[244].type = "stand"; +/* 1:54 */waypoints[244].children[0] = 243; +/* 1:54 */waypoints[244].children[1] = 237; +/* 1:54 */waypoints[244].children[2] = 245; +/* 1:54 */waypoints[244].children[3] = 259; +/* 1:54 */waypoints[245] = spawnstruct(); +/* 1:54 */waypoints[245].origin = (-809.008, -1078.75, 151.866); +/* 1:54 */waypoints[245].type = "stand"; +/* 1:54 */waypoints[245].children[0] = 244; +/* 1:54 */waypoints[245].children[1] = 246; +/* 1:54 */waypoints[246] = spawnstruct(); +/* 1:54 */waypoints[246].origin = (-832.61, -955.32, 168.125); +/* 1:54 */waypoints[246].type = "stand"; +/* 1:54 */waypoints[246].children[0] = 245; +/* 1:54 */waypoints[246].children[1] = 247; +/* 1:54 */waypoints[246].children[2] = 248; +/* 1:54 */waypoints[247] = spawnstruct(); +/* 1:54 */waypoints[247].origin = (-965.875, -999.715, 168.125); +/* 1:54 */waypoints[247].type = "crouch"; +/* 1:54 */waypoints[247].children[0] = 246; +/* 1:54 */waypoints[247].angles = (27.2186, 23.0878, 0); +/* 1:54 */waypoints[248] = spawnstruct(); +/* 1:54 */waypoints[248].origin = (-908.819, -837.57, 168.125); +/* 1:54 */waypoints[248].type = "stand"; +/* 1:54 */waypoints[248].children[0] = 246; +/* 1:54 */waypoints[248].children[1] = 249; +/* 1:54 */waypoints[249] = spawnstruct(); +/* 1:54 */waypoints[249].origin = (-1073.94, -857.662, 168.125); +/* 1:54 */waypoints[249].type = "stand"; +/* 1:54 */waypoints[249].children[0] = 248; +/* 1:54 */waypoints[249].children[1] = 250; +/* 1:54 */waypoints[250] = spawnstruct(); +/* 1:54 */waypoints[250].origin = (-1063.01, -666.39, 232.125); +/* 1:54 */waypoints[250].type = "stand"; +/* 1:54 */waypoints[250].children[0] = 249; +/* 1:54 */waypoints[250].children[1] = 251; +/* 1:54 */waypoints[251] = spawnstruct(); +/* 1:54 */waypoints[251].origin = (-847.756, -660.346, 304.125); +/* 1:54 */waypoints[251].type = "stand"; +/* 1:54 */waypoints[251].children[0] = 250; +/* 1:54 */waypoints[251].children[1] = 252; +/* 1:54 */waypoints[252] = spawnstruct(); +/* 1:54 */waypoints[252].origin = (-873.175, -910.498, 304.125); +/* 1:54 */waypoints[252].type = "stand"; +/* 1:54 */waypoints[252].children[0] = 251; +/* 1:54 */waypoints[252].children[1] = 253; +/* 1:54 */waypoints[253] = spawnstruct(); +/* 1:54 */waypoints[253].origin = (-1023.02, -942.343, 304.125); +/* 1:54 */waypoints[253].type = "crouch"; +/* 1:54 */waypoints[253].children[0] = 252; +/* 1:54 */waypoints[253].children[1] = 254; +/* 1:54 */waypoints[254] = spawnstruct(); +/* 1:54 */waypoints[254].origin = (-1083.88, -943.456, 304.125); +/* 1:54 */waypoints[254].type = "climb"; +/* 1:54 */waypoints[254].children[0] = 253; +/* 1:54 */waypoints[254].children[1] = 255; +/* 1:54 */waypoints[254].angles = (22.3846, 179.868, 0); +/* 1:54 */waypoints[255] = spawnstruct(); +/* 1:54 */waypoints[255].origin = (-1100.5, -943.456, 336.125); +/* 1:54 */waypoints[255].type = "stand"; +/* 1:54 */waypoints[255].children[0] = 254; +/* 1:54 */waypoints[255].children[1] = 256; +/* 1:54 */waypoints[256] = spawnstruct(); +/* 1:54 */waypoints[256].origin = (-1136.14, -949.099, 152.125); +/* 1:54 */waypoints[256].type = "climb"; +/* 1:54 */waypoints[256].children[0] = 255; +/* 1:54 */waypoints[256].children[1] = 257; +/* 1:54 */waypoints[256].angles = (0.247192, -1.42822, 0); +/* 1:54 */waypoints[257] = spawnstruct(); +/* 1:54 */waypoints[257].origin = (-1359.12, -993.193, 151.976); +/* 1:54 */waypoints[257].type = "stand"; +/* 1:54 */waypoints[257].children[0] = 256; +/* 1:54 */waypoints[257].children[1] = 258; +/* 1:54 */waypoints[258] = spawnstruct(); +/* 1:54 */waypoints[258].origin = (-1603.92, -1112.56, 150.271); +/* 1:54 */waypoints[258].type = "stand"; +/* 1:54 */waypoints[258].children[0] = 257; +/* 1:54 */waypoints[258].children[1] = 189; +/* 1:54 */waypoints[258].children[2] = 188; +/* 1:54 */waypoints[258].children[3] = 259; +/* 1:54 */waypoints[258].children[4] = 264; +/* 1:54 */waypoints[259] = spawnstruct(); +/* 1:54 */waypoints[259].origin = (-1213.78, -1156.33, 153.339); +/* 1:54 */waypoints[259].type = "stand"; +/* 1:54 */waypoints[259].children[0] = 258; +/* 1:54 */waypoints[259].children[1] = 244; +/* 1:54 */waypoints[259].children[2] = 260; +/* 1:54 */waypoints[260] = spawnstruct(); +/* 1:54 */waypoints[260].origin = (-1140.28, -1276.42, 147.248); +/* 1:54 */waypoints[260].type = "stand"; +/* 1:54 */waypoints[260].children[0] = 259; +/* 1:54 */waypoints[260].children[1] = 261; +/* 1:54 */waypoints[260].children[2] = 262; +/* 1:54 */waypoints[261] = spawnstruct(); +/* 1:54 */waypoints[261].origin = (-913.021, -1467.5, 144.117); +/* 1:54 */waypoints[261].type = "stand"; +/* 1:54 */waypoints[261].children[0] = 260; +/* 1:54 */waypoints[261].children[1] = 212; +/* 1:54 */waypoints[262] = spawnstruct(); +/* 1:54 */waypoints[262].origin = (-1236.18, -1450.01, 144.005); +/* 1:54 */waypoints[262].type = "stand"; +/* 1:54 */waypoints[262].children[0] = 260; +/* 1:54 */waypoints[262].children[1] = 213; +/* 1:54 */waypoints[262].children[2] = 263; +/* 1:54 */waypoints[262].children[3] = 264; +/* 1:54 */waypoints[263] = spawnstruct(); +/* 1:54 */waypoints[263].origin = (-1480.88, -1696.88, 154.998); +/* 1:54 */waypoints[263].type = "crouch"; +/* 1:54 */waypoints[263].children[0] = 262; +/* 1:54 */waypoints[263].angles = (17.6166, 42.6709, 0); +/* 1:54 */waypoints[264] = spawnstruct(); +/* 1:54 */waypoints[264].origin = (-1467.54, -1317.05, 153.001); +/* 1:54 */waypoints[264].type = "stand"; +/* 1:54 */waypoints[264].children[0] = 262; +/* 1:54 */waypoints[264].children[1] = 258; +/* 1:54 */waypoints[265] = spawnstruct(); +/* 1:54 */waypoints[265].origin = (-1579.12, -1718.05, 152.125); +/* 1:54 */waypoints[265].type = "crouch"; +/* 1:54 */waypoints[265].children[0] = 193; +/* 1:54 */waypoints[265].angles = (11.6455, 169.442, 0); +/* 1:54 */waypoints[266] = spawnstruct(); +/* 1:54 */waypoints[266].origin = (-1958.3, -1479.22, 152.125); +/* 1:54 */waypoints[266].type = "stand"; +/* 1:54 */waypoints[266].children[0] = 192; +/* 1:54 */waypoints[266].children[1] = 267; +/* 1:54 */waypoints[267] = spawnstruct(); +/* 1:54 */waypoints[267].origin = (-2234.27, -1473.94, 152.125); +/* 1:54 */waypoints[267].type = "stand"; +/* 1:54 */waypoints[267].children[0] = 266; +/* 1:54 */waypoints[267].children[1] = 268; +/* 1:54 */waypoints[268] = spawnstruct(); +/* 1:54 */waypoints[268].origin = (-2225.57, -1126.53, 152.125); +/* 1:54 */waypoints[268].type = "stand"; +/* 1:54 */waypoints[268].children[0] = 267; +/* 1:54 */waypoints[268].children[1] = 269; +/* 1:54 */waypoints[269] = spawnstruct(); +/* 1:54 */waypoints[269].origin = (-2225.47, -973.996, 152.125); +/* 1:54 */waypoints[269].type = "stand"; +/* 1:54 */waypoints[269].children[0] = 268; +/* 1:54 */waypoints[269].children[1] = 270; +/* 1:54 */waypoints[269].children[2] = 296; +/* 1:54 */waypoints[270] = spawnstruct(); +/* 1:54 */waypoints[270].origin = (-2048.56, -967.637, 152.125); +/* 1:54 */waypoints[270].type = "stand"; +/* 1:54 */waypoints[270].children[0] = 269; +/* 1:54 */waypoints[270].children[1] = 271; +/* 1:54 */waypoints[270].children[2] = 272; +/* 1:54 */waypoints[271] = spawnstruct(); +/* 1:54 */waypoints[271].origin = (-1826.36, -980.793, 152.125); +/* 1:54 */waypoints[271].type = "stand"; +/* 1:54 */waypoints[271].children[0] = 270; +/* 1:54 */waypoints[271].children[1] = 189; +/* 1:54 */waypoints[271].children[2] = 188; +/* 1:54 */waypoints[272] = spawnstruct(); +/* 1:54 */waypoints[272].origin = (-2056.1, -722.667, 112.125); +/* 1:54 */waypoints[272].type = "stand"; +/* 1:54 */waypoints[272].children[0] = 270; +/* 1:54 */waypoints[272].children[1] = 273; +/* 1:54 */waypoints[272].children[2] = 298; +/* 1:54 */waypoints[273] = spawnstruct(); +/* 1:54 */waypoints[273].origin = (-2064.62, -440.893, 188.125); +/* 1:54 */waypoints[273].type = "stand"; +/* 1:54 */waypoints[273].children[0] = 272; +/* 1:54 */waypoints[273].children[1] = 59; +/* 1:54 */waypoints[273].children[2] = 60; +/* 1:54 */waypoints[274] = spawnstruct(); +/* 1:54 */waypoints[274].origin = (-1989, 191.296, 188.125); +/* 1:54 */waypoints[274].type = "stand"; +/* 1:54 */waypoints[274].children[0] = 58; +/* 1:54 */waypoints[274].children[1] = 63; +/* 1:54 */waypoints[274].children[2] = 59; +/* 1:54 */waypoints[275] = spawnstruct(); +/* 1:54 */waypoints[275].origin = (-883.132, 465.491, 304.125); +/* 1:54 */waypoints[275].type = "stand"; +/* 1:54 */waypoints[275].children[0] = 50; +/* 1:54 */waypoints[275].children[1] = 276; +/* 1:54 */waypoints[276] = spawnstruct(); +/* 1:54 */waypoints[276].origin = (-549.247, 482.953, 304.125); +/* 1:54 */waypoints[276].type = "stand"; +/* 1:54 */waypoints[276].children[0] = 275; +/* 1:54 */waypoints[276].children[1] = 277; +/* 1:54 */waypoints[277] = spawnstruct(); +/* 1:54 */waypoints[277].origin = (-370.582, 492.83, 320.125); +/* 1:54 */waypoints[277].type = "stand"; +/* 1:54 */waypoints[277].children[0] = 276; +/* 1:54 */waypoints[277].children[1] = 278; +/* 1:54 */waypoints[278] = spawnstruct(); +/* 1:54 */waypoints[278].origin = (-343.215, 371.566, 320.125); +/* 1:54 */waypoints[278].type = "crouch"; +/* 1:54 */waypoints[278].children[0] = 277; +/* 1:54 */waypoints[278].children[1] = 279; +/* 1:54 */waypoints[279] = spawnstruct(); +/* 1:54 */waypoints[279].origin = (20.8969, 390.657, 320.125); +/* 1:54 */waypoints[279].type = "stand"; +/* 1:54 */waypoints[279].children[0] = 278; +/* 1:54 */waypoints[279].children[1] = 5; +/* 1:54 */waypoints[280] = spawnstruct(); +/* 1:54 */waypoints[280].origin = (164.061, 714.625, 320.125); +/* 1:54 */waypoints[280].type = "crouch"; +/* 1:54 */waypoints[280].children[0] = 7; +/* 1:54 */waypoints[280].angles = (19.9017, 5.83923, 0); +/* 1:54 */waypoints[281] = spawnstruct(); +/* 1:54 */waypoints[281].origin = (804.139, -994.244, 208.125); +/* 1:54 */waypoints[281].type = "stand"; +/* 1:54 */waypoints[281].children[0] = 225; +/* 1:54 */waypoints[281].children[1] = 282; +/* 1:54 */waypoints[282] = spawnstruct(); +/* 1:54 */waypoints[282].origin = (971.962, -1085.06, 208.125); +/* 1:54 */waypoints[282].type = "stand"; +/* 1:54 */waypoints[282].children[0] = 281; +/* 1:54 */waypoints[282].children[1] = 283; +/* 1:54 */waypoints[282].children[2] = 227; +/* 1:54 */waypoints[283] = spawnstruct(); +/* 1:54 */waypoints[283].origin = (1099.98, -1283.91, 208.125); +/* 1:54 */waypoints[283].type = "stand"; +/* 1:54 */waypoints[283].children[0] = 282; +/* 1:54 */waypoints[283].children[1] = 284; +/* 1:54 */waypoints[284] = spawnstruct(); +/* 1:54 */waypoints[284].origin = (1279.82, -1191.86, 204.125); +/* 1:54 */waypoints[284].type = "stand"; +/* 1:54 */waypoints[284].children[0] = 283; +/* 1:54 */waypoints[284].children[1] = 285; +/* 1:54 */waypoints[285] = spawnstruct(); +/* 1:54 */waypoints[285].origin = (1246.24, -1007.65, 208.125); +/* 1:54 */waypoints[285].type = "stand"; +/* 1:54 */waypoints[285].children[0] = 284; +/* 1:54 */waypoints[285].children[1] = 286; +/* 1:54 */waypoints[285].children[2] = 290; +/* 1:54 */waypoints[286] = spawnstruct(); +/* 1:54 */waypoints[286].origin = (1055.97, -976.429, 208.125); +/* 1:54 */waypoints[286].type = "stand"; +/* 1:54 */waypoints[286].children[0] = 285; +/* 1:54 */waypoints[286].children[1] = 287; +/* 1:54 */waypoints[287] = spawnstruct(); +/* 1:54 */waypoints[287].origin = (1047.35, -829.142, 208.125); +/* 1:54 */waypoints[287].type = "stand"; +/* 1:54 */waypoints[287].children[0] = 286; +/* 1:54 */waypoints[287].children[1] = 288; +/* 1:54 */waypoints[288] = spawnstruct(); +/* 1:54 */waypoints[288].origin = (1050.09, -606.572, 232.125); +/* 1:54 */waypoints[288].type = "stand"; +/* 1:54 */waypoints[288].children[0] = 287; +/* 1:54 */waypoints[288].children[1] = 108; +/* 1:54 */waypoints[288].children[2] = 289; +/* 1:54 */waypoints[289] = spawnstruct(); +/* 1:54 */waypoints[289].origin = (1255.05, -702.843, 232.125); +/* 1:54 */waypoints[289].type = "stand"; +/* 1:54 */waypoints[289].children[0] = 288; +/* 1:54 */waypoints[289].children[1] = 290; +/* 1:54 */waypoints[290] = spawnstruct(); +/* 1:54 */waypoints[290].origin = (1312.69, -859.375, 208.125); +/* 1:54 */waypoints[290].type = "stand"; +/* 1:54 */waypoints[290].children[0] = 289; +/* 1:54 */waypoints[290].children[1] = 285; +/* 1:54 */waypoints[291] = spawnstruct(); +/* 1:54 */waypoints[291].origin = (628.691, 90.1666, 208.125); +/* 1:54 */waypoints[291].type = "stand"; +/* 1:54 */waypoints[291].children[0] = 98; +/* 1:54 */waypoints[291].children[1] = 292; +/* 1:54 */waypoints[292] = spawnstruct(); +/* 1:54 */waypoints[292].origin = (921.166, 103.956, 208.125); +/* 1:54 */waypoints[292].type = "stand"; +/* 1:54 */waypoints[292].children[0] = 291; +/* 1:54 */waypoints[292].children[1] = 293; +/* 1:54 */waypoints[293] = spawnstruct(); +/* 1:54 */waypoints[293].origin = (1030.68, 162.674, 228.737); +/* 1:54 */waypoints[293].type = "stand"; +/* 1:54 */waypoints[293].children[0] = 292; +/* 1:54 */waypoints[293].children[1] = 120; +/* 1:54 */waypoints[293].children[2] = 106; +/* 1:54 */waypoints[294] = spawnstruct(); +/* 1:54 */waypoints[294].origin = (-1810.88, 898.049, -27.6879); +/* 1:54 */waypoints[294].type = "crouch"; +/* 1:54 */waypoints[294].children[0] = 28; +/* 1:54 */waypoints[294].angles = (5.31738, 18.5229, 0); +/* 1:54 */waypoints[295] = spawnstruct(); +/* 1:54 */waypoints[295].origin = (-1382.59, 1295.4, 25.146); +/* 1:54 */waypoints[295].type = "crouch"; +/* 1:54 */waypoints[295].children[0] = 28; +/* 1:54 */waypoints[295].children[1] = 25; +/* 1:54 */waypoints[296] = spawnstruct(); +/* 1:54 */waypoints[296].origin = (-2267.61, -747.799, 143.04); +/* 1:54 */waypoints[296].type = "stand"; +/* 1:54 */waypoints[296].children[0] = 269; +/* 1:54 */waypoints[296].children[1] = 297; +/* 1:54 */waypoints[296].children[2] = 299; +/* 1:54 */waypoints[297] = spawnstruct(); +/* 1:54 */waypoints[297].origin = (-2351.92, -508.791, 200.125); +/* 1:54 */waypoints[297].type = "stand"; +/* 1:54 */waypoints[297].children[0] = 296; +/* 1:54 */waypoints[297].children[1] = 60; +/* 1:54 */waypoints[298] = spawnstruct(); +/* 1:54 */waypoints[298].origin = (-2108.68, -722.209, 112.125); +/* 1:54 */waypoints[298].type = "climb"; +/* 1:54 */waypoints[298].children[0] = 272; +/* 1:54 */waypoints[298].children[1] = 299; +/* 1:54 */waypoints[298].angles = (12.2552, -179.918, 0); +/* 1:54 */waypoints[299] = spawnstruct(); +/* 1:54 */waypoints[299].origin = (-2125.7, -722.21, 158.125); +/* 1:54 */waypoints[299].type = "stand"; +/* 1:54 */waypoints[299].children[0] = 298; +/* 1:54 */waypoints[299].children[1] = 296; +/* 1:54 */return waypoints; +} diff --git a/scripts/bots.gsc b/raw/scripts/bots.gsc similarity index 92% rename from scripts/bots.gsc rename to raw/scripts/bots.gsc index ddb059c..78d7204 100644 --- a/scripts/bots.gsc +++ b/raw/scripts/bots.gsc @@ -1,4 +1,4 @@ -init() -{ - level thread maps\mp\bots\_bot::init(); -} +init() +{ + level thread maps\mp\bots\_bot::init(); +} diff --git a/scripts/bots_menu.gsc b/raw/scripts/bots_menu.gsc similarity index 92% rename from scripts/bots_menu.gsc rename to raw/scripts/bots_menu.gsc index 0ae1805..7f874d9 100644 --- a/scripts/bots_menu.gsc +++ b/raw/scripts/bots_menu.gsc @@ -1,4 +1,4 @@ -init() -{ - level thread maps\mp\bots\_menu::init(); -} +init() +{ + level thread maps\mp\bots\_menu::init(); +} diff --git a/scripts/bots_test.gsc b/raw/scripts/bots_test.gsc similarity index 92% rename from scripts/bots_test.gsc rename to raw/scripts/bots_test.gsc index 0a2544a..629f4cb 100644 --- a/scripts/bots_test.gsc +++ b/raw/scripts/bots_test.gsc @@ -1,73 +1,73 @@ -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include common_scripts\utility; -#include maps\mp\bots\_bot_utility; - -init() -{ - setDvarIfUninitialized( "bots_test", true ); - - if (!getDvarInt("bots_test")) - return; - - level thread onConnected(); - level thread onframe(); -} - -onframe() -{ - for(;;) - { - wait 0.05; - - if(getDvarInt("developer")) print("time:" + getTime() + " child0:" + getVarUsage(0) + " child1:" + getVarUsage(1) + " notifycount:" + getVarUsage(2)); - } -} - -onConnected() -{ - for (;;) - { - level waittill("connected", player); - - player thread test(); - player thread onSpawn(); - } -} - -onSpawn() -{ - self endon("disconnect"); - - for (;;) - { - self waittill("spawned_player"); - - self thread spawned(); - } -} - -spawned() -{ - self endon("disconnect"); - self endon("death"); - - wait 0.5; -} - -test() -{ - self endon("disconnect"); - - for (;;) - { - wait 0.05; - - if (self is_bot()) - { - } - else - { - } - } -} +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include common_scripts\utility; +#include maps\mp\bots\_bot_utility; + +init() +{ + setDvarIfUninitialized( "bots_test", true ); + + if (!getDvarInt("bots_test")) + return; + + level thread onConnected(); + level thread onframe(); +} + +onframe() +{ + for(;;) + { + wait 0.05; + + if(getDvarInt("developer")) print("time:" + getTime() + " child0:" + getVarUsage(0) + " child1:" + getVarUsage(1) + " notifycount:" + getVarUsage(2)); + } +} + +onConnected() +{ + for (;;) + { + level waittill("connected", player); + + player thread test(); + player thread onSpawn(); + } +} + +onSpawn() +{ + self endon("disconnect"); + + for (;;) + { + self waittill("spawned_player"); + + self thread spawned(); + } +} + +spawned() +{ + self endon("disconnect"); + self endon("death"); + + wait 0.5; +} + +test() +{ + self endon("disconnect"); + + for (;;) + { + wait 0.05; + + if (self is_bot()) + { + } + else + { + } + } +} diff --git a/scripts/bots_wp_editor.gsc b/raw/scripts/bots_wp_editor.gsc similarity index 93% rename from scripts/bots_wp_editor.gsc rename to raw/scripts/bots_wp_editor.gsc index ebceda4..d05ab7d 100644 --- a/scripts/bots_wp_editor.gsc +++ b/raw/scripts/bots_wp_editor.gsc @@ -1,4 +1,4 @@ -init() -{ - level thread maps\mp\bots\_wp_editor::init(); -} +init() +{ + level thread maps\mp\bots\_wp_editor::init(); +} diff --git a/scripts/damagehud/__init__.lua b/raw/scripts/damagehud/__init__.lua similarity index 96% rename from scripts/damagehud/__init__.lua rename to raw/scripts/damagehud/__init__.lua index 18b157b..b50d853 100644 --- a/scripts/damagehud/__init__.lua +++ b/raw/scripts/damagehud/__init__.lua @@ -1,28 +1,28 @@ -game:onplayerdamage(function(_self, inflictor, attacker, damage, dflags, mod, weapon, point, dir, hitloc) - if (game:isplayer(attacker) ~= 1 or _self.sessionteam == attacker.sessionteam or _self == attacker) then - return - end - - local huddamage = game:newclienthudelem(attacker) - huddamage.alignx = "center" - huddamage.horzalign = "center" - huddamage.x = 10 - huddamage.y = 235 - huddamage.fontscale = 1.6 - huddamage.font = "objective" - huddamage:setvalue(damage) - - if (hitloc == "head") then - huddamage.color = vector:new(1, 1, 0.25) - end - - huddamage:moveovertime(1) - huddamage:fadeovertime(1) - huddamage.alpha = 0 - huddamage.x = math.random(25, 70) - huddamage.y = 235 + math.random(25, 70) * (math.random(0, 1) == 1 and -1 or 1) - - game:ontimeout(function() - huddamage:destroy() - end, 1000) -end) +game:onplayerdamage(function(_self, inflictor, attacker, damage, dflags, mod, weapon, point, dir, hitloc) + if (game:isplayer(attacker) ~= 1 or _self.sessionteam == attacker.sessionteam or _self == attacker) then + return + end + + local huddamage = game:newclienthudelem(attacker) + huddamage.alignx = "center" + huddamage.horzalign = "center" + huddamage.x = 10 + huddamage.y = 235 + huddamage.fontscale = 1.6 + huddamage.font = "objective" + huddamage:setvalue(damage) + + if (hitloc == "head") then + huddamage.color = vector:new(1, 1, 0.25) + end + + huddamage:moveovertime(1) + huddamage:fadeovertime(1) + huddamage.alpha = 0 + huddamage.x = math.random(25, 70) + huddamage.y = 235 + math.random(25, 70) * (math.random(0, 1) == 1 and -1 or 1) + + game:ontimeout(function() + huddamage:destroy() + end, 1000) +end)