diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index 8b2cb39..4ae3b25 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -34,6 +34,10 @@ BotBuiltinPrintConsole( s ) { [[ level.bot_builtins[ "printconsole" ] ]]( s ); } + else + { + println( s ); + } } /* @@ -1458,25 +1462,18 @@ readWpsFromFile( mapname ) for ( i = 1; i <= waypointCount; i++ ) { argc = freadln( f ); - line = ""; + tokens = []; for ( h = 0; h < argc; h++ ) { - line += fgetarg( f, h ); - - if ( h < argc - 1 ) - { - line += ","; - } + tokens[ h ] = fgetarg( f, h ); } - if ( !isdefined( line ) || line == "" ) + if ( !isdefined( tokens ) || !tokens.size ) { - continue; + break; } - tokens = strtok( line, "," ); - waypoint = parseTokensIntoWaypoint( tokens ); waypoints[ i - 1 ] = waypoint; diff --git a/maps/mp/bots/_wp_editor.gsc b/maps/mp/bots/_wp_editor.gsc new file mode 100644 index 0000000..1998c45 --- /dev/null +++ b/maps/mp/bots/_wp_editor.gsc @@ -0,0 +1,731 @@ +/* + _wp_editor + Author: INeedGames + Date: 09/12/2025 + The ingame waypoint editor. Designed to be ran on the client (not the server) +*/ + +#include maps\mp\_utility; +#include maps\mp\bots\_bot_utility; + +init() +{ + if ( getcvar( "bots_main_debug" ) == "" ) + { + setcvar( "bots_main_debug", 0 ); + } + + if ( !getcvarint( "bots_main_debug" ) ) + { + return; + } + + if ( !getcvarint( "developer" ) ) + { + setcvar( "developer_script", 1 ); + setcvar( "developer", 2 ); + + map( getcvar( "mapname" ) ); + return; + } + + setcvar( "bots_main", 0 ); + setcvar( "bots_main_menu", 0 ); + setcvar( "bots_manage_fill_mode", 0 ); + setcvar( "bots_manage_fill", 0 ); + setcvar( "bots_manage_add", 0 ); + setcvar( "bots_manage_fill_kick", 1 ); + setcvar( "bots_manage_fill_spec", 1 ); + + setcvar( "smoke", 0 ); + setcvar( "frag", 0 ); + setcvar( "speed", 0 ); + + if ( getcvar( "bots_main_debug_distance" ) == "" ) + { + setcvar( "bots_main_debug_distance", 512.0 ); + } + + if ( getcvar( "bots_main_debug_cone" ) == "" ) + { + setcvar( "bots_main_debug_cone", 0.65 ); + } + + if ( getcvar( "bots_main_debug_minDist" ) == "" ) + { + setcvar( "bots_main_debug_minDist", 32.0 ); + } + + if ( getcvar( "bots_main_debug_drawThrough" ) == "" ) + { + setcvar( "bots_main_debug_drawThrough", false ); + } + + if ( getcvar( "bots_main_debug_commandWait" ) == "" ) + { + setcvar( "bots_main_debug_commandWait", 0.5 ); + } + + level.waypoints = []; + level.waypointcount = 0; + + level waittill( "connected", player ); + + player thread onPlayerSpawned(); +} + +secondaryoffhandbuttonpressed() +{ + return getcvarint( "smoke" ); +} + +fragbuttonpressed() +{ + return getcvarint( "frag" ); +} + +adsbuttonpressed() +{ + return getcvarint( "speed" ) || self playerads() > 0.05; +} + +onPlayerSpawned() +{ + self endon( "disconnect" ); + + for ( ;; ) + { + self waittill( "spawned_player" ); + self thread beginDebug(); + } +} + +beginDebug() +{ + self endon( "disconnect" ); + self endon( "death" ); + + level.wptolink = -1; + level.autolink = false; + self.closest = -1; + self.command = undefined; + + self.bot_model_fix = true; + + self freezecontrols( false ); + + self thread debug(); + self thread addWaypoints(); + self thread linkWaypoints(); + self thread deleteWaypoints(); + self thread watchSaveWaypointsCommand(); + self thread sayExtras(); + + self thread textScroll( "^1SecondaryOffhand - ^2Add Waypoint; ^3MeleeButton - ^4Link Waypoint; ^5FragButton - ^6delete Waypoint; ^7UseButton + AttackButton - ^8Save" ); +} + +sayExtras() +{ + self endon( "disconnect" ); + self endon( "death" ); + self iprintln( "Making a crouch waypoint with only one link..." ); + self iprintln( "Makes a camping waypoint." ); +} + +debug() +{ + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) + { + wait 0.05; + + if ( isdefined( self.command ) ) + { + continue; + } + + closest = -1; + myEye = self gettagorigin( "j_head" ); + myAngles = self getplayerangles(); + + 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 ) < getcvarfloat( "bots_main_debug_distance" ) && ( bullettracepassed( myEye, wpOrg, false, self ) || getcvarint( "bots_main_debug_drawThrough" ) ) ) + { + 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 ) > getcvarfloat( "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 + vector_scale( anglestoforward( level.waypoints[ i ].angles ), 64 ), ( 1, 1, 1 ) ); + } + } + } + + self.closest = closest; + + if ( closest != -1 ) + { + stringChildren = ""; + + for ( i = 0; i < level.waypoints[ closest ].children.size; i++ ) + { + if ( i != 0 ) + { + stringChildren = stringChildren + "," + level.waypoints[ closest ].children[ i ]; + } + else + { + stringChildren = stringChildren + level.waypoints[ closest ].children[ i ]; + } + } + + print3d( level.waypoints[ closest ].origin + ( 0, 0, 35 ), stringChildren, ( 0, 1, 0 ), 2 ); + + print3d( level.waypoints[ closest ].origin + ( 0, 0, 15 ), level.waypoints[ closest ].type, ( 0, 1, 0 ), 2 ); + } + } +} + +addWaypoints() +{ + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) + { + while ( !self secondaryoffhandbuttonpressed() || isdefined( self.command ) ) + { + wait 0.05; + } + + pos = self getorigin(); + self.command = true; + + self iprintln( "Adding a waypoint..." ); + self iprintln( "ADS - climb; Attack + Use - tube" ); + self iprintln( "Attack - grenade; Use - claymore" ); + self iprintln( "Else(wait) - your stance" ); + + wait getcvarfloat( "bots_main_debug_commandWait" ); + + self addWaypoint( pos ); + + self.command = undefined; + + while ( self secondaryoffhandbuttonpressed() ) + { + wait 0.05; + } + } +} + +linkWaypoints() +{ + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) + { + while ( !self meleebuttonpressed() || isdefined( self.command ) ) + { + wait 0.05; + } + + self.command = true; + + self iprintln( "ADS - unlink; Else(wait) - Link" ); + + wait getcvarfloat( "bots_main_debug_commandWait" ); + + if ( !self adsbuttonpressed() ) + { + self LinkWaypoint( self.closest ); + } + else + { + self UnLinkWaypoint( self.closest ); + } + + self.command = undefined; + + while ( self meleebuttonpressed() ) + { + wait 0.05; + } + } +} + +deleteWaypoints() +{ + self endon( "disconnect" ); + self endon( "death" ); + + for ( ;; ) + { + while ( !self fragbuttonpressed() || isdefined( self.command ) ) + { + wait 0.05; + } + + self.command = true; + + self iprintln( "Attack - deleteAll; ADS - Load" ); + self iprintln( "Else(wait) - delete" ); + + wait getcvarfloat( "bots_main_debug_commandWait" ); + + if ( self attackbuttonpressed() ) + { + self deleteAllWaypoints(); + } + else if ( self adsbuttonpressed() ) + { + self LoadWaypoints(); + } + else + { + self deleteWaypoint( self.closest ); + } + + self.command = undefined; + + while ( self fragbuttonpressed() ) + { + wait 0.05; + } + } +} + +watchSaveWaypointsCommand() +{ + self endon( "death" ); + self endon( "disconnect" ); + + for ( ;; ) + { + while ( !self usebuttonpressed() || !self attackbuttonpressed() || isdefined( self.command ) ) + { + wait 0.05; + } + + self.command = true; + + self iprintln( "ADS - Autolink; Else(wait) - Save" ); + + wait getcvarfloat( "bots_main_debug_commandWait" ); + + if ( !self adsbuttonpressed() ) + { + self checkForWarnings(); + wait 1; + + logprint( "***********ABiliTy's WPDump**************\n\n" ); + logprint( "\n\n\n\n" ); + mpnm = getMapName( getcvar( "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/*" ); + } + } + + logprint( "*/return waypoints;\n}\n\n\n\n" ); + + filename = "waypoints/" + getcvar( "mapname" ) + "_wp.csv"; + + println( "********* Start Bot Warfare WPDump *********" ); + println( level.waypointcount ); + + // cod2 fprintln always ends the write with a comma... + //f = openfile( filename, "write" ); + f = -1; + + if ( f >= 0 ) + { + fprintln( f, level.waypointcount + "\n" ); + } + + 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 += ","; + } + + str += ","; + + println( str ); + + if ( f >= 0 ) + { + fprintln( f, str + "\n" ); + } + } + + if ( f >= 0 ) + { + closefile( f ); + } + + println( "\n\n\n\n\n\n" ); + + self iprintln( "Saved!!! to " + filename ); + } + else + { + 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.closest; + } + } + + self.command = undefined; + + while ( self usebuttonpressed() && self attackbuttonpressed() ) + { + wait 0.05; + } + } +} + +LoadWaypoints() +{ + self deleteAllWaypoints(); + self iprintlnbold( "Loading WPS..." ); + load_waypoints(); + level.waypointcount = level.waypoints.size; + + 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 ( !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" ); + } + } +} + +deleteAllWaypoints() +{ + level.waypoints = []; + level.waypointcount = 0; + + self iprintln( "DelAllWps" ); +} + +deleteWaypoint( nwp ) +{ + if ( nwp == -1 || distance( self.origin, level.waypoints[ nwp ].origin ) > getcvarfloat( "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( pos ) +{ + level.waypoints[ level.waypointcount ] = spawnstruct(); + + level.waypoints[ level.waypointcount ].origin = pos; + + 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 = []; + + 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++; + } +} + +UnLinkWaypoint( nwp ) +{ + if ( nwp == -1 || distance( self.origin, level.waypoints[ nwp ].origin ) > getcvarfloat( "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 ) > getcvarfloat( "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-- ) + { + if ( level.waypoints[ level.wptolink ].children[ i ] == nwp ) + { + weGood = false; + break; + } + } + + if ( weGood ) + { + for ( i = level.waypoints[ nwp ].children.size - 1; i >= 0; i-- ) + { + if ( level.waypoints[ nwp ].children[ i ] == 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; +} + +destroyOnDeath( hud ) +{ + hud endon( "death" ); + self waittill_either( "death", "disconnect" ); + hud destroy(); +} + +textScroll( string ) +{ + self endon( "death" ); + self endon( "disconnect" ); + // thanks ActionScript + + /*back = createbar( ( 0, 0, 0 ), 1000, 30 ); + back setpoint( "CENTER", undefined, 0, 220 ); + self thread destroyOnDeath( back ); + + text = createfontstring( "default", 1.5 ); + text settext( string ); + self thread destroyOnDeath( text ); + + for ( ;; ) + { + text setpoint( "CENTER", undefined, 1200, 220 ); + text setpoint( "CENTER", undefined, -1200, 220, 20 ); + wait 20; + }*/ +} diff --git a/maps/mp/gametypes/_clientids.gsc b/maps/mp/gametypes/_clientids.gsc index 101a04b..e2ba3e0 100644 --- a/maps/mp/gametypes/_clientids.gsc +++ b/maps/mp/gametypes/_clientids.gsc @@ -6,6 +6,7 @@ init() // bootstrap level thread scripts\mp\bots_adapter_libcod::init(); + level thread scripts\mp\bots_wp_editor::init(); level thread scripts\mp\bots::init(); } diff --git a/scriptdata/waypoints/mp_cod_dust_wp.csv b/scriptdata/waypoints/mp_cod_dust_wp.csv new file mode 100644 index 0000000..68ff732 --- /dev/null +++ b/scriptdata/waypoints/mp_cod_dust_wp.csv @@ -0,0 +1,127 @@ +126 +-590.571 1849.09 0.838144,1,stand,6.54785 -77.157 0,, +-628.197 1629.02 2.26838,0 2,stand,17.7759 106.782 0,, +-421.58 1590.32 2.34734,1 3 7 6,stand,15.1337 76.756 0,, +-380.92 1865.48 0.125,2 4,stand,20.3357 -3.79578 0,, +-157.317 1869.93 0.145806,3 5,stand,22.5604 -93.9056 0,, +-178.786 1757.99 0.125002,4 6 8,stand,20.1489 -102.167 0,, +-224.651 1615.39 0.488254,5 7 24 2,stand,21.4453 -99.9371 0,, +-235.809 1534.49 4.53232,6 2,stand,15.7874 151.76 0,, +82.9078 1749.78 -8.20018,5 9 24,stand,20.8905 0.862427 0,, +367.546 1749.78 3.14994,8 10 25,stand,17.0837 -2.40601 0,, +515.378 1631.69 0.125,9 11 26,stand,22.934 56.618 0,, +599.068 1784.85 0.125,10 12,stand,21.8188 9.47571 0,, +718.086 1785.44 -0.255782,11 13 64,stand,16.3422 -94.5538 0,, +688.432 1560.28 2.67747,12 14,stand,16.2488 -90.6592 0,, +686.743 1271.12 32.125,13 15 27,stand,16.1554 -90.7526 0,, +420.413 1233.17 32.125,14 16,stand,15.3204 178.583 0,, +102.836 1235.09 2.13169,15 17,stand,5.76233 173.754 0,, +-149.283 1253.16 0.745125,16 18 22,stand,19.4073 -178.077 0,, +-280.648 1248.4 36.1911,17 19,stand,25.7135 100.624 0,, +-299.174 1381.62 40.9798,18 20,stand,24.5105 172.271 0,, +-578.246 1382.06 44.9136,19 21,stand,25.0653 -96.5973 0,, +-596.25 1242.02 41.4588,20,stand,16.062 104.227 0,, +-131.326 1416.13 3.33408,17 23,stand,21.3519 19.8688 0,, +10.4335 1497.11 6.08899,22 24,stand,17.2705 160.005 0,, +3.18074 1607.48 -6.89213,23 6 25 8,stand,17.4573 154.061 0,, +204.731 1630.97 -0.220104,24 26 9,stand,22.5604 2.8894 0,, +432.278 1629.7 0.323285,25 10,stand,24.4171 -60.3094 0,, +1057.08 1241.89 32.125,14 28 65,stand,17.1771 -3.16956 0,, +1266.22 1265.83 32.125,27 29,stand,14.1174 -12.6343 0,, +1430.53 1181.56 32.125,28 30 65,stand,18.1989 -168.47 0,, +1677.77 1154.48 32.125,29 31,stand,18.1055 -2.61475 0,, +1898.47 1149.99 0.125,30 32 33,stand,18.0121 -6.60278 0,, +2180.07 1139.22 0.125,31,stand,10.9589 -143.97 0,, +1885.47 1514.4 0.125,31 34,stand,19.314 -95.4327 0,, +1329.12 1514.12 2.85579,33 35 64,stand,30.2618 -12.3541 0,, +1333.96 1698.83 0.244813,34 36 64 99,stand,25.1587 85.3638 0,, +1351.96 1920.87 -0.231463,35 37 63,stand,28.7787 -39.0839 0,, +1725.14 1911.38 4.94784,36 38,stand,16.8091 -0.85144 0,, +2040.93 1911.08 16.335,37 39,stand,18.2922 150.326 0,, +2004.43 2047.75 18.9263,38 40,stand,24.137 -96.6412 0,, +1610.29 2033.88 0.16182,39 41,stand,17.2705 12.7002 0,, +1603.94 2259.69 -1.94746,40 42 62,stand,25.2521 -5.3009 0,, +1890.26 2247.79 -1.43648,41 43,stand,16.4355 109.402 0,, +1868.76 2637.73 3.14823,44 42,stand,16.5289 93.0652 0,, +1850.24 2968.14 0.0132954,43 45,stand,21.5387 -173.293 0,, +1755.73 2962.55 0.252641,44 46 53,stand,25.2521 87.5006 0,, +1755.31 3174.61 21.8029,45 47 48,stand,18.6603 -53.0035 0,, +1861.79 3175.88 32.6631,46,stand,25.0653 -25.0708 0,, +1520.21 3166.28 30.6774,49 46,stand,13.7439 -178.094 0,, +1181.99 3152.9 32.6795,50 48 58,stand,17.0837 -176.331 0,, +832.793 3137.4 40.1253,49 51,stand,17.8253 -84.9243 0,, +838.43 2958.83 48.1785,52 50,stand,17.644 -90.5823 0,, +841.398 2688.23 44.5658,51,stand,22.0056 160.746 0,, +1311.48 2959.1 0.517998,45 54,stand,16.7157 -89.3573 0,, +1315.19 2554.97 0.81357,53 55,stand,17.0837 -91.214 0,, +1300.9 2491.1 2.54647,54 56 57,stand,40.2869 4.27917 0,, +1538.63 2489.83 12.2181,55,stand,16.062 -156.011 0,, +1162.46 2492.9 -0.0649382,55 58 59 62,stand,14.6722 93.2739 0,, +1149.8 2818.46 8.16622,57 49,stand,12.5354 87.8961 0,, +859.35 2568.7 2.83232,57 60,stand,15.6006 -139.675 0,, +702.953 2374.79 1.88195,59 61,stand,16.8091 -21.264 0,, +935.365 2237.46 -1.84044,60 62,stand,17.8253 2.95532 0,, +1199.83 2232.44 -4.69814,61 57 41 63,stand,19.0338 99.657 0,, +1152.61 1908.19 1.17062,62 36 64,stand,16.9904 0.725098 0,, +1112.04 1703.96 16.8523,63 35 12 34,stand,19.5007 -0.85144 0,, +1196 1069.44 32.125,27 29 66,stand,16.8091 -92.9059 0,, +1172.93 618.397 11.9747,65 67 107,stand,18.1989 153.298 0,, +834.839 610.779 9.75177,66 68,stand,18.6603 -153.902 0,, +662.302 567.655 7.6941,67 69,stand,19.7754 -31.9592 0,, +701.237 340.814 0.125001,68 70,stand,13.8373 -89.6814 0,, +718.311 88.4924 2.28071,69 71 82 84,stand,19.1272 -110.748 0,, +104.092 85.0792 -111.213,70 72 81,stand,2.60925 -6.71265 0,, +-153.141 81.8865 -110.594,71 73,stand,17.0837 -78.728 0,, +-141.984 -218.268 -119.033,72 74 81,stand,17.0837 -89.7748 0,, +43.1897 -434.086 -120.548,73 75,stand,15.9741 93.5101 0,, +353.412 -402.658 -118.912,74 76 81,stand,12.074 3.30688 0,, +776.127 -383.859 -68.2447,75 77,stand,11.0522 0.428467 0,, +1242.68 -383.226 2.7176,76 78 86 83,stand,22.1869 171.76 0,, +1257.4 -646.344 17.5631,77 79,stand,15.0458 83.4906 0,, +1003.18 -670.307 23.5316,78 80,stand,15.6006 176.385 0,, +651.006 -651.367 23.8961,79 125,stand,15.6006 179.632 0,, +238.093 -146.765 -111.178,71 75 73,stand,17.1771 130.803 0,, +704.395 -124.113 10.7536,70 83,stand,14.9524 0.153809 0,, +1204.22 -104.288 8.84174,82 84 77,stand,17.5507 126.271 0,, +1190.21 118.547 8.37926,83 70 85,stand,20.7971 -165.333 0,, +1442.71 -41.7574 8.53327,84 86,stand,21.5387 -83.573 0,, +1481 -386.371 -1.04932,85 77 87,stand,19.7754 167.108 0,, +1729.31 -359.93 11.2098,86 88 92,stand,17.0837 -92.1863 0,, +1719.86 -785.173 12.0328,87 89,stand,16.8091 -1.51611 0,, +2016.64 -788.394 12.1242,88 90,stand,18.0121 -28.1525 0,, +2232.12 -765.233 13.3972,89 91 117,stand,18.479 -66.0168 0,, +2203.88 -485.66 10.4454,90 92 100 113,stand,17.0837 -171.271 0,, +1979.53 -377.908 12.6095,91 87 93,stand,21.4453 170.634 0,, +1993.07 88.5781 -89.2714,92 94,stand,17.9187 89.5056 0,, +2035.69 542.832 -183.6,93 95 102,stand,19.314 76.6022 0,, +2167.26 815.766 -184.901,94 96,stand,12.7222 104.26 0,, +2106.56 1105.64 -183.698,95 97,stand,14.6722 87.4622 0,, +2092.55 1420.2 -183.731,96 98,stand,10.2173 97.8552 0,, +2036.12 1649.85 -183.461,97 99 118,stand,4.92737 179.061 0,, +1674.08 1718.53 -118.741,98 35,stand,2.3291 176.182 0,, +2161.41 -154.875 -18.7248,91 101,stand,28.3118 86.0669 0,, +2179.86 91.0802 -95.409,100 102 103,stand,16.1554 99.1516 0,, +2166.39 454.711 -181.676,101 94,stand,20.3357 90.6152 0,, +2388.4 99.5168 7.81654,101 104 112,stand,41.2152 178.984 0,, +2372.18 572.994 17.8926,103 105 108,stand,15.5072 -84.408 0,, +2045.11 586.832 11.9238,104 106,stand,11.7938 -179.72 0,, +1696.56 583.78 11.9194,105 107,stand,12.5354 -174.243 0,, +1424.33 564.566 11.7685,106 66,stand,11.7004 176.94 0,, +2589.69 445.536 23.5981,104 109 111,stand,17.7374 37.2491 0,, +2894.29 597.005 32.7013,108 110,stand,24.6973 -58.2385 0,, +2986.62 263.478 26.5739,109 111,stand,16.3422 109.006 0,, +2640.03 137.982 24.8613,110 112 108,stand,19.9622 -168.563 0,, +2447.61 99.4904 8.125,111 103 113,stand,12.1674 22.89 0,, +2438.6 -314.617 14.3645,112 114 117 91,stand,16.8091 -3.00476 0,, +2691.32 -338.284 15.8616,113 115,stand,21.1707 -97.1027 0,, +2659.87 -589.763 11.9619,114 116,stand,22.6538 -105.919 0,, +2616.43 -782.857 11.8677,115 117,stand,18.2922 86.0889 0,, +2454.88 -673.401 12.5757,116 90 113,stand,16.4355 177.127 0,, +1990.56 1822.11 -183.667,98 119,stand,15.683 0.0604248 0,, +2053.3 1822.15 -181.274,118 120,climb,0.0933838 0.153809 0,, +2103.53 1823.26 -116.773,119 121,climb,0.714111 1.08215 0,, +2174.31 1823.18 -52.0472,120,climb,13.7604 -1.71387 0,, +-45.7835 -519.639 64.125,123 124,stand,16.3586 -1.65344 0,, +-98.2583 -739.482 17.9988,122,stand,18.5834 74.35 0,, +221.846 -518.622 64.125,122 125,stand,9.58008 -0.532837 0,, +610.19 -523.562 64.125,124 80,stand,20.3467 -0.807495 0,, \ No newline at end of file diff --git a/scripts/mp/bots_wp_editor.gsc b/scripts/mp/bots_wp_editor.gsc new file mode 100644 index 0000000..d05ab7d --- /dev/null +++ b/scripts/mp/bots_wp_editor.gsc @@ -0,0 +1,4 @@ +init() +{ + level thread maps\mp\bots\_wp_editor::init(); +}