HomeServer/Server/AllServer/GameServer/Activity/ActivityCarnival.lua
2024-11-20 15:41:37 +08:00

510 lines
22 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 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