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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Checkpoints task
  3. #  Copyright (c) 2004,2005,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. # This task allows you to walk through a given list of checkpoints.
  13. package Task::CheckPoints;
  14. use strict;
  15. use Task::WithSubtask;
  16. use base qw(Task::WithSubtask);
  17. use Modules 'register';
  18. use Globals qw($net %maps_lut);
  19. use Task::MapRoute;
  20. use Log qw(message);
  21. use Network;
  22. use Translation qw(T TF);
  23. ##
  24. # Task::CheckPoints->new(options...)
  25. #
  26. # Create a new CheckPoints task.
  27. #
  28. # Allowed options:
  29. # `l
  30. # - checkpoints (Array<Hash>; required) - A list of checkpoint coordinates. Each hash in
  31. #       this array must have the following keys: 'x', 'y' and 'map'.
  32. # - whenDone - Specifies what to do when all checkpoints have been walked.
  33. #       Must be "repeat" (walk to the first checkpoint and start all over again),
  34. #       "reverse" (walk the list of checkpoints in reverse order) or "stop"
  35. #       (stop the task). The default is "stop".
  36. # `l`
  37. sub new {
  38. my $class = shift;
  39. my %args = @_;
  40. # TODO: do we need a mutex 'npc' too?
  41. my $self = $class->SUPER::new(@_, autofail => 1, autostop => 1, mutexes => ['movement']);
  42. $self->{checkpoints} = $args{checkpoints};
  43. $self->{whenDone} = $args{whenDone};
  44. $self->{index} = 0;
  45. $self->{inc} = 1;
  46. return $self;
  47. }
  48. sub iterate {
  49. my ($self) = @_;
  50. return 0 if (!$self->SUPER::iterate());
  51. return if ($net->getState() != Network::IN_GAME);
  52. my $checkpoints = $self->{checkpoints};
  53. if (defined $self->{walkedTo}) {
  54. message TF("Arrived at waypoint %sn", $self->{walkedTo}), "waypoint";
  55. delete $self->{walkedTo};
  56. } elsif ($self->{index} > -1 && $self->{index} < @{$checkpoints}) {
  57. # Walk to the next point
  58. my $point = $checkpoints->[$self->{index}];
  59. message TF("Walking to waypoint %s: %s(%s): %s,%sn",
  60. $self->{index}, $maps_lut{$point->{map}}, $point->{map}, $point->{x}, $point->{y}),
  61. "waypoint";
  62. $self->{walkedTo} = $self->{index};
  63. $self->{index} += $self->{inc};
  64. my $task = new Task::MapRoute(
  65. map => $point->{map},
  66. x => $point->{x},
  67. y => $point->{y},
  68. );
  69. $self->setSubtask($task);
  70. } else {
  71. # We're at the end of the checkpoint list.
  72. # Figure out what to do now.
  73. if ($self->{whenDone} eq 'repeat') {
  74. $self->{index} = 0;
  75. } elsif ($self->{whenDone} eq 'reverse') {
  76. if ($self->{inc} < 0) {
  77. $self->{inc} = 1;
  78. $self->{index} = 1;
  79. $self->{index} = 0 if ($self->{index} > $#{$self->{points}});
  80. } else {
  81. $self->{inc} = -1;
  82. $self->{index} -= 2;
  83. $self->{index} = 0 if ($self->{index} < 0);
  84. }
  85. } else {
  86. $self->setDone();
  87. }
  88. }
  89. }
  90. 1;