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