View Javadoc

1   package cz.cuni.amis.pogamut.udk.bot.command;
2   
3   import java.util.logging.Logger;
4   
5   import cz.cuni.amis.pogamut.base.communication.worldview.event.IWorldEventListener;
6   import cz.cuni.amis.pogamut.base3d.worldview.object.ILocated;
7   import cz.cuni.amis.pogamut.udk.bot.impl.UDKBot;
8   import cz.cuni.amis.pogamut.unreal.communication.messages.UnrealId;
9   import cz.cuni.amis.pogamut.udk.communication.messages.gbcommands.Shoot;
10  import cz.cuni.amis.pogamut.udk.communication.messages.gbcommands.StopShooting;
11  import cz.cuni.amis.pogamut.udk.communication.messages.gbinfomessages.BeginMessage;
12  import cz.cuni.amis.pogamut.udk.communication.messages.gbinfomessages.Player;
13  
14  /**
15   * Class providing Pogamut2 UT2004 advanced shooting commands for the bot -
16   * shooting in secondary mode, grenade launcher shooting, etc.
17   * 
18   * @author Michal 'Knight' Bida
19   */
20  public class AdvancedShooting extends SimpleShooting {
21  
22  	/** Here we store current UT time used to issue charge shoot commands */
23  	private double currentTime = 0;
24  	/** Time last charge shoot command was issued, -1 for command not issued */
25  	private double lastChargeShootCommandTime = -1;
26  	/** Delay of last charge shoot command */
27  	private double lastChargeShootCommandDelay = 0;
28  	/**
29  	 * Listener to begin message - used to get UT04 current time.
30  	 */
31  	private IWorldEventListener<BeginMessage> myBegListener = new IWorldEventListener<BeginMessage>() {
32  
33  		@Override
34  		public void notify(BeginMessage bm) {
35  			currentTime = bm.getTime();
36  
37  			// Here we will stop shooting if the charge dealy is exceeded
38  			if ((lastChargeShootCommandTime >= 0)
39  					&& ((currentTime - lastChargeShootCommandTime) > lastChargeShootCommandDelay)) {
40  				agent.getAct().act(new StopShooting());
41  				lastChargeShootCommandTime = -1;
42  				lastChargeShootCommandDelay = 0;
43  			}
44  		}
45  	};
46  
47  	/**
48  	 * The bot will stop shooting completely (regardless on the mode of shooting).
49  	 * <p><p>
50  	 * (issues GB STOPSHOOT command)
51  	 */
52  	public void stopShooting() {
53  		agent.getAct().act(new StopShooting());
54  	}
55  	
56  	/**
57  	 * Bot will start shooting his current weapon with selected mode.
58  	 * <p><p>
59  	 * (issues GB SHOOT command)
60  	 * 
61  	 * @param secondaryMode
62  	 *            If true secondary firing mode will be issued.
63  	 * 
64  	 */
65  	public void shootWithMode(boolean secondaryMode) {
66  		Shoot shoot = new Shoot();
67  		shoot.setAlt(secondaryMode);
68  		agent.getAct().act(shoot);
69  	}
70  
71  	/**
72  	 * Bot will start shooting his current weapon with primary firing mode at
73  	 * the location specified. The bot will shoot on this location even when he
74  	 * will turn a little bit from the direction to the location. If he turn out
75  	 * more then approx 15 - 30 degrees he won't be able to hit the location
76  	 * anymore.
77  	 * <p><p>
78  	 * (issues GB SHOOT command)
79  	 * 
80  	 * @param location
81  	 *            Location we will be shooting at.
82  	 * 
83  	 * @see shootPrimary(UnrealId)
84  	 */
85  	public void shootPrimary(ILocated location) {
86  		Shoot shoot = new Shoot();
87  		shoot.setLocation(location.getLocation());
88  		agent.getAct().act(shoot);
89  	}
90  
91  	/**
92  	 * Bot will start shooting his current weapon with primary firing mode at
93  	 * the target specified. The target should exist in the environment. The bot
94  	 * will track the target in the environment as long as other commands won't
95  	 * change his focus (strafe(), turnTo()..). If they will the bot will still
96  	 * shoot on target location until he will turn from target more then approx
97  	 * 15 - 30 degrees. Then he won't be able to hit the target location
98  	 * anymore.
99  	 * <p><p>
100 	 * (issues GB SHOOT command)
101 	 * 
102 	 * @param target
103 	 *            Object in the environment we will shoot at.
104 	 * 
105 	 * @see shootPrimary(ILocated)
106 	 */
107 	public void shootPrimary(UnrealId target) {
108 		Shoot shoot = new Shoot();
109 		shoot.setTarget(target);
110 		agent.getAct().act(shoot);
111 	}
112 	
113 	/**
114 	 * Shortcut for 'shootPrimary(player.getId())', see {@link AdvancedShooting#shootPrimary(UnrealId)}.
115 	 * <p><p>
116 	 * (issues GB SHOOT command)
117 	 * 
118 	 * @param target
119 	 * 			Player the bot wants to shoot at.
120 	 */
121 	public void shootPrimary(Player target) {
122 		shootPrimary(target.getId());
123 	}
124 
125 	/**
126 	 * Bot will start shooting his current weapon with secondary firing mode at
127 	 * the location specified. The bot will shoot on this location even when he
128 	 * will turn a little bit from the direction to the location. If he turn out
129 	 * more then approx 15 - 30 degrees he won't be able to hit the location
130 	 * anymore.
131 	 * <p><p>
132 	 * (issues GB SHOOT command)
133 	 * 
134 	 * @param location
135 	 *            Location we will be shooting at.
136 	 * 
137 	 * @see shootSecondary(UnrealId)
138 	 */
139 	public void shootSecondary(ILocated location) {
140 		Shoot shoot = new Shoot();
141 		shoot.setLocation(location.getLocation());
142 		shoot.setAlt(true);
143 		agent.getAct().act(shoot);
144 	}
145 
146 	/**
147 	 * Bot will start shooting his current weapon with secondary firing mode at
148 	 * the target specified. The target should exist in the environment. The bot
149 	 * will track the target in the environment as long as other commands won't
150 	 * change his focus (strafe(), turnTo()..). If they will the bot will still
151 	 * shoot on target location until he will turn from target more then approx
152 	 * 15 - 30 degrees. Then he won't be able to hit the target location
153 	 * anymore.
154 	 * <p><p>
155 	 * (issues GB SHOOT command)
156 	 * 
157 	 * @param target
158 	 *            Object in the environment we will shoot at.
159 	 * 
160 	 * @see shootSecondary(ILocated)
161 	 */
162 	public void shootSecondary(UnrealId target) {
163 		Shoot shoot = new Shoot();
164 		shoot.setTarget(target);
165 		shoot.setAlt(true);
166 		agent.getAct().act(shoot);
167 	}
168 	
169 	/**
170 	 * Shortcut for 'shootSecondary(player.getId())', see {@link AdvancedShooting#shootSecondary(UnrealId)}.
171 	 * <p><p>
172 	 * (issues GB SHOOT command)
173 	 * 
174 	 * @param target
175 	 * 			Player the bot wants to shoot at.
176 	 */
177 	public void shootSecondary(Player target) {
178 		shootSecondary(target.getId());
179 	}
180 
181 	/**
182 	 * This method can be used for UT2004 charging weapons. Some weapons in
183 	 * UT2004 feature charging firing modes. These modes works as follows. To
184 	 * shoot with a charging firing mode the bot has to start shooting first -
185 	 * this will trigger the weapon to start charging (it won't fire yet). To
186 	 * fire the weapon the bot needs to send STOPSHOOT command to stop charging
187 	 * the weapon and to release the projectile. This method does this
188 	 * automatically for primary firing mode of the weapon. The time of charging
189 	 * can be specified too (second parameter in seconds).
190 	 * <p><p>
191 	 * This method can be also used for non-charing (primary) firing mode of the
192 	 * weapon - then it will work as burst fire - the bot will continue firing
193 	 * for the amout of seconds specified.
194 	 * <p><p>
195 	 * So if the current weapon primary firing mode is charging, the bot will
196 	 * release the projectiles once. With normal primary firing mode the bot
197 	 * will fire a burst.
198 	 * <p><p>
199 	 * Note: We will shoot at location specified. The bot will continue to aim
200 	 * on the location in the environment (for the time of charging or bursting)
201 	 * as long as other commands won't change his focus (strafe(), turnTo()..).
202 	 * If they will the bot will still shoot on location until he will turn from
203 	 * it more then approx 15 - 30 degrees. Then he won't be able to hit the
204 	 * location anymore.
205 	 * <p><p>
206 	 * (issues GB SHOOT command)
207 	 * 
208 	 * @param location
209 	 *            Location we will be shooting at.
210 	 * @param chargeTime
211 	 *            In seconds - how long we will charge the weapon (or how long
212 	 *            will be the burst fire).
213 	 * 
214 	 * @see shootPrimaryCharged(UnrealId, double)
215 	 */
216 	public void shootPrimaryCharged(ILocated location, double chargeTime) {
217 		Shoot shoot = new Shoot();
218 		shoot.setLocation(location.getLocation());
219 		agent.getAct().act(shoot);
220 
221 		// Stop shoot command will be issued after delay
222 		lastChargeShootCommandTime = currentTime;
223 		lastChargeShootCommandDelay = chargeTime;
224 	}
225 
226 	/**
227 	 * This method can be used for UT2004 charging weapons. Some weapons in
228 	 * UT2004 feature charging firing modes. These modes works as follows. To
229 	 * shoot with a charging firing mode the bot has to start shooting first -
230 	 * this will trigger the weapon to start charging (it won't fire yet). To
231 	 * fire the weapon the bot needs to send STOPSHOOT command to stop charging
232 	 * the weapon and to release the projectile. This method does this
233 	 * automatically for primary firing mode of the weapon. The time of charging
234 	 * can be specified too (second parameter in seconds).
235 	 * <p><p>
236 	 * This method can be also used for non-charing (primary) firing mode of the
237 	 * weapon - then it will work as burst fire - the bot will continue firing
238 	 * for the amout of seconds specified.
239 	 * <p><p>
240 	 * So if the current weapon primary firing mode is charging, the bot will
241 	 * release the projectiles once. With normal primary firing mode the bot
242 	 * will fire a burst.
243 	 * <p><p>
244 	 * Note: The target for shooting should exist in the environment. The bot
245 	 * will track the target in the environment (for the time of charging or
246 	 * bursting) as long as other commands won't change his focus (strafe(),
247 	 * turnTo()..). If they will the bot will still shoot on target location
248 	 * until he will turn from target more then approx 15 - 30 degrees. Then he
249 	 * won't be able to hit the target location anymore.
250 	 * <p><p>
251 	 * (issues GB SHOOT command)
252 	 * 
253 	 * @param target
254 	 *            Object in the environment we will shoot at (basic tracking
255 	 *            provided).
256 	 * @param chargeTime
257 	 *            In seconds - how long we will charge the weapon (or how long
258 	 *            will be the burst fire).
259 	 * 
260 	 * @see shootPrimaryCharged(ILocated, double)
261 	 * 
262 	 * @todo Implement somehow the charging delay.
263 	 */
264 	public void shootPrimaryCharged(UnrealId target, double chargeTime) {
265 		Shoot shoot = new Shoot();
266 		shoot.setTarget(target);
267 		agent.getAct().act(shoot);
268 
269 		// Stop shoot command will be issued after delay
270 		lastChargeShootCommandTime = currentTime;
271 		lastChargeShootCommandDelay = chargeTime;
272 	}
273 	
274 	/**
275 	 * Shortcut for 'shootPrimaryCharged(player.getId())', see {@link AdvancedShooting#shootPrimaryCharged(UnrealId, double)}.
276 	 * <p><p>
277 	 * (issues GB SHOOT command)
278 	 * 
279 	 * @param target
280 	 * 			Player the bot wants to shoot at.
281 	 */
282 	public void shootPrimaryCharged(Player target, double chargeTime) {
283 		shootPrimaryCharged(target.getId(), chargeTime);
284 	}
285 
286 	/**
287 	 * This method can be used for UT2004 charging weapons. Some weapons in
288 	 * UT2004 feature charging firing modes. These modes works as follows. To
289 	 * shoot with a charging firing mode the bot has to start shooting first -
290 	 * this will trigger the weapon to start charging (it won't fire yet). To
291 	 * fire the weapon the bot needs to send STOPSHOOT command to stop charging
292 	 * the weapon and to release the projectile. This method does this
293 	 * automatically for secondary firing mode of the weapon. The time of
294 	 * charging can be specified too (second parameter in seconds).
295 	 * <p><p>
296 	 * This method can be also used for non-charing (secondary) firing mode of
297 	 * the weapon - then it will work as burst fire - the bot will continue
298 	 * firing for the amout of seconds specified.
299 	 * <p><p>
300 	 * So if the current weapon secondary firing mode is charging, the bot will
301 	 * release the projectiles once. With normal secondary firing mode the bot
302 	 * will fire a burst.
303 	 * <p><p>
304 	 * Note: We will shoot at location specified. The bot will continue to aim
305 	 * on the location in the environment (for the time of charging or bursting)
306 	 * as long as other commands won't change his focus (strafe(), turnTo()..).
307 	 * If they will the bot will still shoot on location until he will turn from
308 	 * it more then approx 15 - 30 degrees. Then he won't be able to hit the
309 	 * location anymore.
310 	 * <p><p>
311 	 * (issues GB SHOOT command)
312 	 * 
313 	 * @param location
314 	 *            Location we will be shooting at.
315 	 * @param chargeTime
316 	 *            In seconds - how long we will charge the weapon (or how long
317 	 *            will be the burst fire).
318 	 * 
319 	 * @see shootSecondaryCharged(UnrealId, double)
320 	 * 
321 	 * @todo Implement somehow the charging delay.
322 	 */
323 	public void shootSecondaryCharged(ILocated location, double chargeTime) {
324 		Shoot shoot = new Shoot();
325 		shoot.setLocation(location.getLocation());
326 		shoot.setAlt(true);
327 		agent.getAct().act(shoot);
328 
329 		// Stop shoot command will be issued after delay
330 		lastChargeShootCommandTime = currentTime;
331 		lastChargeShootCommandDelay = chargeTime;
332 	}
333 
334 	/**
335 	 * This method can be used for UT2004 charging weapons. Some weapons in
336 	 * UT2004 feature charging firing modes. These modes works as follows. To
337 	 * shoot with a charging firing mode the bot has to start shooting first -
338 	 * this will trigger the weapon to start charging (it won't fire yet). To
339 	 * fire the weapon the bot needs to send STOPSHOOT command to stop charging
340 	 * the weapon and to release the projectile. This method does this
341 	 * automatically for secondary firing mode of the weapon. The time of
342 	 * charging can be specified too (second parameter in seconds).
343 	 * <p><p>
344 	 * This method can be also used for non-charing (secondary) firing mode of
345 	 * the weapon - then it will work as burst fire - the bot will continue
346 	 * firing for the amout of seconds specified.
347 	 * <p><p>
348 	 * So if the current weapon secondary firing mode is charging, the bot will
349 	 * release the projectiles once. With normal secondary firing mode the bot
350 	 * will fire a burst.
351 	 * <p><p>
352 	 * Note: The target for shooting should exist in the environment. The bot
353 	 * will track the target in the environment (for the time of charging or
354 	 * bursting) as long as other commands won't change his focus (strafe(),
355 	 * turnTo()..). If they will the bot will still shoot on target location
356 	 * until he will turn from target more then approx 15 - 30 degrees. Then he
357 	 * won't be able to hit the target location anymore.
358 	 * <p><p>
359 	 * (issues GB SHOOT command)
360 	 * 
361 	 * @param target
362 	 *            Object in the environment we will shoot at (basic tracking
363 	 *            provided).
364 	 * @param chargeTime
365 	 *            In seconds - how long we will charge the weapon (or how long
366 	 *            will be the burst fire).
367 	 * 
368 	 * @see shootSecondaryCharged(ILocated, double)
369 	 * 
370 	 * @todo Implement somehow the charging delay.
371 	 */
372 	public void shootSecondaryCharged(UnrealId target, double chargeTime) {
373 		Shoot shoot = new Shoot();
374 		shoot.setTarget(target);
375 		shoot.setAlt(true);
376 		agent.getAct().act(shoot);
377 
378 		// Stop shoot command will be issued after delay
379 		lastChargeShootCommandTime = currentTime;
380 		lastChargeShootCommandDelay = chargeTime;
381 	}
382 	
383 	/**
384 	 * Shortcut for 'shootSecondaryCharged(player.getId())', see {@link AdvancedShooting#shootSecondaryCharged(UnrealId, double)}.
385 	 * <p><p>
386 	 * (issues GB SHOOT command)
387 	 * 
388 	 * @param target
389 	 * 			Player the bot wants to shoot at.
390 	 */
391 	public void shootSecondaryCharged(Player target, double chargeTime) {
392 		shootSecondaryCharged(target.getId(), chargeTime);
393 	}
394 
395 	/**
396 	 * Resets the agent module so it may be reused.
397 	 */
398 	@Override
399 	protected void reset() {
400 		lastChargeShootCommandTime = -1;
401 		lastChargeShootCommandDelay = 0;
402 	}
403 
404 	/**
405 	 * Constructor. Setups the command module based on given agent and logger.
406 	 * 
407 	 * @param agent
408 	 *            AbstractUT2004Bot we will send commands for
409 	 * @param log
410 	 *            Logger to be used for logging runtime/debug info.
411 	 * 
412 	 * @todo Implement somehow the charging delay.
413 	 */
414 	public AdvancedShooting(UDKBot agent, Logger log) {
415 		super(agent, log);
416 		agent.getWorldView()
417 				.addEventListener(BeginMessage.class, myBegListener);
418 	}
419 
420     @Override
421     public void shoot() {
422         super.shoot();
423     }
424 
425     @Override
426     public void shoot(UnrealId target) {
427         super.shoot(target);
428     }
429     
430     @Override
431     public void shoot(Player target) {
432         super.shoot(target);
433     }
434 
435     @Override
436     public void stopShoot() {
437         super.stopShoot();
438     }
439 
440 
441 }