1 package cz.cuni.amis.pogamut.ut2004.communication.messages;
2
3 import java.io.Serializable;
4 import java.util.HashMap;
5 import java.util.Set;
6
7 import com.thoughtworks.xstream.annotations.XStreamAlias;
8
9 import cz.cuni.amis.pogamut.unreal.communication.messages.UnrealId;
10 import cz.cuni.amis.pogamut.ut2004.communication.messages.gbinfomessages.Self;
11 import cz.cuni.amis.utils.maps.HashMapSet;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public class ItemType implements Serializable, Comparable<ItemType> {
33
34
35
36
37 public static final HashMapSet<Category, ItemType> CATEGORIES = new HashMapSet<Category, ItemType>();
38
39
40
41
42
43 public enum Category {
44
45 WEAPON("Weapon"),
46
47 AMMO("Ammo"),
48
49 PROJECTILE("Projectile"),
50
51 HEALTH("Health"),
52
53 ARMOR("Armor"),
54
55 SHIELD("Shield"),
56
57 ADRENALINE("Adrenaline"),
58
59 OTHER("Other"),
60
61 NONE("No category");
62
63
64
65
66 public final String name;
67
68
69
70
71
72
73
74
75
76 Category(String name) {
77 this.name = name;
78 }
79
80
81
82
83
84
85 public Set<ItemType> getTypes() {
86 return CATEGORIES.get(this);
87 }
88
89 }
90
91
92
93
94
95
96 public static final HashMapSet<Group, ItemType> GROUPS = new HashMapSet<Group, ItemType>();
97
98
99
100
101
102
103
104 public enum Group {
105
106 TRANSLOCATOR("Translocator"),
107
108 SHIELD_GUN("ShieldGun"),
109
110 ASSAULT_RIFLE("AssaultRifle"),
111
112 BIO_RIFLE("BioRifle"),
113
114 SHOCK_RIFLE("ShockRifle"),
115
116 LINK_GUN("LinkGun"),
117
118 MINIGUN("Minigun"),
119
120 FLAK_CANNON("FlakCannon"),
121
122 ROCKET_LAUNCHER("RocketLauncher"),
123
124 LIGHTNING_GUN("LightningGun"),
125
126 SNIPER_RIFLE("SniperRifle"),
127
128 ION_PAINTER("IonPainter"),
129
130 REDEEMER("Redeemer"),
131
132 SUPER_SHOCK_RIFLE("SuperShockRifle"),
133
134 ONS_MINE_LAYER("ONS MineLayer"),
135
136 ONS_GRENADE_LAUNCHER("ONS GrenadeLauncher"),
137
138 ONS_AVRIL("ONS AVRiL"),
139
140 ONS_TARGET_PAINTER("TargetPainter"),
141
142
143 HEALTH("HealthKit"),
144
145 MINI_HEALTH("HealthVial"),
146
147 SUPER_HEALTH("SuperHealth"),
148
149
150 SMALL_ARMOR("SmallShield"),
151
152 SUPER_ARMOR("SuperShield"),
153
154
155 ADRENALINE("Adrenaline"),
156
157 UDAMAGE("UDamage"),
158
159 KEY("Key"),
160
161 OTHER("Unknown"),
162
163 NONE("None");
164
165
166
167
168 public String name;
169
170
171
172
173
174
175
176
177
178 Group(String name) {
179 this.name = name;
180 }
181
182 public Set<ItemType> getTypes() {
183 return GROUPS.get(this);
184 }
185 }
186
187
188
189
190
191
192 private static HashMap<String, ItemType> protos = new HashMap<String, ItemType>();
193
194
195
196
197 public static final ItemType TRANSLOCATOR = MakePrototype(Category.WEAPON, Group.TRANSLOCATOR, new String[] {
198 "XWeapons.TransPickup", "XWeapons.Transpickup", "XWeapons.Translauncher" });
199
200
201 public static final ItemType TRANSLOCATOR_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.TRANSLOCATOR,
202 new String[] { "XWeapons.BlueBeacon", "XWeapons.RedBeacon" });
203
204
205 public static final ItemType SHIELD_GUN = MakePrototype(Category.WEAPON, Group.SHIELD_GUN, new String[] {
206 "XWeapons.ShieldGunPickup", "XWeapons.ShieldGun" });
207
208
209 public static final ItemType SHIELD_GUN_AMMO = MakePrototype(Category.AMMO, Group.SHIELD_GUN, new String[] {
210 "XWeapons.ShieldAmmoPickup", "XWeapons.ShieldAmmo" });
211
212
213 public static final ItemType ASSAULT_RIFLE = MakePrototype(Category.WEAPON, Group.ASSAULT_RIFLE, new String[] {
214 "XWeapons.AssaultRiflePickup", "XWeapons.AssaultRifle" });
215
216 public static final ItemType ASSAULT_RIFLE_AMMO = MakePrototype(Category.AMMO, Group.ASSAULT_RIFLE, new String[] {
217 "XWeapons.AssaultAmmoPickup", "XWeapons.AssaultAmmo" });
218
219 public static final ItemType ASSAULT_RIFLE_GRENADE = MakePrototype(Category.AMMO, Group.ASSAULT_RIFLE,
220 new String[] { "XWeapons.GrenadeAmmoPickup", "XWeapons.GrenadeAmmo" });
221
222 public static final ItemType ASSAULT_RIFLE_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.ASSAULT_RIFLE,
223 new String[] { "XWeapons.Grenade" });
224
225
226 public static final ItemType BIO_RIFLE = MakePrototype(Category.WEAPON, Group.BIO_RIFLE, new String[] {
227 "XWeapons.BioRiflePickup", "UTClassic.ClassicBioRiflePickup", "XWeapons.BioRifle" });
228
229 public static final ItemType BIO_RIFLE_AMMO = MakePrototype(Category.AMMO, Group.BIO_RIFLE, new String[] {
230 "XWeapons.BioAmmoPickup", "XWeapons.BioAmmo" });
231
232
233 public static final ItemType BIO_RIFLE_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.BIO_RIFLE,
234 new String[] { "XWeapons.BioGlob" });
235
236
237 public static final ItemType SHOCK_RIFLE = MakePrototype(Category.WEAPON, Group.SHOCK_RIFLE, new String[] {
238 "XWeapons.ShockRiflePickup", "UTClassic.ClassicShockRiflePickup", "XWeapons.ShockRifle" });
239
240 public static final ItemType SHOCK_RIFLE_AMMO = MakePrototype(Category.AMMO, Group.SHOCK_RIFLE, new String[] {
241 "XWeapons.ShockAmmoPickup", "XWeapons.ShockAmmo" });
242
243
244 public static final ItemType SHOCK_RIFLE_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.SHOCK_RIFLE,
245 new String[] { "XWeapons.ShockProjectile" });
246
247
248 public static final ItemType LINK_GUN = MakePrototype(Category.WEAPON, Group.LINK_GUN, new String[] {
249 "XWeapons.LinkGunPickup", "XWeapons.LinkGun" });
250
251 public static final ItemType LINK_GUN_AMMO = MakePrototype(Category.AMMO, Group.LINK_GUN, new String[] {
252 "XWeapons.LinkAmmoPickup", "XWeapons.LinkAmmo" });
253
254
255 public static final ItemType LINK_GUN_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.LINK_GUN,
256 new String[] { "XWeapons.LinkProjectile" });
257
258
259 public static final ItemType MINIGUN = MakePrototype(Category.WEAPON, Group.MINIGUN, new String[] {
260 "XWeapons.MinigunPickup", "UTClassic.ClassicMinigunPickup", "XWeapons.Minigun" });
261
262 public static final ItemType MINIGUN_AMMO = MakePrototype(Category.AMMO, Group.MINIGUN, new String[] {
263 "XWeapons.MinigunAmmoPickup", "XWeapons.MinigunAmmo" });
264
265
266 public static final ItemType FLAK_CANNON = MakePrototype(Category.WEAPON, Group.FLAK_CANNON, new String[] {
267 "XWeapons.FlakCannonPickup", "UTClassic.ClassicFlakCannonPickup", "XWeapons.FlakCannon" });
268
269 public static final ItemType FLAK_CANNON_AMMO = MakePrototype(Category.AMMO, Group.FLAK_CANNON, new String[] {
270 "XWeapons.FlakAmmoPickup", "XWeapons.FlakAmmo" });
271
272
273 public static final ItemType FLAK_CANNON_CHUNK = MakePrototype(Category.PROJECTILE, Group.FLAK_CANNON,
274 new String[] { "XWeapons.FlakChunk" });
275
276
277 public static final ItemType FLAK_CANNON_SHELL = MakePrototype(Category.PROJECTILE, Group.FLAK_CANNON,
278 new String[] { "XWeapons.FlakShell" });
279
280
281 public static final ItemType ROCKET_LAUNCHER = MakePrototype(Category.WEAPON, Group.ROCKET_LAUNCHER, new String[] {
282 "XWeapons.RocketLauncherPickup", "UTClassic.ClassicRocketLauncherPickup", "XWeapons.RocketLauncher" });
283
284 public static final ItemType ROCKET_LAUNCHER_AMMO = MakePrototype(Category.AMMO, Group.ROCKET_LAUNCHER,
285 new String[] { "XWeapons.RocketAmmoPickup", "XWeapons.RocketAmmo" });
286
287
288 public static final ItemType ROCKET_LAUNCHER_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.ROCKET_LAUNCHER,
289 new String[] { "XWeapons.RocketProj"
290
291
292 public static final ItemType LIGHTNING_GUN = MakePrototype(Category.WEAPON, Group.LIGHTNING_GUN, new String[] {
293 "XWeapons.SniperRiflePickup", "XWeapons.SniperRifle" });
294
295
296 public static final ItemType LIGHTNING_GUN_AMMO = MakePrototype(Category.AMMO, Group.LIGHTNING_GUN, new String[] {
297 "XWeapons.SniperAmmoPickup", "XWeapons.SniperAmmo" });
298
299
300 public static final ItemType SNIPER_RIFLE = MakePrototype(Category.WEAPON, Group.SNIPER_RIFLE,
301 new String[] { "UTClassic.ClassicSniperRiflePickup" });
302
303 public static final ItemType SNIPER_RIFLE_AMMO = MakePrototype(Category.AMMO, Group.SNIPER_RIFLE, new String[] {
304 "UTClassic.ClassicSniperAmmoPickup", "UTClassic.ClassicSniperAmmo" });
305
306
307 public static final ItemType REDEEMER = MakePrototype(Category.WEAPON, Group.REDEEMER, new String[] {
308 "XWeapons.RedeemerPickup", "XWeapons.Redeemer" });
309
310
311 public static final ItemType REDEEMER_AMMO = MakePrototype(Category.AMMO, Group.REDEEMER, new String[] {
312 "XWeapons.RedeemerAmmo" });
313
314
315 public static final ItemType REDEEMER_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.REDEEMER,
316 new String[] { "XWeapons.RedeemerProjectile" });
317
318
319 public static final ItemType SUPER_SHOCK_RIFLE = MakePrototype(Category.WEAPON, Group.SUPER_SHOCK_RIFLE,
320 new String[] { "XWeapons.SuperShockRiflePickup", "XWeapons.SuperShockRifle" });
321
322
323 public static final ItemType ION_PAINTER = MakePrototype(Category.WEAPON, Group.ION_PAINTER, new String[] {
324 "XWeapons.PainterPickup", "XWeapons.Painter" });
325
326 public static final ItemType ION_PAINTER_AMMO = MakePrototype(Category.AMMO, Group.ION_PAINTER, new String[] {"XWeapons.BallAmmo" });
327
328
329 public static final ItemType ONS_MINE_LAYER = MakePrototype(Category.WEAPON, Group.ONS_MINE_LAYER, new String[] {
330 "Onslaught.ONSMineLayerPickup", "Onslaught.ONSMineLayer" });
331
332 public static final ItemType ONS_MINE_LAYER_AMMO = MakePrototype(Category.AMMO, Group.ONS_MINE_LAYER, new String[] {
333 "Onslaught.ONSMineAmmoPickup", "Onslaught.ONSMineAmmo" });
334
335
336 public static final ItemType ONS_MINE_LAYER_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.ONS_MINE_LAYER,
337 new String[] { "Onslaught.ONSMineProjectileRED", "Onslaught.ONSMineProjectileBLUE" });
338
339
340 public static final ItemType ONS_GRENADE_LAUNCHER = MakePrototype(Category.WEAPON, Group.ONS_GRENADE_LAUNCHER,
341 new String[] { "Onslaught.ONSGrenadePickup", "Onslaught.ONSGrenade" });
342
343
344 public static final ItemType ONS_GRENADE_LAUNCHER_AMMO = MakePrototype(Category.AMMO, Group.ONS_GRENADE_LAUNCHER,
345 new String[] { "Onslaught.ONSGrenadeAmmoPickup" });
346
347
348 public static final ItemType ONS_GRENADE_LAUNCHER_PROJECTILE = MakePrototype(Category.PROJECTILE,
349 Group.ONS_GRENADE_LAUNCHER, new String[] { "Onslaught.ONSGrenadeProjectile" });
350
351
352 public static final ItemType ONS_AVRIL = MakePrototype(Category.WEAPON, Group.ONS_AVRIL, new String[] {
353 "Onslaught.ONSAVRiLPickup", "Onslaught.ONSAVRiL" });
354
355 public static final ItemType ONS_AVRIL_AMMO = MakePrototype(Category.AMMO, Group.ONS_AVRIL,
356 new String[] { "Onslaught.ONSAVRiLAmmoPickup" });
357
358
359 public static final ItemType ONS_AVRIL_PROJECTILE = MakePrototype(Category.PROJECTILE, Group.ONS_AVRIL,
360 new String[] { "Onslaught.ONSAVRiLRocket"});
361
362
363 public static final ItemType ONS_TARGET_PAINTER = MakePrototype(Category.WEAPON, Group.ONS_TARGET_PAINTER,
364 new String[] { "OnslaughtFull.ONSPainterPickup", "OnslaughtFull.ONSPainter" });
365
366
367 public static final ItemType HEALTH_PACK = MakePrototype(Category.HEALTH, Group.HEALTH, new String[] {
368 "XPickups.HealthPack", "XPickups.TournamentHealth" });
369
370 public static final ItemType MINI_HEALTH_PACK = MakePrototype(Category.HEALTH, Group.MINI_HEALTH,
371 new String[] { "XPickups.MiniHealthPack" });
372
373 public static final ItemType SUPER_HEALTH_PACK = MakePrototype(Category.HEALTH, Group.SUPER_HEALTH,
374 new String[] { "XPickups.SuperHealthPack" });
375
376
377 public static final ItemType SHIELD_PACK = MakePrototype(Category.ARMOR, Group.SMALL_ARMOR, new String[] {
378 "XPickups.ShieldPack", "XPickups.ShieldPickup" });
379
380 public static final ItemType SUPER_SHIELD_PACK = MakePrototype(Category.ARMOR, Group.SUPER_ARMOR,
381 new String[] { "XPickups.SuperShieldPack" });
382
383
384 public static final ItemType U_DAMAGE_PACK = MakePrototype(Category.OTHER, Group.UDAMAGE, new String[] {
385 "XPickups.UDamagePack", "XGame.UDamageReward" });
386
387
388 public static final ItemType ADRENALINE_PACK = MakePrototype(Category.ADRENALINE, Group.ADRENALINE,
389 new String[] { "XPickups.AdrenalinePickup" });
390
391
392 public static final ItemType KEY = MakePrototype(Category.OTHER, Group.KEY, new String[] { "UnrealGame.KeyPickup" });
393
394
395 public static final ItemType NONE = MakePrototype(Category.OTHER, Group.NONE,
396 new String[] { "None", "NONE", "none" });
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415 public static ItemType getWeapon(UnrealId id) {
416 if (id == null)
417 return null;
418 String str = id.getStringId();
419 if (str.contains("."))
420 str = str.substring(str.lastIndexOf(".") + 1);
421 str = str.toLowerCase();
422 if (str.equals("assaultrifle"))
423 return ItemType.ASSAULT_RIFLE;
424 if (str.equals("shieldgun"))
425 return ItemType.SHIELD_GUN;
426 if (str.equals("flakcannon"))
427 return ItemType.FLAK_CANNON;
428 if (str.equals("biorifle"))
429 return ItemType.BIO_RIFLE;
430 if (str.equals("shockrifle"))
431 return ItemType.SHOCK_RIFLE;
432 if (str.equals("linkgun"))
433 return ItemType.LINK_GUN;
434 if (str.equals("sniperrifle"))
435 return ItemType.SNIPER_RIFLE;
436 if (str.equals("rocketlauncher"))
437 return ItemType.ROCKET_LAUNCHER;
438 if (str.equals("minigun"))
439 return ItemType.MINIGUN;
440 if (str.equals("lightinggun"))
441 return ItemType.LIGHTNING_GUN;
442 if (str.equals("translocator"))
443 return ItemType.TRANSLOCATOR;
444 if (str.equals("translauncher"))
445 return ItemType.TRANSLOCATOR;
446 if (str.equals("redeemer"))
447 return ItemType.REDEEMER;
448 if (str.equals("painter"))
449 return ItemType.ION_PAINTER;
450 return null;
451 }
452
453
454
455
456
457
458
459
460
461
462
463 private String name;
464
465 @Override
466 public String toString() {
467 return "ItemType[name = " + name + ", category = " + category + ", group = " + group + "]";
468 }
469
470
471
472
473
474
475 private Category category;
476
477
478
479
480 private Group group;
481
482
483
484
485
486
487 public Category getCategory() {
488
489 return (category == null) ? (category = getProto().category) : category;
490 }
491
492
493
494
495
496
497 public Group getGroup() {
498
499 return (group == null) ? (group = getProto().group) : group;
500 }
501
502
503
504
505
506
507 private ItemType proto;
508
509
510
511
512
513
514 private ItemType getProto() {
515
516 if (proto != null)
517 return proto;
518 synchronized (protos) {
519 return proto = protos.get(name);
520 }
521 }
522
523
524
525
526
527
528
529
530
531
532 @Override
533 public boolean equals(Object obj) {
534
535 if (this == obj)
536 return true;
537
538
539 if (obj instanceof ItemType) {
540
541 if (getProto() == ((ItemType) obj).getProto())
542 return true;
543 }
544
545 return false;
546 }
547
548
549
550
551
552
553 @Override
554 public int hashCode() {
555
556 return getProto().name.hashCode();
557 }
558
559
560
561
562
563
564
565
566
567
568 public ItemType(String name) {
569 this.name = name;
570 this.category = Category.OTHER;
571 this.group = Group.OTHER;
572 this.proto = this;
573 }
574
575
576
577
578 private ItemType(String name, Category category, Group group) {
579 this.name = name;
580 this.category = category;
581 this.group = group;
582 this.proto = this;
583 }
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598 public static ItemType MakePrototype(Category category, Group group, String[] utNames) {
599 ItemType type;
600 synchronized (protos) {
601
602 type = new ItemType(utNames[0], category, group);
603
604 for (String utName : utNames)
605 protos.put(utName, type);
606
607 if (category != null) {
608 CATEGORIES.get(category).add(type);
609 }
610 if (group != null) {
611 GROUPS.get(group).add(type);
612 }
613 }
614 return type;
615 }
616
617
618
619
620
621
622
623
624 public static ItemType getItemType(String utName) {
625 ItemType type;
626 synchronized (protos) {
627 type = protos.get(utName);
628 if (type != null)
629 return type;
630
631 type = new ItemType(utName);
632 protos.put(utName, type);
633 }
634 return type;
635 }
636
637 public String getName() {
638 return name;
639 }
640
641 @Override
642 public int compareTo(ItemType o) {
643 if (o == null) return 1;
644 if (getName() == null) {
645 if (o.getName() == null) return 0;
646 return 1;
647 } else {
648 if (o.getName() == null) return -1;
649 return getName().compareTo(o.getName());
650 }
651 }
652
653 }