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

502 lines
21 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 json = require "json"
local ActivityFlipCard = oo.class(activity)
ActivityFlipCard.ActivityType = dataType.ActivityType_FlipCard
ActivityFlipCard.TaskType_Daily = 1 -- 每日任务
ActivityFlipCard.TaskType_Normal = 2 -- 常规任务
function ActivityFlipCard:Init()
end
-- 玩家翻翻乐数据初始化
function ActivityFlipCard:InitData(player, activityType)
-- 翻翻乐数据
local activityId, startTime, endTime = self:GetActivityInfo(player, activityType)
local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity")
local level = 0
for k, v in pairs(cfgActivity) do
if v.activityType == dataType.ActivityType_FlipCard then -- 活动翻翻乐
level = v.level
break
end
end
-- 是否存在数据
if player.gameData.activity[activityType] ~= nil--存在玩家活动数据
and next(player.gameData.activity[activityType])
and player.gameData.activity[activityType].flipCardId == activityId then--活动id相同说明已经初始化过数据了
return
end
--是否需要初始化
if activityId > 0 and player.gameData.level >= level then
-- 玩家对应配置
local cfgFlipCards = skynet.server.gameConfig:GetPlayerCurCfg(player, "FlipCards", activityId)
local cfgCardTask = skynet.server.gameConfig:GetPlayerAllCfg(player, "FlipCardsTask")
local cfgCardLevel = skynet.server.gameConfig:GetPlayerAllCfg(player, "FlipCardsLevel")
player.gameData.activity[activityType]={}--清理以往的活动数据
player.gameData.activity[activityType].flipCardId = activityId -- 本次活动id
player.gameData.activity[activityType].activeValue = 0 -- 活跃值
player.gameData.activity[activityType].nowFlipCardData = {} -- 本次游戏数据
player.gameData.activity[activityType].cardTasks = {} -- 活跃值任务
player.gameData.activity[activityType].flipCardInfos = {} -- 玩家翻翻乐的相关信息
for i = 1, #cfgFlipCards.cardsLevelId, 1 do
local levelId =cfgFlipCards.cardsLevelId[i]
player.gameData.activity[activityType].flipCardInfos[i] = {}
player.gameData.activity[activityType].flipCardInfos[i].id = levelId -- 当前关卡等级
player.gameData.activity[activityType].flipCardInfos[i].needActValue = cfgCardLevel[levelId].activeValue -- 当前关卡需要的活跃值
if i == 1 then
player.gameData.activity[activityType].flipCardInfos[i].status = 1 -- 当前关卡状态 0 未解锁 1已解锁 2已完成
player.gameData.activity[activityType].nowFlipCardData.id = 1
else
player.gameData.activity[activityType].flipCardInfos[i].status = 0 -- 当前关卡状态 0 未解锁 1已解锁 2已完成
end
end
for k, v in pairs(cfgCardTask) do
-- 任务数据 id , 任务类型 , 进度 , 状态
table.insert(player.gameData.activity[activityType].cardTasks, {
id = v.id,
type = v.taskType,
progress = 0,
status = skynet.server.task.TaskStatus_NoComplete
})
end
-- 本次游戏数据初始
player.gameData.activity[activityType].nowFlipCardData.gameEndTime = 0
end
end
-- 每次登录需要进行修改的数据
function ActivityFlipCard:LoginInitData(player)
-- 重置翻翻乐红点
skynet.server.msgTips:Reset(player, 102)
skynet.server.msgTips:Reset(player, 103)
--检查是否需要清理过期道具
self:CheckFlipCardGoods(player)
-- 检查应该初始还是结束活动
local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity")
-- 翻翻乐数据
local activityId, startTime, endTime = self:GetActivityInfo(player, self.ActivityType)
--活动未开启
if activityId == 0 then
return
end
local level = 0
for k, v in pairs(cfgActivity) do
if v.activityType == dataType.ActivityType_FlipCard then -- 活动翻翻乐
level = v.level
break
end
end
if player.gameData.level >= level then
--检查初始化
self:InitData(player, self.ActivityType)
if player.gameData.activity[self.ActivityType]
and next(player.gameData.activity[self.ActivityType]) ~= nil and
player.gameData.activity[self.ActivityType].flipCardId ~= nil then
-- 判断该活动是否到期
if skynet.GetTime() > endTime or activityId > player.gameData.activity[self.ActivityType].flipCardId then
-- player.gameData.activity[self.ActivityType].id = v.id -- 记录该活动的id
-- 初始玩家数据
player.gameData.activity[self.ActivityType] = {}
else
-- 红点系统
if player.gameData.activity[self.ActivityType] and next(player.gameData.activity[self.ActivityType]) ~= nil then
self:CheckFlipCardLevel(player)
-- 有关卡可以挑战时 添加对应红点
for k, v in pairs(player.gameData.activity[self.ActivityType].flipCardInfos) do
if v.status == 1 then
skynet.server.msgTips:AddNoNotice(player, 103)
end
end
-- 有活跃值可以领取时 添加对应红点
for k, v in pairs(player.gameData.activity[self.ActivityType].cardTasks) do
if v.status == skynet.server.task.TaskStatus_AlreadyComplete then
skynet.server.msgTips:AddNoNotice(player, 102)
end
end
end
end
end
end
end
--检查是否需要清理过期道具
function ActivityFlipCard:CheckFlipCardGoods(player)
-- 翻翻乐数据
local activityId, _, _,_ = self:GetActivityInfo(player, self.ActivityType)
--没有活动数据,直接返回
if not player.gameData.activity[self.ActivityType] or next(player.gameData.activity[self.ActivityType]) == nil then
if activityId <= 0 then
local cfgFliCars= skynet.server.gameConfig:GetPlayerAllCfg(player, "FlipCards")
for _, cfgFliCar in ipairs(cfgFliCars) do
local goodsCount=skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop, cfgFliCar.ticketId)
if goodsCount > 0 then
log.info(string.format("清理过期玫瑰卡牌数据2道具id%d数量:%d",cfgFliCar.ticketId,goodsCount))
--扣除道具
skynet.server.bag:RemoveGoods(player,dataType.GoodsType_Prop, cfgFliCar.ticketId ,goodsCount)--扣除玫瑰卡片
end
end
end
return
end
--活动不相等
if player.gameData.activity[self.ActivityType].flipCardId ~= activityId then
local cfgFliCar= skynet.server.gameConfig:GetPlayerCurCfg(player, "FlipCards", player.gameData.activity[self.ActivityType].flipCardId)
if cfgFliCar ~= nil then
local goodsCount=skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop, cfgFliCar.ticketId)
if goodsCount > 0 then
--log.info(string.format("清理过期玫瑰卡牌数据2活动id:%d,道具id%d数量:%d",player.gameData.activity[self.ActivityType].flipCardId,cfgFliCar.ticketId ,goodsCount))
--扣除道具
skynet.server.bag:RemoveGoods(player,dataType.GoodsType_Prop, cfgFliCar.ticketId ,goodsCount)--扣除玫瑰卡片
end
end
player.gameData.activity[self.ActivityType] = {}
end
end
-- 翻翻乐 展示
function ActivityFlipCard:Show(player, c2sData, s2cData)
c2sData.data = assert(pb.decode("C2SActivityFlipCardShow", c2sData.data))
local data = {}
-- 判断一下是否需要初始化玩家数据
--if player.gameData.activity[self.ActivityType] == nil or next(player.gameData.activity[self.ActivityType]) == nil then
self:InitData(player, self.ActivityType)
--end
self:CheckFlipCardLevel(player)
-- 玩家翻翻乐的相关信息
data.flipCardInfos = {}
for k, v in pairs(player.gameData.activity[self.ActivityType].flipCardInfos) do
table.insert(data.flipCardInfos, v)
end
s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityFlipCardShow")
s2cData.data = assert(pb.encode("S2CActivityFlipCardShow", data))
end
-- 翻翻乐 开始游戏
function ActivityFlipCard:Start(player, c2sData, s2cData)
c2sData.data = assert(pb.decode("C2SActivityFlipCardStart", c2sData.data))
local data = {}
local id = c2sData.data.id -- 翻翻乐关卡id
local cfgCardLevel = skynet.server.gameConfig:GetPlayerAllCfg(player, "FlipCardsLevel")
for k, v in pairs(player.gameData.activity[self.ActivityType].flipCardInfos) do
if v.id == id and v.status == 1 then
-- local cfgFlipCards = skynet.server.gameConfig:GetPlayerAllCfg(player, "FlipCards",
-- player.gameData.activity[self.ActivityType].flipCardId)
player.gameData.activity[self.ActivityType].nowFlipCardData.id = id
player.gameData.activity[self.ActivityType].nowFlipCardData.gameEndTime = skynet.GetTime() + cfgCardLevel[id].levelTime
end
end
data.id = id
data.endTime = player.gameData.activity[self.ActivityType].nowFlipCardData.gameEndTime
s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityFlipCardStart")
s2cData.data = assert(pb.encode("S2CActivityFlipCardStart", data))
end
-- 翻翻乐 完成翻翻乐
function ActivityFlipCard:Finish(player, c2sData, s2cData)
c2sData.data = assert(pb.decode("C2SActivityFlipCardFinish", c2sData.data))
local data = {}
local isFinish = c2sData.data.isFinish -- 是否完成翻翻乐
-- 判断当前时间是否完成
-- if isFinish and skynet.GetTime() < player.gameData.activity[self.ActivityType].nowFlipCardData.gameEndTime then
if isFinish then
-- 完成游戏 发放对应奖励
local cfgCardLevel = skynet.server.gameConfig:GetPlayerAllCfg(player, "FlipCardsLevel")
local rewardId = cfgCardLevel[player.gameData.activity[self.ActivityType].nowFlipCardData.id].levelReward
-- 发放对应奖励
local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_112")
local id = player.gameData.activity[self.ActivityType].nowFlipCardData.id -- 当前关卡id
--查找索引
for index, value in ipairs(player.gameData.activity[self.ActivityType].flipCardInfos) do
if value.id == id then
player.gameData.activity[self.ActivityType].flipCardInfos[index].status = skynet.server.task.TaskStatus_AlreadyComplete
break
end
end
player:GiveReward(rewardId, eventId, 1)
data.rewardId = rewardId
-- 有关卡可以挑战时 添加对应红点
local redDot = false
for k, v in pairs(player.gameData.activity[self.ActivityType].flipCardInfos) do
if v.status == 1 then
redDot = true
end
end
if not redDot then
skynet.server.msgTips:ReduceAll(player, 103)
end
--检查是否有新的关卡开启
self:CheckFlipCardLevel(player)
end
-- 初始游戏数据
player.gameData.activity[self.ActivityType].nowFlipCardData.gameEndTime = 0
s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityFlipCardFinish")
s2cData.data = assert(pb.encode("S2CActivityFlipCardFinish", data))
end
-- 翻翻乐 任务展示
function ActivityFlipCard:TaskShow(player, c2sData, s2cData)
c2sData.data = assert(pb.decode("C2SActivityFlipCardTaskShow", c2sData.data))
local data = {}
data.taskInfos = self:GetShowTaskData(player)
-- log.info('翻翻乐任务展示', skynet.server.common:TableToString(data))
s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityFlipCardTaskShow")
s2cData.data = assert(pb.encode("S2CActivityFlipCardTaskShow", data))
end
-- 翻翻乐 任务获取
function ActivityFlipCard:TaskGet(player, c2sData, s2cData)
c2sData.data = assert(pb.decode("C2SActivityFlipCardTaskGet", c2sData.data))
local data = {}
local taskId = c2sData.data.taskId -- 任务id
local activityId, startTime, endTime = self:GetActivityInfo(player, self.ActivityType)
-- 玩家对应配置
local cfgFlipCards = skynet.server.gameConfig:GetPlayerCurCfg(player, "FlipCards", activityId)
for k, v in pairs(player.gameData.activity[self.ActivityType].cardTasks) do
if v.id == taskId and v.status == skynet.server.task.TaskStatus_AlreadyComplete then
-- 完成任务 修改对应数据
local cfgCardTask = skynet.server.gameConfig:GetPlayerCurCfg(player, "FlipCardsTask", v.id)
-- player.gameData.activity[self.ActivityType].activeValue =
-- player.gameData.activity[self.ActivityType].activeValue + cfgCardTask.point
skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, cfgFlipCards.ticketId, cfgCardTask.point)
v.status = skynet.server.task.TaskStatus_AlreadyGet
skynet.server.msgTips:Reduce(player, 102)
self:CheckFlipCardLevel(player)
log.debug(string.format("玩家 %d 翻翻乐 任务完成领取积分 任务ID %d", player.userId, taskId))
break
end
end
data.taskId = taskId
data.taskInfos = self:GetShowTaskData(player)
-- data.activeValue = player.gameData.activity[self.ActivityType].activeValue
s2cData.cmd = pb.enum("MsgType", "CMD_S2C_ActivityFlipCardTaskGet")
s2cData.data = assert(pb.encode("S2CActivityFlipCardTaskGet", data))
end
-- 翻翻乐 修改任务 kind 任务类型 count 数值
function ActivityFlipCard:Modify(player, kind, count)
-- 如果没有开启的翻翻乐 则返回
local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity")
local activityId, startTime, endTime = self:GetActivityInfo(player, self.ActivityType)
if activityId == 0 then
return
end
local level = 0
for k, v in pairs(cfgActivity) do
if v.activityType == dataType.ActivityType_FlipCard then -- 活动翻翻乐
level = v.level
break
end
end
--if player.gameData.activity[self.ActivityType] == nil and player.gameData.level > level then
self:InitData(player, self.ActivityType)
--end
if not player.gameData.activity[self.ActivityType] or not player.gameData.activity[self.ActivityType].cardTasks then
return
end
log.debug(string.format("玩家 %d 翻翻乐 任务修改 种类 %d 数量 %d", player.userId, kind, count))
for k, v in pairs(player.gameData.activity[self.ActivityType].cardTasks) do
if v.type == kind and v.status == skynet.server.task.TaskStatus_NoComplete then
-- 获取最大进度
local cfgCardTask = skynet.server.gameConfig:GetPlayerCurCfg(player, "FlipCardsTask", v.id)
local maxProgress = cfgCardTask.value
v.progress = v.progress + count
-- 检查是否完成任务
if v.progress >= maxProgress then
if skynet.server.task.TaskStatus_NoComplete == v.status then
skynet.server.msgTips:Add(player, 102)
end
v.status = skynet.server.task.TaskStatus_AlreadyComplete
v.progress = maxProgress
log.debug(string.format("玩家 %d 翻翻乐 任务修改 种类 %d 数量 %d", player.userId, kind,
count))
end
end
end
end
-- 翻翻乐 获取可以显示的任务
function ActivityFlipCard:GetShowTaskData(player)
local data = {}
-- 翻翻乐数据
local activityId, startTime, endTime = self:GetActivityInfo(player, self.ActivityType)
-- 没有开启的活动
if activityId <= 0 then
return data
end
local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity")
for k, v in pairs(player.gameData.activity[self.ActivityType].cardTasks) do
-- 未完成和已完成才会显示
for k1, v1 in pairs(cfgActivity) do
if v1.activityType == dataType.ActivityType_FlipCard and v1.level <= player.gameData.level and v1.activityId == activityId then
-- if skynet.server.task.TaskStatus_AlreadyGet == v.status then
table.insert(data, {
id = v.id,
progress = v.progress,
status = v.status
})
-- end
end
end
end
-- 将完成的任务排到最后
local sortData = {}
for k, v in pairs(data) do
if skynet.server.task.TaskStatus_AlreadyGet ~= v.status then
-- if v.id == 15 then
-- -- 判断玩家的家园如果是满级的话就不刷新这个任务出来
-- local groupId = skynet.server.group:GetGroupID(player)
-- local groupInfo = skynet.server.group:GetGroup(groupId)
-- if groupId and groupInfo ~= nil then
-- -- log.info('if23123123',groupId)
-- if groupInfo.communityLevel == 5 and skynet.server.task.TaskStatus_NoComplete == v.status then
-- else
-- table.insert(sortData, v)
-- end
-- else
-- -- log.info('else111',groupId)
-- table.insert(sortData, v)
-- end
-- else
table.insert(sortData, v)
--end
end
end
for k, v in pairs(data) do
if skynet.server.task.TaskStatus_AlreadyGet == v.status then
table.insert(sortData, v)
end
end
data = sortData
return data
end
-- 翻翻乐 检查是否有新的关卡解锁
function ActivityFlipCard:CheckFlipCardLevel(player)
local cfgCardLevel = skynet.server.gameConfig:GetPlayerAllCfg(player, "FlipCardsLevel")
local id =player.gameData.activity[self.ActivityType].nowFlipCardData.id
local indexId = 0
--查找索引
for index, value in ipairs(player.gameData.activity[self.ActivityType].flipCardInfos) do
if value.id == id then
indexId =index
break
end
end
--没有下一个关卡
if indexId == 0 then
return
end
local activityId, startTime, endTime = self:GetActivityInfo(player, self.ActivityType)
--活动未开启
if activityId == 0 then
return
end
-- 玩家对应配置
local cfgFlipCards = skynet.server.gameConfig:GetPlayerCurCfg(player, "FlipCards", activityId)
if player.gameData.activity[self.ActivityType].flipCardInfos[indexId].status == skynet.server.task.TaskStatus_AlreadyComplete then
local atId = player.gameData.activity[self.ActivityType].nowFlipCardData.id
--查找下一个节点
local nextId = 0
for _, value in ipairs(cfgFlipCards.cardsLevelId) do
if value > atId and (nextId > value or nextId ==0 )then
nextId = value
end
end
--是否没有下一关卡
if nextId == 0 then
return
end
--更新下一个节点id
player.gameData.activity[self.ActivityType].nowFlipCardData.id = nextId
-- if player.gameData.activity[self.ActivityType].nowFlipCardData.id < 8 then
-- player.gameData.activity[self.ActivityType].nowFlipCardData.id = player.gameData.activity[self.ActivityType].nowFlipCardData.id + 1
-- end
end
-- 判断积分解锁关卡
if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, cfgFlipCards.ticketId) >=
cfgCardLevel[player.gameData.activity[self.ActivityType].nowFlipCardData.id].activeValue
and player.gameData.activity[self.ActivityType].flipCardInfos[indexId].status == 0 then
player.gameData.activity[self.ActivityType].flipCardInfos[indexId].status = skynet.server.task.TaskStatus_NoComplete
end
end
-- -- 翻翻乐 检查是否有新的关卡解锁
-- function ActivityFlipCard:RedDotCheck(player)
-- end
-- 定义一个回调函数
local function onEventFired(player , taskId , count)
--翻翻乐
ActivityFlipCard:Modify(player,taskId,count)
end
-- 注册事件处理函数
taskListEvent:Register(onEventFired,"翻翻乐任务")
skynet.server.activityFlipCard = ActivityFlipCard
return ActivityFlipCard