Skip to content

Commit 9520a57

Browse files
committed
UpdateTargetAbilityEvent: Safer implementation, per player ability tracking
1 parent 90bc219 commit 9520a57

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

sc2reader/engine/plugins/context.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def handleInitGame(self, event, replay):
1515
replay.unit = dict()
1616

1717
# keep track of last TargetAbilityEvent for UpdateTargetAbilityEvent
18-
self.last_target_ability_event = None
18+
self.last_target_ability_event = {}
1919

2020
def handleGameEvent(self, event, replay):
2121
self.load_message_game_player(event, replay)
@@ -28,6 +28,10 @@ def handleAbilityEvent(self, event, replay):
2828
return
2929

3030
if event.ability_id not in replay.datapack.abilities:
31+
# safeguard against missing abilities
32+
if event.player.pid in self.last_target_ability_event:
33+
del self.last_target_ability_event[event.player.pid]
34+
3135
if not getattr(replay, 'marked_error', None):
3236
replay.marked_error = True
3337
event.logger.error(replay.filename)
@@ -50,7 +54,7 @@ def handleAbilityEvent(self, event, replay):
5054
self.logger.error("Other unit {0} not found".format(event.other_unit_id))
5155

5256
def handleTargetAbilityEvent(self, event, replay):
53-
self.last_target_ability_event = event
57+
self.last_target_ability_event[event.player.pid] = event
5458

5559
if not replay.datapack:
5660
return
@@ -68,9 +72,13 @@ def handleTargetAbilityEvent(self, event, replay):
6872
replay.objects[event.target_unit_id] = unit
6973

7074
def handleUpdateTargetAbilityEvent(self, event, replay):
71-
# store corresponding TargetAbilityEvent data in this event
72-
# currently using for *MacroTracker only, so only need ability name
73-
event.ability_name = self.last_target_ability_event.ability_name
75+
# We may not find a TargetAbilityEvent before finding an
76+
# UpdateTargetAbilityEvent, perhaps due to Missing Abilities in the
77+
# datapack
78+
if event.player.pid in self.last_target_ability_event:
79+
# store corresponding TargetAbilityEvent data in this event
80+
# currently using for *MacroTracker only, so only need ability name
81+
event.ability_name = self.last_target_ability_event[event.player.pid].ability_name
7482

7583
self.handleTargetAbilityEvent(event, replay)
7684

0 commit comments

Comments
 (0)