View Javadoc

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 }