Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
UpdateTargetAbilityEvent: Safer implementation, per player ability tr…
…acking
  • Loading branch information
gravelweb committed Jun 11, 2016
commit 9520a57c0825fe264b83b745c17b75e07a44371b
18 changes: 13 additions & 5 deletions sc2reader/engine/plugins/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def handleInitGame(self, event, replay):
replay.unit = dict()

# keep track of last TargetAbilityEvent for UpdateTargetAbilityEvent
self.last_target_ability_event = None
self.last_target_ability_event = {}

def handleGameEvent(self, event, replay):
self.load_message_game_player(event, replay)
Expand All @@ -28,6 +28,10 @@ def handleAbilityEvent(self, event, replay):
return

if event.ability_id not in replay.datapack.abilities:
# safeguard against missing abilities
if event.player.pid in self.last_target_ability_event:
del self.last_target_ability_event[event.player.pid]

if not getattr(replay, 'marked_error', None):
replay.marked_error = True
event.logger.error(replay.filename)
Expand All @@ -50,7 +54,7 @@ def handleAbilityEvent(self, event, replay):
self.logger.error("Other unit {0} not found".format(event.other_unit_id))

def handleTargetAbilityEvent(self, event, replay):
self.last_target_ability_event = event
self.last_target_ability_event[event.player.pid] = event

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

def handleUpdateTargetAbilityEvent(self, event, replay):
# store corresponding TargetAbilityEvent data in this event
# currently using for *MacroTracker only, so only need ability name
event.ability_name = self.last_target_ability_event.ability_name
# We may not find a TargetAbilityEvent before finding an
# UpdateTargetAbilityEvent, perhaps due to Missing Abilities in the
# datapack
if event.player.pid in self.last_target_ability_event:
# store corresponding TargetAbilityEvent data in this event
# currently using for *MacroTracker only, so only need ability name
event.ability_name = self.last_target_ability_event[event.player.pid].ability_name

self.handleTargetAbilityEvent(event, replay)

Expand Down