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