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 ActivityDreamLife = oo.class(activity) ActivityDreamLife.ActivityType = dataType.ActivityType_DreamLife ActivityDreamLife.TaskStatus_NoStart = 1 -- 未开始 ActivityDreamLife.TaskStatus_NoFinish = 2 -- 进行中 ActivityDreamLife.TaskStatus_NoGet = 3 -- 未领取 ActivityDreamLife.TaskStatus_Get = 4 -- 已领取 ActivityDreamLife.TaskStatus_OtherNoFinish = 5 -- 待家园成员完成 function ActivityDreamLife:Init() end -- 玩家礼包数据初始化 function ActivityDreamLife:InitData(player, activityType) -- 若来数据 local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, activityType) -- 玩家若来活动相关数据 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_DreamLife then -- 活动若来 level = v.level break end end for k, v in pairs(cfgActivity) do if v.activityType == self.ActivityType and v.activityId == activityId then player.gameData.activity[activityType].id = v.id -- 记录该活动的id break end end if activityId > 0 and player.gameData.level >= level then -- 玩家对应配置 local cfgDreamLifeTask = skynet.server.gameConfig:GetPlayerAllCfg(player, "DreamLifeTask") local cfgDreamLife = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLife", activityId) local cfgDreamLifeStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "DreamLifeStore") -- log.info('若来配置' .. skynet.server.common:TableToString(cfgCarnival)) player.gameData.activity[activityType].shopInfos = {} -- 若来的商店奖励信息 player.gameData.activity[activityType].DreamLife = {} -- 若来的任务相关信息 player.gameData.activity[activityType].score = 0 -- 玩家累计蜗蜗积分 player.gameData.activity[activityType].activityId = activityId -- 玩家若来任务奖励数据赋值 -- for k, v in pairs(cfgDreamLifeStore) do -- local count = v.id -- player.gameData.activity[activityType].shopInfos[count] = {} -- player.gameData.activity[activityType].shopInfos[count].id = count -- 商品id -- player.gameData.activity[activityType].shopInfos[count].limit = {v.purchaseLimit, 0} -- 兑换限制 例如 {3,1} 3 可兑换次数 1 已兑换次数 -- end for k, v in pairs(cfgDreamLife.shopGoods) do player.gameData.activity[activityType].shopInfos[v] = {} player.gameData.activity[activityType].shopInfos[v].id = v -- 商品id player.gameData.activity[activityType].shopInfos[v].limit = {cfgDreamLifeStore[v].purchaseLimit, 0} -- 兑换限制 例如 {3,1} 3 可兑换次数 1 已兑换次数 end -- 初始任务数据 self:InitTask(player) end end -- 初始任务数据 function ActivityDreamLife:InitTask(player) local DreamLife = player.gameData.activity[self.ActivityType].DreamLife DreamLife.tasks = {} local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) if activityId == 0 then return end local cfgDreamLife = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLife", activityId) local cfgDreamLifeTask = skynet.server.gameConfig:GetPlayerAllCfg(player, "DreamLifeTask") if cfgDreamLifeTask then local taskType = dataType.GroupTaskType_DreamLife for k, v in pairs(cfgDreamLifeTask) do for k1, v1 in pairs(cfgDreamLife.personalTask) do if v.id == v1 then table.insert(DreamLife.tasks, { id = v.id, kind = v.taskType, progress = 0, finishTime = 0, status = self.TaskStatus_NoStart }) end end for k1, v1 in pairs(cfgDreamLife.communityTask) do if v.id == v1 then table.insert(DreamLife.tasks, { id = v.id, kind = v.taskType, progress = 0, finishTime = 0, status = self.TaskStatus_NoStart }) end end skynet.server.group:GetTaskCount(player, taskType, v.id) end end end -- 每次登录需要进行修改的数据 function ActivityDreamLife: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 = skynet.server.activity:GetActivityInfo(player, self.ActivityType) local cfgDreamLifeStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "DreamLifeStore") local cfgDreamLife = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLife", activityId) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local level = 0 for k, v in pairs(cfgActivity) do if v.activityType == dataType.ActivityType_DreamLife 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 and player.gameData.activity[self.ActivityType].activityId ~= nil then -- 判断该活动是否到期 if skynet.GetTime() > endTime or activityId > player.gameData.activity[self.ActivityType].activityId then -- 初始玩家数据 player.gameData.activity[self.ActivityType] = {} if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 21) == 0 then return end -- 活动代币转为金币发送邮件 local mailInfo = { mailType = "奖励", mailTitle = "请领取奖励", mailText = "【童趣游园会】限时活动已结束,您未消耗的蜗蜗积分已转化为金币发放,请及时领取哦!", mailEffectiveTime = 7 } local mailId = "XWYR" .. tostring(skynet.GetTime()) local award = {} table.insert(award, { type = dataType.GoodsType_Init, id = dataType.GoodsType_Coin, count = 0 }) if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 21) * cfgSValue.snailIntegralCoin > cfgSValue.snailIntegralCoinLimit then award[1].count = cfgSValue.snailIntegralCoinLimit or 0 else award[1].count = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 21) * cfgSValue.snailIntegralCoin or 0 end skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 21, skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 21)) skynet.server.mail:AddMail(player, mailId, mailInfo, award, false) skynet.server.msgTips:ReduceAll(player, 100) else -- log.info('检查若来任务') -- 检查是否有完成的任务 self:CheckTask(player) -- 红点系统 skynet.server.msgTips:Reset(player, 99) for k, v in pairs(player.gameData.activity[self.ActivityType].DreamLife.tasks) do if v.status == self.TaskStatus_NoGet or skynet.GetTime() >= v.finishTime and v.status == self.TaskStatus_NoFinish then skynet.server.msgTips:AddNoNotice(player, 99) end end if activityId > 0 then self:CheckShopRedDot(player) end end else self:InitData(player, self.ActivityType) end end end -- 检查活动是否到期 function ActivityDreamLife:CheckActiviTy(player) local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) if activityId == 0 then --s2cData.code = errorInfo.ErrorCode.ActivityClosed return end end -- 检查是否有完成的任务 function ActivityDreamLife:CheckTask(player) if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil then return end local myPartnerId = player.gameData.partner.id local curDetail = skynet.server.personal:GetDetail(myPartnerId) -- 判断是否加入家园 if curDetail and curDetail.groupId and "" == curDetail.groupId then skynet.server.group:CheckDreamLifeTask(player) end for k, v in pairs(player.gameData.activity[self.ActivityType].DreamLife.tasks) do if v.kind == 1 and v.status == self.TaskStatus_NoFinish and skynet.GetTime() >= v.finishTime then v.status = self.TaskStatus_NoGet elseif v.kind == 2 and v.status == self.TaskStatus_NoFinish and curDetail and curDetail.groupId and "" ~= curDetail.groupId then -- 调用家园接口修改家园任务进度 local taskType = dataType.GroupTaskType_DreamLife -- skynet.server.group:UpdateTask(player, taskType, v.id) if skynet.server.group:GetDreamLifeTaskState(player, v.id) then v.status = self.TaskStatus_OtherNoFinish end local cfgOneDreamLifeTask = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLifeTask", v.id) .targetHeadcount -- 调用家园接口获取该任务进度 v.progress = skynet.server.group:GetTaskCount(player, taskType, v.id) if v.progress >= cfgOneDreamLifeTask then v.status = self.TaskStatus_NoGet end end end end -- 检查是否有完成的任务 function ActivityDreamLife:CheckShopRedDot(player) if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil then return end local shopInfos = player.gameData.activity[self.ActivityType].shopInfos local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) local cfgDreamLifeStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "DreamLifeStore") local cfgDreamLife = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLife", activityId) local wowoScore = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 21) --获取蜗蜗积分数量 skynet.server.msgTips:Reset(player, 100) for k, v in pairs(cfgDreamLife.shopGoods) do if wowoScore >= cfgDreamLifeStore[v].snailIntegral and shopInfos[v].limit[2] < cfgDreamLifeStore[v].purchaseLimit then skynet.server.msgTips:Add(player, 100) break end end end -- 若来 任务展示 function ActivityDreamLife:TaskShow(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityDreamLifeTaskShow", c2sData.data)) local data = {} if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil or 0 == #player.gameData.activity[self.ActivityType].DreamLife.tasks then self:InitData(player, self.ActivityType) end local myPartnerId = player.gameData.partner.id local curDetail = skynet.server.personal:GetDetail(myPartnerId) -- 检查是否有完成的任务 self:CheckTask(player) --self:CheckShopRedDot(player) -- 判断是否加入家园 data.taskInfos = {} if curDetail and "" == (curDetail.groupId or "") then for k, v in pairs(player.gameData.activity[self.ActivityType].DreamLife.tasks) do if v.kind == 1 then table.insert(data.taskInfos, v) elseif v.kind == 2 then v.status = self.TaskStatus_NoStart end end else data.taskInfos = player.gameData.activity[self.ActivityType].DreamLife.tasks end -- 获取家园信息 data.groupInfo = skynet.server.group:GetGroupAllInfo(player) -- log.info('若来任务展示数据' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityDreamLifeTaskShow") s2cData.data = assert(pb.encode("S2CActivityDreamLifeTaskShow", data)) end -- 若来 任务开始 function ActivityDreamLife:TaskStart(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityDreamLifeTaskStart", c2sData.data)) self:CheckActiviTy(player) local data = {} local taskId = c2sData.data.taskId local myPartnerId = player.gameData.partner.id local curDetail = skynet.server.personal:GetDetail(myPartnerId) if not taskId then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else local canDo = true -- local taskInfo = player.gameData.activity[self.ActivityType].DreamLife.tasks[taskId] local taskInfo = {} for k, v in pairs(player.gameData.activity[self.ActivityType].DreamLife.tasks) do if v.status == self.TaskStatus_NoFinish then canDo = false end if taskId == v.id then taskInfo = v end end if canDo then local cfgOneDreamLifeTask = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLifeTask", taskId) if taskInfo.kind == 2 then -- 判断是否加入家园 if curDetail and "" == curDetail.groupId then s2cData.code = errorInfo.ErrorCode.NoUnlockFunc else taskInfo.status = self.TaskStatus_NoFinish taskInfo.finishTime = skynet.GetTime() + cfgOneDreamLifeTask.taskTime * 60 skynet.server.group:SaveDreamLifeTask(player, taskId, taskInfo.finishTime) end elseif taskInfo.kind == 1 then taskInfo.status = self.TaskStatus_NoFinish taskInfo.finishTime = skynet.GetTime() + cfgOneDreamLifeTask.taskTime * 60 end data.taskInfo = taskInfo end end -- log.info('若来任务开始数据' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityDreamLifeTaskStart") s2cData.data = assert(pb.encode("S2CActivityDreamLifeTaskStart", data)) end -- 若来 任务领取奖励 function ActivityDreamLife:TaskGet(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityDreamLifeTaskGet", c2sData.data)) self:CheckActiviTy(player) local data = {} local taskId = c2sData.data.taskId local DreamLife = player.gameData.activity[self.ActivityType].DreamLife data.taskInfo = {} -- 判断任务是否完成 self:CheckTask(player) for k, v in pairs(DreamLife.tasks) do if taskId == v.id and self.TaskStatus_NoGet == v.status then -- 只有状态为任务已完成才能领取 local cfgOneDreamLifeTask = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLifeTask", v.id) local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_108") player:GiveReward(cfgOneDreamLifeTask.taskReward, eventId) v.status = self.TaskStatus_Get v.finishTime = 0 skynet.server.msgTips:Reduce(player, 99) data.taskInfo = v self:CheckShopRedDot(player) 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_ActivityDreamLifeTaskGet") s2cData.data = assert(pb.encode("S2CActivityDreamLifeTaskGet", data)) end -- 若来 商店展示 function ActivityDreamLife:ShopShow(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityDreamLifeShopShow", c2sData.data)) local data = {} local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) local cfgDreamLife = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLife", activityId) data.shopInfos = {} for k, v in pairs(cfgDreamLife.shopGoods) do table.insert(data.shopInfos, { id = v, count = 0, alreadyCount = player.gameData.activity[self.ActivityType].shopInfos[v].limit[2] }) end skynet.server.msgTips:ReduceAll(player, 100) -- data.score = player.gameData.activity[self.ActivityType].score -- log.info('若来商店展示' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityDreamLifeShopShow") s2cData.data = assert(pb.encode("S2CActivityDreamLifeShopShow", data)) end -- 若来 商店兑换 function ActivityDreamLife:ShopGet(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SActivityDreamLifeShopGet", c2sData.data)) local id = c2sData.data.shopInfo.id local count = math.abs(c2sData.data.shopInfo.count) local data = {} local cfgDreamLifeStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "DreamLifeStore") local activityId, startTime, endTime = skynet.server.activity:GetActivityInfo(player, self.ActivityType) local cfgDreamLife = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLife", activityId) -- local Carnival = cfgCarnival[activityId] -- 若来活动相关数据 if player.gameData.activity[self.ActivityType].shopInfos[id].limit[1] ~= 0 and player.gameData.activity[self.ActivityType].shopInfos[id].limit[2] + count > player.gameData.activity[self.ActivityType].shopInfos[id].limit[1] then s2cData.code = errorInfo.ErrorCode.MaxLimit else -- local needScore = cfgDreamLifeStore[id].snailIntegral * count local isSuc = false if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 21) - needScore >= 0 then -- 扣除所需要的蜗蜗积分 skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 21, needScore) isSuc = true end if isSuc then player.gameData.activity[self.ActivityType].shopInfos[id].limit[2] = player.gameData.activity[self.ActivityType].shopInfos[id].limit[2] + count data.shopInfo = { id = id, count = count, alreadyCount = player.gameData.activity[self.ActivityType].shopInfos[id].limit[2] } -- data.score = player.gameData.activity[self.ActivityType].score local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_109") player:GiveReward(cfgDreamLifeStore[id].rewardId, eventId, count) -- skynet.server.msgTips:Reduce(player, 88) local redDot = false for k, v in pairs(cfgDreamLife.shopGoods) do if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 21) >= cfgDreamLifeStore[v].snailIntegral then redDot = true end end if not redDot then skynet.server.msgTips:ReduceAll(player, 100) end else s2cData.code = errorInfo.ErrorCode.NoEnoughPoint end end -- log.info('若来商店兑换' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityDreamLifeShopGet") s2cData.data = assert(pb.encode("S2CActivityDreamLifeShopGet", data)) end skynet.server.activityDreamLife = ActivityDreamLife return ActivityDreamLife