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.pathfinding.map.IPFMapView;
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.IWorldView;
10 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.AnnotationListenerRegistrator;
11 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.EventListener;
12 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassEventListener;
13 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectClassListener;
14 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectEventListener;
15 import cz.cuni.amis.pogamut.base.communication.worldview.listener.annotation.ObjectListener;
16 import cz.cuni.amis.pogamut.base.utils.logging.LogCategory;
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.sposh.JavaBehaviour;
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.Weaponry;
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.CTF;
28 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Game;
29 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.ItemDescriptors;
30 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Items;
31 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.NavPoints;
32 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.NavigationGraphBuilder;
33 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Players;
34 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.Senses;
35 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.UT2004AgentInfo;
36 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.UT2004Items;
37 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.WeaponPrefs;
38 import cz.cuni.amis.pogamut.ut2004.agent.module.sensor.visibility.Visibility;
39 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004AStarPathPlanner;
40 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004GetBackToNavGraph;
41 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004Navigation;
42 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004PathExecutor;
43 import cz.cuni.amis.pogamut.ut2004.agent.navigation.UT2004RunStraight;
44 import cz.cuni.amis.pogamut.ut2004.agent.navigation.astar.UT2004AStar;
45 import cz.cuni.amis.pogamut.ut2004.agent.navigation.floydwarshall.FloydWarshallMap;
46 import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.KefikRunner;
47 import cz.cuni.amis.pogamut.ut2004.agent.navigation.loquenavigator.LoqueNavigator;
48 import cz.cuni.amis.pogamut.ut2004.bot.IUT2004BotController;
49 import cz.cuni.amis.pogamut.ut2004.bot.command.AdvancedLocomotion;
50 import cz.cuni.amis.pogamut.ut2004.bot.command.CompleteBotCommandsWrapper;
51 import cz.cuni.amis.pogamut.ut2004.bot.command.ImprovedShooting;
52 import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004Bot;
53 import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004BotController;
54 import cz.cuni.amis.pogamut.ut2004.bot.impl.UT2004BotModuleController;
55 import cz.cuni.amis.pogamut.ut2004.communication.messages.ItemType;
56 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbcommands.GetPath;
57 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.AutoTraceRay;
58 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.BotKilled;
59 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.ConfigChange;
60 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo;
61 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.InitedMessage;
62 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.NavPoint;
63 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.PathList;
64 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.Self;
65 import cz.cuni.amis.pogamut.ut2004.communication.translator.itemdescriptor.ItemDescriptor;
66
67
68 //
69 // 3rd change
70 //
71
72 public class UT2004Behaviour<BOT extends UT2004Bot> extends JavaBehaviour<BOT> {
73
74 /**
75 * Random number generator that is usually useful to have during decision making.
76 */
77 protected Random random = new Random(System.currentTimeMillis());
78
79 /**
80 * User log - it's log-level is initially set to {@link Level#ALL}.
81 * @deprecated use {@link UT2004BotController#log} instead
82 */
83 protected LogCategory user = null;
84
85 /**
86 * Alias for user's log.
87 */
88 protected LogCategory log = null;
89
90 /**
91 * Memory module specialized on general info about the game - game type, time limit, frag limit, etc.
92 * <p><p>
93 * 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)}
94 * is called.
95 * <p><p>
96 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
97 */
98 protected Game game;
99
100 /**
101 * Memory module specialized on general info about the agent whereabouts - location, rotation, health, current weapon, who is enemy/friend, etc.
102 * <p><p>
103 * 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)}
104 * is called.
105 * <p><p>
106 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
107 */
108 protected AgentInfo info;
109
110 /**
111 * Memory module specialized on whereabouts of other players - who is visible, enemy / friend, whether bot can see anybody, etc.
112 * <p><p>
113 * 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)}
114 * is called.
115 * <p><p>
116 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
117 */
118 protected Players players;
119
120 /**
121 * Sensory module that provides mapping between {@link ItemType} and {@link ItemDescriptor} providing
122 * an easy way to obtain item descriptors for various items in UT2004.
123 * <p><p>
124 * 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)}
125 * is called.
126 * <p><p>
127 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
128 */
129 protected ItemDescriptors descriptors;
130
131 /**
132 * Memory module specialized on items on the map - which are visible and which are probably spawned.
133 * <p><p>
134 * 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)}
135 * is called.
136 * <p><p>
137 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
138 */
139 protected Items items;
140
141 /**
142 * Memory module specialized on agent's senses - whether the bot has been recently killed, collide with level's geometry, etc.
143 * <p><p>
144 * 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)}
145 * is called.
146 * <p><p>
147 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
148 */
149 protected Senses senses;
150
151 /**
152 * Memory module specialized on info about the bot's weapon and ammo inventory - it can tell you which weapons are loaded, melee/ranged, etc.
153 * <p><p>
154 * 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)}
155 * is called.
156 * <p><p>
157 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
158 */
159 protected Weaponry weaponry;
160
161 /**
162 * Memory module specialized on the agent's configuration inside UT2004 - name, vision time, manual spawn, cheats (if enabled at GB2004).
163 * <p><p>
164 * 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)}
165 * is called.
166 * <p><p>
167 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
168 */
169 protected AgentConfig config;
170
171 /**
172 * Support for creating rays used for raycasting (see {@link AutoTraceRay} that is being utilized).
173 * <p><p>
174 * 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)}
175 * is called.
176 */
177 protected Raycasting raycasting;
178
179 /**
180 * Creates and 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 SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)}
183 * is called.
184 * <p><p>
185 * Initialized inside {@link UT2004Behaviour#initializeModules(UT2004Bot)}.
186 */
187 protected CompleteBotCommandsWrapper body;
188
189 /**
190 * Shortcut for <i>body.getImprovedShooting()</i> that allows you to shoot at opponent.
191 * <p><p>
192 * Note: more weapon-handling methods are available through {@link UT2004Behaviour#weaponry}.
193 * <p><p>
194 * May be used since since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)}
195 * is called.
196 * <p><p>
197 * Initialized inside {@link UT2004Behaviour#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 UT2004Behaviour#pathExecutor} that needs {@link PathHandle} from the {@link UT2004Behaviour#pathPlanner}.
205 * <p><p>
206 * May be used since since the first {@link SposhBotLogic#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)}
207 * is called.
208 * <p><p>
209 * Initialized inside {@link UT2004Behaviour#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 UT2004BotModuleControllerNew#initializePathFinding(UT2004Bot)}.
220 */
221 protected UT2004PathExecutor<ILocated> pathExecutor = null;
222
223 /**
224 * Planner used to compute the path (consisting of navigation points) inside the map.
225 * <p><p>
226 * May be used since since the first {@link IUT2004BotController#botFirstSpawn(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage, Self)}
227 * is called.
228 * <p><p>
229 * Initialized inside {@link UT2004BotModuleControllerNew#initializePathFinding(UT2004Bot)}.
230 */
231 protected IPathPlanner<ILocated> pathPlanner = null;
232
233 /**
234 * Weapon preferences for your bot. See {@link WeaponPrefs} class javadoc. It allows you to define preferences for
235 * weapons to be used at given distance (together with their firing mode).
236 */
237 protected WeaponPrefs weaponPrefs;
238
239 /**
240 * Navigation graph builder that may be used to manually extend the navigation graph of the UT2004.
241 * <p><p>
242 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)}
243 * is called.
244 * <p><p>
245 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
246 */
247 protected NavigationGraphBuilder navBuilder;
248
249 /**
250 * Module that is providing various statistics about the bot. You may also used it to output these stats (in CSV format)
251 * into some file using {@link AgentStats#startOutput(String)} or {@link AgentStats#startOutput(String, boolean)}.
252 */
253 protected AgentStats stats;
254
255 /**
256 * Path-planner ({@link IPathPlanner} using {@link NavPoint}s), you may use it to find paths inside the environment wihtout
257 * waiting for round-trip of {@link GetPath} command and {@link PathList}s response from UT2004. It is much faster than
258 * {@link UT2004BotModuleController#pathPlanner} but you need to pass {@link NavPoint} instances to planner instead of
259 * {@link ILocated} ... to find the nearest {@link NavPoint} instance, {@link DistanceUtils} is a handy, check especially
260 * {@link DistanceUtils#getNearest(java.util.Collection, ILocated)}.
261 */
262 protected FloydWarshallMap fwMap;
263
264 /**
265 * Navigation helper that is able to get your bot back to the nearest navigation graph so you can use {@link UT2004BotModuleController#navigation}
266 * without fear of catastrophe.
267 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)}
268 * is called.
269 * <p><p>
270 * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
271 */
272 protected UT2004GetBackToNavGraph getBackToNavGraph;
273
274 /**
275 * Navigation helper that can run-straight to some point with stuck detectors.
276 * <p><p>
277 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)}
278 * is called.
279 * <p><p>
280 * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
281 */
282 protected UT2004RunStraight runStraight;
283
284 /**
285 * Command module that is internally using {@link UT2004PathExecutor} for path-following and {@link FloydWarshallMap}
286 * for path planning resulting in unified class that can solely handle navigation of the bot within the environment.
287 * <p><p>
288 * In contrast to {@link UT2004PathExecutor} methods
289 * of this module may be recalled every {@link UT2004BotModuleController#logic()} iteration even with
290 * the same argument (which is not true for {@link UT2004PathExecutor#followPath(cz.cuni.amis.pogamut.base.agent.navigation.IPathFuture)}.
291 * <p><p>
292 * Note that this class is actually initialized with instances of {@link UT2004BotModuleController#pathExecutor} and {@link UT2004BotModuleController#fwMap}
293 * 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)}
294 * method.
295 * <p><p>
296 * May be used since first {@link UT2004BotModuleController#logic()} is called.
297 * <p><p>
298 * Initialized inside {@link UT2004BotModuleController#initializePathFinding(UT2004Bot)}.
299 */
300 protected UT2004Navigation navigation;
301
302 /**
303 * Module that provides visibility/cover information for the map.
304 * <p><p>
305 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)}
306 * is called.
307 * <p><p>
308 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
309 */
310 protected Visibility visibility;
311
312 /**
313 * Listener registrator that probes declared methods for the presence of {@link EventListener}, {@link ObjectClassEventListener},
314 * {@link ObjectClassListener}, {@link ObjectEventListener} and {@link ObjectListener} annotations and automatically registers
315 * them as listeners on a specific events.
316 * <p><p>
317 * Note that this registrator is usable for 'this' object only! It will work only for 'this' object.
318 */
319 protected AnnotationListenerRegistrator listenerRegistrator;
320
321 /**
322 * Shortcut for the {@link UT2004BotModuleController#getWorldView()}.
323 */
324 protected IVisionWorldView world;
325
326 /**
327 * Module that provides shortcut for getting {@link NavPoint}s out of {@link IWorldView}.
328 * <p><p>
329 * May be used since {@link IUT2004BotController#botInitialized(cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.GameInfo, ConfigChange, InitedMessage)}
330 * is called.
331 * <p><p>
332 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
333 */
334 protected NavPoints navPoints;
335
336 /**
337 * Class providing A-Star algorithm over the navpoints as they are present within the {@link IWorldView}.
338 * <p><p>
339 * You may provide custom {@link IPFMapView} over the map in-order to greatly customize the A-Star search.
340 */
341 protected UT2004AStar aStar;
342
343 /**
344 * Module specialized on CTF games. Enabled only for CTF games, check {@link CTF#isEnabled()}.
345 * <p><p>
346 * Initialized inside {@link UT2004BotModuleController#initializeModules(UT2004Bot)}.
347 */
348 protected CTF ctf;
349
350 /**
351 * Module for adrenaline combos.
352 */
353 protected AdrenalineCombo combo;
354
355 /**
356 * Shortcut for the {@link UT2004BotModuleController#getAct()}.
357 */
358 protected IAct act;
359
360 public UT2004Behaviour(String name, BOT bot) {
361 super(name, bot);
362 log = bot.getLogger().getCategory(UT2004BotController.USER_LOG_CATEGORY_ID);
363 log.setLevel(Level.ALL);
364 user = log;
365 }
366
367 /**
368 * Called after the construction of the {@link UT2004Behaviour} before the GameBots2004 greets the bot even before
369 * {@link UT2004Behaviour#prepareBehaviour(UT2004Bot)} method.
370 * <p><p>
371 * <b>NOTE:</b> This is Pogamut's developers reserved method - do not override it and if you do, always use 'super'
372 * to call parent's initializeBehaviour.
373 */
374 protected void initializeBehaviour(BOT bot) {
375 initializeModules(bot);
376 initializePathFinding(bot);
377 initializeListeners(bot);
378 }
379
380 /**
381 * Initializes {@link UT2004Behaviour#listenerRegistrator} and calls {@link AnnotationListenerRegistrator#addListeners()} method
382 * to probe all declared methods for event-annotation presence.
383 * @param bot
384 */
385 protected void initializeListeners(BOT bot) {
386 listenerRegistrator = new AnnotationListenerRegistrator(this, getWorldView(), bot.getLogger().getCategory("Listeners"));
387 listenerRegistrator.addListeners();
388 }
389
390 /**
391 * Initializes path-finding modules: {@link UT2004BotModuleControllerNew#pathPlanner} and {@link UT2004BotModuleControllerNew#pathExecutor}.
392 * If you need different path planner / path executor - override this method and initialize your own modules.
393 * @param bot
394 */
395 protected void initializePathFinding(BOT bot) {
396 pathPlanner = new UT2004AStarPathPlanner(bot);
397 fwMap = new FloydWarshallMap(bot);
398 aStar = new UT2004AStar(bot);
399 pathExecutor =
400 new UT2004PathExecutor<ILocated>(
401 bot,
402 info,
403 move,
404 new LoqueNavigator<ILocated>(bot, info, move, bot.getLog())
405 );
406 getBackToNavGraph = new UT2004GetBackToNavGraph(bot, info, move);
407 runStraight = new UT2004RunStraight(bot, info, move);
408 navigation = new UT2004Navigation(bot, pathExecutor, fwMap, getBackToNavGraph, runStraight);
409 }
410
411 /**
412 * Initializes memory/command modules of the bot.
413 *
414 * @param bot
415 */
416 protected void initializeModules(BOT bot) {
417 world = getWorldView();
418 act = getAct();
419
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 Weaponry(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 /**
442 * Called after the behaviour construction to initialize user's data structures.
443 * @param bot
444 */
445 protected void prepareBehaviour(BOT bot) {
446 }
447
448 /**
449 * This method is called whenever {@link InitedMessage} is received. Various agent modules are usable since this
450 * method is called.
451 *
452 * @param gameInfo
453 * @param config
454 * @param init
455 * @param self
456 */
457 public void botInitialized(GameInfo info, ConfigChange config, InitedMessage init) {
458 }
459
460 /**
461 * This method is called only once whenever first batch of information what the bot can see is received.
462 * <i><i>
463 * It is sort of "first-logic-method" where you may issue commands for the first time and handle everything
464 * else in bot's logic then. It eliminates the need to have 'boolean firstLogic' field inside your bot.
465 * <p><p>
466 * Note that this method has advantage over the {@link IUT2004BotController#botInitialized(GameInfo, ConfigChange, InitedMessage)}
467 * that you already have {@link Self} object.
468 *
469 * @param gameInfo
470 * @param config
471 * @param init
472 * @param self
473 */
474 public void botSpawned(GameInfo gameInfo, ConfigChange config, InitedMessage init, Self self) {
475 }
476
477 /**
478 * Called after {@link UT2004Behaviour#botSpawned(GameInfo, ConfigChange, InitedMessage, Self)} as a hook for Pogamut's core developers
479 * to finalize initialization of various modules.
480 * <p><p>
481 * <b>NOTE:</b> This is Pogamut's developers reserved method - do not override it and if you do, always use 'super'
482 * to call parent's finishControllerInitialization.
483 */
484 public void finishBehaviourInitialization() {
485 if (navBuilder.isUsed()) {
486 log.info("Navigation graph has been altered by 'navBuilder', triggering recomputation of Floyd-Warshall path matrix...");
487 Level oldLevel = fwMap.getLog().getLevel();
488 fwMap.getLog().setLevel(Level.FINER);
489 fwMap.refreshPathMatrix();
490 fwMap.getLog().setLevel(oldLevel);
491 }
492 }
493
494 /**
495 * Called whenever the bot gets killed inside the game.
496 *
497 * @param event
498 */
499 public void botKilled(BotKilled event) {
500 }
501
502 public IVisionWorldView getWorldView() {
503 return bot.getWorldView();
504 }
505
506 public IAct getAct() {
507 return bot.getAct();
508 }
509
510 public UT2004GetBackToNavGraph getGetBackToNavGraph() {
511 return getBackToNavGraph;
512 }
513
514 public Visibility getVisibility() {
515 return visibility;
516 }
517
518 public Random getRandom() {
519 return random;
520 }
521
522 public LogCategory getLog() {
523 return log;
524 }
525
526 public Game getGame() {
527 return game;
528 }
529
530 public AgentInfo getInfo() {
531 return info;
532 }
533
534 public Players getPlayers() {
535 return players;
536 }
537
538 public ItemDescriptors getDescriptors() {
539 return descriptors;
540 }
541
542 public Items getItems() {
543 return items;
544 }
545
546 public Senses getSensesModule() {
547 return senses;
548 }
549
550 public Weaponry getWeaponry() {
551 return weaponry;
552 }
553
554 public AgentConfig getConfig() {
555 return config;
556 }
557
558 public Raycasting getRaycasting() {
559 return raycasting;
560 }
561
562 public CompleteBotCommandsWrapper getBody() {
563 return body;
564 }
565
566 public ImprovedShooting getShoot() {
567 return shoot;
568 }
569
570 public AdvancedLocomotion getMove() {
571 return move;
572 }
573
574 public UT2004PathExecutor<ILocated> getPathExecutor() {
575 return pathExecutor;
576 }
577
578 public IPathPlanner<ILocated> getPathPlanner() {
579 return pathPlanner;
580 }
581
582 public WeaponPrefs getWeaponPrefs() {
583 return weaponPrefs;
584 }
585
586 public NavigationGraphBuilder getNavBuilder() {
587 return navBuilder;
588 }
589
590 public AgentStats getStats() {
591 return stats;
592 }
593
594 public FloydWarshallMap getFwMap() {
595 return fwMap;
596 }
597
598 public UT2004RunStraight getRunStraight() {
599 return runStraight;
600 }
601
602 public UT2004Navigation getNavigation() {
603 return navigation;
604 }
605
606 public IVisionWorldView getWorld() {
607 return world;
608 }
609
610 public NavPoints getNavPoints() {
611 return navPoints;
612 }
613
614 public UT2004AStar getaStar() {
615 return aStar;
616 }
617
618 public CTF getCtf() {
619 return ctf;
620 }
621
622 public AdrenalineCombo getCombo() {
623 return combo;
624 }
625
626 }