2025-06-04 05:12:01 +08:00

409 lines
11 KiB
Plaintext

GuildData = class("GuildData")
autoImport("GuildHeadData");
autoImport("GuildMemberData");
GuildSummaryType = {
-- 初始化賦值 不會更新到的屬性
initType1 = "createtime",
-- 服務端用來同步的公會列表中的公會資訊屬性
OtherGuildSummary1 = "curmember",
OtherGuildSummary2 = "maxmember",
OtherGuildSummary3 = "chairmanname",
OtherGuildSummary4 = "guildname",
OtherGuildSummary5 = "chairmangender",
-- "nextraidtime"
}
local function mapGuildEnumProp(enum,propName)
if(enum) then
GuildSummaryType[enum] = propName
else
helplog("enum is nil! propName is",propName)
end
end
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_ID,"guid")
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_NAME,"name")-- 名字
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_LEVEL,"level")-- 等級
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_PORTRAIT,"portrait")-- 頭像
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_ASSET,"asset")-- 公會資金
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_DISMISSTIME,"dismisstime")-- 解散時間
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_BOARDINFO,"boardinfo")-- 公告資訊
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_RECRUITINFO,"recruitinfo")-- 招聘資訊
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_QUEST_RESETTIME,"questresettime")-- quest reset time
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_ZONEID,"zoneid")-- 分線id
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_ZONETIME,"zonetime")-- 分線倒計時
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_NEXTZONE,"nextzone")-- 切線
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_DONATETIME1,"donatetime1")-- 華麗金屬重新整理時間
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_DONATETIME2,"donatetime2")-- 普通道具重新整理時間
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_ASSET_DAY,"assettoday")
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_CITYID,"cityid")
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_CITY_GIVEUP_CD,"citygiveuptime")
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_OPEN_FUNCTION,"openfunction")
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_TREASURE_GVG_COUNT,"gvg_treasure_count")-- 0 無據點寶箱。1 有
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_TREASURE_GUILD_COUNT,"guild_treasure_count")-- 公會資產已開啟寶箱次數
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_TREASURE_BCOIN_COUNT,"bcoin_treasure_count")-- B格貓金幣已開啟寶箱次數
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_SUPERGVG,"insupergvg")-- gvg資格
mapGuildEnumProp(GuildCmd_pb.EGUILDDATA_SUPERGVG_LV,"supergvg_lv")-- gvg level
GuildData.PropertyTypeMap = {
name = "string",
boardinfo = "string",
recruitinfo = "string",
chairmanname = "string",
guildname = "string",
portrait = "string",
}
GuildJobType = {
Chairman = GuildCmd_pb.EGUILDJOB_CHAIRMAN,
ViceChairman = GuildCmd_pb.EGUILDJOB_VICE_CHAIRMAN,
Member1 = GuildCmd_pb.EGUILDJOB_MEMBER1,
Member2 = GuildCmd_pb.EGUILDJOB_MEMBER2,
Member3 = GuildCmd_pb.EGUILDJOB_MEMBER3,
Member4 = GuildCmd_pb.EGUILDJOB_MEMBER4,
Member5 = GuildCmd_pb.EGUILDJOB_MEMBER5,
Member6 = GuildCmd_pb.EGUILDJOB_MEMBER6,
Member7 = GuildCmd_pb.EGUILDJOB_MEMBER7,
Member8 = GuildCmd_pb.EGUILDJOB_MEMBER8,
Member9 = GuildCmd_pb.EGUILDJOB_MEMBER9,
Member10 = GuildCmd_pb.EGUILDJOB_MEMBER10,
}
-- GuildJobUpdateType = {
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_CHAIR] = GuildCmd_pb.EGUILDJOB_CHAIRMAN,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_VICE] = GuildCmd_pb.EGUILDJOB_VICE_CHAIRMAN,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER1] = GuildCmd_pb.EGUILDJOB_MEMBER1,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER2] = GuildCmd_pb.EGUILDJOB_MEMBER2,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER3] = GuildCmd_pb.EGUILDJOB_MEMBER3,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER4] = GuildCmd_pb.EGUILDJOB_MEMBER4,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER5] = GuildCmd_pb.EGUILDJOB_MEMBER5,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER6] = GuildCmd_pb.EGUILDJOB_MEMBER6,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER7] = GuildCmd_pb.EGUILDJOB_MEMBER7,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER8] = GuildCmd_pb.EGUILDJOB_MEMBER8,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER9] = GuildCmd_pb.EGUILDJOB_MEMBER9,
-- [GuildCmd_pb.EGUILDDATA_JOBNAME_MEMBER10] = GuildCmd_pb.EGUILDJOB_MEMBER10,
-- }
function GuildData:ctor(guildData)
self.id = nil;
self.memberNum = 0;
self.maxMemberNum = 0;
self.membersMap = {};
self.applysMap = {};
self.jobMap = {};
self:SetData(guildData);
end
-- 預設為number型別
function GuildData:GetPropertyType(key)
return GuildData.PropertyTypeMap[key] or "number";
end
function GuildData:SetData(gdata)
if(gdata)then
-- local updateStr = "GuildData(Init): ";
for _,key in pairs(GuildSummaryType)do
if(gdata[key])then
self[key] = gdata[key];
-- updateStr = updateStr..string.format("| %s:%s", key, gdata[key]);
else
local summary = gdata.summary;
if(summary and summary[key])then
self[key] = summary[key];
-- updateStr = updateStr..string.format("| %s:%s", key, self[key]);
end
end
end
self.id = self.guid;
self:UpdateStaticData();
self:UpdateGuildJobInfos(gdata.jobs);
-- helplog(updateStr);
self:SetMembers(gdata.members);
self:SetApplys(gdata.applys);
end
end
function GuildData:UpdateGuildJobInfos(server_jobs)
if(server_jobs and #server_jobs>0)then
local jobInfo = nil;
for i=1,#server_jobs do
self:UpdateGuildJobInfo(server_jobs[i]);
end
end
end
function GuildData:UpdateGuildJobInfo(single)
local jobId = single.job;
-- local jobStr = ""
if(jobId)then
local jobInfo = self.jobMap[jobId];
if(jobInfo == nil)then
jobInfo = {};
jobInfo.id = jobId;
self.jobMap[jobId] = jobInfo;
end
local config = Table_GuildJob[jobId];
if(config == nil)then
helplog("Error Server Data ", tostring(jobId));
return;
end
if(single.name~=nil and single.name~="")then
jobInfo.name = single.name;
else
jobInfo.name = config.Name;
end
jobInfo.auth = single.auth;
jobInfo.limitlv = config.OpenLevel;
jobInfo.editauth = single.editauth or 0;
-- jobStr = string.format("JobInfo--> id:%s name:%s auth:%s editauth:%s limitlv:%s",
-- tostring(jobInfo.id), tostring(jobInfo.name), tostring(jobInfo.auth), tostring(jobInfo.editauth), tostring(jobInfo.limitlv))
end
-- helplog("Update GuildJob:", jobStr);
end
function GuildData:UpdateStaticData(updateDatas)
if(self.level)then
local key = math.max(1, self.level);
key = math.min(self.level, #Table_Guild);
self.staticData = Table_Guild[key];
self.maxMemberNum = self.staticData and self.staticData.MemberNum or 0;
end
end
function GuildData:UpdateData(updateDatas)
-- local updateStr = "GuildData(Update): ";
-- updateStr = updateStr..string.format("| %s:%s", "name", self.name);
local jobNameUpdate = false;
for i=1,#updateDatas do
local single = updateDatas[i];
local type, value, data = single.type, single.value, single.data;
local key = GuildSummaryType[type];
if(key)then
-- 更新 job 資訊
local propertyType = self:GetPropertyType(key);
if(propertyType == "string")then
self[key] = data or "";
else
self[key] = value;
end
-- updateStr = updateStr..string.format("| %s:%s", key, tostring(self[key]));
end
end
if(jobNameUpdate)then
for _,member in pairs(self.membersMap)do
member:UpdateJobInfo(self.jobInfo);
end
end
self:UpdateStaticData();
-- helplog(updateStr);
end
function GuildData:SetMembers(smDatas)
if(smDatas)then
for i=1,#smDatas do
member = self:SetMember(smDatas[i]);
end
end
end
function GuildData:SetMember(serviceGuildMember)
local member = self:GetMemberByGuid(serviceGuildMember.charid);
if(not member)then
member = self:AddMember(serviceGuildMember);
else
local cacheOffline = member:IsOffline();
member:SetData(serviceGuildMember);
end
return member;
end
function GuildData:AddMember(serviceGuildMember)
if(serviceGuildMember)then
local newMember = GuildMemberData.new(serviceGuildMember, self);
self.membersMap[serviceGuildMember.charid] = newMember;
self.memberNum = self.memberNum+1;
return newMember;
end
end
function GuildData:RemoveMembers(dels)
for i=1,#dels do
self:RemoveMember(dels[i]);
end
end
function GuildData:RemoveMember(guid)
local catchMember = self:GetMemberByGuid(guid);
if(catchMember)then
self.membersMap[guid] = nil;
self.memberNum = self.memberNum-1;
end
return catchMember;
end
function GuildData:GetMemberByGuid(guid)
return self.membersMap[guid];
end
function GuildData:GetMemberList()
local result = {};
for k,v in pairs(self.membersMap)do
table.insert(result, v);
end
return result;
end
-- apply info
function GuildData:SetApplys(applys)
if(applys and #applys>0)then
for i=1,#applys do
self:SetApply(applys[i]);
end
end
end
function GuildData:SetApply(serviceGuildApply)
local catchApply = self:GetApplyByGuid(serviceGuildApply.charid);
if(not catchApply)then
catchApply = self:AddApply(serviceGuildApply);
else
catchApply:SetData(serviceGuildApply);
end
return catchApply;
end
function GuildData:AddApply(apply)
if(apply and apply.charid)then
local catchApply = GuildMemberData.new(apply);
self.applysMap[apply.charid] = catchApply;
return catchApply;
end
end
function GuildData:RemoveApplys(dels)
for i=1,#dels do
self:RemoveApply(dels[i]);
end
end
function GuildData:RemoveApply(guid)
local catchApply = self:GetApplyByGuid(guid);
if(catchApply)then
self.applysMap[guid] = nil;
end
return catchApply;
end
function GuildData:GetApplyByGuid(guid)
return self.applysMap[guid];
end
function GuildData:GetApplyList()
local result = {};
for k,v in pairs(self.applysMap) do
table.insert(result, v);
end
return result;
end
function GuildData:ClearApplyList()
self.applysMap = {};
end
function GuildData:GetChairMan()
for _,member in pairs(self.membersMap)do
if(member.job == GuildJobType.Chairman)then
return member;
end
end
local _,errorChairMan = next(self.membersMap);
return errorChairMan;
end
function GuildData:GetViceChairmanList()
local result = {};
for _,member in pairs(self.membersMap)do
if(member.job == GuildJobType.ViceChairman)then
table.insert(result, member);
end
end
return result;
end
function GuildData:GetOnlineMembers()
local result = {};
for _,member in pairs(self.membersMap)do
if(not member:IsOffline())then
table.insert(result, member);
end
end
return result;
end
function GuildData:GetUpgradeConfig()
return self:GetGuildConfig(self.level + 1);
end
function GuildData:GetGuildConfig(level)
level = level or self.level;
local maxlv = 1;
for lv,_ in pairs(Table_Guild)do
maxlv = math.max(maxlv, lv);
end
level = math.min(level, maxlv);
level = math.max(1, level);
return Table_Guild[level];
end
function GuildData:GetNextDonateTime()
if(self.donatetime1 and self.donatetime2)then
return self.donatetime1 < self.donatetime2 and self.donatetime1 or self.donatetime2;
end
return 0;
end
function GuildData:GetJobMap()
return self.jobMap;
end
function GuildData:GetJobAuthValue(job)
if(self.jobMap[job])then
-- return Table_GuildJob[job].Authority;
return self.jobMap[job].auth;
end
end
function GuildData:GetJobName(job)
if(self.jobMap[job])then
return self.jobMap[job].name;
end
end
function GuildData:GetJobEditAuth(job)
if(self.jobMap[job])then
-- return Table_GuildJob[job].EditAuthority;
return self.jobMap[job].editauth;
end
end
function GuildData:CheckFunctionOpen(etype)
local v = 1 << (etype-1);
local openfunction = self.openfunction or 0;
return v & openfunction > 0;
end
function GuildData:Exit()
end