Skip to content

Commit

Permalink
Fix eventMacro quests (#3938)
Browse files Browse the repository at this point in the history
* Fix eventMacro quests

* updated hook names
  • Loading branch information
Henrybk authored Jan 9, 2025
1 parent d878df9 commit a6ccb82
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 130 deletions.
16 changes: 2 additions & 14 deletions plugins/eventMacro/eventMacro/Condition/QuestActive.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ use eventMacro::Utilities qw( find_variable );

use base 'eventMacro::Condition';

# Using 'inventory_ready' is not optimal, but it works.
sub _hooks {
['packet_mapChange','inventory_ready','packet/quest_all_list','packet/quest_all_list2','packet/quest_all_list3','packet/quest_all_mission','packet/quest_add','packet/quest_delete','packet/quest_update_mission_hunt','packet/quest_active'];
['quest_all_list_end','quest_all_mission_end','quest_added','quest_update_mission_hunt_end','quest_delete','quest_active'];
}

sub _parse_syntax {
Expand Down Expand Up @@ -83,18 +82,7 @@ sub validate_condition {
my ( $self, $callback_type, $callback_name, $args ) = @_;

if ($callback_type eq 'hook') {

if ($callback_name eq 'packet_mapChange') {
$self->{fulfilled_ID} = undef;
$self->{fulfilled_member_index} = undef;

} elsif ($callback_name eq 'inventory_ready') {
return $self->SUPER::validate_condition if ($self->{is_on_stand_by} == 0);
$self->{is_on_stand_by} = 0;

} else {
$self->{is_on_stand_by} = 0;
}
$self->{is_on_stand_by} = 0;

} elsif ($callback_type eq 'variable') {
$self->update_vars($callback_name, $args);
Expand Down
54 changes: 24 additions & 30 deletions plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ use eventMacro::Utilities qw( find_variable );

use base 'eventMacro::Condition';

# Using 'inventory_ready' is not optimal, but it works.
sub _hooks {
['packet_mapChange','inventory_ready','packet/quest_all_list','packet/quest_all_list2','packet/quest_all_list3','packet/quest_all_mission','packet/quest_add','packet/quest_delete','packet/quest_update_mission_hunt','packet/quest_active'];
['quest_all_list_end','quest_all_mission_end','quest_added','quest_update_mission_hunt_end','quest_delete','quest_active'];
}

sub _parse_syntax {
Expand Down Expand Up @@ -102,6 +101,7 @@ sub update_vars {

sub check_quests {
my ( $self, $list ) = @_;
my $found = 0;
$self->{fulfilled_quest_id} = undef;
$self->{fulfilled_mob_id} = undef;
$self->{fulfilled_member_index} = undef;
Expand All @@ -118,45 +118,39 @@ sub check_quests {
next unless ($quest->{active});

next unless (exists $quest->{missions});
next unless (keys %{$quest->{missions}});

my $quest_hunt_ID;
foreach (keys %{$questList->{$quest_ID}->{missions}}) {
my $mission = \%{$questList->{$quest_ID}->{missions}->{$_}};
#my $quest_hunt_ID;
#my $count;
#my $goal;

foreach my $key (keys %{$quest->{missions}}) {
next unless (defined $key);
my $mission = \%{$quest->{missions}{$key}};
if ((exists $mission->{mob_id} && $mission->{mob_id} == $mob_ID) || (exists $mission->{hunt_id} && $mission->{hunt_id} == $mob_ID)) {
$quest_hunt_ID = $_;
last;
next unless (exists $mission->{'mob_count'} && defined $mission->{'mob_count'});
next unless (exists $mission->{'mob_goal'} && defined $mission->{'mob_goal'});
next unless ($mission->{'mob_count'} == $mission->{'mob_goal'});
$found = 1;
#$quest_hunt_ID = $key;
#$count = $mission->{'mob_count'};
#$goal = $mission->{'mob_goal'};

$self->{fulfilled_quest_id} = $quest_ID;
$self->{fulfilled_mob_id} = $mob_ID;
$self->{fulfilled_member_index} = $member_index;
}
last if ($found);
}

next unless (exists $quest->{missions}->{$quest_hunt_ID}->{mob_count});
next unless (exists $quest->{missions}->{$quest_hunt_ID}->{mob_goal});
next unless ($quest->{missions}->{$quest_hunt_ID}->{mob_count} == $quest->{missions}->{$quest_hunt_ID}->{mob_goal});

$self->{fulfilled_quest_id} = $quest_ID;
$self->{fulfilled_mob_id} = $mob_ID;
$self->{fulfilled_member_index} = $member_index;
last;
last if ($found);
}
}

sub validate_condition {
my ( $self, $callback_type, $callback_name, $args ) = @_;

if ($callback_type eq 'hook') {

if ($callback_name eq 'packet_mapChange') {
$self->{fulfilled_quest_id} = undef;
$self->{fulfilled_mob_id} = undef;
$self->{fulfilled_member_index} = undef;
$self->{is_on_stand_by} = 1;

} elsif ($callback_name eq 'inventory_ready') {
return $self->SUPER::validate_condition if ($self->{is_on_stand_by} == 0);
$self->{is_on_stand_by} = 0;

} else {
$self->{is_on_stand_by} = 0;
}
$self->{is_on_stand_by} = 0;

} elsif ($callback_type eq 'variable') {
$self->update_vars($callback_name, $args);
Expand Down
66 changes: 31 additions & 35 deletions plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ use eventMacro::Utilities qw( find_variable );

use base 'eventMacro::Condition';

# Using 'inventory_ready' is not optimal, but it works.
sub _hooks {
['packet_mapChange','inventory_ready','packet/quest_all_list','packet/quest_all_list2','packet/quest_all_list3','packet/quest_all_mission','packet/quest_add','packet/quest_delete','packet/quest_update_mission_hunt','packet/quest_active'];
['quest_all_list_end','quest_all_mission_end','quest_added','quest_update_mission_hunt_end','quest_delete','quest_active'];
}

sub _parse_syntax {
Expand Down Expand Up @@ -102,6 +101,7 @@ sub update_vars {

sub check_quests {
my ( $self, $list ) = @_;
my $found = 0;
$self->{fulfilled_quest_id} = undef;
$self->{fulfilled_mob_id} = undef;
$self->{fulfilled_member_index} = undef;
Expand All @@ -112,50 +112,46 @@ sub check_quests {
next unless (defined $quest_ID);
next unless (defined $mob_ID);
next unless (exists $questList->{$quest_ID});
next unless (exists $questList->{$quest_ID}->{active});
next unless ($questList->{$quest_ID}->{active});
next unless (exists $questList->{$quest_ID}->{missions});
my $quest = $questList->{$quest_ID};

my $quest_hunt_ID;
foreach (keys %{$questList->{$quest_ID}->{missions}}) {
my $mission = \%{$questList->{$quest_ID}->{missions}->{$_}};
next unless (exists $quest->{active});
next unless ($quest->{active});

next unless (exists $quest->{missions});
next unless (keys %{$quest->{missions}});

#my $quest_hunt_ID;
#my $count;
#my $goal;

foreach my $key (keys %{$quest->{missions}}) {
next unless (defined $key);
my $mission = \%{$questList->{$quest_ID}->{missions}->{$key}};
if ((exists $mission->{mob_id} && $mission->{mob_id} == $mob_ID) || (exists $mission->{hunt_id} && $mission->{hunt_id} == $mob_ID)) {
$quest_hunt_ID = $_;
last;
next unless (exists $mission->{'mob_count'} && defined $mission->{'mob_count'});
next unless (exists $mission->{'mob_goal'} && defined $mission->{'mob_goal'});
next unless ($mission->{'mob_count'} < $mission->{'mob_goal'});
$found = 1;
#$quest_hunt_ID = $key;
#$count = $mission->{'mob_count'};
#$goal = $mission->{'mob_goal'};


$self->{fulfilled_quest_id} = $quest_ID;
$self->{fulfilled_mob_id} = $mob_ID;
$self->{fulfilled_member_index} = $member_index;
}
last if ($found);
}

next if (
exists $questList->{$quest_ID}->{missions}->{$quest_hunt_ID}->{mob_count} &&
exists $questList->{$quest_ID}->{missions}->{$quest_hunt_ID}->{mob_goal} &&
$questList->{$quest_ID}->{missions}->{$quest_hunt_ID}->{mob_count} == $questList->{$quest_ID}->{missions}->{$quest_hunt_ID}->{mob_goal}
);

$self->{fulfilled_quest_id} = $quest_ID;
$self->{fulfilled_mob_id} = $mob_ID;
$self->{fulfilled_member_index} = $member_index;
last;
last if ($found);
}
}

sub validate_condition {
my ( $self, $callback_type, $callback_name, $args ) = @_;

if ($callback_type eq 'hook') {

if ($callback_name eq 'packet_mapChange') {
$self->{fulfilled_quest_id} = undef;
$self->{fulfilled_mob_id} = undef;
$self->{fulfilled_member_index} = undef;
$self->{is_on_stand_by} = 0;

} elsif ($callback_name eq 'inventory_ready') {
return $self->SUPER::validate_condition if ($self->{is_on_stand_by} == 0);
$self->{is_on_stand_by} = 0;

} else {
$self->{is_on_stand_by} = 0;
}
$self->{is_on_stand_by} = 0;

} elsif ($callback_type eq 'variable') {
$self->update_vars($callback_name, $args);
Expand Down
26 changes: 7 additions & 19 deletions plugins/eventMacro/eventMacro/Condition/QuestInactive.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ use eventMacro::Utilities qw( find_variable );

use base 'eventMacro::Condition';

# Using 'inventory_ready' is not optimal, but it works.
sub _hooks {
['packet_mapChange','inventory_ready','packet/quest_all_list','packet/quest_all_list2','packet/quest_all_list3','packet/quest_all_mission','packet/quest_add','packet/quest_delete','packet/quest_update_mission_hunt','packet/quest_active'];
['quest_all_list_end','quest_all_mission_end','quest_added','quest_update_mission_hunt_end','quest_delete','quest_active'];
}

sub _parse_syntax {
Expand Down Expand Up @@ -70,30 +69,19 @@ sub check_quests {
foreach my $member_index ( 0..$#{ $self->{members_array} } ) {
my $quest_ID = $self->{members_array}->[$member_index];
next unless (defined $quest_ID);
next if (exists $questList->{$quest_ID} && exists $questList->{$quest_ID}->{active} && $questList->{$quest_ID}->{active});
$self->{fulfilled_ID} = $quest_ID;
$self->{fulfilled_member_index} = $member_index;
last;
if (!keys %{$questList} || !exists $questList->{$quest_ID} || !exists $questList->{$quest_ID}->{active} || !$questList->{$quest_ID}->{active}) {
$self->{fulfilled_ID} = $quest_ID;
$self->{fulfilled_member_index} = $member_index;
last;
}
}
}

sub validate_condition {
my ( $self, $callback_type, $callback_name, $args ) = @_;

if ($callback_type eq 'hook') {

if ($callback_name eq 'packet_mapChange') {
$self->{fulfilled_ID} = undef;
$self->{fulfilled_member_index} = undef;
$self->{is_on_stand_by} = 1;

} elsif ($callback_name eq 'inventory_ready') {
return $self->SUPER::validate_condition if ($self->{is_on_stand_by} == 0);
$self->{is_on_stand_by} = 0;

} else {
$self->{is_on_stand_by} = 0;
}
$self->{is_on_stand_by} = 0;

} elsif ($callback_type eq 'variable') {
$self->update_vars($callback_name, $args);
Expand Down
17 changes: 2 additions & 15 deletions plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ use eventMacro::Utilities qw( find_variable );

use base 'eventMacro::Condition';

# Using 'inventory_ready' is not optimal, but it works.
sub _hooks {
['packet_mapChange','inventory_ready','packet/quest_all_list','packet/quest_all_list2','packet/quest_all_list3','packet/quest_all_mission','packet/quest_add','packet/quest_delete','packet/quest_update_mission_hunt','packet/quest_active'];
['quest_all_list_end','quest_all_mission_end','quest_added','quest_update_mission_hunt_end','quest_delete','quest_active'];
}

sub _parse_syntax {
Expand Down Expand Up @@ -87,19 +86,7 @@ sub validate_condition {
my ( $self, $callback_type, $callback_name, $args ) = @_;

if ($callback_type eq 'hook') {

if ($callback_name eq 'packet_mapChange') {
$self->{fulfilled_ID} = undef;
$self->{fulfilled_member_index} = undef;
$self->{is_on_stand_by} = 1;

} elsif ($callback_name eq 'inventory_ready') {
return $self->SUPER::validate_condition if ($self->{is_on_stand_by} == 0);
$self->{is_on_stand_by} = 0;

} else {
$self->{is_on_stand_by} = 0;
}
$self->{is_on_stand_by} = 0;

} elsif ($callback_type eq 'variable') {
$self->update_vars($callback_name, $args);
Expand Down
17 changes: 2 additions & 15 deletions plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ use eventMacro::Utilities qw( find_variable );

use base 'eventMacro::Condition';

# Using 'inventory_ready' is not optimal, but it works.
sub _hooks {
['packet_mapChange','inventory_ready','packet/quest_all_list','packet/quest_all_list2','packet/quest_all_list3','packet/quest_all_mission','packet/quest_add','packet/quest_delete','packet/quest_update_mission_hunt','packet/quest_active'];
['quest_all_list_end','quest_all_mission_end','quest_added','quest_update_mission_hunt_end','quest_delete','quest_active'];
}

sub _parse_syntax {
Expand Down Expand Up @@ -87,19 +86,7 @@ sub validate_condition {
my ( $self, $callback_type, $callback_name, $args ) = @_;

if ($callback_type eq 'hook') {

if ($callback_name eq 'packet_mapChange') {
$self->{fulfilled_ID} = undef;
$self->{fulfilled_member_index} = undef;
$self->{is_on_stand_by} = 1;

} elsif ($callback_name eq 'inventory_ready') {
return $self->SUPER::validate_condition if ($self->{is_on_stand_by} == 0);
$self->{is_on_stand_by} = 0;

} else {
$self->{is_on_stand_by} = 0;
}
$self->{is_on_stand_by} = 0;

} elsif ($callback_type eq 'variable') {
$self->update_vars($callback_name, $args);
Expand Down
14 changes: 12 additions & 2 deletions src/Network/Receive.pm
Original file line number Diff line number Diff line change
Expand Up @@ -4623,7 +4623,7 @@ sub quest_all_list {
mission_len => 44,
};

} elsif ($args->{switch} eq '0AFF') { # SERVERTYPE >= 20150513
} elsif ($args->{switch} eq '0AFF') { # SERVERTYPE >= 20181010
$quest_info = {
quest_pack => 'V C V2 v',
quest_keys => [qw(quest_id active time_expire time_start mission_amount)],
Expand Down Expand Up @@ -4657,6 +4657,8 @@ sub quest_all_list {
$offset += $quest_info->{quest_len};

next if !exists $quest->{mission_amount};

debug "- Mission amount: $quest->{mission_amount}\n", "info";

for ( my $j = 0 ; $j < $quest->{mission_amount}; $j++ ) {
my $mission;
Expand All @@ -4678,7 +4680,7 @@ sub quest_all_list {
}
}

Plugins::callHook('quest_list');
Plugins::callHook('quest_all_list_end');
}

# 02b2 <packet len>.W <num>.L { <quest id>.L <start time>.L <expire time>.L <mobs>.W { <mob id>.L <mob count>.W <mob name>.24B }*3 }*num
Expand Down Expand Up @@ -4737,6 +4739,8 @@ sub quest_all_mission {
});
}
}

Plugins::callHook('quest_all_mission_end');
}

# 02b3 <quest id>.L <active>.B <start time>.L <expire time>.L <mobs>.W { <mob id>.L <mob count>.W <mob name>.24B }*3 (ZC_ADD_QUEST)
Expand Down Expand Up @@ -4906,13 +4910,17 @@ sub quest_update_mission_hunt {
goal => $quest_mission->{mob_goal}
});
}

Plugins::callHook('quest_update_mission_hunt_end');
}

# 02B4
sub quest_delete {
my ($self, $args) = @_;
message TF("Quest: %s has been deleted.\n", $quests_lut{$args->{questID}} ? "$quests_lut{$args->{questID}}{title} ($args->{questID})" : $args->{questID}), "info";
delete $questList->{$args->{questID}};

Plugins::callHook('quest_delete');
}

# 02B7
Expand All @@ -4925,6 +4933,8 @@ sub quest_active {
, "info";

$questList->{$args->{questID}}->{active} = $args->{active};

Plugins::callHook('quest_active');
}

# 02C1
Expand Down

0 comments on commit a6ccb82

Please sign in to comment.