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