Class: Lich::Gemstone::Group
- Inherits:
-
Object
- Object
- Lich::Gemstone::Group
- Defined in:
- documented/gemstone/group.rb,
documented/gemstone/group.rb
Defined Under Namespace
Modules: Observer
Class Method Summary collapse
-
._members ⇒ Array<GameObj>
private
Returns the internal members array without checking or copying.
-
.add(*members) ⇒ Array<Hash>
Adds one or more members to the group by sending GROUP commands.
-
.broken? ⇒ Boolean
Checks if the group state is broken or inconsistent.
-
.check ⇒ Array<GameObj>
Actively checks group status by sending the GROUP command to the game.
-
.checked=(flag) ⇒ Boolean
Sets the checked flag indicating group data has been verified.
-
.checked? ⇒ Boolean
Checks if group data has been verified with the game.
-
.clear ⇒ Array
Clears all group members and resets the checked flag.
-
.closed? ⇒ Boolean
Checks if the group is closed to new members.
-
.delete(*members) ⇒ Array<GameObj>
Removes one or more members from the group by ID.
-
.disks ⇒ Array<Disk>
Returns Disk objects for all group members.
-
.ids ⇒ Array<String>
Returns array of all member IDs.
-
.include?(*members) ⇒ Boolean
Checks if all specified members are in the group.
-
.leader ⇒ Symbol, GameObj
Gets the current group leader.
-
.leader=(char) ⇒ Symbol, GameObj
Sets the group leader.
-
.leader? ⇒ Boolean
Checks if the current player is the group leader.
-
.maybe_check ⇒ Array<GameObj>?
Checks group status only if not already checked.
-
.members ⇒ Array<GameObj>
Returns a copy of the current group members.
-
.method_missing(method, *args, &block) ⇒ Object
private
Delegates missing methods to the members array.
-
.nonmembers ⇒ Array<GameObj>
Returns all PCs in the room who are not in the group.
-
.nouns ⇒ Array<String>
Returns array of all member nouns (names).
-
.open? ⇒ Boolean
Checks if the group is open to new members.
-
.push(*members) ⇒ Array<GameObj>
Adds one or more members to the group if they’re not already included.
-
.refresh(*members) ⇒ Array<GameObj>
Replaces the entire members list with new members.
-
.status ⇒ Symbol
Gets the current group status.
-
.status=(state) ⇒ Symbol
Sets the group status (open or closed).
-
.to_s ⇒ String
String representation of the group members.
Class Method Details
._members ⇒ Array<GameObj>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns the internal members array without checking or copying. Used internally by the Observer to avoid infinite loops.
74 75 76 |
# File 'documented/gemstone/group.rb', line 74 def self._members @@members end |
.add(*members) ⇒ Array<Hash>
Adds one or more members to the group by sending GROUP commands. Handles both String names and GameObj instances. Can accept nested arrays of members.
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'documented/gemstone/group.rb', line 182 def self.add(*members) members.map do |member| if member.is_a?(Array) Group.add(*member) else member = GameObj.pcs.find { |pc| pc.noun.eql?(member) } if member.is_a?(String) break if member.nil? result = dothistimeout("group ##{member.id}", 3, Regexp.union( %r{You add #{member.noun} to your group}, %r{#{member.noun}'s group status is closed}, %r{But #{member.noun} is already a member of your group} )) case result when %r{You add}, %r{already a member} Group.push(member) { ok: member } when %r{closed} Group.delete(member) { err: member } else end end end end |
.broken? ⇒ Boolean
Checks if the group state is broken or inconsistent. Waits for any claim locks to release before checking. For leaders: checks if member list matches actual PCs in room. For members: checks if leader is still present.
234 235 236 237 238 239 240 241 242 243 |
# File 'documented/gemstone/group.rb', line 234 def self.broken? sleep(0.1) while Lich::Gemstone::Claim::Lock.locked? if Group.leader? return true if (GameObj.pcs.empty? || GameObj.pcs.nil?) && !@@members.empty? return false if (GameObj.pcs.empty? || GameObj.pcs.nil?) && @@members.empty? (GameObj.pcs.map(&:noun) & @@members.map(&:noun)).size < @@members.size else GameObj.pcs.find do |pc| pc.noun.eql?(Group.leader.noun) end.nil? end end |
.check ⇒ Array<GameObj>
Actively checks group status by sending the GROUP command to the game. Clears current group data and waits up to 3 seconds for response. Should be called at script initialization.
134 135 136 137 138 139 140 |
# File 'documented/gemstone/group.rb', line 134 def self.check Group.clear() ttl = Time.now + 3 Game._puts "<c>group\r\n" wait_until { Group.checked? or Time.now > ttl } @@members.dup end |
.checked=(flag) ⇒ Boolean
Sets the checked flag indicating group data has been verified.
98 99 100 |
# File 'documented/gemstone/group.rb', line 98 def self.checked=(flag) @@checked = flag end |
.checked? ⇒ Boolean
Checks if group data has been verified with the game.
32 33 34 |
# File 'documented/gemstone/group.rb', line 32 def self.checked? @@checked end |
.clear ⇒ Array
Clears all group members and resets the checked flag. Does not change leader status.
25 26 27 28 |
# File 'documented/gemstone/group.rb', line 25 def self.clear() @@members = [] @@checked = false end |
.closed? ⇒ Boolean
Checks if the group is closed to new members.
126 127 128 |
# File 'documented/gemstone/group.rb', line 126 def self.closed? not open? end |
.delete(*members) ⇒ Array<GameObj>
Removes one or more members from the group by ID.
49 50 51 52 |
# File 'documented/gemstone/group.rb', line 49 def self.delete(*members) gone = members.map(&:id) @@members.reject! do |m| gone.include?(m.id) end end |
.disks ⇒ Array<Disk>
Returns Disk objects for all group members. If the player is leader with no members, returns only the player’s disk. Always includes the current character’s disk if available.
82 83 84 85 86 87 |
# File 'documented/gemstone/group.rb', line 82 def self.disks return [Disk.find_by_name(Char.name)].compact if Group.leader? && members.empty? member_disks = members.map(&:noun).compact.map { |noun| Disk.find_by_name(noun) }.compact member_disks.push(Disk.find_by_name(Char.name)) if Disk.find_by_name(Char.name) return member_disks end |
.ids ⇒ Array<String>
Returns array of all member IDs.
212 213 214 |
# File 'documented/gemstone/group.rb', line 212 def self.ids @@members.map(&:id) end |
.include?(*members) ⇒ Boolean
Checks if all specified members are in the group.
225 226 227 |
# File 'documented/gemstone/group.rb', line 225 def self.include?(*members) members.all? { |m| ids.include?(m.id) } end |
.leader ⇒ Symbol, GameObj
Gets the current group leader.
163 164 165 |
# File 'documented/gemstone/group.rb', line 163 def self.leader @@leader end |
.leader=(char) ⇒ Symbol, GameObj
Sets the group leader.
157 158 159 |
# File 'documented/gemstone/group.rb', line 157 def self.leader=(char) @@leader = char end |
.leader? ⇒ Boolean
Checks if the current player is the group leader.
169 170 171 |
# File 'documented/gemstone/group.rb', line 169 def self.leader? @@leader.eql?(:self) end |
.maybe_check ⇒ Array<GameObj>?
Checks group status only if not already checked.
144 145 146 |
# File 'documented/gemstone/group.rb', line 144 def self.maybe_check Group.check unless checked? end |
.members ⇒ Array<GameObj>
Returns a copy of the current group members. Automatically checks group status if not already checked.
65 66 67 68 |
# File 'documented/gemstone/group.rb', line 65 def self.members maybe_check @@members.dup end |
.method_missing(method, *args, &block) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Delegates missing methods to the members array. Allows Group to act like an Array in many contexts.
248 249 250 |
# File 'documented/gemstone/group.rb', line 248 def self.method_missing(method, *args, &block) @@members.send(method, *args, &block) end |
.nonmembers ⇒ Array<GameObj>
Returns all PCs in the room who are not in the group.
150 151 152 |
# File 'documented/gemstone/group.rb', line 150 def self.nonmembers GameObj.pcs.to_a.reject { |pc| ids.include?(pc.id) } end |
.nouns ⇒ Array<String>
Returns array of all member nouns (names).
218 219 220 |
# File 'documented/gemstone/group.rb', line 218 def self.nouns @@members.map(&:noun) end |
.open? ⇒ Boolean
Checks if the group is open to new members. Automatically verifies group status if not already checked.
119 120 121 122 |
# File 'documented/gemstone/group.rb', line 119 def self.open? maybe_check @@status.eql?(:open) end |
.push(*members) ⇒ Array<GameObj>
Adds one or more members to the group if they’re not already included. Does not duplicate members.
40 41 42 43 44 |
# File 'documented/gemstone/group.rb', line 40 def self.push(*members) members.each do |member| @@members.push(member) unless include?(member) end end |
.refresh(*members) ⇒ Array<GameObj>
Replaces the entire members list with new members. Used when receiving a complete group listing from the game.
58 59 60 |
# File 'documented/gemstone/group.rb', line 58 def self.refresh(*members) @@members = members.dup end |
.status ⇒ Symbol
Gets the current group status.
112 113 114 |
# File 'documented/gemstone/group.rb', line 112 def self.status() @@status end |
.status=(state) ⇒ Symbol
Sets the group status (open or closed).
106 107 108 |
# File 'documented/gemstone/group.rb', line 106 def self.status=(state) @@status = state end |
.to_s ⇒ String
String representation of the group members.
91 92 93 |
# File 'documented/gemstone/group.rb', line 91 def self.to_s @@members.to_s end |