Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package eventMacro::Condition::InPortalDist;
- use strict;
- use Globals;
- use Utils;
- use base 'eventMacro::Conditiontypes::NumericConditionState';
- sub _hooks {
- ['add_portal_list','portal_disappeared'];
- }
- sub _dynamic_hooks {
- ['packet/actor_movement_interrupted','packet/high_jump','packet/character_moves','packet_mapChange'];
- }
- sub _parse_syntax {
- my ( $self, $condition_code ) = @_;
- $self->{list_size} = 0;
- $self->{fulfilled_actor} = undef;
- $self->SUPER::_parse_syntax($condition_code);
- }
- sub _get_val {
- my ( $self ) = @_;
- return $self->{current_actor_distance};
- undef $self->{current_actor_distance};
- }
- sub validate_condition {
- my ( $self, $callback_type, $callback_name, $args ) = @_;
- if ($callback_type eq 'variable') {
- $self->update_validator_var($callback_name, $args);
- } elsif ($callback_type eq 'hook') {
- if ($callback_name eq 'add_portal_list') {
- $self->{list_size} = $portalsList->size;
- if ($self->{list_size} == 1) {
- $self->add_or_remove_dynamic_hooks(1);
- }
- $self->{current_actor_distance} = distance($char->{pos_to}, $args->{pos_to});
- if ( !defined $self->{fulfilled_actor} && $self->validator_check) {
- $self->{fulfilled_actor} = $args;
- }
- } elsif ( $callback_name eq 'portal_disappeared' ) {
- $self->{list_size} = ($portalsList->size - 1);
- if ($self->{list_size} == 0) {
- $self->add_or_remove_dynamic_hooks(0);
- }
- if (defined $self->{fulfilled_actor} && $args->{portal}->{binID} == $self->{fulfilled_actor}->{binID}) {
- $self->search_for_dist_in_actors_list;
- }
- } elsif ($callback_name eq 'packet/character_moves' || ($callback_name eq 'packet/actor_movement_interrupted' && Actor::get($args->{ID})->isa('Actor::You')) || ($callback_name eq 'packet/high_jump' && Actor::get($args->{ID})->isa('Actor::You'))) {
- if (defined $self->{fulfilled_actor}) {
- $self->{current_actor_distance} = distance($char->{pos_to}, $self->{fulfilled_actor}->{pos_to});
- return $self->SUPER::validate_condition if ( $self->validator_check );
- $self->search_for_dist_in_actors_list;
- } else {
- $self->search_for_dist_in_actors_list;
- }
- } elsif ($callback_name eq 'packet_mapChange') {
- if ($self->{list_size} > 0) {
- $self->add_or_remove_dynamic_hooks(0);
- }
- $self->{list_size} = 0;
- $self->{fulfilled_actor} = undef;
- }
- } elsif ($callback_type eq 'recheck') {
- $self->search_for_dist_in_actors_list;
- }
- return $self->SUPER::validate_condition( (defined $self->{fulfilled_actor} ? 1 : 0) );
- }
- sub search_for_dist_in_actors_list {
- my ($self) = @_;
- $self->{fulfilled_actor} = undef;
- foreach my $actor (@{$portalsList->getItems}) {
- $self->{current_actor_distance} = distance($char->{pos_to}, $actor->{pos_to});
- next unless ( $self->validator_check );
- $self->{fulfilled_actor} = $actor;
- last;
- }
- }
- sub get_new_variable_list {
- my ($self) = @_;
- my $new_variables;
- $new_variables->{".".$self->{name}."Last"."Pos"} = sprintf("%d %d %s", $self->{fulfilled_actor}->{pos_to}{x}, $self->{fulfilled_actor}->{pos_to}{y}, $field->baseName);
- $new_variables->{".".$self->{name}."Last"."BinId"} = $self->{fulfilled_actor}->{binID};
- $new_variables->{".".$self->{name}."Last"."Dist"} = distance($char->{pos_to}, $self->{fulfilled_actor}->{pos_to});
- return $new_variables;
- }
- 1;
Advertisement
Add Comment
Please, Sign In to add comment