Skip to content

Commit bd3b44b

Browse files
committed
events: fix ItemPickup, ItemEquip & ItemRemove UniqueID() issue
- use getPlayerWeapon() in gameEventHandler - add ItemPickup.WeaponTraceable() - delay ItemPickup event (so the weapon is added to Player.RawWeapons) fixes #119
1 parent bcc6d49 commit bd3b44b

File tree

3 files changed

+75
-13
lines changed

3 files changed

+75
-13
lines changed

events/events.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -407,22 +407,42 @@ type RankUpdate struct {
407407
// ItemEquip signals an item was equipped.
408408
// This event is not available in all demos.
409409
type ItemEquip struct {
410-
Weapon common.Equipment
411-
Player *common.Player
410+
Player *common.Player
411+
Weapon common.Equipment // Value of WeaponPtr, use WeaponPtr instead
412+
WeaponPtr *common.Equipment
412413
}
413414

414415
// ItemPickup signals an item was bought or picked up.
415416
// This event is not available in all demos.
416417
type ItemPickup struct {
417-
Weapon common.Equipment
418418
Player *common.Player
419+
Weapon common.Equipment // UniqueID() of this cannot be used to trace the weapon, use WeaponTraceable() instead
420+
}
421+
422+
// WeaponTraceable attempts to return the original Equipment instance.
423+
// This can be used to trace the same weapon with UniqueID() when it's being dropped to other players.
424+
//
425+
// If the original instance cannot be found, the returned Equipment will still have a different UniqueID().
426+
func (pu ItemPickup) WeaponTraceable() *common.Equipment {
427+
if pu.Player == nil {
428+
return &pu.Weapon
429+
}
430+
431+
for _, wep := range pu.Player.RawWeapons {
432+
if wep.Weapon == pu.Weapon.Weapon {
433+
return wep
434+
}
435+
}
436+
437+
return &pu.Weapon
419438
}
420439

421440
// ItemDrop signals an item was dropped.
422441
// This event is not available in all demos.
423442
type ItemDrop struct {
424-
Weapon common.Equipment
425-
Player *common.Player
443+
Player *common.Player
444+
Weapon common.Equipment // Value of WeaponPtr, use WeaponPtr instead
445+
WeaponPtr *common.Equipment
426446
}
427447

428448
// DataTablesParsed signals that the datatables were parsed.

events/events_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,45 @@ func TestBombEvents(t *testing.T) {
4242
}
4343
}
4444

45+
func TestItemPickup_WeaponTraceable_PlayerNil(t *testing.T) {
46+
e := ItemPickup{
47+
Weapon: common.Equipment{Weapon: common.EqAK47},
48+
Player: nil,
49+
}
50+
51+
assert.Equal(t, e.Weapon, *e.WeaponTraceable())
52+
}
53+
54+
func TestItemPickup_WeaponTraceable_WeaponFound(t *testing.T) {
55+
wep := &common.Equipment{
56+
EntityID: 1,
57+
Weapon: common.EqAK47,
58+
}
59+
e := ItemPickup{
60+
Weapon: common.Equipment{Weapon: common.EqAK47},
61+
Player: &common.Player{RawWeapons: map[int]*common.Equipment{
62+
1: wep,
63+
}},
64+
}
65+
66+
assert.Equal(t, wep, e.WeaponTraceable())
67+
}
68+
69+
func TestItemPickup_WeaponTraceable_WeaponNotFound(t *testing.T) {
70+
wep := &common.Equipment{
71+
EntityID: 1,
72+
Weapon: common.EqAK47,
73+
}
74+
e := ItemPickup{
75+
Weapon: common.Equipment{Weapon: common.EqKnife},
76+
Player: &common.Player{RawWeapons: map[int]*common.Equipment{
77+
1: wep,
78+
}},
79+
}
80+
81+
assert.Equal(t, e.Weapon, *e.WeaponTraceable())
82+
}
83+
4584
type demoInfoProvider struct {
4685
}
4786

game_events.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -481,33 +481,36 @@ func (geh gameEventHandler) bombBegindefuse(desc *msg.CSVCMsg_GameEventListDescr
481481
func (geh gameEventHandler) itemEquip(desc *msg.CSVCMsg_GameEventListDescriptorT, ge *msg.CSVCMsg_GameEvent) {
482482
player, weapon := geh.itemEvent(desc, ge)
483483
geh.dispatch(events.ItemEquip{
484-
Player: player,
485-
Weapon: weapon,
484+
Player: player,
485+
Weapon: *weapon,
486+
WeaponPtr: weapon,
486487
})
487488
}
488489

489490
func (geh gameEventHandler) itemPickup(desc *msg.CSVCMsg_GameEventListDescriptorT, ge *msg.CSVCMsg_GameEvent) {
490491
player, weapon := geh.itemEvent(desc, ge)
491-
geh.dispatch(events.ItemPickup{
492+
// Delayed because of #119 - Equipment.UniqueID()
493+
geh.parser.delayedEvents = append(geh.parser.delayedEvents, events.ItemPickup{
492494
Player: player,
493-
Weapon: weapon,
495+
Weapon: *weapon,
494496
})
495497
}
496498

497499
func (geh gameEventHandler) itemRemove(desc *msg.CSVCMsg_GameEventListDescriptorT, ge *msg.CSVCMsg_GameEvent) {
498500
player, weapon := geh.itemEvent(desc, ge)
499501
geh.dispatch(events.ItemDrop{
500-
Player: player,
501-
Weapon: weapon,
502+
Player: player,
503+
Weapon: *weapon,
504+
WeaponPtr: weapon,
502505
})
503506
}
504507

505-
func (geh gameEventHandler) itemEvent(desc *msg.CSVCMsg_GameEventListDescriptorT, ge *msg.CSVCMsg_GameEvent) (*common.Player, common.Equipment) {
508+
func (geh gameEventHandler) itemEvent(desc *msg.CSVCMsg_GameEventListDescriptorT, ge *msg.CSVCMsg_GameEvent) (*common.Player, *common.Equipment) {
506509
data := mapGameEventData(desc, ge)
507510
player := geh.playerByUserID32(data["userid"].GetValShort())
508511

509512
wepType := common.MapEquipment(data["item"].GetValString())
510-
weapon := common.NewEquipment(wepType)
513+
weapon := getPlayerWeapon(player, wepType)
511514

512515
return player, weapon
513516
}

0 commit comments

Comments
 (0)