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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Sit/stand task
  3. #  Copyright (c) 2004-2006 OpenKore Developers
  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: Sit/stand task.
  14. #
  15. # A task for sitting or standing. This task will keep sending sit or
  16. # stand messages to the server until the character is actually sitting
  17. # or standing.
  18. package Task::SitStand;
  19. use strict;
  20. use Time::HiRes qw(time);
  21. use Modules 'register';
  22. use Task;
  23. use base qw(Task);
  24. use Globals qw(%timeout $char $messageSender $net);
  25. use Network;
  26. use Skill;
  27. use Translation qw(T);
  28. use Utils qw(timeOut);
  29. use Utils::Exceptions;
  30. # Mutexes used by this task.
  31. use constant MUTEXES => ['movement'];
  32. # Error codes
  33. use enum qw(NO_SIT_STAND_SKILL);
  34. ##
  35. # Task::SitStand->new(options...)
  36. #
  37. # Create a new Task::SitStand object.
  38. #
  39. # The following options are allowed:
  40. # `l
  41. # - All options allowed for Task->new(), except 'mutexes'.
  42. # - <tt>mode</tt> (required) - Either 'sit' or 'stand'. An ArgumentException will be thrown if you specify something else.
  43. # - <tt>wait</tt> - Wait the specified number of seconds before actually trying to sit or stand. The default is 0.
  44. # `l`
  45. sub new {
  46. my $class = shift;
  47. my %args = @_;
  48. my $self = $class->SUPER::new(@_, mutexes => MUTEXES);
  49. if ($args{mode} ne 'sit' && $args{mode} ne 'stand') {
  50. ArgumentException->throw("No mode specified.");
  51. }
  52. $self->{mode} = $args{mode};
  53. $self->{wait}{timeout} = $args{wait};
  54. $self->{retry}{timeout} = $timeout{ai_stand_wait}{timeout} || 1;
  55. $self->{sitSkill} = new Skill(handle => 'NV_BASIC');
  56. return $self;
  57. }
  58. # Overrided method.
  59. sub activate {
  60. my ($self) = @_;
  61. $self->SUPER::activate();
  62. $self->{wait}{time} = time;
  63. }
  64. # Overrided method.
  65. sub interrupt {
  66. my ($self) = @_;
  67. $self->SUPER::interrupt();
  68. $self->{interruptionTime} = time;
  69. }
  70. # Overrided method.
  71. sub resume {
  72. my ($self) = @_;
  73. $self->SUPER::resume();
  74. $self->{wait}{time} += time - $self->{interruptionTime};
  75. $self->{retry}{time} += time - $self->{interruptionTime};
  76. }
  77. # Overrided method.
  78. sub iterate {
  79. my ($self) = @_;
  80. $self->SUPER::iterate();
  81. return unless ($net->getState() == Network::IN_GAME);
  82. if (($self->{mode} eq 'stand' && !$char->{sitting}) || ($self->{mode} eq 'sit' && $char->{sitting})) {
  83. $self->setDone();
  84. $timeout{ai_sit}{time} = $timeout{ai_sit_wait}{time} = 0;
  85. } elsif ($char->getSkillLevel($self->{sitSkill}) < 3) {
  86. $self->setError(NO_SIT_STAND_SKILL, T("Basic Skill level 3 is required in order to sit or stand."));
  87. } elsif (timeOut($self->{wait}) && timeOut($self->{retry})) {
  88. if ($self->{mode} eq 'stand') {
  89. $messageSender->sendStand();
  90. } else {
  91. $messageSender->sendSit();
  92. }
  93. $self->{retry}{time} = time;
  94. }
  95. }
  96. 1;