Class: Lich::Gemstone::Group

Inherits:
Object
  • Object
show all
Defined in:
documented/gemstone/group.rb,
documented/gemstone/group.rb

Defined Under Namespace

Modules: Observer

Class Method Summary collapse

Class Method Details

._membersArray<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.

Returns:

  • (Array<GameObj>)

    the internal members array



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.

Examples:

Add a single member

Group.add("PlayerName")

Add multiple members

Group.add("Player1", "Player2")

Parameters:

  • members (Array<String, GameObj, Array>)

    members to add

Returns:

  • (Array<Hash>)

    array of results, each containing :ok or :err key with member



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.

Returns:

  • (Boolean)

    true if group state is inconsistent



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

.checkArray<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.

Returns:

  • (Array<GameObj>)

    copy of the members array after checking



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.

Parameters:

  • flag (Boolean)

    true if group data is verified

Returns:

  • (Boolean)

    the flag value



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.

Returns:

  • (Boolean)

    true if group data has been checked



32
33
34
# File 'documented/gemstone/group.rb', line 32

def self.checked?
  @@checked
end

.clearArray

Clears all group members and resets the checked flag. Does not change leader status.

Returns:

  • (Array)

    Empty array



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.

Returns:

  • (Boolean)

    true if group status is not open



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.

Parameters:

  • members (Array<GameObj>)

    one or more GameObj instances to remove

Returns:

  • (Array<GameObj>)

    the updated members array



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

.disksArray<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.

Returns:

  • (Array<Disk>)

    array of Disk objects for group members



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

.idsArray<String>

Returns array of all member IDs.

Returns:

  • (Array<String>)

    array of 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.

Parameters:

  • members (Array<GameObj>)

    members to check

Returns:

  • (Boolean)

    true if all 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

.leaderSymbol, GameObj

Gets the current group leader.

Returns:

  • (Symbol, GameObj)

    :self if current player is leader, or GameObj of leader



163
164
165
# File 'documented/gemstone/group.rb', line 163

def self.leader
  @@leader
end

.leader=(char) ⇒ Symbol, GameObj

Sets the group leader.

Parameters:

  • char (Symbol, GameObj)

    :self if current player is leader, or GameObj of leader

Returns:

  • (Symbol, GameObj)

    the leader value



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.

Returns:

  • (Boolean)

    true if current player is leader



169
170
171
# File 'documented/gemstone/group.rb', line 169

def self.leader?
  @@leader.eql?(:self)
end

.maybe_checkArray<GameObj>?

Checks group status only if not already checked.

Returns:

  • (Array<GameObj>, nil)

    members array if check was needed, nil otherwise



144
145
146
# File 'documented/gemstone/group.rb', line 144

def self.maybe_check
  Group.check unless checked?
end

.membersArray<GameObj>

Returns a copy of the current group members. Automatically checks group status if not already checked.

Returns:

  • (Array<GameObj>)

    copy of the members array



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

.nonmembersArray<GameObj>

Returns all PCs in the room who are not in the group.

Returns:

  • (Array<GameObj>)

    array of PC GameObj instances not in 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

.nounsArray<String>

Returns array of all member nouns (names).

Returns:

  • (Array<String>)

    array of member nouns



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.

Returns:

  • (Boolean)

    true if group status is open



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.

Parameters:

  • members (Array<GameObj>)

    one or more GameObj instances to add

Returns:

  • (Array<GameObj>)

    the updated members array



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.

Parameters:

  • members (Array<GameObj>)

    the complete list of group members

Returns:

  • (Array<GameObj>)

    the new members array



58
59
60
# File 'documented/gemstone/group.rb', line 58

def self.refresh(*members)
  @@members = members.dup
end

.statusSymbol

Gets the current group status.

Returns:

  • (Symbol)

    :open or :closed



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).

Parameters:

  • state (Symbol)

    :open or :closed

Returns:

  • (Symbol)

    the status value



106
107
108
# File 'documented/gemstone/group.rb', line 106

def self.status=(state)
  @@status = state
end

.to_sString

String representation of the group members.

Returns:

  • (String)

    string representation of members array



91
92
93
# File 'documented/gemstone/group.rb', line 91

def self.to_s
  @@members.to_s
end