local skynet = require "skynet" local oo = require "Class" local log = require "Log" local pb = require "pb" local dataType = require "DataType" local errorInfo = require "ErrorInfo" local activity = require "Activity" local taskListEvent = require "TaskListEvent" local ActivityCarnival = oo.class() ActivityCarnival.ActivityType = dataType.ActivityType_Carnival -- -- 根据玩家的配置获取不同的数据 -- ActivityCarnival.ActivityInfo = {} -- local configType = skynet.server.gameConfig:GetConfigType("Main", 1) -- ActivityCarnival.ActivityInfo[configType] = {} -- ActivityCarnival.ActivityInfo[configType].ActivityId = 0 -- 该活动在配置中的id -- ActivityCarnival.ActivityInfo[configType].StartTime = 0 -- 嘉年华活动的开始时间 -- ActivityCarnival.ActivityInfo[configType].EndTime = 0 -- 嘉年华活动的结束时间 -- configType = skynet.server.gameConfig:GetConfigType("A", 1) -- ActivityCarnival.ActivityInfo[configType] = {} -- ActivityCarnival.ActivityInfo[configType].ActivityId = 0 -- 该活动在配置中的id -- ActivityCarnival.ActivityInfo[configType].StartTime = 0 -- 嘉年华活动的开始时间 -- ActivityCarnival.ActivityInfo[configType].EndTime = 0 -- 嘉年华活动的结束时间 -- configType = skynet.server.gameConfig:GetConfigType("B", 1) -- ActivityCarnival.ActivityInfo[configType] = {} -- ActivityCarnival.ActivityInfo[configType].ActivityId = 0 -- 该活动在配置中的id -- ActivityCarnival.ActivityInfo[configType].StartTime = 0 -- 嘉年华活动的开始时间 -- ActivityCarnival.ActivityInfo[configType].EndTime = 0 -- 嘉年华活动的结束时间 function ActivityCarnival:Init() end -- -- 设置活动信息 -- function ActivityCarnival:SetCarnivalInfo(player, keyName, keyValue) -- local configType = player.basicInfo.configType -- self.ActivityInfo[configType][keyName] = tonumber(keyValue) -- end -- -- 获取活动信息 -- function ActivityCarnival:GetCarnivalInfo(player, keyName) -- local configType = player.basicInfo.configType -- return self.ActivityInfo[configType][keyName] -- end -- 玩家礼包数据初始化 function ActivityCarnival:InitData(player, activityType) -- 嘉年华数据 local activityId, startTime, endTime,id = skynet.server.activity:GetActivityInfo(player, activityType) -- if activityId > 0 then -- self:SetCarnivalInfo(player, "ActivityId", activityId) -- 获取满足开放时间的嘉年华id -- self:SetCarnivalInfo(player, "StartTime", startTime) -- 嘉年华开始时间 -- self:SetCarnivalInfo(player, "EndTime", endTime) -- 嘉年华结束时间 -- end -- 玩家嘉年华活动相关数据 player.gameData.activity[activityType] = {} local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity") local level = 0 for k, v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_Carnival then -- 活动嘉年华 level = v.level break end end player.gameData.activity[activityType].id = id -- 记录该活动的id if activityId > 0 and player.gameData.level >= level then -- 玩家对应配置 local cfgCarnivalTask = skynet.server.gameConfig:GetPlayerAllCfg(player, "CarnivalTask") local cfgCarnival = skynet.server.gameConfig:GetPlayerCurCfg(player, "Carnival", activityId) player.gameData.activity[activityType].rewardInfos = {} -- 嘉年华的累计奖励信息 player.gameData.activity[activityType].sumRewardInfo = {} -- 嘉年华大奖信息 player.gameData.activity[activityType].Carnival = {} -- 嘉年华的任务相关信息 -- 玩家嘉年华任务奖励数据赋值 for i = 1, #cfgCarnival.packReward, 1 do player.gameData.activity[activityType].rewardInfos[i] = {} player.gameData.activity[activityType].rewardInfos[i].id = i -- 任务id player.gameData.activity[activityType].rewardInfos[i].status = 0 -- 0 不可领取 1 可以领取 2 已经领取 player.gameData.activity[activityType].rewardInfos[i].rewardId = cfgCarnival.packReward[i] player.gameData.activity[activityType].rewardInfos[i].taskReward = false -- 是否有可领取的任务奖励 end -- 七日大奖累计数据 player.gameData.activity[activityType].sumRewardInfo[1] = {} player.gameData.activity[activityType].sumRewardInfo[1].id = 8 -- 大奖id player.gameData.activity[activityType].sumRewardInfo[1].finishCount = 0 -- 当前嘉年华的累计完成次数 player.gameData.activity[activityType].sumRewardInfo[1].status = 0 -- 当前任务状态 0-未解锁 1-已解锁 2-已完成 -- 后面用完挪到player -- if player.gameData.level >= 10 and not player:IsUnlockSystem(dataType.UnlockSystem_ActivityCarnival) then -- player:AddUnlockSystem(dataType.UnlockSystem_ActivityCarnival) -- end -- self:CheckNew(player) self:CheckActivity(player) end end -- 初始化任务数据 function ActivityCarnival:CheckNew(player) if not player:IsUnlockSystem(dataType.UnlockSystem_ActivityCarnival) then return end -- log.info('初始化嘉年华任务') -- 根据开始和结束时间找到当期的任务 -- local curCfgCarnival = self:GetCurPeriodCfg(player) local Carnival = player.gameData.activity[self.ActivityType].Carnival Carnival.tasks = {} local cfgCarnivalTask = skynet.server.gameConfig:GetPlayerAllCfg(player, "CarnivalTask") local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) if cfgCarnivalTask then for k, v in pairs(cfgCarnivalTask) do if activityId == v.carnivalId then table.insert(Carnival.tasks, { id = v.id, type = v.days, kind = v.taskType, progress = 0, endTime = endTime, status = skynet.server.task.TaskStatus_NoComplete }) end end end end -- 初始化数据 function ActivityCarnival:CheckActivity(player) local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) -- log.info("初始化数据activityId", activityId) local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity") local level = 0 for k, v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_Carnival then -- 活动嘉年华 level = v.level break end end if activityId > 0 and player.gameData.level >= level then player.gameData.activity[self.ActivityType].carnivalInfo = {} -- 嘉年华任务解锁信息 local cfgCarnival = skynet.server.gameConfig:GetPlayerCurCfg(player, "Carnival", activityId) local nowTime = skynet.GetTime() local dayCount = math.ceil((nowTime - startTime) / (24 * 60 * 60)) -- log.info('dayCount', dayCount) -- -- 玩家嘉年华任务数据赋值 for i = 1, #cfgCarnival.packReward, 1 do player.gameData.activity[self.ActivityType].carnivalInfo[i] = {} player.gameData.activity[self.ActivityType].carnivalInfo[i].id = i -- 任务id if i <= dayCount then -- 当前任务状态 0-未解锁 1-已解锁 player.gameData.activity[self.ActivityType].carnivalInfo[i].status = 1 else player.gameData.activity[self.ActivityType].carnivalInfo[i].status = 0 end player.gameData.activity[self.ActivityType].carnivalInfo[i].startTime = startTime + (i - 1) * 24 * 60 * 60 end end end -- 每次登录需要进行修改的数据 function ActivityCarnival:LoginInitData(player) -- 重置嘉年华红点 -- skynet.server.msgTips:Reset(player, 87) skynet.server.msgTips:Reset(player, 88) skynet.server.msgTips:Reset(player, 89) -- 检查应该初始还是结束活动 local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity") local activityId, startTime, endTime,id = skynet.server.activity:GetActivityInfo(player, self.ActivityType) local level = 0 for k, v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_Carnival then -- 活动嘉年华 level = v.level break end end -- 判断玩家活动是否开启 if player.gameData.level >= level then if player.gameData.activity[self.ActivityType] and next(player.gameData.activity[self.ActivityType]) ~= nil then -- 判断该活动是否到期,活动为0 则结束活动,活动id 与当前活动id不同 if skynet.GetTime() > endTime or activityId == 0 or (player.gameData.activity[self.ActivityType].id~=nil and player.gameData.activity[self.ActivityType].id ~= id) then -- player.gameData.activity[self.ActivityType].id = v.id -- 记录该活动的id -- 初始玩家数据 player.gameData.activity[self.ActivityType] = {} --删除红点 skynet.server.msgTips:Reset(player, 87) else -- 红点系统 self:CheckActivity(player) self:CheckTask(player) self:CheckDayTaskReward(player) self:CheckSumTask(player) end else self:InitData(player, self.ActivityType) end end end -- 嘉年华 展示 function ActivityCarnival:Show(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityCarnivalShow", c2sData.data)) local data = {} local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) local cfgCarnival = skynet.server.gameConfig:GetPlayerAllCfg(player, "Carnival") local Carnival = cfgCarnival[activityId] -- 嘉年华活动相关数据 -- 判断一下是否需要初始化玩家数据 if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil then self:InitData(player, self.ActivityType) end self:CheckTask(player) self:CheckDayTaskReward(player) self:CheckSumTask(player) -- 重置一下游玩数据 if next(player.gameData.activity[self.ActivityType]) ~= nil then data.rewardInfos = player.gameData.activity[self.ActivityType].rewardInfos data.sumRewardInfo = { id = player.gameData.activity[self.ActivityType].sumRewardInfo[1].id, status = player.gameData.activity[self.ActivityType].sumRewardInfo[1].status, rewardId = Carnival.otherId } data.carnivalInfos = player.gameData.activity[self.ActivityType].carnivalInfo data.endTime = endTime end -- log.info('嘉年华展示数据' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityCarnivalShow") s2cData.data = assert(pb.encode("S2CActivityCarnivalShow", data)) end -- 检查是否完成所有每日任务 function ActivityCarnival:CheckDayTaskReward(player) if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil then return end for k1, v1 in pairs(player.gameData.activity[self.ActivityType].rewardInfos) do local finish = true if v1.status == 0 then for k2, v2 in pairs(player.gameData.activity[self.ActivityType].Carnival.tasks) do if v2.type == v1.id and v2.status == 1 then finish = false end end if finish then v1.status = 1 skynet.server.msgTips:Add(player, 88) end end end end -- 检查是否有完成的任务 function ActivityCarnival:CheckTask(player) if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil then return end for k1, v1 in pairs(player.gameData.activity[self.ActivityType].rewardInfos) do local finish = true if v1.status == 0 or v1.status == 2 then for k2, v2 in pairs(player.gameData.activity[self.ActivityType].Carnival.tasks) do if v2.type == v1.id and v2.status == 2 then v1.taskReward = true finish = false end end if finish then v1.taskReward = false end end end end -- 检查是否完成嘉年华累计奖励 function ActivityCarnival:CheckSumTask(player) if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil then return end local finish = true for k, v in pairs(player.gameData.activity[self.ActivityType].rewardInfos) do if v.status == 0 or v.status == 1 then finish = false break end end if finish and player.gameData.activity[self.ActivityType].sumRewardInfo[1].status == 0 then player.gameData.activity[self.ActivityType].sumRewardInfo[1].status = 1 skynet.server.msgTips:Add(player, 89) end end -- 嘉年华 任务展示 function ActivityCarnival:TaskShow(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityCarnivalTaskShow", c2sData.data)) local data = {} local id = c2sData.data.id if not id then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else -- 获取任务信息 data.taskInfo = self:GetShowTaskData(player, id) local count = 0 for k, v in pairs(data.taskInfo) do if v.status == 2 or v.status == 3 then count = count + 1 end end data.progress = count end -- log.info('嘉年华任务展示数据' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityCarnivalTaskShow") s2cData.data = assert(pb.encode("S2CActivityCarnivalTaskShow", data)) end -- 获取显示的任务信息 function ActivityCarnival:GetShowTaskData(player, id) local data = {} local Carnival = player.gameData.activity[self.ActivityType].Carnival for k, v in pairs(Carnival.tasks) do -- 显示对应天数的任务 if id == v.type then table.insert(data, { id = v.id, progress = v.progress, status = v.status, endTime = v.endTime }) end end return data end -- 嘉年华 任务领取奖励 function ActivityCarnival:TaskGet(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityCarnivalTaskGet", c2sData.data)) local data = {} local taskId = c2sData.data.taskId local Carnival = player.gameData.activity[self.ActivityType].Carnival data.taskInfo = {} -- 判断任务是否完成 for k, v in pairs(Carnival.tasks) do if taskId == v.id and skynet.server.task.TaskStatus_AlreadyComplete == v.status then -- 只有状态为任务已完成才能领取 local cfgOne = skynet.server.gameConfig:GetPlayerCurCfg(player, "CarnivalTask", v.id) local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_104") player:GiveReward(cfgOne.rewardId, eventId) v.status = skynet.server.task.TaskStatus_AlreadyGet player:AddExpCount(cfgOne.expNum, true) skynet.server.msgTips:Reduce(player, 87) data.taskInfo = { id = taskId, progress = v.progress, status = v.status, endTime = v.endTime } log.debug(string.format("玩家 %d 嘉年华任务 任务完成 ID %d ", player.basicInfo.userID, taskId)) break end end -- data.taskInfo = self:GetShowTaskData(player, id) -- log.info('嘉年华任务领取奖励' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityCarnivalTaskGet") s2cData.data = assert(pb.encode("S2CActivityCarnivalTaskGet", data)) end -- 嘉年华 当天完成任务获取宝箱 function ActivityCarnival:GetChest(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityCarnivalGetChest", c2sData.data)) local data = {} local id = c2sData.data.id -- 判断当天任务奖励是否可以领取 local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) local cfgCarnival = skynet.server.gameConfig:GetPlayerAllCfg(player, "Carnival") local Carnival = cfgCarnival[activityId] -- 嘉年华活动相关数据 local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_105") if player.gameData.activity[self.ActivityType].rewardInfos[id].status == 1 then player.gameData.activity[self.ActivityType].rewardInfos[id].status = 2 data.rewardId = Carnival.packReward[id] player:GiveReward(Carnival.packReward[id], eventId) self:CheckSumTask(player) skynet.server.msgTips:Reduce(player, 88) end -- log.info('当天完成任务获取宝箱' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityCarnivalGetChest") s2cData.data = assert(pb.encode("S2CActivityCarnivalGetChest", data)) end -- 嘉年华 七日累计大奖领取 function ActivityCarnival:SumGet(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityCarnivalSumGet", c2sData.data)) local data = {} local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) local cfgCarnival = skynet.server.gameConfig:GetPlayerAllCfg(player, "Carnival") local Carnival = cfgCarnival[activityId] -- 嘉年华活动相关数据 -- 判断七日大奖是否可以领取 if player.gameData.activity[self.ActivityType].sumRewardInfo[1].status == 1 then local finish = true for k, v in pairs(player.gameData.activity[self.ActivityType].rewardInfos) do if v.status == 0 then finish = false break end end if finish then player.gameData.activity[self.ActivityType].sumRewardInfo[1].status = 2 local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_106") data.rewardId = Carnival.otherId player:GiveReward(Carnival.otherId, eventId) skynet.server.msgTips:Reduce(player, 89) end else s2cData.code = errorInfo.ErrorCode.ErrRequestParam end -- log.info('七日累计大奖领取' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityCarnivalSumGet") s2cData.data = assert(pb.encode("S2CActivityCarnivalSumGet", data)) end -- 获得当前期配置 function ActivityCarnival:GetCurPeriodCfg(player) local curCfgCarnival = nil local activityId = skynet.server.activity:GetActivityInfo(player, dataType.ActivityType_Carnival) -- activityId = 1 if activityId > 0 then local cfgCarnival = skynet.server.gameConfig:GetPlayerCurCfg(player, "CarnivalTask", activityId) curCfgCarnival = cfgCarnival -- 获取当前嘉年华任务信息 end return curCfgCarnival end -- 嘉年华 修改任务 function ActivityCarnival:Modify(player, kind, count) local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) -- 判断是否解锁 if not player:IsUnlockSystem(dataType.UnlockSystem_ActivityCarnival) then return end --嘉年华活动未开启 if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil or player.gameData.activity[self.ActivityType].Carnival == nil or next(player.gameData.activity[self.ActivityType].Carnival) == nil or player.gameData.activity[self.ActivityType].Carnival.tasks == nil then return end local nowTime = skynet.GetTime() local dayCount = math.ceil((nowTime - startTime) / (24 * 60 * 60)) local day = 1 count = count or 1 log.debug(string.format("玩家 %d 嘉年华 任务修改 种类 %d 数量 %d", player.userId, kind, count)) local maxProgress = 0 local Carnival = player.gameData.activity[self.ActivityType].Carnival for k, v in pairs(Carnival.tasks) do if kind == v.kind and skynet.server.task.TaskStatus_NoComplete == v.status then -- 获取最大进度 day = v.type if dayCount < day and v.kind == 39 then maxProgress = skynet.server.gameConfig:GetPlayerCurCfg(player, "CarnivalTask", v.id).value v.progress = v.progress + count -- log.info('v.progress', v.progress) -- 检查是否完成任务 if v.progress >= maxProgress then if skynet.server.task.TaskStatus_NoComplete == v.status then skynet.server.msgTips:Add(player, 87) end v.status = skynet.server.task.TaskStatus_AlreadyComplete v.progress = maxProgress log.debug(string.format("玩家 %d 嘉年华 任务种类 %d 任务ID %d 完成 ", player.userId, kind, v.id)) end elseif dayCount >= day then maxProgress = skynet.server.gameConfig:GetPlayerCurCfg(player, "CarnivalTask", v.id).value v.progress = v.progress + count -- log.info('v.progress', v.progress) -- 检查是否完成任务 if v.progress >= maxProgress then if skynet.server.task.TaskStatus_NoComplete == v.status then skynet.server.msgTips:Add(player, 87) end v.status = skynet.server.task.TaskStatus_AlreadyComplete v.progress = maxProgress log.debug(string.format("玩家 %d 嘉年华 任务种类 %d 任务ID %d 完成 ", player.userId, kind, v.id)) end end end end self:CheckTask(player) self:CheckDayTaskReward(player) self:CheckSumTask(player) end -- 定义一个回调函数 local function onEventFired(player , taskId , count) --处理活动 ActivityCarnival:Modify(player , taskId , count) end -- 注册事件处理函数 taskListEvent:Register(onEventFired,"嘉年华任务") skynet.server.activityCarnival = ActivityCarnival return ActivityCarnival