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