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

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Actor list
  3. #
  4. #  Copyright (c) 2006 OpenKore Development Team
  5. #
  6. #  This software is open source, licensed under the GNU General Public
  7. #  License, version 2.
  8. #  Basically, this means that you're allowed to modify and distribute
  9. #  this software. However, if you distribute modified versions, you MUST
  10. #  also distribute the source code.
  11. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  12. #########################################################################
  13. ##
  14. # MODULE DESCRIPTION: List of actors
  15. #
  16. # <b>Derived from: @CLASS(ObjectList)</b>
  17. #
  18. # The ActorList class holds a list of Actor-objects.
  19. # OpenKore stores lists of players/monsters/portals/NPCs/etc. in lists
  20. # of this type. Those lists are $playersList, $monstersList, $npcsList,
  21. # $petsList and $portalsList, defined in Globals.pm.
  22. #
  23. # <h3>Differences compared to ObjectList</h3>
  24. # All items in ActorList are of the same class, and are all a
  25. # subclass of @CLASS(Actor).
  26. package ActorList;
  27. use strict;
  28. use Carp::Assert;
  29. use Utils::ObjectList;
  30. use base qw(ObjectList);
  31. ### CATEGORY: Class ActorList
  32. ##
  33. # ActorList ActorList->new(String type)
  34. # type: The name of the class that all items in this ActorList must be.
  35. # Requires: defined($type) && UNIVERSAL::isa($type, "Actor")
  36. # Ensures:  $self->size() == 0
  37. #
  38. # Creates a new ActorList object.
  39. sub new {
  40. my ($class, $type) = @_;
  41. assert(defined $type) if DEBUG;
  42. assert(UNIVERSAL::isa($type, "Actor")) if DEBUG;
  43. my $self = $class->SUPER::new();
  44. # Invariant: defined(type)
  45. $self->{type} = $type;
  46. # Hash<Bytes, Actor> IDmap
  47. # Maps an actor ID ($Actor->{ID}) to an actor. Used
  48. # for fast lookups of actors based on IDs.
  49. #
  50. # Invariant:
  51. #     defined(IDmap)
  52. #     scalar(keys IDmap) == size()
  53. #     for all values $v in IDmap:
  54. #         find($v) != -1
  55. $self->{IDmap} = {};
  56. return $self;
  57. }
  58. ##
  59. # int $ActorList->add(Actor actor)
  60. # Requires:
  61. #     defined($actor)
  62. #     defined($actor->{ID})
  63. #     $self->find($actor) == -1
  64. #
  65. # Adds an actor to this ActorList.
  66. #
  67. # This method overloads $ObjectList->add(), and has a stronger precondition.
  68. # See the documentation for that method for more information about this
  69. # method.
  70. sub add {
  71. my ($self, $actor) = @_;
  72. assert(defined $actor) if DEBUG;
  73. assert($actor->isa($self->{type})) if DEBUG;
  74. assert(defined $actor->{ID}) if DEBUG;
  75. assert(!exists $self->{IDmap}{$actor->{ID}}) if DEBUG;
  76. $self->{IDmap}{$actor->{ID}} = $actor;
  77. return $self->SUPER::add($actor);
  78. }
  79. ##
  80. # Actor $ActorList->getByID(Bytes ID)
  81. # Returns: An Actor, or undef if there is no actor with that ID in this list.
  82. # Requires: defined($ID)
  83. # Ensures: if defined(result): result->{ID} eq $ID
  84. #
  85. # Looks up an Actor object based on the actor ID.
  86. #
  87. # See also: $Actor->{ID}
  88. sub getByID {
  89. my ($self, $ID) = @_;
  90. assert(defined $ID) if DEBUG;
  91. return $self->{IDmap}{$ID};
  92. }
  93. ##
  94. # boolean $ActorList->remove(Actor actor)
  95. # Requires: defined($actor) && defined($actor->{ID})
  96. #
  97. # Removes an actor from this ActorList.
  98. #
  99. # This method overloads $ObjectList->remove(), and has a stronger precondition.
  100. # See the documentation for that method for more information about this
  101. # method.
  102. sub remove {
  103. my ($self, $actor) = @_;
  104. assert(defined $actor) if DEBUG;
  105. assert(UNIVERSAL::isa($actor, $self->{type})) if DEBUG;
  106. assert(defined $actor->{ID}) if DEBUG;
  107. my $result = $self->SUPER::remove($actor);
  108. if ($result) {
  109. delete $self->{IDmap}{$actor->{ID}};
  110. }
  111. return $result;
  112. }
  113. ##
  114. # boolean $ActorList->removeByID(Bytes ID)
  115. # ID: The ID of the actor to remove.
  116. # Returns: Whether the actor with the specified ID was in the list.
  117. # Requires: defined($ID)
  118. #
  119. # Removes an actor based on the actor ID. This will trigger an onRemove event
  120. # before the actor is removed.
  121. #
  122. # See also: $Actor->{ID}
  123. sub removeByID {
  124. my ($self, $ID) = @_;
  125. my $actor = $self->getByID($ID);
  126. if (defined $actor) {
  127. return $self->remove($actor);
  128. } else {
  129. return 0;
  130. }
  131. }
  132. # overloaded
  133. sub doClear {
  134. my ($self) = @_;
  135. $self->SUPER::doClear();
  136. $self->{IDmap} = {};
  137. }
  138. # overloaded
  139. sub checkValidity {
  140. my ($self) = @_;
  141. $self->SUPER::checkValidity();
  142. assert(defined $self->{type});
  143. assert(defined $self->{IDmap});
  144. should(scalar(keys %{$self->{IDmap}}), $self->size());
  145. foreach my $v (values %{$self->{IDmap}}) {
  146. assert($self->find($v) != -1);
  147. }
  148. }
  149. 1;