diff --git a/maps/mp/bots/_bot.gsc b/maps/mp/bots/_bot.gsc index 4ac27ee..155d093 100644 --- a/maps/mp/bots/_bot.gsc +++ b/maps/mp/bots/_bot.gsc @@ -23,6 +23,11 @@ init() if (!getDvarInt("bots_main")) return; + if(getDvar("bots_main_lowmem") == "") + setDvar("bots_main_lowmem", false);//lower memory usage mode, more cpu + + level.bots_lowmem = getDvarInt("bots_main_lowmem"); + thread load_waypoints(); thread hook_callbacks(); diff --git a/maps/mp/bots/_bot_utility.gsc b/maps/mp/bots/_bot_utility.gsc index 111d1d8..763b785 100644 --- a/maps/mp/bots/_bot_utility.gsc +++ b/maps/mp/bots/_bot_utility.gsc @@ -934,7 +934,10 @@ load_waypoints() level.waypoints[i].childCount = level.waypoints[i].children.size; } - level.waypointsKDTree = WaypointsToKDTree(); + if (!level.bots_lowmem) + { + level.waypointsKDTree = WaypointsToKDTree(); + } level.waypointsCamp = []; level.waypointsTube = []; @@ -1492,6 +1495,27 @@ GetNearestWaypointWithSight(pos) 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 = level.waypoints[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. @@ -1505,7 +1529,11 @@ AStarSearch(start, goal, team, greedy_path) closed = [];//set for quick lookup - startwp = level.waypointsKDTree KDTreeNearest(start);//balanced kdtree, for nns + startwp = undefined; + if (level.bots_lowmem) + startwp = getNearestWaypoint(start); + else + startwp = level.waypointsKDTree KDTreeNearest(start);//balanced kdtree, for nns if(!isDefined(startwp)) return []; _startwp = undefined; @@ -1515,7 +1543,11 @@ AStarSearch(start, goal, team, greedy_path) startwp = _startwp; startwp = startwp.index; - goalwp = level.waypointsKDTree KDTreeNearest(goal); + goalwp = undefined; + if (level.bots_lowmem) + goalwp = getNearestWaypoint(goal); + else + goalwp = level.waypointsKDTree KDTreeNearest(goal); if(!isDefined(goalwp)) return []; _goalwp = undefined;