Skip to content

Commit 90bc219

Browse files
committed
Add handler for command_update_target_unit_event
This is one step towards fixing Zerg Macro (ggtracker/ggtrackerstack#13, ggtracker/ggtrackerstack#49) and Terran Macro (ggtracker/ggtrackerstack#48)
1 parent bdf3bc2 commit 90bc219

File tree

3 files changed

+43
-10
lines changed

3 files changed

+43
-10
lines changed

sc2reader/engine/plugins/context.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ def handleInitGame(self, event, replay):
1414
replay.units = set()
1515
replay.unit = dict()
1616

17+
# keep track of last TargetAbilityEvent for UpdateTargetAbilityEvent
18+
self.last_target_ability_event = None
19+
1720
def handleGameEvent(self, event, replay):
1821
self.load_message_game_player(event, replay)
1922

@@ -47,6 +50,8 @@ def handleAbilityEvent(self, event, replay):
4750
self.logger.error("Other unit {0} not found".format(event.other_unit_id))
4851

4952
def handleTargetAbilityEvent(self, event, replay):
53+
self.last_target_ability_event = event
54+
5055
if not replay.datapack:
5156
return
5257

@@ -62,6 +67,13 @@ def handleTargetAbilityEvent(self, event, replay):
6267
event.target = unit
6368
replay.objects[event.target_unit_id] = unit
6469

70+
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
74+
75+
self.handleTargetAbilityEvent(event, replay)
76+
6577
def handleSelectionEvent(self, event, replay):
6678
if not replay.datapack:
6779
return

sc2reader/events/game.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,22 @@ def __init__(self, frame, pid, data):
339339
self.location = (self.x, self.y, self.z)
340340

341341

342+
class UpdateTargetAbilityEvent(TargetAbilityEvent):
343+
"""
344+
Extends :class:`TargetAbilityEvent`
345+
346+
This event is generated when a TargetAbilityEvent is updated, likely due to
347+
changing the target unit. It is unclear if this needs to be a separate event
348+
from TargetAbilityEvent, but for flexibility, it will be treated
349+
differently.
350+
351+
One example of this event occuring is casting inject on a hatchery while
352+
holding shift, and then shift clicking on a second hatchery.
353+
"""
354+
355+
name = 'UpdateTargetAbilityEvent'
356+
357+
342358
class SelfAbilityEvent(AbilityEvent):
343359
"""
344360
Extends :class:`AbilityEvent`

sc2reader/readers.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,7 +1525,7 @@ def __init__(self):
15251525
61: (None, self.trigger_hotkey_pressed_event),
15261526
103: (None, self.command_manager_state_event),
15271527
104: (None, self.command_update_target_point_event),
1528-
105: (None, self.command_update_target_unit_event),
1528+
105: (UpdateTargetAbilityEvent, self.command_update_target_unit_event),
15291529
106: (None, self.trigger_anim_length_query_by_name_event),
15301530
107: (None, self.trigger_anim_length_query_by_props_event),
15311531
108: (None, self.trigger_anim_offset_event),
@@ -1596,19 +1596,24 @@ def command_update_target_point_event(self, data):
15961596

15971597
def command_update_target_unit_event(self, data):
15981598
return dict(
1599-
target=dict(
1600-
target_unit_flags=data.read_uint16(),
1599+
flags=0, # fill me with previous TargetUnitEvent.flags
1600+
ability=None, # fill me with previous TargetUnitEvent.ability
1601+
data=('TargetUnit', dict(
1602+
flags=data.read_uint16(),
16011603
timer=data.read_uint8(),
1602-
tag=data.read_uint32(),
1603-
snapshot_unit_link=data.read_uint16(),
1604-
snapshot_control_player_id=data.read_bits(4) if data.read_bool() else None,
1605-
snapshot_upkeep_player_id=data.read_bits(4) if data.read_bool() else None,
1606-
snapshot_point=dict(
1604+
unit_tag=data.read_uint32(),
1605+
unit_link=data.read_uint16(),
1606+
control_player_id=data.read_bits(4) if data.read_bool() else None,
1607+
upkeep_player_id=data.read_bits(4) if data.read_bool() else None,
1608+
point=dict(
16071609
x=data.read_bits(20),
16081610
y=data.read_bits(20),
16091611
z=data.read_bits(32) - 2147483648,
1610-
)
1611-
)
1612+
),
1613+
)),
1614+
sequence=0, # fill me with previous TargetUnitEvent.flags
1615+
other_unit_tag=None, # fill me with previous TargetUnitEvent.flags
1616+
unit_group=None, # fill me with previous TargetUnitEvent.flags
16121617
)
16131618

16141619
def command_event(self, data):

0 commit comments

Comments
 (0)