XGuildManagerCreator = function() local XGuildManager = {} local Json = require("XCommon/Json") local GuildRpc = { GuildCreate = "GuildCreateRequest", --创建公会请求 GuildApply = "GuildApplyRequest", --申请加入公会 GuildAckApply = "GuildAckApplyRequest", --审批加入公会 GuildRecruit = "GuildRecruitRequest", --公会招募请求 GuildListRecommend = "GuildListRecommendRequest", --获取公会推荐列表请求 GuildListDetail = "GuildListDetailRequest", --获取公会详情 GuildChangeIcon = "GuildChangeIconRequest", --更改公会头像 GuildChangeName = "GuildChangeNameRequest", --更改公会名称 GuildChangeDeclaration = "GuildChangeDeclarationRequest", --更换宣言 GuildChangeNotice = "GuildChangeNoticeRequest", --更换内部通讯 GuildChangeRankName = "GuildChangeRankNameRequest", --修改自定义职位 GuildReleaseWish = "GuildReleaseWishRequest", --发布心愿 GuildListWish = "GuildListWishRequest", --获取已发布心愿列表 GuildWishContribute = "GuildWishContributeRequest", --心愿捐献 GuildChangeRank = "GuildChangeRankRequest", --更换职位 GuildQuit = "GuildQuitRequest", --退出公会 GuildKickMember = "GuildKickMemberRequest", --公会踢人 GuildListNews = "GuildListNewsRequest", --获取公会动态 GuildGiveLike = "GuildGiveLikeRequest", --点赞 GuildImpeach = "GuildImpeachRequest", --弹劾 GuildChangeScript = "GuildChangeScriptRequest", --迎新语,检测屏蔽词 --GuildListScript = "GuildListScriptRequest", --获取当前自定义话术 暂时弃用 GuildRecruitRecommend = "GuildRecruitRecommendRequest", --获取招募推荐请求 GuildListRecruit = "GuildListRecruitRequest", --玩家查询发给自己的招募请求 GuildAckRecruit = "GuildAckRecruitRequest", --回应招募请求 GuildTourist = "GuildTouristRequest", --游客模式加入公会 GuildQuitTourist = "GuildQuitTouristRequest", --退出游客模式 GuildListApply = "GuildListApplyRequest", --获取公会申请者列表 GuildLevelUp = "GuildLevelUpRequest", --公会升级 GuildPayMaintain = "GuildPayMaintainRequest", --公会缴纳维护费用 GuildGetGift = "GuildGetGiftRequest", --公会获取活跃度礼包 GuildListChat = "GuildListChatRequest", --服务器聊天缓存请求 GuildChangeApplyOption = "GuildChangeApplyOptionRequest", --修改申请选项 GuildGetContributeReward = "GuildGetContributeRewardRequest", --领取上周贡献奖励 GuildMemberDetail = "GuildMemberDetailRequest", --获取公会成员信息 GuildListRank = "GuildListRankRequest", --公会排行榜 GuildFind = "GuildFindRequest", --公会搜索 GuildListTalent = "GuildListTalentRequest", --公会天赋列表 GuildUpgradeTalent = "GuildUpgradeTalentRequest", --公会天赋升级 } local DataType = { Int = 1, String = 2, } XGuildManager.GuildFunctional = { Info = 1, Member = 2, Challenge = 3, Welfare = 4, } local GuildData = nil local GuildMemberCount = 0 local GuildJoinCdEnd = 0 local CanImpeach = false local HasImpeach = false local GuildLastRank = {} local GuildCurRank = {} local EnterGuildRightAway = false local TalentLevelCount = 0 local LastReqServeChatTime = 0 local TalentPoint = 0 local TalentLevels = {} -- id = level --发布心愿,请求多少次。 local WishCount = 0 --发布心愿,捐赠了多少次。 local WishContributeCount = 0 -- 是否可以领取贡献奖励 local HasContributeReward = 0 -- 公会推荐招募页数 local RecommendPageNo = 0 -- 公会推荐招募数据 local RecommendPageData = {} -- 发送过招募的玩家 local RecommendedPlayers = {} --推荐公会数据 local GuildRecommendDatas = {} --搜索公会数据 local GuildFindDatas = {} --自定义话术数据 local GuildScriptListDatas = {} local GuildScriptSelectedDatas = {} --自定义话术 local GuildScriptAutoChat = nil local GuildWelcomeWordKey = "GuildWelcomeWordKey" local GuildWelcomeSelectKey = "GuildWelcomeSelectKey" local GuildWelcomeAutoChatKey = "GuildWelcomeAutoChatKey" -- 自定义职位名 local GuildCustomName = {} --已发布心愿列表数据 local GuildWishListDatas = {} --公会申请者数据 local GuildApplyListDatas = {} local HasApplyMember = false --玩家收到的招募数据 local GuildRecruitDatas = {} --未加入公会时公会信息 local GuildVistorInfoDatas = {} -- 排行榜 local GuildRankListDatas = {} -- 公会动态相关 local GuildLogList = {} local GuildLogMaxPage = {} local GuildNewsCountPerPage = 0 -- 未加入公会前的邀请 local HasGuildRecruit = false -- 公会免费改名机会(被强制改名后获得) local FreeChangeGuildNameCount = 0 function XGuildManager.AsyncGuildData(notifyData) if not notifyData then return end HasContributeReward = notifyData.HasContributeReward FreeChangeGuildNameCount = notifyData.FreeChangeGuildNameCount or 0 GuildData.GuildId = notifyData.GuildId GuildData.GuildName = notifyData.GuildName GuildData.GuildLevel = notifyData.GuildLevel GuildData.GuildIconId = notifyData.IconId GuildData.GuildRankLevel = notifyData.GuildRankLevel GuildData.BossEndTime = notifyData.BossEndTime --工会boss结束时间,用于工会主页面显示倒计时 HasGuildRecruit = notifyData.HasRecruit XEventManager.DispatchEvent(XEventId.EVENT_GUILD_RECRUIT_LIST_CHANGED) if XGuildManager.IsJoinGuild() then XGuildManager.GetGuildDetails(0) if EnterGuildRightAway == notifyData.GuildId then EnterGuildRightAway = nil XGuildManager.CloseAllAndEnterGuild() end -- 获取服务端公会频道缓存 XGuildManager.GuildListChat(function() end) -- 申请列表 if XGuildManager.IsGuildAdminister() then XGuildManager.GetGuildListApply(function() local applyList = XGuildManager.GetGuildApplyList() if next(applyList) then HasApplyMember = true XEventManager.DispatchEvent(XEventId.EVENT_GUILD_APPLY_LIST_CHANGED) end end) end -- 获取成员 local guildId = XGuildManager.GetGuildId() XGuildManager.GetGuildMembers(guildId) else -- 未加入公会,清除自定义职位信息 GuildData:UpdateAllRankNames() end XEventManager.DispatchEvent(XEventId.EVENT_GUILD_NOTICE) end function XGuildManager.AsyncGuildRankName(notifyData) if not notifyData then return end GuildData:UpdateAllRankNames(notifyData.AllRankName) XEventManager.DispatchEvent(XEventId.EVENT_GUILD_ALLRANKNAME_UPDATE) end -- 紧急维护状态更新 function XGuildManager.AsyncGuildMaintain(notifyData) if not notifyData then return end GuildData.MaintainState = notifyData.MaintainState GuildData.EmergenceTime = notifyData.EmergenceTime XEventManager.DispatchEvent(XEventId.EVENT_GUILD_MAINTAIN_STATE_CHANGED) end -- 公会弹劾状态 function XGuildManager.AsyncGuildImpeach(notifyData) if not notifyData then return end -- notifyData.State 0正常、1可弹劾 CanImpeach = notifyData.State == 1 XEventManager.DispatchEvent(XEventId.EVENT_GUILD_LEADER_DISSMISS) end -- 公会建设度更新 function XGuildManager.AsyncGuildEvent(notifyData) if not notifyData then return end local eventType = notifyData.Type local eventValue = notifyData.Value local eventValue2 = notifyData.Value2 local eventStr = notifyData.Str1 if XGuildConfig.GuildEventType.Build == eventType then GuildData.Build = eventValue XEventManager.DispatchEvent(XEventId.EVENT_GUILD_BUILD_CHANGED) elseif XGuildConfig.GuildEventType.Contribute == eventType then GuildData.GuildContributeLeft = eventValue XEventManager.DispatchEvent(XEventId.EVENT_GUILD_CONTRIBUTE_CHANGED) CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_CONTRIBUTE_CHANGED) elseif XGuildConfig.GuildEventType.GiftContribute == eventType then GuildData.GiftContribute = eventValue XEventManager.DispatchEvent(XEventId.EVENT_GUILD_GIFT_CONTRIBUTE_CHANGED) CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_GIFT_CONTRIBUTE_CHANGED) elseif XGuildConfig.GuildEventType.Level == eventType then GuildData.GuildLevel = eventValue local levelTemplate = XGuildConfig.GetGuildLevelDataBylevel(GuildData.GuildLevel) GuildData.GuildMemberMaxCount = levelTemplate.Capacity XEventManager.DispatchEvent(XEventId.EVENT_GUILD_LEVEL_CHANGED) CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_LEVEL_CHANGED) elseif XGuildConfig.GuildEventType.ApplyChanged == eventType then HasApplyMember = true XEventManager.DispatchEvent(XEventId.EVENT_GUILD_APPLY_LIST_CHANGED) elseif XGuildConfig.GuildEventType.KickOut == eventType then XDataCenter.ChatManager.DeleteGuildChat(GuildData.GuildId) XDataCenter.GuildBossManager.ClearLog() XDataCenter.GuildBossManager.ClearReward() GuildData.GuildId = 0 GuildData.GiftGuildLevel = 0 if XPlayer.Id == eventValue then return end if XLuaUiManager.IsUiLoad("UiGuildMain") then XUiManager.TipMsg(CS.XTextManager.GetText("GuildKickOutByAdministor")) if CS.XFight.Instance ~= nil then return end if XHomeSceneManager.GetCurrentScene() ~= nil then XHomeSceneManager.LeaveScene() end XLuaUiManager.RunMain() end -- if XLuaUiManager.IsUiLoad("UiGuildMain") then -- XUiManager.TipMsg(CS.XTextManager.GetText("GuildKickOutByAdministor")) -- if XLuaUiManager.IsUiShow("UiGuildMain") then -- XLuaUiManager.Close("UiGuildMain") -- end -- end XEventManager.DispatchEvent(XEventId.EVENT_GUILD_GIFT_CONTRIBUTE_CHANGED) elseif XGuildConfig.GuildEventType.ContributeReward == eventType then HasContributeReward = eventValue XEventManager.DispatchEvent(XEventId.EVENT_GUILD_MEMBER_CONTRIBUTE_CONDITION) elseif XGuildConfig.GuildEventType.WeeklyReset == eventType then -- 清空周贡献 -- local allMember = XGuildManager.GetMemberList() -- for _, member in pairs(allMember or {}) do -- member.ContributeWeek = 0 -- end if XGuildManager.IsJoinGuild() then XGuildManager.GuildListChat(function() CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_WEEKLY_RESET) end) end elseif XGuildConfig.GuildEventType.RankLevelChanged == eventType then -- 重新请求最新消息,重现请求角色 local oldRankLevel = GuildData.GuildRankLevel local needReq = oldRankLevel == XGuildConfig.GuildRankLevel.Leader or eventValue == XGuildConfig.GuildRankLevel.Leader GuildData.GuildRankLevel = eventValue CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_RANKLEVEL_CHANGED) XEventManager.DispatchEvent(XEventId.EVENT_GUILD_RANKLEVEL_CHANGED) if XLuaUiManager.IsUiLoad("UiGuildMain") then XUiManager.TipMsg(CS.XTextManager.GetText("GuildRankLevelChangeNotify", XGuildManager.GetRankNameByLevel(GuildData.GuildRankLevel))) if XGuildManager.IsGuildAdminister() then XGuildManager.GetGuildListApply(function() local applyList = XGuildManager.GetGuildApplyList() if next(applyList) then HasApplyMember = true XEventManager.DispatchEvent(XEventId.EVENT_GUILD_APPLY_LIST_CHANGED) end end) else HasApplyMember = false XEventManager.DispatchEvent(XEventId.EVENT_GUILD_APPLY_LIST_CHANGED) end if needReq then--更新 XGuildManager.GetGuildDetails(0, function() CsXGameEventManager.Instance:Notify(XEventId.EVNET_GUILD_LEADER_NAME_CHANGED) end) end end -- 假如会长->会员,其他->会长,更新成员 if XLuaUiManager.IsUiLoad("UiGuildRongyu") and needReq then local guildId = XGuildManager.GetGuildId() XGuildManager.GetGuildMembers(guildId, function() XEventManager.DispatchEvent(XEventId.EVNET_GUILD_LEADER_CHANGED) if XLuaUiManager.IsUiShow("UiPlayerInfo") then XLuaUiManager.Close("UiPlayerInfo") end end) end if XLuaUiManager.IsUiShow("UiPlayerInfo") then XLuaUiManager.Close("UiPlayerInfo") end elseif XGuildConfig.GuildEventType.Talent == eventType then TalentLevels[eventValue] = eventValue2 CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_TALENT_ASYNC) elseif XGuildConfig.GuildEventType.TalentPoint == eventType then TalentPoint = eventValue CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_TALENT_ASYNC) elseif XGuildConfig.GuildEventType.MemberChanged == eventType then GuildData.GuildMemberCount = eventValue if XGuildManager.GetGuildScriptAutoChat() then -- local username = eventStr XGuildManager.SendGuildScript() end XEventManager.DispatchEvent(XEventId.EVENT_GUILD_MEMBERCOUNT_CHANGED) CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_MEMBERCOUNT_CHANGED) elseif XGuildConfig.GuildEventType.Recruit == eventType then HasGuildRecruit = true XEventManager.DispatchEvent(XEventId.EVENT_GUILD_RECRUIT_LIST_CHANGED) elseif XGuildConfig.GuildEventType.GuildBossHpBox == eventType then XDataCenter.GuildBossManager.SetBossHpReward(true) XEventManager.DispatchEvent(XEventId.EVENT_GUILDBOSS_HPBOX_CHANGED) XDataCenter.GuildBossManager.UpdateGuildBossHp(eventValue, eventValue2) elseif XGuildConfig.GuildEventType.GuildBossScoreBox == eventType then XDataCenter.GuildBossManager.SetScoreReward(true) XEventManager.DispatchEvent(XEventId.EVENT_GUILDBOSS_SCOREBOX_CHANGED) elseif XGuildConfig.GuildEventType.GuildBossWeeklyTask == eventType then XDataCenter.GuildBossManager.SetGuildBossWeeklyTaskTime(eventValue) elseif XGuildConfig.GuildEventType.FreeChangeName == eventType then FreeChangeGuildNameCount = FreeChangeGuildNameCount + 1 end end function XGuildManager.Init() if not GuildData then GuildData = XGuildData.New() end GuildNewsCountPerPage = CS.XGame.Config:GetInt("GuildNewsCountPerPage") end function XGuildManager.IsInitGuildData() return GuildData:IsInit() end --所在公会的职务 function XGuildManager.GetCurRankLevel() return GuildData.GuildRankLevel end --所在公会的职务是否是管理层 function XGuildManager.IsGuildAdminister() return GuildData:IsGuildAdministor() end -- 是否为会长 function XGuildManager.IsGuildLeader() return GuildData:IsLeader() end --是否已经加入公会 function XGuildManager.IsJoinGuild() return GuildData:IsJoinGuild() end --当前公会职位人数 function XGuildManager.GetMyGuildPosCount() -- GetGuildPositionCurAmount local data = GuildData:GetGuildMembers() local level = XGuildManager.GetGuildLevel() local amount = {} for _, v in pairs(XGuildConfig.GuildRankLevel) do amount[v] = amount[v] or 0 end for _, v in pairs(data) do amount[v.RankLevel] = amount[v.RankLevel] + 1 end return amount end --当前公会职位容量 function XGuildManager.GetGuildPosCapacity(level, rank) local rankLevel = XGuildConfig.GuildRankLevel local guildLevelData = XGuildConfig.GetGuildLevelDataBylevel(level) if not guildLevelData then return end if rank == rankLevel.Leader then return 1 elseif rank == rankLevel.CoLeader then return guildLevelData.PositionNum[1] elseif rank == rankLevel.Elder then return guildLevelData.PositionNum[2] elseif rank == rankLevel.Member then return guildLevelData.Capacity elseif rank == rankLevel.Tourist then return guildLevelData.PositionNum[3] end end -- 如果该玩家是在离线时被审批进入了公会,则重新上线前,Data.GuildDetail都不会更新信息,因此采用本地信息判断 function XGuildManager.CheckMemberOperatePermission(targetId) local memberList = XDataCenter.GuildManager.GetMemberList() local isAdministor = XDataCenter.GuildManager.IsGuildAdminister() local myRankLevel = XDataCenter.GuildManager.GetCurRankLevel() if memberList[targetId] then local targetRankLevel = memberList[targetId].RankLevel return targetRankLevel ~= nil and targetRankLevel > 0 and isAdministor and myRankLevel < targetRankLevel end return false end --当前心愿请求数 function XGuildManager.GetCurWishReqCount() return WishCount end --累计当前心愿请求数 function XGuildManager.AddCurWishReqCount() WishCount = WishCount + 1 end --获取所有公会 function XGuildManager.GetCurGuildsInfo() return {} end --获取今天已经捐赠次数 function XGuildManager.GetCurDonationCount() return WishContributeCount end --累加今天已经捐赠次数 function XGuildManager.AddCurDonationCount() WishContributeCount = WishContributeCount + 1 end --获取总可捐赠次数 function XGuildManager.GetTotalDonationCount(level) return XGuildConfig.GetGuildWishContributeMaxCountByLevel(level) end --判断此公会人数是否已经满 function XGuildManager.IsFullGuild(guildId) local data = XGuildManager.GetVistorGuildDetailsById(guildId) if not data then return true end return data.GuildMemberMaxCount == data.GuildMemberCount end --判断此公会游客数量是否已经满 function XGuildManager.IsFullGuildVistor(guildId) local data = XGuildManager.GetVistorGuildDetailsById(guildId) if not data then return true end return data.GuildTouristMaxCount == data.GuildTouristCount end --判断自己是不是游客 function XGuildManager.IsGuildTourist() return XGuildManager.GetCurRankLevel() == XGuildConfig.GuildRankLevel.Tourist end --已经发布的心愿 function XGuildManager.GetGuildWishList() return GuildWishListDatas end --处理公会推荐列表数据 -- int Id; -- string Name; -- int IconId; -- int Level; -- int MemberCount; -- int MemberMaxCount; -- int ContributeIn7Days; function XGuildManager.HandleGuildRecommendDatas(pageNo, datas) if datas ~= nil and next(datas) ~= nil then GuildRecommendDatas[pageNo] = {} for _, v in pairs(datas) do if v and v.Id then table.insert(GuildRecommendDatas[pageNo], v) end end XGuildManager.RecordGuildRecommend(-1) else XGuildManager.RecordGuildRecommend(pageNo) end end function XGuildManager.HandleGuildFindDatas(guildname, datas) if datas ~= nil and next(datas) ~= nil then GuildFindDatas[guildname] = {} for _, v in pairs(datas) do if v and v.Id then table.insert(GuildFindDatas[guildname], v) end end end end function XGuildManager.GetGuildFindDatas(guildname) return GuildFindDatas[guildname] or {} end function XGuildManager.RecordGuildRecommend(pageNo) XGuildManager.EmptyPageNo = pageNo end function XGuildManager.GetCurGuildRecommend() return XGuildManager.EmptyPageNo end function XGuildManager.GetGuildRecommendDatas(pageNo) local nextPageNo = pageNo + 1 if GuildRecommendDatas[pageNo] and not GuildRecommendDatas[nextPageNo] then XDataCenter.GuildManager.GuildListRecommendRequest(nextPageNo, function() end) end return GuildRecommendDatas[pageNo] or {} end function XGuildManager.ResetGuildRecommendDatas() GuildRecommendDatas = {} end function XGuildManager.IsNeedRequestRecommendData() if not next(GuildRecommendDatas) then return true end if XTime.GetServerNowTimestamp() - XGuildManager.PreRequestRecommendTime > XGuildConfig.GuildRequestRecommandTime then return true end return false end function XGuildManager.ResetPreRequestRecommendTime() XGuildManager.PreRequestRecommendTime = 0 end function XGuildManager.IsNeedRequestRank() if not next(GuildRankListDatas) then return true end if XTime.GetServerNowTimestamp() - XGuildManager.PreRequestGuildListRankTime > XGuildConfig.GuildRequestRankTime then return true end return false end -- 随机发送迎新语 function XGuildManager.SendGuildScript() math.randomseed(os.time()) local chatData = {} chatData.ChannelType = ChatChannelType.Guild chatData.MsgType = ChatMsgType.Normal chatData.TargetIds = {} chatData.TargetIds[1] = XGuildManager.GetGuildId() local welcome = XGuildManager.GetGuildScriptSelectedDatas() if #welcome == 0 then return end local content = welcome[math.random(#welcome)] chatData.Content = content XDataCenter.ChatManager.SendChat(chatData) end --处理已发布心愿列表数据 -- string Name; -- int HeadPortraitId; -- int RankLevel; -- int ItemId; -- int GotCount; -- int MaxCount; -- int Seq; function XGuildManager.HandleListWishDatas(wishesData, wishCount, wishContributeCount) GuildWishListDatas = {} if wishesData ~= nil and next(wishesData) ~= nil then for _, v in pairs(wishesData) do if v and v.Id then if XPlayer.Id ~= v.Id then table.insert(GuildWishListDatas, v) end end end end WishCount = wishCount WishContributeCount = wishContributeCount end function XGuildManager.HandleListRankDatas(type, tabledata, myRankNum) GuildRankListDatas[type] = {} local rankFromList = nil if not (tabledata and next(tabledata)) then return end for index, v in ipairs(tabledata) do if v and v.GuildId then if GuildData.GuildId == v.GuildId then rankFromList = index end v.RankNum = index v.Type = type table.insert(GuildRankListDatas[type], v) end end -- 如果榜单中有则优先用榜单的排名 if rankFromList then GuildData.GuildRank[type] = rankFromList -- 如果服务端没有,则本地只能显示百分比 elseif myRankNum > 0 and myRankNum < 1 then GuildData.GuildRank[type] = (math.floor(myRankNum * 10000) / 10000) else GuildData.GuildRank[type] = 0 end end function XGuildManager.GetMyGuildRank(type) return GuildData.GuildRank[type] or 0 end function XGuildManager.GetMyGuildLastRank(type) if not GuildLastRank[type] then GuildLastRank[type] = XGuildManager.GetGuildPrefs(XGuildConfig.KEY_LAST_RANK..type, nil, DataType.String) end if not GuildLastRank[type] then return 0 end local strTable = string.Split(GuildLastRank[type], '_') local lastDate, lastRank = strTable[1], strTable[2] return tonumber(lastRank) or 0 end function XGuildManager.SaveMyGuildCurRank(type) local date = os.date("%Y%m%d") local oldCurRank = XGuildManager.GetGuildPrefs(XGuildConfig.KEY_CUR_RANK..type, nil, DataType.String) local strTable = string.Split(oldCurRank, '_') local lastDate = strTable[1] or date -- 已经是旧数据了,需要赋给GuildLastRank if next(strTable) and tonumber(lastDate) < tonumber(date) then GuildLastRank[type] = oldCurRank XGuildManager.SaveGuildPrefs(XGuildConfig.KEY_LAST_RANK..type, GuildLastRank[type], DataType.String) end GuildCurRank[type] = string.format( "%s_%.4f", date, XGuildManager.GetMyGuildRank(type)) XGuildManager.SaveGuildPrefs(XGuildConfig.KEY_CUR_RANK..type, GuildCurRank[type], DataType.String) end function XGuildManager.GetListRankDatas(order) return GuildRankListDatas[order] end function XGuildManager.EnterGuild() if not XDataCenter.GuildManager.IsJoinGuild() then if XGuildManager.IsNeedRequestRecommendData() then XDataCenter.GuildManager.GuildListRecommendRequest(1, function() XLuaUiManager.Open("UiGuildRecommendation") end) else XLuaUiManager.Open("UiGuildRecommendation") end return end if XGuildManager.IsGuildTourist() then XDataCenter.GuildManager.GetVistorGuildDetailsReq(GuildData.GuildId, function() XLuaUiManager.Open("UiGuildVistor") end) else XDataCenter.GuildManager.GetGuildDetails(0, function() XLuaUiManager.Open("UiGuildMain") end) end end -- 用于在未进公会界面前获取公会数据,如已有数据则不再获取 function XGuildManager.RequestGuildData() if not XDataCenter.GuildManager.IsJoinGuild() then return end if not XGuildManager.IsInitGuildData() then XDataCenter.GuildManager.GetGuildDetails(0) end end function XGuildManager.CloseAllAndEnterGuild() XDataCenter.GuildManager.GetGuildDetails(0, function() XLuaUiManager.PopThenOpen("UiGuildMain") XLuaUiManager.Remove("UiGuildRecommendation") end) end function XGuildManager.EnterGuildTalent() if XGuildManager.CheckAllTalentLevelMax() then XDataCenter.GuildManager.GetGuildDetails(0, function() XLuaUiManager.Open("UiGuildGloryLevel") end) else XGuildManager.GuildTalentListReq(function() XLuaUiManager.Open("UiGuildSkill") end) end end function XGuildManager.HandleGuildListRecruitDatas(datas) GuildRecruitDatas = {} if datas ~= nil and next(datas) ~= nil then for _, v in pairs(datas) do if v.PlayerId and v.PlayerId ~= XPlayer.Id then table.insert(GuildRecruitDatas, v) end end end end function XGuildManager.GetGuildListRecruitDatas() return GuildRecruitDatas end function XGuildManager.IsNeedRequestRecruitData() if not next(GuildRecruitDatas) then return true end if XTime.GetServerNowTimestamp() - XGuildManager.PreRequestRecruitTime > XGuildConfig.GuildRequestRecruitTime then return true end return false end --游客模式退出后,清掉。 function XGuildManager.QuitVistorClean() XGuildManager.ClearVistorGuildMembers(GuildData.GuildId) GuildData.GuildId = 0 end -- RPC --获取招募推荐请求 function XGuildManager.GuildRecruitRecommendRequest(pageNo, cb) XNetwork.Call(GuildRpc.GuildRecruitRecommend, { PageNo = pageNo }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end for _, recruitInfo in pairs(res.RecommendData or {}) do if not RecommendedPlayers[recruitInfo.PlayerId] then RecommendPageData[recruitInfo.PlayerId] = recruitInfo end end if cb then cb() end end) end -- 随机出count个推荐招募,不在ownList中 function XGuildManager.GetRandomRecommendPlayers() local randomRecommend = {} local playerIdList = {} local availableCount = 0 local availableRecommend = {} for id, recruitInfo in pairs(RecommendPageData) do if not RecommendedPlayers[id] then table.insert(playerIdList, id) availableCount = availableCount + 1 availableRecommend[id] = recruitInfo end end if availableCount <= XGuildConfig.RecommendCount then return availableRecommend end -- 需要随机:随机次数尽量少 math.randomseed(os.time()) local randomCount = XGuildConfig.RecommendCount local leftCount = availableCount - XGuildConfig.RecommendCount local leftPlayers = {} if leftCount <= XGuildConfig.RecommendCount then while (leftCount > 0) do local index = math.random(1, availableCount) local playerId = playerIdList[index] if not leftPlayers[playerId] then leftPlayers[playerId] = true leftCount = leftCount - 1 end end for id, recruitInfo in pairs(availableRecommend) do if not leftPlayers[id] then randomRecommend[id] = recruitInfo end end return randomRecommend else while (randomCount > 0) do local randomLength = availableCount - (XGuildConfig.RecommendCount - randomCount) local index = math.random(1, randomLength) local playerId = playerIdList[index] if not randomRecommend[playerId] then randomRecommend[playerId] = availableRecommend[playerId] randomCount = randomCount - 1 -- 随机到的、跟最后一个调换位置 local temp = playerIdList[randomLength] playerIdList[index] = temp playerIdList[randomLength] = playerId end end return randomRecommend end end --玩家查询发给自己的招募请求 function XGuildManager.GuildListRecruitRequest(cb) if XGuildManager.IsNeedRequestRecruitData() then XNetwork.Call(GuildRpc.GuildListRecruit, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XGuildManager.PreRequestRecruitTime = XTime.GetServerNowTimestamp() XGuildManager.HandleGuildListRecruitDatas(res.Data) if cb then cb() end end) else if cb then cb() end end end --回应招募请求 function XGuildManager.GuildAckRecruitRequest(guildId, isAgree, playerId, cb) if not guildId or guildId <= 0 or isAgree == nil then XLog.Error("XGuildManager.GuildAckRecruitRequest参数错误: 参数guildId是 " .. tostring(guildId) .. " 参数isAgree是" .. tostring(isAgree)) return end XNetwork.Call(GuildRpc.GuildAckRecruit, { GuildId = guildId, IsAgree = isAgree }, function(res) local removeIndex = -1 for k, v in pairs(GuildRecruitDatas or {}) do if v.PlayerId == playerId and v.GuildId == guildId then removeIndex = k break end end if removeIndex ~= -1 then table.remove(GuildRecruitDatas, removeIndex) end if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) if cb then cb() end return end if isAgree then XGuildManager.CloseAllAndEnterGuild() end if cb then cb() end end) end --游客模式加入公会 function XGuildManager.GuildTouristRequest(guildId, cb) if not guildId or guildId <= 0 then XLog.Error("XGuildManager.GuildTouristRequest参数错误: 参数guildId是空或者guildId小于等于0, 参数guildId:" .. tostring(guildId)) return end XNetwork.Call(GuildRpc.GuildTourist, { GuildId = guildId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData.GuildId = guildId if cb then cb() end end) end --退出游客模式 function XGuildManager.GuildQuitTouristRequest(cb) XNetwork.Call(GuildRpc.GuildQuitTourist, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end --发布心愿 function XGuildManager.PublishWishRequest(itemId, cb) if not itemId then XLog.Error("XGuildManager.PublishWishRequest参数错误: 参数itemId是空") return end XNetwork.Call(GuildRpc.GuildReleaseWish, { ItemId = itemId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XGuildManager.AddCurWishReqCount() if cb then cb() end end) end --捐赠 function XGuildManager.DonateRequest(playerId, seq, itemId, cb) XNetwork.Call(GuildRpc.GuildWishContribute, { PlayerId = playerId, Seq = seq, ItemId = itemId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XGuildManager.AddCurDonationCount() if cb then cb() end end) end --创建公会 function XGuildManager.BuildGuildRequest(guildName, guildDeclaration, iconId, cb) XNetwork.Call(GuildRpc.GuildCreate, { GuildName = guildName, GuildDeclaration = guildDeclaration, IconId = iconId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) local needDispatch, name, declaration = false if res.GuildName ~= nil and res.GuildName ~= "" then name = res.GuildName needDispatch = true end if res.GuildDeclaration ~= nil and res.GuildDeclaration ~= "" then declaration = res.GuildDeclaration needDispatch = true end if needDispatch then name = name or guildName declaration = declaration or guildDeclaration CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_FILTER_FINISH, name, declaration) end return end if cb then cb() end end) end -- 获取公会详情GuildId = 0表示本公会 function XGuildManager.GetGuildDetails(guild, cb) XNetwork.Call(GuildRpc.GuildListDetail, { GuildId = guild }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData:UpdateGuildData(res) if cb then cb() end end) end function XGuildManager.GetVistorGuildDetailsReq(guildId, cb) XNetwork.Call(GuildRpc.GuildListDetail, { GuildId = guildId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if not GuildVistorInfoDatas[res.GuildId] then GuildVistorInfoDatas[res.GuildId] = XGuildVistorData.New() end GuildVistorInfoDatas[res.GuildId]:UpdateGuildData(res) if cb then cb() end end) end function XGuildManager.GetVistorGuildDetailsById(guildId) return GuildVistorInfoDatas[guildId] end function XGuildManager.GetVistorMemberList(guildId) return GuildVistorInfoDatas[guildId]:GetMemberList() end function XGuildManager.IsHaveVistorGuildDetailsById(guildId) if not GuildVistorInfoDatas[guildId] then return false end return GuildVistorInfoDatas[guildId]:IsHaveVistorGuildDetailsById() end -- 自定义职位 function XGuildManager.ChangeRankName(allRankNames, cb) XNetwork.Call(GuildRpc.GuildChangeRankName, { AllRankName = allRankNames }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData:UpdateAllRankNames(allRankNames) if cb then cb() end end) end -- 变更职位 function XGuildManager.GuildChangeRank(playerId, rankId, cb) XNetwork.Call(GuildRpc.GuildChangeRank, { PlayerId = playerId, NewRank = rankId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local members = GuildData:GetGuildMembers() if members and members[playerId] then members[playerId].RankLevel = rankId -- 通知刷新 XEventManager.DispatchEvent(XEventId.EVENT_GUILD_UPDATE_MEMBER_INFO) end if cb then cb() end end) end -- 退出公会 function XGuildManager.QuitGuild(cb) local lastGuildId = GuildData.GuildId local tempLevel = XGuildManager.GetGuildLevel() XGuildManager.SaveGuildLevel(-1) XNetwork.Call(GuildRpc.GuildQuit, {}, function(res) if res.Code ~= XCode.Success then XGuildManager.SaveGuildLevel(tempLevel) XUiManager.TipCode(res.Code) return end XDataCenter.ChatManager.DeleteGuildChat(lastGuildId) XDataCenter.GuildBossManager.ClearLog() XDataCenter.GuildBossManager.ClearReward() XGuildManager.ClearLog() GuildData.GuildId = 0 if cb then cb() end end) end --修改公会头像 function XGuildManager.GuildChangeIconRequest(iconid, cb) XNetwork.Call(GuildRpc.GuildChangeIcon, { IconId = iconid }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData.GuildIconId = iconid if cb then cb() end end) end -- 修改公会名称 function XGuildManager.GuildChangeName(name, func) XNetwork.Call(GuildRpc.GuildChangeName, { Name = name }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) if res.Name ~= nil and res.Name ~= "" then CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_FILTER_FINISH, res.Name) end return end GuildData.GuildName = name if func then func() end end) end -- 修改宣言 function XGuildManager.GuildChangeDeclaration(delaration, func) XNetwork.Call(GuildRpc.GuildChangeDeclaration, { Delaration = delaration }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) if res.Delaration ~= nil and res.Delaration ~= "" then CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_FILTER_FINISH, res.Delaration) end return end GuildData.GuildDeclaration = delaration if func then func() end end) end -- 修改内部通讯 function XGuildManager.GuildChangeNotice(notice, func) XNetwork.Call(GuildRpc.GuildChangeNotice, { Notice = notice }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) if res.Notice ~= nil and res.Notice ~= "" then CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_FILTER_FINISH, res.Notice) end return end GuildData.GuildInterCom = notice if func then func() end end) end -- 获取公会成员信息 function XGuildManager.GetGuildMembers(guildId, func) XNetwork.Call(GuildRpc.GuildMemberDetail, { GuildId = guildId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end CanImpeach = res.CanImpeach HasImpeach = res.HasImpeach local MemberCount = 0 for _, _ in pairs(res.MembersData or {}) do MemberCount = MemberCount + 1 end GuildData:UpdateGuildMembers(res.MembersData, MemberCount) -- 人数变化,相同界面使用这个事件 if MemberCount > GuildMemberCount then GuildMemberCount = MemberCount XEventManager.DispatchEvent(XEventId.EVENT_GUILD_UPDATE_MEMBER_INFO) end -- 检查会长罢免 XEventManager.DispatchEvent(XEventId.EVENT_GUILD_LEADER_DISSMISS) -- 检查成员在线人数 XEventManager.DispatchEvent(XEventId.EVENT_GUILD_MEMBERCOUNT_CHANGED) CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_MEMBERCOUNT_CHANGED) if func then func() end end) end -- 获取公会成员信息(游客) function XGuildManager.GetVistorGuildMembers(guildId, func) XNetwork.Call(GuildRpc.GuildMemberDetail, { GuildId = guildId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if not GuildVistorInfoDatas[guildId] then GuildVistorInfoDatas[guildId] = XGuildVistorData.New() end GuildVistorInfoDatas[guildId]:UpdateGuildMembers(res.MembersData) if func then func() end end) end -- 申请加入公会的列表 function XGuildManager.GetGuildListApply(cb) XNetwork.Call(GuildRpc.GuildListApply, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildApplyListDatas = {} for _, v in pairs(res.Data or {}) do GuildApplyListDatas[v.PlayerId] = v end if cb then cb() end end) end -- 点赞 function XGuildManager.GuildGiveLike(playerId, itemId, itemCount, cb) XNetwork.Call(GuildRpc.GuildGiveLike, { OtherId = playerId, ItemId = itemId, ItemCount = itemCount }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 弹劾会长 function XGuildManager.GuildImpeachLeader(cb) XNetwork.Call(GuildRpc.GuildImpeach, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 公会升级 function XGuildManager.GuildLevelUp(cb) XNetwork.Call(GuildRpc.GuildLevelUp, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end -- 缴纳维护费用 function XGuildManager.GuildPayMaintain(cb) XNetwork.Call(GuildRpc.GuildPayMaintain, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData.MaintainState = XGuildConfig.GuildMaintainState.Normal if cb then cb() end end) end function XGuildManager.GetGuildLogListByType(type) if not GuildLogList[type] then GuildLogList[type] = {} end return GuildLogList[type] end function XGuildManager.GetGuildLogMaxPage(type) return GuildLogMaxPage[type] or 0 end function XGuildManager.ClearLog() GuildLogList = {} GuildLogMaxPage = {} end -- 获取公会动态 function XGuildManager.GetGuildListNews(newsType, pageNo, cb) XNetwork.Call(GuildRpc.GuildListNews, { NewsType = newsType, PageNo = pageNo }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end -- 记录公会动态信息 local logList = XGuildManager.GetGuildLogListByType(newsType) if pageNo <= 0 then pageNo = res.MaxPageNo GuildLogMaxPage[newsType] = res.MaxPageNo end for k, v in ipairs(res.News or {}) do -- 首先请求最后一页(pageNo为0),获得最大页数后循环-1获取列表 local index = (pageNo - 1) * GuildNewsCountPerPage + k logList[index] = v end if cb then cb() end end) end -- 公会活跃度礼包 function XGuildManager.GuildGetGift(giftLevel, cb) XNetwork.Call(GuildRpc.GuildGetGift, { GiftLevel = giftLevel}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData.GiftLevelGot[giftLevel] = true local giftGuildLevel = GuildData.GiftGuildLevel local giftData = XGuildConfig.GetGuildGiftByGuildLevelAndGiftLevel(giftGuildLevel, giftLevel) if giftData and giftData.GiftReward then local rewardList = XRewardManager.GetRewardList(giftData.GiftReward) if rewardList then XUiManager.OpenUiObtain(rewardList) end end if cb then cb() end -- 触发更新 XEventManager.DispatchEvent(XEventId.EVENT_GUILD_GIFT_CONTRIBUTE_CHANGED) CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_GIFT_CONTRIBUTE_CHANGED) end) end -- 修改申请设置 function XGuildManager.GuildChangeApplyOption(option, minLevel, func) XNetwork.Call(GuildRpc.GuildChangeApplyOption, { Option = option, MinLevel = minLevel }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData.Option = option GuildData.MinLevel = minLevel if func then func() end end) end -- 领取上周贡献奖励 function XGuildManager.GuildGetContributeReward(func) XNetwork.Call(GuildRpc.GuildGetContributeReward, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end HasContributeReward = 0 XEventManager.DispatchEvent(XEventId.EVENT_GUILD_MEMBER_CONTRIBUTE_CONDITION) local list = {} table.insert(list, XRewardManager.CreateRewardGoodsByTemplate({ TemplateId = XGuildConfig.GuildCoin, Count = res.AddGuildCoin })) XUiManager.OpenUiObtain(list) if func then func() end end) end -- 获取服务器聊天缓存 function XGuildManager.GuildListChat(cb) -- 限制频繁操作 local curTime = XTime.GetServerNowTimestamp() if curTime - LastReqServeChatTime < 5 then return end LastReqServeChatTime = curTime XNetwork.Call(GuildRpc.GuildListChat, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local chatCache = {} for i = 1, #res.ChatList do local chatJson = Json.decode(res.ChatList[i]) local chatData = XChatData.New(chatJson) -- local chatData = XChatData.New() -- chatData.SenderId = chatJson.SenderId -- chatData.TargetId = chatJson.TargetId -- chatData.CreateTime = chatJson.CreateTime -- chatData.Content = chatJson.Content -- chatData.MsgType = chatJson.MsgType -- chatData.MessageId = chatJson.MessageId -- chatData.Icon = chatJson.Icon -- chatData.CustomContent = chatJson.CustomContent -- chatData.NickName = chatJson.NickName table.insert(chatCache, 1, chatData) end -- 初始化客户端信息 XDataCenter.ChatManager.InitLocalCacheGuildChatContent() -- 服务端,客户端消息合并 XDataCenter.ChatManager.MergeClientAndServerGuildChat(chatCache) if cb then cb() end end) end -- 会长向玩家发出招募 function XGuildManager.GuildRecruit(playerId, cb, notRecord) XNetwork.Call(GuildRpc.GuildRecruit, { PlayId = playerId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) if not notRecord then RecommendedPlayers[playerId] = true end -- 招募发出成功 if cb then cb() end return end XUiManager.TipMsg(CS.XTextManager.GetText("GuildHasSendRecruit")) if not notRecord then RecommendedPlayers[playerId] = true end -- 招募发出成功 if cb then cb() end end) end --申请加入公会 function XGuildManager.ApplyToJoinGuildRequest(guildId, cb) XNetwork.Call(GuildRpc.GuildApply, { GuildId = guildId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end if res.IsPass == true then EnterGuildRightAway = guildId if guildId == XGuildManager.GetGuildId() then XGuildManager.CloseAllAndEnterGuild() end end end) end -- 拒绝成员加入公会 function XGuildManager.RefuseGuildRequest(playId, cb) XNetwork.Call(GuildRpc.GuildAckApply, { PlayId = playId, IsAgree = false }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) GuildApplyListDatas[playId] = nil if cb then cb() end return end GuildApplyListDatas[playId] = nil if cb then cb() end end) end --同意成员加入公会 function XGuildManager.AcceptGuildRequest(playId, playerName, cb) XNetwork.Call(GuildRpc.GuildAckApply, { PlayId = playId, IsAgree = true }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) GuildApplyListDatas[playId] = nil if cb then cb() end return end XUiManager.TipMsg(CS.XTextManager.GetText("GuildAcceptSucceed", playerName)) GuildApplyListDatas[playId] = nil if cb then cb() end end) end -- 公会踢人 function XGuildManager.GuildKickMember(playerId, cb) XNetwork.Call(GuildRpc.GuildKickMember, { OtherId = playerId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData:RemoveMember(playerId) XEventManager.DispatchEvent(XEventId.EVENT_GUILD_UPDATE_MEMBER_INFO) if cb then cb() end end) end --获取公会推荐列表请求 function XGuildManager.GuildListRecommendRequest(pageNo, cb) XNetwork.Call(GuildRpc.GuildListRecommend, { PageNo = pageNo }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XGuildManager.PreRequestRecommendTime = XTime.GetServerNowTimestamp() XGuildManager.HandleGuildRecommendDatas(pageNo, res.Datas) GuildJoinCdEnd = res.JoinCdEnd if cb then cb() end end) end function XGuildManager.GetGuildJoinCdEnd() return GuildJoinCdEnd end -- 公会搜索 function XGuildManager.GuildFind(guildname, cb) XNetwork.Call(GuildRpc.GuildFind, { GuildName = guildname }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XGuildManager.HandleGuildFindDatas(guildname, res.GuildList) if cb then cb() end end) end --迎新语,检测屏蔽词 function XGuildManager.GuildChangeScriptRequest(scripts, selects, autoChat, cb) XNetwork.Call(GuildRpc.GuildChangeScript, { Scripts = scripts }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end for i= 1, #scripts do if res.Scripts and res.Scripts[i] ~= nil and res.Scripts[i] ~= "" then scripts[i] = res.Scripts[i] end end local scriptsData = {} local exist = false for index, data in pairs(scripts) do scriptsData[index] = {} scriptsData[index].WelcomeWord = data scriptsData[index].Select = selects[index] exist = exist or selects[index] end autoChat = autoChat and exist XDataCenter.GuildManager.SetGuildScriptDatas(scriptsData, autoChat) XUiManager.TipText("GuildWelcomeWordSuccessTips") if cb then cb() end end) end --获取当前自定义话术 暂时弃用 -- function XGuildManager.GuildListScriptRequest(cb) -- XNetwork.Call(GuildRpc.GuildListScript, {}, function(res) -- if res.Code ~= XCode.Success then -- XUiManager.TipCode(res.Code) -- return -- end -- XGuildManager.HandleGuildScriptDatas(res.Scripts, res.AutoChat) -- if cb then -- cb() -- end -- end) -- end --获取已发布心愿列表 function XGuildManager.GuildListWishRequest(cb) XNetwork.Call(GuildRpc.GuildListWish, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XGuildManager.HandleListWishDatas(res.WishesData, res.WishCount, res.WishContributeCount) if cb then cb() end end) end -- 公会天赋 function XGuildManager.GuildTalentListReq(func) XNetwork.Call(GuildRpc.GuildListTalent, {}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end TalentPoint = res.Point TalentLevels = {} local talentSumLevel = 0 for id, level in pairs(res.Talents or {}) do TalentLevels[id] = level talentSumLevel = talentSumLevel + level end GuildData.TalentSumLevel = talentSumLevel if func then func() end end) end -- 公会天赋升级 function XGuildManager.GuildUpgradeTalent(talentId, func) XNetwork.Call(GuildRpc.GuildUpgradeTalent, { Id = talentId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end GuildData.TalentSumLevel = GuildData.TalentSumLevel + 1 TalentPoint = res.Point -- if not TalentLevels[talentId] then -- TalentLevels[talentId] = 0 -- end -- local oldLevel = TalentLevels[talentId] -- TalentLevels[talentId] = oldLevel + 1 if func then func() end end) end function XGuildManager.GetTalentPoint() return TalentPoint end function XGuildManager.GetTalentLevel(id) return TalentLevels[id] or 0 end -- 是否解锁 function XGuildManager.IsTalentUnlock(id) local talentTemplate = XGuildConfig.GetGuildTalentById(id) if not talentTemplate then return false end local curGuildLevel = XGuildManager.GetGuildLevel() return curGuildLevel >= talentTemplate.GuildLevel end function XGuildManager.IsTalentMaxLevel(id) local curLevel = XGuildManager.GetTalentLevel(id) local talentTemplate = XGuildConfig.GetGuildTalentById(id) if not talentTemplate then return false end return talentTemplate.CostPoint[curLevel + 1] == nil end function XGuildManager.CheckAllTalentLevelMax() if XGuildManager.IsGuildLevelMax(XGuildManager.GetGuildLevel()) then --or -- XGuildManager.GetTalentPointFromBuild() > 0 then if TalentLevelCount == 0 then local sum = 0 local points = XGuildConfig.GetSortedTalentPoints() for _, v in pairs(points) do local talentTemplate = XGuildConfig.GetGuildTalentById(v.Id) sum = sum + #talentTemplate.CostPoint end TalentLevelCount = sum end return GuildData.TalentSumLevel == TalentLevelCount end return false end -- 能否升级:是否解锁、父节点、消耗,最高级 function XGuildManager.CanTalentUpgrade(id) if not XGuildManager.IsTalentUnlock(id) then return false end local curLevel = XGuildManager.GetTalentLevel(id) local talentTemplate = XGuildConfig.GetGuildTalentById(id) if not talentTemplate then return false end if not XGuildManager.CheckParentTalent(id) then return false end local cost = talentTemplate.CostPoint[curLevel + 1] or 0 return TalentPoint >= cost end -- 前置条件检查 function XGuildManager.CheckParentTalent(id) local talentTemplate = XGuildConfig.GetGuildTalentById(id) if not talentTemplate then return false end local preUnlock = false local preAllZero = true local curLevel = XGuildManager.GetTalentLevel(id) for i = 1, #talentTemplate.Parent do local preId = talentTemplate.Parent[i] local preLevel = XGuildManager.GetTalentLevel(preId) if preId > 0 then preAllZero = false if preLevel > curLevel then preUnlock = true break end end end if not preAllZero then return preUnlock end return true end -- 父节点是否都为0 function XGuildManager.IsTalentParentAllZero(id) local talentTemplate = XGuildConfig.GetGuildTalentById(id) if not talentTemplate then return false end local allZero = true for i = 1, #talentTemplate.Parent do if talentTemplate.Parent[i] > 0 then allZero = false break end end return allZero end -- 公会日常任务 function XGuildManager.GetSortedGuildDailyTasks() local tasks = XDataCenter.TaskManager.GetGuildDailyFullTaskList() -- 是否需要排序 for _, v in pairs(tasks or {}) do v.SortWeight = 2 if v.State == XDataCenter.TaskManager.TaskState.Achieved then v.SortWeight = 1 elseif v.State == XDataCenter.TaskManager.TaskState.Finish or v.State == XDataCenter.TaskManager.TaskState.Invalid then v.SortWeight = 3 end end table.sort(tasks, function(taskA, taskB) if taskA.SortWeight == taskB.SortWeight then return taskA.Id < taskB.Id end return taskA.SortWeight < taskB.SortWeight end) return tasks end -- 是否有购买的权限 function XGuildManager.CheckShopBuyAccess(shopId) if shopId == XGuildConfig.GuildPurchaseShop then return XGuildManager.IsGuildAdminister() end return true end -- 是否可以领取贡献奖励 function XGuildManager.CanCollectContributeReward() if XGuildManager.IsGuildTourist() then return false end return HasContributeReward == 1 end -- 获取公会排名 function XGuildManager.GuildListRankRequest(order, cb) XNetwork.Call(GuildRpc.GuildListRank, { Order = order}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XGuildManager.HandleListRankDatas(order, res.RankList, res.MyRankNum) if cb then cb() end end) end -- 是否紧急维护状态 function XGuildManager.IsUrgentMaintainState() return GuildData.MaintainState == XGuildConfig.GuildMaintainState.Urgent end -- 紧急状态开始时间 function XGuildManager.GetEmergenceTime() return GuildData.EmergenceTime end -- 获取建设度 function XGuildManager.GetBuild() return GuildData.Build end -- 获取申请设置 function XGuildManager.GetApplyOption() return GuildData.Option end -- 获取最低等级 function XGuildManager.GetMinLevelOption() return GuildData.MinLevel end -- 获取最高等级获得的天赋点 function XGuildManager.GetTalentPointFromBuild() return GuildData.TalentPointFromBuild or 0 end -- 获取当前荣耀等级 function XGuildManager.GetGloryLevel() local level = math.modf( GuildData.TalentPointFromBuild / XGuildConfig.GloryPointsPerLevel) return level > XGuildConfig.GuildGloryMaxLevel and XGuildConfig.GuildGloryMaxLevel or level end -- 礼包是否可以领取 function XGuildManager.CanCollectGift(giftLevel) if XGuildManager.IsGuildTourist() then return false end if not XGuildManager.IsJoinGuild() then return false end local lastGuildId = XGuildManager.GetGiftGuildGot() local curGuildId = XGuildManager.GetGuildId() if lastGuildId > 0 and lastGuildId ~= curGuildId then return false end local giftGuildLevel = XGuildManager.GetGiftGuildLevel() local giftLevelGots = XGuildManager.GetGiftLevelGot() if giftLevelGots[giftLevel] then return false end local giftData = XGuildConfig.GetGuildGiftByGuildLevelAndGiftLevel(giftGuildLevel, giftLevel) if not giftData then return false end local giftContribute = XGuildManager.GetGiftContribute() if giftContribute < giftData.GiftContribute then return false end return true end -- 公会礼包贡献进度 function XGuildManager.GetGiftContribute() return GuildData.GiftContribute end -- 礼包刷新时的公会等级 function XGuildManager.GetGiftGuildLevel() return GuildData.GiftGuildLevel end -- 礼包当前等级 function XGuildManager.GetGiftLevel() return GuildData.GiftLevel end -- 玩家已领取的礼包等级 function XGuildManager.GetGiftLevelGot() return GuildData.GiftLevelGot end -- 玩家在哪个公会领过礼包 function XGuildManager.GetGiftGuildGot() return GuildData.GiftGuildGot end -- 当前剩余的贡献值 function XGuildManager.GetGuildContributeLeft() return GuildData.GuildContributeLeft end -- 公会id function XGuildManager.GetGuildId() return GuildData.GuildId end -- 公会名字 function XGuildManager.GetGuildName() return GuildData.GuildName end -- 公会等级 function XGuildManager.GetGuildLevel() return GuildData.GuildLevel end function XGuildManager.GetGuildContributeIn7Days() return GuildData.GuildContributeIn7Days end -- 判断公会等级是否提升 function XGuildManager.CheckGuildLevelUp() if not XGuildManager.IsJoinGuild() then return false end if XLuaUiManager.IsUiShow("UiGuildLevelUp") then return false end local curLevel = XGuildManager.GetGuildLevel() local lastLevel = XGuildManager.GetLastLevel() -- -1 表示换了公会或未保存过 if lastLevel == -1 then XGuildManager.SaveGuildLevel() return false end if lastLevel < curLevel then GuildData.GuildLastLevel = lastLevel XLuaUiManager.Open("UiGuildLevelUp",lastLevel, curLevel, function() XGuildManager.SaveGuildLevel(curLevel) end) return true end return false end --最后一次保存的等级 function XGuildManager.GetLastLevel() return GuildData.GuildLastLevel or XGuildManager.GetGuildPrefs(XGuildConfig.KEY_LAST_LEVEL, -1) end -- 保存当前等级 function XGuildManager.SaveGuildLevel(level) local curLevel = level or XGuildManager.GetGuildLevel() XGuildManager.SaveGuildPrefs(XGuildConfig.KEY_LAST_LEVEL, curLevel) GuildData.GuildLastLevel = curLevel end -- 公会等级是否达到最大(是否满级) function XGuildManager.IsGuildLevelMax(level) local isMax = false local levelData = XGuildConfig.GetGuildLevelDataBylevel(level) if not levelData then return isMax end local nextLevel = level + 1 local nextLevelData = XGuildConfig.GetGuildLevelDataBylevel(nextLevel) if not nextLevelData then isMax = true end return isMax end -- 保存本地数据 function XGuildManager.SaveGuildPrefs(key, value, type) local guildId = XGuildManager.GetGuildId() if XPlayer.Id and guildId then key = string.format("%s_%s_%s", key, tostring(XPlayer.Id), tostring(guildId)) if type == DataType.String then CS.UnityEngine.PlayerPrefs.SetString(key, value) else CS.UnityEngine.PlayerPrefs.SetInt(key, value) end CS.UnityEngine.PlayerPrefs.Save() end end -- 获取本地数据 function XGuildManager.GetGuildPrefs(key, defaultValue, type) local guildId = XGuildManager.GetGuildId() if XPlayer.Id and guildId then key = string.format("%s_%s_%s", key, tostring(XPlayer.Id), tostring(guildId)) if CS.UnityEngine.PlayerPrefs.HasKey(key) then local guildPref = nil if type == DataType.String then guildPref = CS.UnityEngine.PlayerPrefs.GetString(key) else guildPref = CS.UnityEngine.PlayerPrefs.GetInt(key) end return (guildPref == nil or guildPref == 0) and defaultValue or guildPref end end return defaultValue end -- 公会宣言 function XGuildManager.GetGuildDeclaration() return GuildData.GuildDeclaration end -- 公会内部通讯 function XGuildManager.GetGuildInterCom() return GuildData.GuildInterCom end -- 公会图标 function XGuildManager.GetGuildIconId() local headPortrait = XGuildConfig.GetGuildHeadPortraitById(GuildData.GuildIconId) if not headPortrait then return nil end return headPortrait.Icon end function XGuildManager.GetGuildHeadPortrait() return GuildData.GuildIconId end -- 会长名字 function XGuildManager.GetGuildLeaderName() return GuildData.GuildLeaderName end -- 会员数量 function XGuildManager.GetMemberCount() return GuildData.GuildMemberCount end -- 会员在线数量 function XGuildManager.GetOnlineMemberCount() local onlineCount = 0 local allMembers = GuildData:GetGuildMembers() for _, member in pairs(allMembers or {}) do if member.OnlineFlag == 1 then onlineCount = onlineCount + 1 end end return onlineCount end -- 会员最大数量 function XGuildManager.GetMemberMaxCount() return GuildData.GuildMemberMaxCount end -- 是否可以弹劾会长 function XGuildManager.CanImpeachLeader() return CanImpeach end -- 是否弹劾过会长 function XGuildManager.HasImpeachLeader() return HasImpeach end -- 设置弹劾过会长 function XGuildManager.SetImpeachLeader() HasImpeach = true end -- 获取成员 function XGuildManager.GetMemberList() return GuildData:GetGuildMembers() end -- 获取成员(游客) function XGuildManager.GetVistorMemberList(guildid) return GuildVistorInfoDatas[guildid]:GetGuildMembers() end -- 清掉获取成员 function XGuildManager.ClearVistorGuildMembers(guildid) if GuildVistorInfoDatas[guildid] then GuildVistorInfoDatas[guildid]:ClearGuildMembers() end end -- 推荐页数 function XGuildManager.GetRecommendPageNo() RecommendPageNo = RecommendPageNo % 10 + 1 return RecommendPageNo end -- 自定义职位{Id = Name} function XGuildManager.GetAllRankNames() return GuildData.DecodeRankNames end function XGuildManager.GetRankNameByLevel(level) return GuildData:GetRankNameByLevel(level) end -- 查看申请者列表 function XGuildManager.GetGuildApplyList() return GuildApplyListDatas end -- 重置申请信息 function XGuildManager.ResetApplyMemberList() HasApplyMember = false XEventManager.DispatchEvent(XEventId.EVENT_GUILD_APPLY_LIST_CHANGED) end -- 是否有申请信息 function XGuildManager.GetHasApplyMemberList() if XGuildManager.IsGuildTourist() or not XGuildManager.IsGuildAdminister() then return false end return HasApplyMember end -- 获取保存公会聊天缓存的key function XGuildManager.GetGuildChannelKey(guildId) return string.format("GuildKey_%s_%s", tostring(XPlayer.Id), tostring(guildId)) end -- 查看是否有招募 function XGuildManager.HasGuildRecruitList() return HasGuildRecruit end -- 重置招募列表 function XGuildManager.ResetGuildRecruit() if HasGuildRecruit then HasGuildRecruit = false XEventManager.DispatchEvent(XEventId.EVENT_GUILD_RECRUIT_LIST_CHANGED) end end -- 查询免费改名机会 function XGuildManager.GetFreeChangeGuildName() return FreeChangeGuildNameCount > 0 end -- 使用免费改名机会 function XGuildManager.SetFreeChangeGuildNameCount() if FreeChangeGuildNameCount > 0 then FreeChangeGuildNameCount = FreeChangeGuildNameCount - 1 end end -- 获取工会boss结束时间 function XGuildManager.GuildBossEndTime() return GuildData.BossEndTime end -- 更新工会boss结束时间 function XGuildManager.SetGuildBossEndTime(val) if val then GuildData.BossEndTime = val else XLog.Warning("SetGuildBossEndTime(val) Failed") end end --获取当前迎新语 function XGuildManager.GetGuildScriptDatas() if not next(GuildScriptListDatas) then GuildScriptListDatas = {} for i = 1, XGuildConfig.GuildDefaultWelcomeWord do local key = string.format("%s_%d_%d", GuildWelcomeWordKey, XPlayer.Id, i) if not CS.UnityEngine.PlayerPrefs.HasKey(key) then break end GuildScriptListDatas[i] = {} GuildScriptListDatas[i].WelcomeWord = CS.UnityEngine.PlayerPrefs.GetString(key ,nil) key = string.format("%s_%d_%d", GuildWelcomeSelectKey, XPlayer.Id, i) GuildScriptListDatas[i].Select = (CS.UnityEngine.PlayerPrefs.GetInt(key, 0) == 1) end if not next(GuildScriptListDatas) then GuildScriptListDatas = XGuildConfig.GetDefaultWelcomeWords() end end return GuildScriptListDatas end function XGuildManager.HandleGuildScriptSelectedDatas(scriptsData) GuildScriptSelectedDatas = {} for _, v in pairs(scriptsData) do if v.Select then table.insert(GuildScriptSelectedDatas, v.WelcomeWord) end end end function XGuildManager.GetGuildScriptSelectedDatas() if GuildScriptSelectedDatas == nil or next(GuildScriptSelectedDatas) == nil then local scriptsData = XGuildManager.GetGuildScriptDatas() XGuildManager.HandleGuildScriptSelectedDatas(scriptsData) end return GuildScriptSelectedDatas end --处理迎新语数据(可以优化,用XSaveTool.SaveData方法) function XGuildManager.SetGuildScriptDatas(scriptsData, autoChat) GuildScriptListDatas = {} if scriptsData and next(scriptsData) then for k, v in pairs(scriptsData) do if v then table.insert(GuildScriptListDatas, v) local key = string.format("%s_%d_%d", GuildWelcomeWordKey, XPlayer.Id, k) CS.UnityEngine.PlayerPrefs.SetString(key, v.WelcomeWord) key = string.format("%s_%d_%d", GuildWelcomeSelectKey, XPlayer.Id, k) CS.UnityEngine.PlayerPrefs.SetInt(key, v.Select and 1 or 0) end end XGuildManager.HandleGuildScriptSelectedDatas(scriptsData) end GuildScriptAutoChat = autoChat local key = string.format("%s_%d", GuildWelcomeAutoChatKey, XPlayer.Id) CS.UnityEngine.PlayerPrefs.SetInt(key, GuildScriptAutoChat and 1 or 0) CS.UnityEngine.PlayerPrefs.Save() end function XGuildManager.GetGuildScriptAutoChat() if GuildScriptAutoChat == nil then local key = string.format("%s_%d", GuildWelcomeAutoChatKey, XPlayer.Id) -- 是否自动喊话,默认开启 GuildScriptAutoChat = (CS.UnityEngine.PlayerPrefs.GetInt(key, 1) == 1) end return GuildScriptAutoChat end function XGuildManager.InitGuildCustomNameTable() GuildCustomName = {} for _, v in pairs(XGuildConfig.GuildRankLevel) do GuildCustomName[v] = {} end local templates = XTool.Clone(XGuildConfig.GetCustomNameTemplate()) local list = {} for index, template in pairs(templates) do if template.Enable then template.Id = index table.insert(list, template) end end table.sort(list, function(itemA, itemB) return itemA.Id < itemB.Id end) for k, v in pairs(list) do table.insert(GuildCustomName[v.RankLevel], v.Name) end end function XGuildManager.GetGuildCustomName() if not next(GuildCustomName) then XGuildManager.InitGuildCustomNameTable() end return GuildCustomName end XGuildManager.Init() return XGuildManager end -- 上线时推送公会数据 XRpc.NotifyGuildData = function(notifyData) XDataCenter.GuildManager.AsyncGuildData(notifyData) end -- 推送公会事件 XRpc.NotifyGuildEvent = function(notifyData) XDataCenter.GuildManager.AsyncGuildEvent(notifyData) end XRpc.NotifyRankName = function(notifyData) XDataCenter.GuildManager.AsyncGuildRankName(notifyData) end XRpc.NotifyGuildMaintain = function(notifyData) XDataCenter.GuildManager.AsyncGuildMaintain(notifyData) end XRpc.NotifyGuildImpeach = function(notifyData) XDataCenter.GuildManager.AsyncGuildImpeach(notifyData) end