HomeServer/Server/AllServer/GameServer/Activity/ActivityDreamLife.lua

443 lines
20 KiB
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
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