View Javadoc

1   package cz.cuni.amis.pogamut.sposh.context;
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.communication.command.IAct;
8   import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.AnnotationListenerRegistrator;
9   import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.EventListener;
10  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassEventListener;
11  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassListener;
12  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectEventListener;
13  import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectListener;
14  import cz.cuni.amis.pogamut.base.utils.logging.LogCategory;
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.Emoticons;
20  import cz.cuni.amis.pogamut.emohawk.agent.module.sensomotoric.Inventory;
21  import cz.cuni.amis.pogamut.emohawk.agent.module.sensomotoric.Places;
22  import cz.cuni.amis.pogamut.emohawk.agent.module.sensomotoric.Steering;
23  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.AgentConfig;
24  import cz.cuni.amis.pogamut.ut2004.agent.module.sensomotoric.Raycasting;
25  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.AgentInfo;
26  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.AgentStats;
27  import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Game;
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.navigation.UT2004AStarPathPlanner;
31  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004GetBackToNavGraph;
32  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004Navigation;
33  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004PathExecutor;
34  import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004RunStraight;
35  import cz.cuni.amis.pogamut.ut2004.agent.navigation.floydwarshall.FloydWarshallMap;
36  import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.KefikRunner;
37  import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.LoqueNavigator;
38  import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004DistanceStuckDetector;
39  import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004PositionStuckDetector;
40  import cz.cuni.amis.pogamut.ut2004.agent.navigation.stuckdetector.UT2004TimeStuckDetector;
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.UT2004BotController;
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.BotKilled;
50  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange;
51  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo;
52  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage;
53  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.NavPoint;
54  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.PathList;
55  import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.Self;
56  
57  /**
58   * Primitive State Context for Emohawk.
59   * @author Jimmy
60   */
61  public class EmohawkContext<BOT extends UT2004Bot> extends Context<BOT> implements IUT2004Context<BOT> {
62  
63  	/**
64  	 * Random number generator that is usually useful to have during decision making.
65  	 */
66  	protected Random random = new Random(System.currentTimeMillis());
67  	    
68      /**
69       * Alias for user's log.
70       */
71      protected LogCategory log = null;
72  	
73  	/**
74  	 * Memory module specialized on general info about the game - game type, time limit, frag limit, etc.
75  	 * <p><p>
76  	 * May be used since {@link SposhBotLogic#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)}
77       * is called.
78       * <p><p>
79       * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
80  	 */
81  	protected Game game;
82  	
83  	/**
84  	 * Memory module specialized on general info about the agent whereabouts - location, rotation, health, current weapon, who is enemy/friend, etc.
85  	 * <p><p>
86  	 * May be used since first {@link Self} message is received, i.e, since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
87       * is called.
88       * <p><p>
89       * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
90  	 */
91  	protected AgentInfo info;
92  	
93  	/**
94  	 * Memory module specialized on whereabouts of other players - who is visible, enemy / friend, whether bot can see anybody, etc.
95  	 * <p><p>
96  	 * May be used since {@link SposhBotLogic#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 UT2004Behaviour#initializeModules(UT2004Bot)}.
100 	 */
101 	protected Players players;
102 	
103 //	/**
104 //	 * Sensory module that provides mapping between {@link ItemType} and {@link ItemDescriptor} providing
105 //     * an easy way to obtain item descriptors for various items in UT2004.
106 //     * <p><p>
107 //     * May be used since {@link SposhBotLogic#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 UT2004Behaviour#initializeModules(UT2004Bot)}.
111 //	 */
112 //	protected ItemDescriptors descriptors;
113 //	
114 //	/**
115 //	 * Memory module specialized on items on the map - which are visible and which are probably spawned.
116 //	 * <p><p>
117 //	 * May be used since {@link SposhBotLogic#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)}
118 //     * is called.
119 //     * <p><p>
120 //     * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
121 //	 */
122 //	protected Items items;
123 	
124 	/**
125 	 * Memory module specialized on agent's senses - whether the bot has been recently killed, collide with level's geometry, etc.
126 	 * <p><p>
127 	 * May be used since {@link SposhBotLogic#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 UT2004Behaviour#initializeModules(UT2004Bot)}.
131 	 */
132 	protected Senses senses;
133 	
134 //	/**
135 //	 * Memory module specialized on info about the bot's weapon and ammo inventory - it can tell you which weapons are loaded, melee/ranged, etc.
136 //	 * <p><p>
137 //	 * May be used since {@link SposhBotLogic#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)}
138 //     * is called.
139 //     * <p><p>
140 //     * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
141 //	 */
142 //	protected Weaponry weaponry;
143 	
144 	/**
145 	 * Memory module specialized on the agent's configuration inside UT2004 - name, vision time, manual spawn, cheats (if enabled at GB2004).
146 	 * <p><p>
147 	 * May be used since {@link SposhBotLogic#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage)}
148      * is called.
149      * <p><p>
150      * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
151 	 */
152 	protected AgentConfig config;
153 	
154 	/**
155 	 * Support for creating rays used for raycasting (see {@link AutoTraceRay} that is being utilized).
156 	 * <p><p>
157 	 * May be used since {@link SposhBotLogic#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)}
158      * is called.
159 	 */
160 	protected Raycasting raycasting;
161 	
162 //	/**
163 //	 * Creates and wraps all available commands that can be issued to the virtual body of the bot inside UT2004.
164 //     * <p><p>
165 //     * May be used since since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
166 //     * is called.
167 //     * <p><p>
168 //     * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
169 //	 */
170 //	protected CompleteBotCommandsWrapper body;
171 //	
172 //	/**
173 //	 * Shortcut for <i>body.getImprovedShooting()</i> that allows you to shoot at opponent.
174 //	 * <p><p>
175 //	 * Note: more weapon-handling methods are available through {@link UT2004Behaviour#weaponry}.
176 //	 * <p><p>
177 //	 * May be used since since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
178 //     * is called.
179 //     * <p><p>
180 //	 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
181 //	 */
182 //	protected ImprovedShooting shoot;
183 	
184 	/**
185 	 * Shortcut for <i>body.getAdvancedLocomotion()</i> that allows you to manually steer the movement through the environment.
186 	 * <p><p>
187 	 * Note: navigation is done via {@link UT2004Behaviour#pathExecutor} that needs {@link PathHandle} from the {@link UT2004Behaviour#pathPlanner}.
188 	 * <p><p>
189 	 * May be used since since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)} 
190      * is called.
191      * <p><p>
192 	 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
193 	 */
194 	protected AdvancedLocomotion move;
195 	
196 	/**
197 	 * Allows you to speak!
198 	 */
199 	protected Communication comm;
200 	
201 	/**
202      * Executor is used for following a path in the environment.
203      * <p><p>
204      * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)}
205      * is called.
206      * <p><p>
207      * Initialized inside {@link UT2004BotModuleControllerNew#initializePathFinding(UT2004Bot)}.
208      */
209 	protected UT2004PathExecutor<ILocated> pathExecutor = null;
210 
211     /**
212      * Planner used to compute the path (consisting of navigation points) inside the map.
213      * <p><p>
214      * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)}
215      * is called.
216      * <p><p>
217      * Initialized inside {@link UT2004BotModuleControllerNew#initializePathFinding(UT2004Bot)}.
218      */
219     protected IPathPlanner<ILocated> pathPlanner = null;
220     
221 //    /**
222 //     * Weapon preferences for your bot. See {@link WeaponPrefs} class javadoc. It allows you to define preferences for
223 //     * weapons to be used at given distance (together with their firing mode).
224 //     */
225 //    protected WeaponPrefs weaponPrefs;
226     
227 //    /**
228 //     * Navigation graph builder that may be used to manually extend the navigation graph of the UT2004.
229 //     * <p><p>
230 //     * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
231 //     * is called.
232 //     * <p><p>
233 //     * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
234 //     */
235 //    protected NavigationGraphBuilder navBuilder;
236     
237     /**
238      * Module that is providing various statistics about the bot. You may also used it to output these stats (in CSV format)
239      * into some file using {@link AgentStats#startOutput(String)} or {@link AgentStats#startOutput(String, boolean)}.
240      */
241     protected AgentStats stats;
242 
243     /**
244      * Path-planner ({@link IPathPlanner} using {@link NavPoint}s), you may use it to find paths inside the environment wihtout
245      * waiting for round-trip of {@link GetPath} command and {@link PathList}s response from UT2004. It is much faster than 
246      * {@link UT2004BotModuleController#pathPlanner} but you need to pass {@link NavPoint} instances to planner instead of
247      * {@link ILocated} ... to find the nearest {@link NavPoint} instance, {@link DistanceUtils} is a handy, check especially
248      * {@link DistanceUtils#getNearest(java.util.Collection, ILocated)}.
249      */
250 	protected FloydWarshallMap fwMap;
251 	
252 	/**
253 	 * Command module that is internally using {@link UT2004PathExecutor} for path-following and {@link FloydWarshallMap}
254 	 * for path planning resulting in unified class that can solely handle navigation of the bot within the environment.
255 	 * <p><p> 
256 	 * In contrast to {@link UT2004PathExecutor} methods
257 	 * of this module may be recalled every {@link UT2004BotModuleController#logic()} iteration even with 
258 	 * the same argument (which is not true for {@link UT2004PathExecutor#followPath(cz.cuni.amis.pogamut.base.agent.navigation.IPathFuture)}.
259 	 * <p><p>
260 	 * Note that this class is actually initialized with instances of {@link UT2004BotModuleController#pathExecutor} and {@link UT2004BotModuleController#fwMap}
261 	 * 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)} 
262 	 * method.
263 	 * <p><p>
264 	 * May be used since first {@link UT2004BotModuleController#logic()} is called.
265      * <p><p>
266      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
267 	 */
268 	protected UT2004Navigation navigation;
269     
270     /**
271      * Listener registrator that probes declared methods for the presence of {@link EventListener}, {@link ObjectClassEventListener},
272      * {@link ObjectClassListener}, {@link ObjectEventListener} and {@link ObjectListener} annotations and automatically registers
273      * them as listeners on a specific events.
274      * <p><p>
275      * Note that this registrator is usable for 'this' object only! It will work only for 'this' object.
276      */
277     protected AnnotationListenerRegistrator listenerRegistrator;
278     
279     /**
280      * Shortcut for the {@link UT2004BotModuleController#getWorldView()}.
281      */
282     protected IVisionWorldView world;
283     
284     /**
285      * Shortcut for the {@link UT2004BotModuleController#getAct()}.
286      */
287     protected IAct act;
288 
289     /**
290 	 * Navigation helper that is able to get your bot back to the nearest navigation graph so you can use {@link UT2004BotModuleController#navigation} 
291 	 * without fear of catastrophe.
292 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
293      * is called.
294      * <p><p>
295      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
296 	 */
297 	protected UT2004GetBackToNavGraph getBackToNavGraph;
298 	
299 	/**
300 	 * Navigation helper that can run-straight to some point with stuck detectors.
301 	 * <p><p>
302 	 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)} 
303      * is called.
304      * <p><p>
305      * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
306 	 */
307 	protected UT2004RunStraight runStraight;
308 	
309 	/**
310 	 * Module for handling animations.
311 	 */
312 	protected Animations animations;
313 	
314 	/**
315 	 * Module for handling emoticons.
316 	 */
317 	protected Emoticons emoticons;
318 	
319 	/**
320 	 * High-level description of the map.
321 	 */
322 	protected Places places;
323 	
324 	/**
325 	 * High-level access to steering library.
326 	 */
327 	protected Steering steering;
328 
329 	/**
330 	 * High-level access to inventory and items.
331 	 */
332 	protected Inventory inventory;
333 
334 	public EmohawkContext(String name, BOT bot) {
335 		super(name, bot);
336         log = bot.getLogger().getCategory(UT2004BotController.USER_LOG_CATEGORY_ID);
337         log.setLevel(Level.ALL);
338 	}
339 
340 	/**
341 	 * Called after the construction of the {@link UT2004Behaviour} before the GameBots2004 greets the bot even before
342 	 * {@link UT2004Behaviour#prepareBehaviour(UT2004Bot)} method.
343 	 * <p><p>
344 	 * <b>NOTE:</b> This is Pogamut's developers reserved method - do not override it and if you do, always use 'super' 
345 	 * to call parent's initializeBehaviour.
346      */
347 	protected void initialize() {
348 		initializeModules(bot);
349 		initializePathFinding(bot);
350 		initializeListeners(bot);
351 	}
352 	
353 	/**
354      * Initializes {@link UT2004Behaviour#listenerRegistrator} and calls {@link AnnotationListenerRegistrator#addListeners()} method
355      * to probe all declared methods for event-annotation presence.
356      * @param bot
357      */
358 	protected void initializeListeners(BOT bot) {
359 		listenerRegistrator = new AnnotationListenerRegistrator(this, getWorldView(), bot.getLogger().getCategory("Listeners"));
360 		listenerRegistrator.addListeners();
361 	}
362 
363 	/**
364 	 * Initializes path-finding modules: {@link UT2004BotModuleControllerNew#pathPlanner} and {@link UT2004BotModuleControllerNew#pathExecutor}.
365 	 * If you need different path planner / path executor - override this method and initialize your own modules.
366 	 * @param bot
367 	 */
368 	protected void initializePathFinding(BOT bot) {
369 		pathPlanner  = new UT2004AStarPathPlanner(bot);
370 		fwMap        = new FloydWarshallMap(bot);
371 		pathExecutor = 
372         	new UT2004PathExecutor<ILocated>(
373         		bot, 
374         		new LoqueNavigator<ILocated>(bot, 
375         		bot.getLog())
376         	);   
377 		
378 		// add stuck detectors that watch over the path-following, if it (heuristicly) finds out that the bot has stuck somewhere,
379     	// it reports an appropriate path event and the path executor will stop following the path which in turn allows 
380     	// us to issue another follow-path command in the right time
381         pathExecutor.addStuckDetector(new UT2004TimeStuckDetector(bot, 3000, 100000)); // if the bot does not move for 3 seconds, considered that it is stuck
382         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
383         pathExecutor.addStuckDetector(new UT2004DistanceStuckDetector(bot));           // watch over distances to target
384 		
385 		getBackToNavGraph = new UT2004GetBackToNavGraph(bot, info, move);
386         runStraight = new UT2004RunStraight(bot, info, move);
387 		navigation = new UT2004Navigation(bot, pathExecutor, fwMap, getBackToNavGraph, runStraight);
388 	}
389 
390 	/**
391 	 * Initializes memory/command modules of the bot.
392 	 * 
393 	 * @param bot
394 	 */
395 	protected void initializeModules(BOT bot) {
396 		world       = bot.getWorldView();
397 		act         = bot.getAct();
398 		game        = new Game(bot);
399 		info        = new AgentInfo(bot, game);
400 		players     = new Players(bot);
401 //		descriptors = new ItemDescriptors(bot);
402 //		weaponry    = new Weaponry(bot, descriptors);
403 //		items       = new Items(bot, info, game, weaponry, null);
404 		senses      = new Senses(bot, info, players);
405 		config      = new AgentConfig(bot);
406 		raycasting  = new Raycasting(bot);
407 //		shoot       = body.getImprovedShooting();
408 		move        = new AdvancedLocomotion(getBot(), getBot().getLogger().getCategory("Move"));
409 		comm        = new Communication(getBot(), getBot().getLogger().getCategory("Communicaton"));
410 //		navBuilder  = new NavigationGraphBuilder(bot);
411 		stats       = new AgentStats(bot);
412         animations  = new Animations(bot);
413         emoticons   = new Emoticons(bot);
414         places      = new Places(bot);
415         steering    = new Steering(bot);
416         inventory   = new Inventory(bot);
417 //		weaponPrefs = new WeaponPrefs(weaponry, bot);
418 	}
419 	
420 	/**
421 	 * Called after the behaviour construction to initialize user's data structures.
422 	 * @param bot
423 	 */
424 	protected void prepareBehaviour(BOT bot) {		
425 	}	
426 	
427 	/**
428      * This method is called whenever {@link InitedMessage} is received. Various agent modules are usable since this
429      * method is called.
430      * 
431      * @param gameInfo
432      * @param config
433      * @param init
434      * @param self
435      */
436     public void botInitialized(GameInfo info, ConfigChange config, InitedMessage init) {
437     }
438 
439     /**
440      * This method is called only once whenever first batch of information what the bot can see is received.
441      * <i><i>
442      * It is sort of "first-logic-method" where you may issue commands for the first time and handle everything
443      * else in bot's logic then. It eliminates the need to have 'boolean firstLogic' field inside your bot.
444      * <p><p>
445      * Note that this method has advantage over the {@link IUT2004BotController#botInitialized(GameInfo, ConfigChange, InitedMessage)}
446      * that you already have {@link Self} object.
447      * 
448      * @param gameInfo
449      * @param config
450      * @param init
451      * @param self
452      */
453     public void botSpawned(GameInfo gameInfo, ConfigChange config, InitedMessage init, Self self) {
454     }
455     
456     /**
457 	 * Called after {@link UT2004Behaviour#botFirstSpawn(GameInfo, ConfigChange, InitedMessage, Self)} as a hook for Pogamut's core developers
458 	 * to finalize initialization of various modules.
459 	 * <p><p>
460 	 * <b>NOTE:</b> This is Pogamut's developers reserved method - do not override it and if you do, always use 'super' 
461 	 * to call parent's finishControllerInitialization.
462      */
463     public void finishInitialization() {
464 //    	if (navBuilder.isUsed()) {
465 //			log.info("Navigation graph has been altered by 'navBuilder', triggering recomputation of Floyd-Warshall path matrix...");
466 //			Level oldLevel = fwMap.getLog().getLevel();
467 //			fwMap.getLog().setLevel(Level.FINER);
468 //			fwMap.refreshPathMatrix();
469 //			fwMap.getLog().setLevel(oldLevel);
470 //		}
471     }
472     
473     /**
474      * This method is called before the SPOSH iteration is invoked. You may clear previous-state variables here.
475      */
476     public void logicIteration() {    	
477     }
478     
479     /**
480      * Called whenever the bot gets killed inside the game.
481      * 
482      * @param event
483      */
484 	public void botKilled(BotKilled event) {		
485 	}
486 	
487 	public IVisionWorldView getWorldView() {
488 		return bot.getWorldView();
489 	}
490 	
491 	public IAct getAct() {
492 		return bot.getAct();
493 	}
494 
495 	public Random getRandom() {
496 		return random;
497 	}
498 
499 	public LogCategory getLog() {
500 		return log;
501 	}
502 
503 	public Game getGame() {
504 		return game;
505 	}
506 
507 	public AgentInfo getInfo() {
508 		return info;
509 	}
510 
511 	public Players getPlayers() {
512 		return players;
513 	}
514 
515 	public Senses getSenses() {
516 		return senses;
517 	}
518 
519 	public AgentConfig getConfig() {
520 		return config;
521 	}
522 
523 	public Raycasting getRaycasting() {
524 		return raycasting;
525 	}
526 
527 	public AdvancedLocomotion getMove() {
528 		return move;
529 	}
530 
531 	public UT2004PathExecutor<ILocated> getPathExecutor() {
532 		return pathExecutor;
533 	}
534 
535 	public IPathPlanner<ILocated> getPathPlanner() {
536 		return pathPlanner;
537 	}
538 
539 	public AgentStats getStats() {
540 		return stats;
541 	}
542 
543 	public FloydWarshallMap getFwMap() {
544 		return fwMap;
545 	}
546 
547 	public UT2004Navigation getNavigation() {
548 		return navigation;
549 	}
550 
551 	public AnnotationListenerRegistrator getListenerRegistrator() {
552 		return listenerRegistrator;
553 	}
554 
555 	public IVisionWorldView getWorld() {
556 		return world;
557 	}
558 	
559 	public UT2004GetBackToNavGraph getBackToNavGraph() {
560 		return getBackToNavGraph;
561 	}
562 
563 	public Communication getComm() {
564 		return comm;
565 	}
566 
567 	public UT2004GetBackToNavGraph getGetBackToNavGraph() {
568 		return getBackToNavGraph;
569 	}
570 
571 	public UT2004RunStraight getRunStraight() {
572 		return runStraight;
573 	}
574 
575 	public Animations getAnimations() {
576 		return animations;
577 	}
578 
579 	public Emoticons getEmoticons() {
580 		return emoticons;
581 	}
582 
583 	public Places getPlaces() {
584 		return places;
585 	}
586 
587 	public Steering getSteering() {
588 		return steering;
589 	}
590 
591 	public Inventory getInventory() {
592 		return inventory;
593 	}
594 
595 }