diff --git a/src/Commands.pm b/src/Commands.pm index d607e74c17..165172ef02 100644 --- a/src/Commands.pm +++ b/src/Commands.pm @@ -7091,7 +7091,9 @@ sub cmdQuest { my $quest = $questList->{$questID}; $msg .= swrite(sprintf("\@%s \@%s \@%s \@%s \@%s", ('>'x2), ('<'x5), ('<'x30), ('<'x10), ('<'x24)), [$k, $questID, $quests_lut{$questID} ? $quests_lut{$questID}{title} : '', $quest->{active} ? T("active") : T("inactive"), $quest->{time_expire} ? scalar localtime $quest->{time_expire} : '']); - foreach my $mobID (keys %{$quest->{missions}}) { + foreach my $mobID (sort { + ($quest->{missions}{$a}{mission_index} // 9999) <=> ($quest->{missions}{$b}{mission_index} // 9999) || $a <=> $b + } keys %{$quest->{missions}}) { my $mission = $quest->{missions}->{$mobID}; $msg .= swrite(sprintf("\@%s \@%s \@%s", ('>'x2), ('<'x30), ('<'x30)), [" -", $mission->{mob_name}, sprintf(defined $mission->{mob_goal} ? '%d/%d' : '%d', @{$mission}{qw(mob_count mob_goal)})]); @@ -8786,4 +8788,3 @@ sub cmdEden { 1; - diff --git a/src/Network/Receive.pm b/src/Network/Receive.pm index 0382a8cf37..8a167cc457 100644 --- a/src/Network/Receive.pm +++ b/src/Network/Receive.pm @@ -4891,6 +4891,8 @@ sub quest_update_mission_hunt { @{$mission}{@{$quest_info->{mission_keys}}} = unpack($quest_info->{mission_pack}, substr($args->{message}, $offset, $quest_info->{mission_len})); + next unless exists $questList->{$mission->{questID}}; + my $quest = \%{$questList->{$mission->{questID}}}; my $mission_id; @@ -4924,6 +4926,21 @@ sub quest_update_mission_hunt { } } + # Some servers can return mission updates keyed only by hunt identification. + # If direct lookup fails, map update by mission index from hunt_id. + if (!defined $mission_id && exists $mission->{hunt_id}) { + my $mission_index = $mission->{hunt_id} - ($mission->{questID} * 1000); + + foreach my $current_key (keys %{$quest->{missions}}) { + next unless exists $quest->{missions}->{$current_key}{mission_index}; + next unless $quest->{missions}->{$current_key}{mission_index} == $mission_index || $quest->{missions}->{$current_key}{mission_index} == $mission_index - 1; + $mission_id = $current_key; + last; + } + } + + next unless defined $mission_id && exists $quest->{missions}->{$mission_id}; + my $quest_mission = \%{$quest->{missions}->{$mission_id}}; $quest_mission->{mob_count} = $mission->{mob_count}; @@ -12604,4 +12621,3 @@ sub notify_accessible_mapname { } 1; -