公会系统:guild_manager.lua
```lua
-- modules/guild_manager.lua
-- 公会管理器,管理公会成员信息、公会操作等
local utils = require("core.utils")
local class = require("core.class")
local event = require("core.event")
local moduleBase = require("core.module")
local GuildManager = moduleBase.Module:extend("GuildManager")
-- 公会职位
local Position = {
MASTER = 1, -- 会长
VICE_MASTER = 2, -- 副会长
MEMBER = 3 -- 成员
}
-- 获取职位名称
function GuildManager.GetPositionName(position)
local positionNames = {
[Position.MASTER] = "会长",
[Position.VICE_MASTER] = "副会长",
[Position.MEMBER] = "成员"
}
return positionNames[position] or "未知"
end
function GuildManager:ctor(name)
GuildManager.super.ctor(self, name)
-- 公会信息
self.guildInfo = {
guild_id = 0,
guild_name = "",
level = 1,
exp = 0,
max_members = 50,
notice = ""
}
-- 成员列表
self.members = {}
-- 玩家公会ID
self.playerGuildId = 0
end
function GuildManager:initialize()
utils.print("初始化公会管理器...")
-- 注册事件
self:RegisterEvents()
GuildManager.super.initialize(self)
end
function GuildManager:RegisterEvents()
-- 监听成员更新
event.on("GUILD_MEMBER_UPDATE", function(member)
self:OnMemberUpdate(member)
end)
-- 监听玩家登录
event.on("PLAYER_LOGIN_SUCCESS", function(playerInfo)
self:OnPlayerLogin(playerInfo)
end)
end
function GuildManager:OnPlayerLogin(playerInfo)
self.playerGuildId = playerInfo.guild_id or 0
if self.playerGuildId > 0 then
self:RequestGuildInfo()
self:RequestGuildMembers()
end
end
-- 请求公会信息
function GuildManager:RequestGuildInfo(callback)
local networkManager = require("modules.network_manager")
local networkModule = networkManager.getModule("NetworkManager")
if not networkModule:IsConnected() then
utils.print("网络未连接")
if callback then
callback(false, "网络未连接")
end
return
end
local request = {
guild_id = self.playerGuildId
}
networkModule:SendRequest("guild.GetGuildInfo", request, function(result, message, data)
if result == 0 then
self.guildInfo = data.guild_info or {}
utils.print("获取公会信息成功: " .. self.guildInfo.guild_name)
event.emit("GUILD_INFO_LOADED", self.guildInfo)
if callback then
callback(true, self.guildInfo)
end
else
utils.print("获取公会信息失败: " .. message)
if callback then
callback(false, message)
end
end
end)
end
-- 请求成员列表
function GuildManager:RequestGuildMembers(callback)
local networkManager = require("modules.network_manager")
local networkModule = networkManager.getModule("NetworkManager")
if not networkModule:IsConnected() then
utils.print("网络未连接")
if callback then
callback(false, "网络未连接", {})
end
return
end
local request = {
guild_id = self.playerGuildId
}
networkModule:SendRequest("guild.GetGuildMembers", request, function(result, message, data)
if result == 0 then
self.members = data.members or {}
utils.print("获取成员列表成功,共" .. #self.members .. "人")
event.emit("GUILD_MEMBERS_LOADED", self.members)
if callback then
callback(true, self.members)
end
else
utils.print("获取成员列表失败: " .. message)
if callback then
callback(false, message, {})
end
end
end)
end
-- 成员更新处理
function GuildManager:OnMemberUpdate(member)
if not member or member.player_id == 0 then
return
end
-- 更新或添加成员
local found = false
for i, existingMember in ipairs(self.members) do
if existingMember.player_id == member.player_id then
self.members[i] = member
found = true
break
end
end
if not found then
table.insert(self.members, member)
end
event.emit("GUILD_MEMBER_CHANGED", member)
end
-- 根据ID获取成员
function GuildManager:GetMember(playerId)
for _, member in ipairs(self.members) do
if member.player_id == playerId then
return member
end
end
return nil
end
-- 获取在线成员
function GuildManager:GetOnlineMembers()
local onlineMembers = {}
for _, member in ipairs(self.members) do
if member.is_online then
table.insert(onlineMembers, member)
end
end
return onlineMembers
end
-- 获取公会信息
function GuildManager:GetGuildInfo()
return self.guildInfo
end
-- 获取成员列表
function GuildManager:GetMembers()
return self.members
end
-- 获取在线成员数量
function GuildManager:GetOnlineCount()
local count = 0
for _, member in ipairs(self.members) do
if member.is_online then
count = count + 1
end
end
return count
end
-- 是否在公会中
function GuildManager:IsInGuild()
return self.playerGuildId > 0
end
-- 导出常量
GuildManager.Position = Position
return GuildManager
```