443 lines
20 KiB
Lua
443 lines
20 KiB
Lua
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
|