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

391 lines
13 KiB
Lua
Raw Permalink 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 json =require "json"
local dataType = require "DataType"
local ActivityLimitedAccum = oo.class()
ActivityLimitedAccum.ActivityType = dataType.ActivityType_LimitedAccum
--构造函数
function ActivityLimitedAccum:Init()
end
-- 每次登录需要进行修改的数据
function ActivityLimitedAccum:LoginInitData(player)
--判断模块是否开启
if not player:IsUnlockSystem( dataType.UnlockSystem_DesignHouse ) then
log.debug("限时累充模块未开启")
return
end
--活动结束
local cfgLimitedAccum = self:CheckDataAndGetActivity(player)
if cfgLimitedAccum == nil then
log.debug("限时累充活动已结束")
return
end
--迁移数据
self:PortalData(player)
-- 处理红点
skynet.server.msgTips:Reset(player, 94)
log.debug("限时累充活动进行中")
end
--移植老的活动数据
function ActivityLimitedAccum:PortalData(player)
--不存在数据直接返回
if player.gameData.design == nil or player.gameData.design.timeCardPoints == nil then
return
end
for activityId, oldValue in pairs(player.gameData.design.timeCardPoints) do
--local activityId =oldValue.raffleId
if player.gameData.LimitedAccumMap[activityId] == nil then
player.gameData.LimitedAccumMap[activityId]={}
end
--是否导入
if player.gameData.LimitedAccumMap[activityId].isPortal then
goto continue
end
if player.gameData.LimitedAccumMap[activityId].pointsInfo == nil then
player.gameData.LimitedAccumMap[activityId].pointsInfo={}
end
player.gameData.LimitedAccumMap[activityId].activityId = activityId
player.gameData.LimitedAccumMap[activityId].LoginDate = skynet.GetTime() --登录天数
--处理积分
if player.gameData.LimitedAccumMap[activityId].points ~=nil
and player.gameData.LimitedAccumMap[activityId].points > 0 then
player.gameData.LimitedAccumMap[activityId].points=player.gameData.LimitedAccumMap[activityId].points+oldValue.points
else
player.gameData.LimitedAccumMap[activityId].points=oldValue.points
end
if oldValue.pointsInfo ~= nil then
for _, points in pairs(oldValue.pointsInfo) do
local isExist = false
for index, temp in ipairs(player.gameData.LimitedAccumMap[activityId].pointsInfo) do
if temp.id == points.id then
isExist = true
if player.gameData.LimitedAccumMap[activityId].pointsInfo[index].isGet ~=2 then
player.gameData.LimitedAccumMap[activityId].pointsInfo[index].isGet = points.isGet
end
break
end
end
if not isExist then
table.insert(player.gameData.LimitedAccumMap[activityId].pointsInfo, points)
end
end
end
--升序排序
table.sort(player.gameData.LimitedAccumMap[activityId].pointsInfo,function(a,b)
return a.id < b.id
end)
--判断积分是否达到可以领取对应的积分奖励
local cfgLimitedAccum = skynet.server.gameConfig:GetPlayerCurCfg( player , "LimitedAccum" , activityId )
for index ,v1 in ipairs(player.gameData.LimitedAccumMap[activityId].pointsInfo) do
if player.gameData.LimitedAccumMap[activityId].points >= cfgLimitedAccum.value[index] and v1.isGet == 0 then
player.gameData.LimitedAccumMap[activityId].pointsInfo[index].isGet = 1--修改为可以领取
end
end
--标记已经导入
player.gameData.LimitedAccumMap[activityId].isPortal = true
::continue::
end
end
--初始玩家数据,返回活动信息,
function ActivityLimitedAccum:CheckDataAndGetActivity(player)
--默认空活动
local cfgLimitedAccum = nil
if player==nil then
log.debug("限时累充CheckDataAndGetActivity player is nil")
return cfgLimitedAccum
end
--判断等级是否开启
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivitySignPack) then
log.debug("限时累充等级不足")
return cfgLimitedAccum
end
--获取开启的活动
local activityId, _, _, _ = activity:GetActivityInfo(player, ActivityLimitedAccum.ActivityType)
--没有开启的活动
if activityId == 0 then
log.debug("限时累充未开启-未获取到有效的活动1")
return cfgLimitedAccum
end
--初始化
if player.gameData.LimitedAccumMap==nil then
player.gameData.LimitedAccumMap={}
end
--获取活动配置
cfgLimitedAccum=self:GetLimitedAccumConfig(player,activityId)
--未获取到有效的活动
if cfgLimitedAccum == nil then
log.debug("限时累充未开启-未获取到有效的活动2")
return cfgLimitedAccum
end
--如果玩家已经存在活动不需要检查
if player.gameData.LimitedAccumMap[activityId] then
player.gameData.LimitedAccumMap[activityId].LoginDate = skynet.GetTime() --更新登录时间 补发奖励用
return cfgLimitedAccum
end
--存在活动初始化玩家数据
local LimitedAccum = {}
LimitedAccum.activityId = cfgLimitedAccum.id
LimitedAccum.points = 0--灵感积分
LimitedAccum.LoginDate = skynet.GetTime() --登录天数
LimitedAccum.pointsInfo = {} --奖励列表
for index, _ in ipairs(cfgLimitedAccum.value) do
table.insert(LimitedAccum.pointsInfo, {id = index, isGet = 0}) --0 不可领取 1 可以领取 2 已领取
end
--更新缓存
player.gameData.LimitedAccumMap[activityId] = LimitedAccum
return cfgLimitedAccum
end
--可领取奖励列表
function ActivityLimitedAccum:IfConDrawReward(player)
--不存在开启的活动
local cfgLimitedAccum=self:CheckDataAndGetActivity(player)
--活动未开启
if cfgLimitedAccum == nil then
log.debug("限时累充未开启-未获取到有效的活动")
return cfgLimitedAccum
end
--获取玩家信息
local activityId, _, _, _ = activity:GetActivityInfo(player, ActivityLimitedAccum.ActivityType)
local limitedAccum = player.gameData.LimitedAccumMap[activityId]
for _, v1 in pairs(limitedAccum.pointsInfo) do
if v1.isGet == 1 then
return true
end
end
return false
end
--获取配置信息
function ActivityLimitedAccum:GetLimitedAccumConfig(player,activityId)
local cfLimitedAccum = nil
--获取该活动的默认初始关卡
local cfLimitedAccums=skynet.server.gameConfig:GetPlayerAllCfg(player, "LimitedAccum")
if cfLimitedAccums==nil then
log.debug("cfLimitedAccums is nil")
return cfLimitedAccum
end
for index, value in pairs(cfLimitedAccums) do
if value.id==activityId then
cfLimitedAccum=value
break
end
end
return cfLimitedAccum
end
--是否付费签到
function ActivityLimitedAccum:Pay(player,storeId)
--检查显示是否开启
local cfgLimitedAccum=self:CheckDataAndGetActivity(player)
if cfgLimitedAccum == nil then
return
end
--对应限时累充数据修改
--找到对应礼包充值价格
local packPrice = 0
local cfgAllStorePrice = skynet.server.gameConfig:GetPlayerAllCfg( player , "StorePrice")
for k , v in pairs(cfgAllStorePrice) do
if v.storePackId == storeId then
packPrice = v.price
break
end
end
--获取玩家信息
local activityId, _, _, _ = activity:GetActivityInfo(player, ActivityLimitedAccum.ActivityType)
local limitedAccum = player.gameData.LimitedAccumMap[activityId]
--修改玩家的卡池累充额度
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue" )
limitedAccum.points = limitedAccum.points + packPrice/100 * cfgSValue.valueAccumulatePoint
--判断积分是否达到可以领取对应的积分奖励
local cfgLimitedAccum = skynet.server.gameConfig:GetPlayerCurCfg( player , "LimitedAccum" , activityId )
for index ,v1 in ipairs(limitedAccum.pointsInfo) do
if limitedAccum.points >= cfgLimitedAccum.value[index] and v1.isGet == 0 then
v1.isGet = 1 --修改为可以领取
end
end
if self:IfConDrawReward(player) then
skynet.server.msgTips:Add(player , 94) --同时添加对应红点
end
--通知客户端
local data = {}
data.points = limitedAccum.points
skynet.server.gameServer:SendMsgToUser(player.userId, "CMD_S2C_ActivityLimitedAccumPointChange", data)
end
--添加积分
function ActivityLimitedAccum:AddPoints(player,points)
--新版累充积分
local activityId, _, _, _ = activity:GetActivityInfo(player, dataType.ActivityType_LimitedAccum)
if activityId == 0 then
return
end
if player.gameData.LimitedAccumMap == nil then
player.gameData.LimitedAccumMap={}
end
if player.gameData.LimitedAccumMap[activityId] == nil then
player.gameData.LimitedAccumMap[activityId]={}
end
local limitedAccum = player.gameData.LimitedAccumMap[activityId]
if limitedAccum.points == nil then
limitedAccum.points=0
end
limitedAccum.points = limitedAccum.points + points
--判断积分是否达到可以领取对应的积分奖励
local cfgLimitedAccum = skynet.server.gameConfig:GetPlayerCurCfg( player , "LimitedAccum" , activityId )
for index ,v1 in ipairs(limitedAccum.pointsInfo) do
if limitedAccum.points >= cfgLimitedAccum.value[index] and v1.isGet == 0 then
v1.isGet = 1 --修改为可以领取
end
end
--通知客户端
local data = {}
data.points = limitedAccum.points
skynet.server.gameServer:SendMsgToUser(player.userId, "CMD_S2C_ActivityLimitedAccumPointChange", data)
end
--限时累积充值展示
function ActivityLimitedAccum:TimePointsShow( player , c2sData ,s2cData )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimePointsShow")
c2sData.data = assert(pb.decode("C2SDesignTimePointsShow", c2sData.data ))
local data = {}
--检查显示是否开启
local cfgLimitedAccum=self:CheckDataAndGetActivity(player)
if cfgLimitedAccum == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
--获取玩家信息
local activityId, _, _, _ = activity:GetActivityInfo(player, ActivityLimitedAccum.ActivityType)
local limitedAccum = player.gameData.LimitedAccumMap[activityId]
data.points = limitedAccum.points
data.pointsInfos = {}
for k1 ,v1 in pairs(limitedAccum.pointsInfo) do
table.insert(data.pointsInfos , v1)
end
data.accumId = limitedAccum.activityId
s2cData.data = assert(pb.encode("S2CDesignTimePointsShow", data))
end
--限时累积充值获取
function ActivityLimitedAccum:TimePointsGet( player , c2sData ,s2cData )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimePointsGet")
c2sData.data = assert(pb.decode("C2SDesignTimePointsGet", c2sData.data ))
local id = c2sData.data.id
local data = {}
data.id = id
data.pointsInfos = {}
--检查显示是否开启
local cfgLimitedAccum=self:CheckDataAndGetActivity(player)
if cfgLimitedAccum == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
--获取玩家信息
local activityId, _, _, _ = activity:GetActivityInfo(player, ActivityLimitedAccum.ActivityType)
local limitedAccum = player.gameData.LimitedAccumMap[activityId]
local cfgLimitedAccum = skynet.server.gameConfig:GetPlayerCurCfg( player , "LimitedAccum" , limitedAccum.activityId )
for index ,v1 in ipairs(limitedAccum.pointsInfo) do
if v1.id == id and v1.isGet == 1 then
--进行发放奖励
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_107")
player:GiveReward(cfgLimitedAccum.rewardId[index], eventId , 1)
v1.isGet = 2
end
table.insert(data.pointsInfos,v1)
end
if not self:IfConDrawReward(player) then
skynet.server.msgTips:ReduceAll(player , 94)
end
data.accumId = limitedAccum.activityId
s2cData.data = assert(pb.encode("S2CDesignTimePointsGet", data))
end
skynet.server.activityLimitedAccum = ActivityLimitedAccum
return ActivityLimitedAccum