1 package cz.cuni.amis.pogamut.ut2004.bot.impl; 2 3 import java.util.Random; 4 import java.util.logging.Level; 5 6 import cz.cuni.amis.pogamut.base.agent.navigation.IPathPlanner; 7 import cz.cuni.amis.pogamut.base.agent.navigation.PathExecutorState; 8 import cz.cuni.amis.pogamut.base.communication.command.IAct; 9 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.AnnotationListenerRegistrator; 10 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.EventListener; 11 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassEventListener; 12 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassListener; 13 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectEventListener; 14 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectListener; 15 import cz.cuni.amis.pogamut.base.utils.math.DistanceUtils; 16 import cz.cuni.amis.pogamut.base3d.worldview.IVisionWorldView; 17 import cz.cuni.amis.pogamut.base3d.worldview.object.ILocated; 18 import cz.cuni.amis.pogamut.unreal.agent.navigation.IUnrealPathExecutor; 19 import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.AgentConfig; 20 import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Raycasting; 21 import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Weaponry; 22 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.AgentInfo; 23 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.AgentStats; 24 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Game; 25 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.ItemDescriptors; 26 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Items; 27 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.NavigationGraphBuilder; 28 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Players; 29 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Senses; 30 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.WeaponPrefs; 31 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004AStarPathPlanner; 32 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004GetBackToNavGraph; 33 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004Navigation; 34 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004PathExecutor; 35 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004RunStraight; 36 import cz.cuni.amis.pogamut.ut2004.agent.navigation.floydwarshall.FloydWarshallMap; 37 import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.KefikRunner; 38 import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.LoqueNavigator; 39 import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004DistanceStuckDetector; 40 import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004PositionStuckDetector; 41 import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004TimeStuckDetector; 42 import cz.cuni.amis.pogamut.ut2004.bot.IUT2004BotController; 43 import cz.cuni.amis.pogamut.ut2004.bot.command.AdvancedLocomotion; 44 import cz.cuni.amis.pogamut.ut2004.bot.command.CompleteBotCommandsWrapper; 45 import cz.cuni.amis.pogamut.ut2004.bot.command.ImprovedShooting; 46 import cz.cuni.amis.pogamut.ut2004.communication.messages.ItemType; 47 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbcommands.GetPath; 48 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.AutoTraceRay; 49 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange; 50 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage; 51 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.NavPoint; 52 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.PathList; 53 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.Self; 54 import cz.cuni.amis.pogamut.ut2004.communication.translator.itemdescriptor.ItemDescriptor; 55 56 /** 57 * The most advanced controller that is available. This controller contains all useful modules pre-instantiated. 58 * 59 * @author Jimmy 60 * 61 * @param <BOT> 62 */ 63 public class UT2004BotModuleController<BOT extends UT2004Bot> extends UT2004BotLogicController<BOT> { 64 65 /** 66 * Random number generator that is usually useful to have during decision making. 67 */ 68 protected Random random = new Random(System.currentTimeMillis()); 69 70 /** 71 * Command module that is internally using {@link UT2004PathExecutor} for path-following and {@link FloydWarshallMap} 72 * for path planning resulting in unified class that can solely handle navigation of the bot within the environment. 73 * <p><p> 74 * In contrast to {@link UT2004PathExecutor} methods 75 * of this module may be recalled every {@link UT2004BotModuleController#logic()} iteration even with 76 * the same argument (which is not true for {@link UT2004PathExecutor#followPath(cz.cuni.amis.pogamut.base.agent.navigation.IPathFuture)}. 77 * <p><p> 78 * Note that this class is actually initialized with instances of {@link UT2004BotModuleController#pathExecutor} and {@link UT2004BotModuleController#fwMap} 79 * so you must take care if using add/remove stuck detectors or reinitilize this property to your liking (you can do that in {@link UT2004BotModuleController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 80 * method. 81 * <p><p> 82 * May be used since first {@link UT2004BotModuleController#logic()} is called. 83 * <p><p> 84 * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}. 85 */ 86 protected UT2004Navigation navigation; 87 88 /** 89 * Memory module specialized on general info about the game - game type, time limit, frag limit, etc. 90 * <p><p> 91 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)} 92 * is called. 93 * <p><p> 94 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 95 */ 96 protected Game game; 97 98 /** 99 * Memory module specialized on general info about the agent whereabouts - location, rotation, health, current weapon, who is enemy/friend, etc. 100 * <p><p> 101 * May be used since first {@link Self} message is received, i.e, since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 102 * is called. 103 * <p><p> 104 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 105 */ 106 protected AgentInfo info; 107 108 /** 109 * Memory module specialized on whereabouts of other players - who is visible, enemy / friend, whether bot can see anybody, etc. 110 * <p><p> 111 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)} 112 * is called. 113 * <p><p> 114 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 115 */ 116 protected Players players; 117 118 /** 119 * Sensory module that provides mapping between {@link ItemType} and {@link ItemDescriptor} providing 120 * an easy way to obtain item descriptors for various items in UT2004. 121 * <p><p> 122 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)} 123 * is called. 124 * <p><p> 125 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 126 */ 127 protected ItemDescriptors descriptors; 128 129 /** 130 * Memory module specialized on items on the map - which are visible and which are probably spawned. 131 * <p><p> 132 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)} 133 * is called. 134 * <p><p> 135 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 136 */ 137 protected Items items; 138 139 /** 140 * Memory module specialized on agent's senses - whether the bot has been recently killed, collide with level's geometry, etc. 141 * <p><p> 142 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)} 143 * is called. 144 * <p><p> 145 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 146 */ 147 protected Senses senses; 148 149 /** 150 * Memory module specialized on info about the bot's weapon and ammo inventory - it can tell you which weapons are loaded, melee/ranged, etc. 151 * <p><p> 152 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)} 153 * is called. 154 * <p><p> 155 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 156 */ 157 protected Weaponry weaponry; 158 159 /** 160 * Memory module specialized on the agent's configuration inside UT2004 - name, vision time, manual spawn, cheats (if enabled at GB2004). 161 * <p><p> 162 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)} 163 * is called. 164 * <p><p> 165 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 166 */ 167 protected AgentConfig config; 168 169 /** 170 * Support for creating rays used for raycasting (see {@link AutoTraceRay} that is being utilized). 171 * <p><p> 172 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)} 173 * is called. 174 * <p><p> 175 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 176 */ 177 protected Raycasting raycasting; 178 179 /** 180 * Wraps all available commands that can be issued to the virtual body of the bot inside UT2004. 181 * <p><p> 182 * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 183 * is called. 184 * <p><p> 185 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 186 */ 187 protected CompleteBotCommandsWrapper body; 188 189 /** 190 * Shortcut for <i>body.getAdvancedShooting()</i> that allows you to shoot at opponent. 191 * <p><p> 192 * Note: more weapon-handling methods are available through {@link UT2004BotModuleControllerNew#weaponry}. 193 * <p><p> 194 * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 195 * is called. 196 * <p><p> 197 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 198 */ 199 protected ImprovedShooting shoot; 200 201 /** 202 * Shortcut for <i>body.getAdvancedLocomotion()</i> that allows you to manually steer the movement through the environment. 203 * <p><p> 204 * Note: navigation is done via {@link UT2004BotModuleControllerNew#pathExecutor} that needs {@link PathHandle} from the {@link UT2004BotModuleControllerNew#pathPlanner}. 205 * <p><p> 206 * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 207 * is called. 208 * <p><p> 209 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 210 */ 211 protected AdvancedLocomotion move; 212 213 /** 214 * Executor is used for following a path in the environment. 215 * <p><p> 216 * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 217 * is called. 218 * <p><p> 219 * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}. 220 * <p><p> 221 * {@link UT2004PathExecutor#addStuckDetector(cz.cuni.amis.pogamut.base.agent.navigation.IStuckDetector)} is initialized with default stuck detectors: 222 * {@link UT2004TimeStuckDetector}, {@link UT2004PositionStuckDetector}, {@link UT2004DistanceStuckDetector}. 223 * <p><p> 224 * If one of stuck detectors (heuristicly) finds out that the bot has stuck somewhere, 225 * it reports it back to {@link UT2004PathExecutor} and the path executor will stop following the path switching 226 * itself to {@link PathExecutorState#STUCK}, which in turn allows us to issue another follow-path command in the right time. 227 */ 228 protected UT2004PathExecutor<ILocated> pathExecutor = null; 229 230 /** 231 * Planner used to compute the path (consisting of navigation points) inside the map. 232 * <p><p> 233 * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 234 * is called. 235 * <p><p> 236 * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}. 237 */ 238 protected IPathPlanner<ILocated> pathPlanner = null; 239 240 /** 241 * Navigation graph builder that may be used to manually extend the navigation graph of the UT2004. 242 * <p><p> 243 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 244 * is called. 245 * <p><p> 246 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}. 247 */ 248 protected NavigationGraphBuilder navBuilder = null; 249 250 /** 251 * Listener registrator that probes declared methods for the presence of {@link EventListener}, {@link ObjectClassEventListener}, 252 * {@link ObjectClassListener}, {@link ObjectEventListener} and {@link ObjectListener} annotations and automatically registers 253 * them as listeners on a specific events. 254 * <p><p> 255 * Note that this registrator is usable for 'this' object only! It will work only for 'this' object. 256 */ 257 protected AnnotationListenerRegistrator listenerRegistrator; 258 259 /** 260 * Weapon preferences for your bot. See {@link WeaponPrefs} class javadoc. It allows you to define preferences for 261 * weapons to be used at given distance (together with their firing modes). 262 */ 263 protected WeaponPrefs weaponPrefs; 264 265 /** 266 * Shortcut for the {@link UT2004Bot#getWorldView()}. 267 */ 268 protected IVisionWorldView world; 269 270 /** 271 * Shortcut for the {@link UT2004Bot#getAct()}. 272 */ 273 protected IAct act; 274 275 /** 276 * Module that is providing various statistics about the bot. You may also used it to output these stats (in CSV format) 277 * into some file using {@link AgentStats#startOutput(String)} or {@link AgentStats#startOutput(String, boolean)}. 278 */ 279 protected AgentStats stats; 280 281 /** 282 * Path-planner ({@link IPathPlanner} using {@link NavPoint}s), you may use it to find paths inside the environment wihtout 283 * waiting for round-trip of {@link GetPath} command and {@link PathList}s response from UT2004. It is much faster than 284 * {@link UT2004BotModuleController#pathPlanner} but you need to pass {@link NavPoint} instances to planner instead of 285 * {@link ILocated} ... to find the nearest {@link NavPoint} instance, {@link DistanceUtils} is a handy, check especially 286 * {@link DistanceUtils#getNearest(java.util.Collection, ILocated)}. 287 */ 288 protected FloydWarshallMap fwMap; 289 290 /** 291 * Navigation helper that is able to get your bot back to the nearest navigation graph so you can use {@link UT2004BotModuleController#navigation} 292 * without fear of catastrophe. 293 * <p><p> 294 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 295 * is called. 296 * <p><p> 297 * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}. 298 */ 299 protected UT2004GetBackToNavGraph getBackToNavGraph; 300 301 /** 302 * Navigation helper that can run-straight to some point with stuck detectors. 303 * <p><p> 304 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 305 * is called. 306 * <p><p> 307 * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}. 308 */ 309 protected UT2004RunStraight runStraight; 310 311 @Override 312 public void initializeController(BOT bot) { 313 super.initializeController(bot); 314 world = getWorldView(); 315 act = getAct(); 316 initializeModules(bot); 317 initializePathFinding(bot); 318 initializeListeners(bot); 319 } 320 321 /** 322 * Initializes {@link UT2004BotModuleControllerNew#listenerRegistrator} and calls {@link AnnotationListenerRegistrator#addListeners()} method 323 * to probe all declared methods for event-annotation presence. 324 * @param bot 325 */ 326 protected void initializeListeners(BOT bot) { 327 listenerRegistrator = new AnnotationListenerRegistrator(this, getWorldView(), bot.getLogger().getCategory("Listeners")); 328 listenerRegistrator.addListeners(); 329 } 330 331 /** 332 * Initializes path-finding modules: {@link UT2004BotModuleControllerNew#pathPlanner}, {@link UT2004BotModuleController#fwMap} and {@link UT2004BotModuleControllerNew#pathExecutor}. 333 * If you need different path planner / path executor - override this method and initialize your own modules. 334 * @param bot 335 */ 336 protected void initializePathFinding(BOT bot) { 337 pathPlanner = new UT2004AStarPathPlanner(bot); 338 fwMap = new FloydWarshallMap(bot); 339 pathExecutor = 340 new UT2004PathExecutor<ILocated>( 341 bot, 342 new LoqueNavigator<ILocated>(bot, 343 new KefikRunner(bot, info, move, bot.getLog()), 344 bot.getLog()) 345 ); 346 347 // add stuck detectors that watch over the path-following, if it (heuristicly) finds out that the bot has stuck somewhere, 348 // it reports an appropriate path event and the path executor will stop following the path which in turn allows 349 // us to issue another follow-path command in the right time 350 pathExecutor.addStuckDetector(new UT2004TimeStuckDetector(bot, 3000, 100000)); // if the bot does not move for 3 seconds, considered that it is stuck 351 pathExecutor.addStuckDetector(new UT2004PositionStuckDetector(bot)); // watch over the position history of the bot, if the bot does not move sufficiently enough, consider that it is stuck 352 pathExecutor.addStuckDetector(new UT2004DistanceStuckDetector(bot)); // watch over distances to target 353 354 getBackToNavGraph = new UT2004GetBackToNavGraph(bot, info, move); 355 runStraight = new UT2004RunStraight(bot, info, move); 356 navigation = new UT2004Navigation(bot, pathExecutor, fwMap, getBackToNavGraph, runStraight); 357 } 358 359 /** 360 * Initializes memory/command modules of the bot. 361 * 362 * @param bot 363 */ 364 protected void initializeModules(BOT bot) { 365 game = new Game(bot); 366 info = new AgentInfo(bot, game); 367 players = new Players(bot); 368 descriptors = new ItemDescriptors(bot); 369 weaponry = new Weaponry(bot, descriptors); 370 items = new Items(bot, info, game, weaponry, null); 371 senses = new Senses(bot, info, players); 372 config = new AgentConfig(bot); 373 raycasting = new Raycasting(bot); 374 body = new CompleteBotCommandsWrapper(bot, weaponry, null); 375 shoot = body.getImprovedShooting(); 376 move = body.getLocomotion(); 377 navBuilder = new NavigationGraphBuilder(bot); 378 stats = new AgentStats(bot); 379 weaponPrefs = new WeaponPrefs(weaponry, bot); 380 } 381 382 @Override 383 public void finishControllerInitialization() { 384 if (navBuilder.isUsed()) { 385 log.info("Navigation graph has been altered by 'navBuilder', triggering recomputation of Floyd-Warshall path matrix..."); 386 Level oldLevel = fwMap.getLog().getLevel(); 387 fwMap.getLog().setLevel(Level.FINER); 388 fwMap.refreshPathMatrix(); 389 fwMap.getLog().setLevel(oldLevel); 390 } 391 } 392 393 // 394 // 395 // MODULE GETTERS 396 // 397 // 398 399 public Random getRandom() { 400 return random; 401 } 402 403 public Game getGame() { 404 return game; 405 } 406 407 public AgentInfo getInfo() { 408 return info; 409 } 410 411 public Players getPlayers() { 412 return players; 413 } 414 415 public ItemDescriptors getDescriptors() { 416 return descriptors; 417 } 418 419 public Items getItems() { 420 return items; 421 } 422 423 public Senses getSenses() { 424 return senses; 425 } 426 427 public Weaponry getWeaponry() { 428 return weaponry; 429 } 430 431 public AgentConfig getConfig() { 432 return config; 433 } 434 435 public Raycasting getRaycasting() { 436 return raycasting; 437 } 438 439 public CompleteBotCommandsWrapper getBody() { 440 return body; 441 } 442 443 public ImprovedShooting getShoot() { 444 return shoot; 445 } 446 447 public AdvancedLocomotion getMove() { 448 return move; 449 } 450 451 public IUnrealPathExecutor<ILocated> getPathExecutor() { 452 return pathExecutor; 453 } 454 455 public IPathPlanner<ILocated> getPathPlanner() { 456 return pathPlanner; 457 } 458 459 public NavigationGraphBuilder getNavBuilder() { 460 return navBuilder; 461 } 462 463 public WeaponPrefs getWeaponPrefs() { 464 return weaponPrefs; 465 } 466 467 public IVisionWorldView getWorld() { 468 return world; 469 } 470 471 public AgentStats getStats() { 472 return stats; 473 } 474 475 public FloydWarshallMap getFwMap() { 476 return fwMap; 477 } 478 479 public UT2004Navigation getNavigation() { 480 return navigation; 481 } 482 483 }