diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 32558eda..fa52d48a 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -397,7 +397,8 @@ asio::awaitable forward_subcommand_with_entity_id_transcode_t(shared_ptr -asio::awaitable forward_subcommand_with_entity_targets_transcode_t(shared_ptr c, SubcommandMessage& msg) { +asio::awaitable forward_subcommand_with_entity_targets_transcode_and_track_hits_t( + shared_ptr c, SubcommandMessage& msg) { // I'm lazy and this should never happen for item commands (since all players need to stay in sync) if (command_is_private(msg.command)) { throw runtime_error("entity subcommand sent via private command"); @@ -427,7 +428,18 @@ asio::awaitable forward_subcommand_with_entity_targets_transcode_t(shared_ for (size_t z = 0; z < header.target_count; z++) { auto& res = resolutions.emplace_back(TargetResolution{nullptr, nullptr, targets[z].entity_id}); if ((res.entity_id >= 0x1000) && (res.entity_id < 0x4000)) { - res.ene_st = l->map_state->enemy_state_for_index(c->version(), res.entity_id - 0x1000); + auto ene_st = l->map_state->enemy_state_for_index(c->version(), res.entity_id - 0x1000); + res.ene_st = ene_st; + + // Track hits for all resolved enemies + c->log.info_f("Claiming last hit on E-{:03X}", ene_st->e_id); + ene_st->set_last_hit_by_client_id(c->lobby_client_id); + if (ene_st->alias_target_ene_st) { + c->log.info_f("Claiming last hit on E-{:03X} (alias of E-{:03X})", + ene_st->alias_target_ene_st->e_id, ene_st->e_id); + ene_st->alias_target_ene_st->set_last_hit_by_client_id(c->lobby_client_id); + } + } else if ((res.entity_id >= 0x4000) && (res.entity_id < 0xFFFF)) { res.obj_st = l->map_state->object_state_for_index(c->version(), res.entity_id - 0x4000); } @@ -3427,12 +3439,10 @@ static asio::awaitable on_update_enemy_state(shared_ptr c, Subcomm } ene_st->game_flags = src_flags; ene_st->total_damage = cmd.total_damage; - ene_st->set_last_hit_by_client_id(c->lobby_client_id); l->log.info_f("E-{:03X} updated to damage={} game_flags={:08X}", ene_st->e_id, ene_st->total_damage, ene_st->game_flags); if (ene_st->alias_target_ene_st) { ene_st->alias_target_ene_st->game_flags = src_flags; ene_st->alias_target_ene_st->total_damage = cmd.total_damage; - ene_st->alias_target_ene_st->set_last_hit_by_client_id(c->lobby_client_id); l->log.info_f("Alias target E-{:03X} updated to damage={} game_flags={:08X}", ene_st->alias_target_ene_st->e_id, ene_st->alias_target_ene_st->total_damage, ene_st->alias_target_ene_st->game_flags); } @@ -5489,10 +5499,10 @@ const vector subcommand_definitions{ /* 6x43 */ {0x3A, 0x3F, 0x43, on_forward_check_game_client}, /* 6x44 */ {0x3B, 0x40, 0x44, on_forward_check_game_client}, /* 6x45 */ {0x3C, 0x41, 0x45, on_forward_check_game_client}, - /* 6x46 */ {NONE, 0x42, 0x46, forward_subcommand_with_entity_targets_transcode_t}, - /* 6x47 */ {0x3D, 0x43, 0x47, forward_subcommand_with_entity_targets_transcode_t}, + /* 6x46 */ {NONE, 0x42, 0x46, forward_subcommand_with_entity_targets_transcode_and_track_hits_t}, + /* 6x47 */ {0x3D, 0x43, 0x47, forward_subcommand_with_entity_targets_transcode_and_track_hits_t}, /* 6x48 */ {NONE, NONE, 0x48, on_cast_technique_finished}, - /* 6x49 */ {0x3E, 0x44, 0x49, forward_subcommand_with_entity_targets_transcode_t}, + /* 6x49 */ {0x3E, 0x44, 0x49, forward_subcommand_with_entity_targets_transcode_and_track_hits_t}, /* 6x4A */ {0x3F, 0x45, 0x4A, on_change_hp}, /* 6x4B */ {0x40, 0x46, 0x4B, on_change_hp}, /* 6x4C */ {0x41, 0x47, 0x4C, on_change_hp},