Move.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:5k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Simple movement task
  3. #  Copyright (c) 2006 OpenKore Team
  4. #
  5. #  This software is open source, licensed under the GNU General Public
  6. #  License, version 2.
  7. #  Basically, this means that you're allowed to modify and distribute
  8. #  this software. However, if you distribute modified versions, you MUST
  9. #  also distribute the source code.
  10. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  11. #########################################################################
  12. ##
  13. # MODULE DESCRIPTION: Simple movement task.
  14. #
  15. # The Move task is responsible for moving a single step. That is: to
  16. # move to a near place on the same map, that can be reached by clicking
  17. # one time inside the RO client.
  18. #
  19. # This task will keep sending the 'move' message to the server until the
  20. # character has moved, or until a specific amount of time has passed.
  21. # Furthermore, this task will also make sure that the character first
  22. # stands up, if the character is sitting.
  23. #
  24. # You should take a look at the Route task instead, for movements which
  25. # involve a longer route for which multiple steps are required.
  26. package Task::Move;
  27. use strict;
  28. use Time::HiRes qw(time);
  29. use Scalar::Util;
  30. use Modules 'register';
  31. use Task::WithSubtask;
  32. use base qw(Task::WithSubtask);
  33. use Task::SitStand;
  34. use Globals qw(%timeout $char $net $messageSender);
  35. use Plugins;
  36. use Network;
  37. use Log qw(warning debug);
  38. use Utils qw(timeOut);
  39. use Utils::Exceptions;
  40. # Error constants.
  41. use enum qw(
  42. TOO_LONG
  43. NO_SIT_STAND_SKILL
  44. UNKNOWN_ERROR
  45. );
  46. # Mutexes used by this task.
  47. use constant MUTEXES => Task::SitStand::MUTEXES;
  48. ##
  49. # Task::Move->new(options...)
  50. #
  51. # Create a new Task::Move object. The following options are allowed:
  52. # `l
  53. # - All options allowed by Task->new(), except 'movement', 'autostop' and 'autofail'.
  54. # - <tt>x</tt> (required) - The X-coordinate that you want to move to.
  55. # - <tt>y</tt> (required) - The Y-coordinate that you want to move to.
  56. # - <tt>retryTime</tt> - After a 'move' message has been sent, if the character does not
  57. #                        move within the specified amount of time, then this task will re-sent
  58. #                        a 'move' message. The default is 0.5.
  59. # - <tt>giveupTime</tt> - If the character still hasn't moved after the specified amount of time,
  60. #                         then this task will give up and complete with an error.
  61. # `l`
  62. #
  63. # x and y may not be 0 or undef. Otherwise, an ArgumentException will be thrown.
  64. sub new {
  65. my $class = shift;
  66. my %args = @_;
  67. my $self = $class->SUPER::new(@_, autostop => 1, autofail => 1, mutexes => MUTEXES);
  68. if ($args{x} == 0 || $args{y} == 0) {
  69. ArgumentException->throw(error => "Invalid arguments.");
  70. }
  71. $self->{x} = $args{x};
  72. $self->{y} = $args{y};
  73. $self->{retry}{timeout} = $args{retryTime} || 0.5;
  74. $self->{giveup}{timeout} = $args{giveupTime} || $timeout{ai_move_giveup}{timeout} || 3;
  75. # Watch for map change events. Pass a weak reference to ourselves in order
  76. # to avoid circular references (memory leaks).
  77. my @holder = ($self);
  78. Scalar::Util::weaken($holder[0]);
  79. $self->{mapChangedHook} = Plugins::addHook('Network::Receive::map_changed', &mapChanged, @holder);
  80. return $self;
  81. }
  82. sub DESTROY {
  83. my ($self) = @_;
  84. Plugins::delHook($self->{mapChangedHook});
  85. }
  86. # Overrided method.
  87. sub activate {
  88. my ($self) = @_;
  89. $self->SUPER::activate();
  90. $self->{giveup}{time} = time;
  91. $self->{start_time} = time;
  92. }
  93. # Overrided method.
  94. sub interrupt {
  95. my ($self) = @_;
  96. $self->SUPER::interrupt();
  97. $self->{interruptionTime} = time;
  98. }
  99. # Overrided method.
  100. sub resume {
  101. my ($self) = @_;
  102. $self->SUPER::resume();
  103. $self->{giveup}{time} += time - $self->{interruptionTime};
  104. $self->{retry}{time} += time - $self->{interruptionTime};
  105. }
  106. # Overrided method.
  107. sub iterate {
  108. my ($self) = @_;
  109. return if (!$self->SUPER::iterate());
  110. return if ($net->getState() != Network::IN_GAME);
  111. # If we're sitting, wait until we've stood up.
  112. if ($char->{sitting}) {
  113. debug "Move - trying to standn", "move";
  114. my $task = new Task::SitStand(mode => 'stand');
  115. $self->setSubtask($task);
  116. # Stop if the map changed.
  117. } elsif ($self->{mapChanged}) {
  118. debug "Move - map change detectedn", "move";
  119. $self->setDone();
  120. # Stop if we've moved.
  121. } elsif ($char->{time_move} > $self->{start_time}) {
  122. debug "Move - donen", "move";
  123. $self->setDone();
  124. # Stop if we've timed out.
  125. } elsif (timeOut($self->{giveup})) {
  126. debug "Move - timeoutn", "move";
  127. $self->setError(TOO_LONG, "Tried too long to move");
  128. } elsif (timeOut($self->{retry})) {
  129. debug "Move - (re)tryingn", "move";
  130. $messageSender->sendMove($self->{x}, $self->{y});
  131. $self->{retry}{time} = time;
  132. }
  133. }
  134. # Overrided method.
  135. sub subtaskDone {
  136. my ($self, $task) = @_;
  137. if (!$task->getError()) {
  138. $self->{start_time} = time;
  139. $self->{giveup}{time} = time;
  140. }
  141. }
  142. # Overrided method.
  143. sub translateSubtaskError {
  144. my ($self, $task, $error) = @_;
  145. my $code;
  146. if ($task->isa('Task::SitStand') && $error->{code} == Task::SitStand::NO_SIT_STAND_SKILL) {
  147. $code = NO_SIT_STAND_SKILL;
  148. }
  149. if (!defined $code) {
  150. $code = UNKNOWN_ERROR;
  151. }
  152. return { code => $code, message => $error->{message} };
  153. }
  154. sub mapChanged {
  155. my (undef, undef, $holder) = @_;
  156. my $self = $holder->[0];
  157. $self->{mapChanged} = 1;
  158. }
  159. 1;