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

658 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 json =require "json"
local dataType = require "DataType"
local taskListEvent = require "TaskListEvent"
local ActivityReplicaStore = oo.class()
ActivityReplicaStore.ActivityType = dataType.ActivityType_ActivityReplicaStore
--构造函数
function ActivityReplicaStore:Init()
end
-- 每次登录需要进行修改的数据
function ActivityReplicaStore:LoginInitData(player)
--功能未开启
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivityReplicaStore ) then
log.debug("复刻商店未开启-等级不足")
return
end
--检查补发
self:CheckSettle(player)
--活动是否开启
if not self:CheckDataAndGetActivity(player) then
log.debug("复刻商店未开启")
return
end
-- 处理红点
--skynet.server.msgTips:Reset(player, 116)
log.debug("复刻商店活动进行中")
self:Show(player,{},{})
end
--检查结算
function ActivityReplicaStore:CheckSettle(player)
--补发奖励
if player.gameData.ReplicaStoreMap ==nil or not next(player.gameData.ReplicaStoreMap) then
log.debug("复刻商店未开启")
return
end
--获取开启的活动
local openActivityId,_, _, _ = activity:GetActivityInfo(player, ActivityReplicaStore.ActivityType)
for activityId, replicaStore in pairs(player.gameData.ReplicaStoreMap) do
--是否已经结算,活动是否开启
if replicaStore.isSettle or activityId == openActivityId then
goto continue
end
--获取活动配置
local cfgReplicaStoreList=self:GetReplicaStoreConfig(player,activityId)
--补发奖励id
local rewards={}
for _, value in ipairs(replicaStore.packList) do
--已经领取,或者不满足
if value.isDrawFreeReward or value.unlockNumb > replicaStore.SpendingGoldNum then
goto continue1
end
for _, cfgReplicaStore in ipairs(cfgReplicaStoreList) do
if value.unlockNumb == cfgReplicaStore.unlockNumb then
table.insert(rewards,cfgReplicaStore.freeReward)
break
end
end
::continue1::
end
replicaStore.isSettle=true
--是否需要补发奖励
if next(rewards) then
skynet.server.mail:AddNewMail( player , skynet.server.mail.MailType_Award,"好礼接力奖励补发", "本次时光商店活动已经结束,小蜗们忘记领取的奖励已经通过邮件发放咯,请小蜗们及时领取~", rewards, true)
end
::continue::
end
end
--初始玩家数据,返回活动信息,
function ActivityReplicaStore:CheckDataAndGetActivity(player)
--默认空活动
local playerReplicaStore = nil
if player==nil then
log.debug("复刻商店未开启")
return playerReplicaStore
end
--判断等级是否开启
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivityReplicaStore) then
log.debug("复刻商店等级不足")
return playerReplicaStore
end
--获取开启的活动
local activityId,_, _, id = activity:GetActivityInfo(player, ActivityReplicaStore.ActivityType)
--没有开启的活动
if activityId == 0 then
return playerReplicaStore
end
--初始化
if player.gameData.ReplicaStoreMap==nil then
player.gameData.ReplicaStoreMap={}
end
--获取活动配置
local cfgReplicaStoreList=self:GetReplicaStoreConfig(player,activityId)
--未获取到有效的活动
if cfgReplicaStoreList == nil then
log.debug("复刻商店未开启-未获取到有效的活动2")
return playerReplicaStore
end
--如果玩家已经存在活动不需要检查
if player.gameData.ReplicaStoreMap[activityId] then
playerReplicaStore=player.gameData.ReplicaStoreMap[activityId]
--删除过期活动,减少数据产生
local removeKeyList = {}
for exceedActivityId, value in pairs(player.gameData.ReplicaStoreMap) do
if exceedActivityId ~= activityId and value.id ~= id then
table.insert(removeKeyList, exceedActivityId)
end
end
if next(removeKeyList) then
for _, removeKey in ipairs(removeKeyList) do
player.gameData.ReplicaStoreMap[removeKey]=nil
end
end
return playerReplicaStore
end
--存在活动初始化玩家数据
local playerActivityReplicaStore = {}
playerActivityReplicaStore.id = id
playerActivityReplicaStore.activityId = activityId
playerActivityReplicaStore.SpendingGoldNum = 0
--是否结算
playerActivityReplicaStore.isSettle = false
--礼包信息
playerActivityReplicaStore.packList={}
for _, cfgReplicaStore in ipairs(cfgReplicaStoreList) do
--添加信息,,--解锁条件【这里当成id使用】是否领取免费奖励已经选择的奖励列表
table.insert(playerActivityReplicaStore.packList,{unlockNumb=cfgReplicaStore.unlockNumb,isDrawFreeReward=false,selectRewardList={},buyNum = 0})
end
--更新缓存
player.gameData.ReplicaStoreMap[activityId] = playerActivityReplicaStore
--添加红点
skynet.server.msgTips:Add(player, 124)
return playerActivityReplicaStore
end
--获取配置信息
function ActivityReplicaStore:GetReplicaStoreConfig(player,activityId)
local cfgcfgReplicaStoreList={}
--获取该活动的默认初始关卡
local cfgReplicaStore=skynet.server.gameConfig:GetPlayerAllCfg(player, "ReplicaStore")
if cfgReplicaStore==nil then
log.debug("cfgReplicaStore is nil")
return cfgcfgReplicaStoreList
end
for _, value in pairs(cfgReplicaStore) do
if value.activityId==activityId then
table.insert(cfgcfgReplicaStoreList,value)
end
end
--对cfgcfgReplicaStoreList进行升序
table.sort(cfgcfgReplicaStoreList, function(a, b)
return a.unlockNumb < b.unlockNumb
end)
return cfgcfgReplicaStoreList
end
--是否可以免费领取
function ActivityReplicaStore:isCanDraw( player)
--活动是否开启
local playerReplicaStore =self:CheckDataAndGetActivity(player)
if playerReplicaStore ==nil then
return false
end
for _, value in ipairs(playerReplicaStore.packList) do
if value.unlockNumb <= playerReplicaStore.SpendingGoldNum and not value.isDrawFreeReward then
return true
end
end
return false
end
--礼包充值
function ActivityReplicaStore:Charge( player , storeId )
--检查并且获取活动信息
local playerReplicaStore=self:CheckDataAndGetActivity(player)
if playerReplicaStore == nil then
return
end
--获取配置
local cfgReplicaStoreList=self:GetReplicaStoreConfig(player,playerReplicaStore.activityId)
local cfgReplicaStore=nil
for _, value in ipairs(cfgReplicaStoreList) do
if value.storepackId == storeId then
cfgReplicaStore=value
break
end
end
if cfgReplicaStore == nil then
return
end
for _, value in pairs(playerReplicaStore.packList) do
if value.unlockNumb == cfgReplicaStore.unlockNumb then
--选择奖励
local rewardStrList=value.selectRewardList
--未选择的情况
if not next(rewardStrList) then
for _, object in ipairs(cfgReplicaStore.storeObject) do
table.insert(rewardStrList,object)
if #rewardStrList >= cfgReplicaStore.buyNumb then
break
end
end
end
--发奖
for _, rewardStr in ipairs(rewardStrList) do
local tmp = skynet.server.common:Split( rewardStr ,"_" )
local goodsType=tonumber(tmp[ 1 ])
local id = tonumber(tmp[ 2 ])
local give,replaceRewardId = player:RewardConversion(id , goodsType)
if give then
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_145")
player:GiveReward(replaceRewardId , eventId , 1)
else
--是否是头像/头像框
if goodsType == dataType.GoodsType_HeadAndHeadFrame then
local cfgOneHead = skynet.server.gameConfig:GetPlayerCurCfg( player , "Head" , id)
skynet.server.personal:ChangeGainInfo(player , goodsType , id , cfgOneHead.type , skynet.server.personal.AddGoods)
else
--发奖
skynet.server.bag:AddGoods( player , goodsType , id , 1 )
end
end
end
if not value.buyNum then
value.buyNum = 0
end
--添加购买次数
value.buyNum=value.buyNum+1
--清空选择
value.selectRewardList={}
end
end
end
--消耗金币
function ActivityReplicaStore:CostGold(player,GoldCount)
--检查并且获取活动信息
local playerReplicaStore=self:CheckDataAndGetActivity(player)
if playerReplicaStore == nil then
return
end
--添加金币
playerReplicaStore.SpendingGoldNum=playerReplicaStore.SpendingGoldNum+GoldCount
--红点处理
if self:isCanDraw(player) then
skynet.server.msgTips:Add(player,123)
end
end
--根据配置奖励配置转换成程序奖励类型
function ActivityReplicaStore:GetRewardType(type)
local goodsType = 0
if 1 == type then
goodsType = dataType.GoodsType_Furniture
elseif 2 == type then
goodsType = dataType.GoodsType_Decorate
elseif 3 == type then
goodsType = dataType.GoodsType_Garden
elseif 4 == type then
goodsType = dataType.GoodsType_Clothes
elseif 5 == type then
goodsType = dataType.GoodsType_PetClothes
elseif 6 == type then
goodsType = dataType.GoodsType_HeadAndHeadFrame
elseif 7 == type then
goodsType = dataType.GoodsType_HeadAndHeadFrame
end
return goodsType
end
--获取复刻商店信息
function ActivityReplicaStore:Show( player , c2sData , s2cData )
--c2sData.data = assert(pb.decode("C2SActivityReplicaStoreShow", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityReplicaStoreShow")
local data = {}
data.replicaStoreItemList={}
--检查并且获取活动信息
local playerReplicaStore=self:CheckDataAndGetActivity(player)
if playerReplicaStore == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
data.currentCost=playerReplicaStore.SpendingGoldNum
for _, value in ipairs(playerReplicaStore.packList) do
local freeState = 1
--可领取
if value.unlockNumb <=playerReplicaStore.SpendingGoldNum then
freeState = 2
end
--已领取
if value.isDrawFreeReward then
freeState = 3
end
table.insert(data.replicaStoreItemList,{unlockNumb=value.unlockNumb,freeState=freeState,buyNum=value.buyNum})
end
--添加红点
skynet.server.msgTips:ReduceAll(player, 124)
--log.debug("复刻商店 获取信息: ",json:encode(data))
--返回信息
s2cData.data = assert(pb.encode("S2CActivityReplicaStoreShow", data))
end
--领取复刻商店信息
function ActivityReplicaStore:GetFreeReward( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityReplicaStoreGetFreeReward", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityReplicaStoreGetFreeReward")
local unlockNumb=c2sData.data.unlockNumb
local data = {}
data.unlockNumb=unlockNumb
--检查并且获取活动信息
local playerReplicaStore=self:CheckDataAndGetActivity(player)
if playerReplicaStore == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
--判断添加
if unlockNumb>playerReplicaStore.SpendingGoldNum then
log.debug("领取免费礼包失败 消费金币不足 ",unlockNumb,playerReplicaStore.SpendingGoldNum)
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
--领取奖励
local freeReward = 0
--循环查找礼包信息
for _, value in ipairs(playerReplicaStore.packList) do
if value.unlockNumb == unlockNumb then
--已领取
if value.isDrawFreeReward then
log.debug("领取免费礼包失败 已领取 ")
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
--获取配置
local cfgReplicaStoreList=self:GetReplicaStoreConfig(player,playerReplicaStore.activityId)
--配置
local cfgReplicaStore=nil
for index, value in ipairs(cfgReplicaStoreList) do
if value.unlockNumb == unlockNumb then
cfgReplicaStore=value
break
end
end
--配置不存在
if not cfgReplicaStore then
log.debug("领取免费礼包失败 配置不存在 ",unlockNumb)
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
--发奖
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_144")
player:GiveReward( cfgReplicaStore.freeReward ,eventId)
freeReward=cfgReplicaStore.freeReward
--设置成已领取
value.isDrawFreeReward=true
break
end
end
--红点处理
if not self:isCanDraw(player) then
log.debug("复刻商店 删除小红点")
skynet.server.msgTips:ReduceAll(player,123)
end
data.freeReward=freeReward
--返回信息
s2cData.data = assert(pb.encode("S2CActivityReplicaStoreGetFreeReward", data))
end
--复刻商店自选礼包选择
function ActivityReplicaStore:Choose( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityReplicaStoreChoose", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityReplicaStoreChoose")
local rewardStrList=c2sData.data.rewardStrList
local unlockNumb=c2sData.data.unlockNumb
local data = {}
if not next(rewardStrList) then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("复刻商店 自选礼包选择参数错误")
return
end
--检查并且获取活动信息
local playerReplicaStore=self:CheckDataAndGetActivity(player)
if playerReplicaStore == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
log.info("复刻商店 自选礼包选择参数错误1")
return
end
--获取活动配置
local cfgReplicaStoreList=self:GetReplicaStoreConfig(player,playerReplicaStore.activityId)
local isOk=false
--检查参数
for _, cfgReplicaStore in ipairs(cfgReplicaStoreList) do
if unlockNumb ~= cfgReplicaStore.unlockNumb then
log.info("复刻商店 自选礼包选择参数错误4,continue",unlockNumb,cfgReplicaStore.unlockNumb)
goto continue
end
--判断选择数据量
if #rewardStrList ~= cfgReplicaStore.buyNumb then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("复刻商店 自选礼包选择参数错误2")
return
end
for _, rewardStr in ipairs(rewardStrList) do
local exists =false
for _, value in ipairs(cfgReplicaStore.storeObject) do
if rewardStr == value then
exists=true
break
end
end
--未查询到
if not exists then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("复刻商店 自选礼包选择参数错误3")
return
end
end
isOk=true
break
::continue::
end
if not isOk then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("复刻商店 自选礼包选择参数错误4")
return
end
--判断金币是否满足
if unlockNumb>playerReplicaStore.SpendingGoldNum or unlockNumb == 0 then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("复刻商店 自选礼包选择参数错误5")
return
end
--循环查找礼包信息
for _, value in ipairs(playerReplicaStore.packList) do
if value.unlockNumb == unlockNumb then
value.selectRewardList=rewardStrList
break
end
end
--红点处理
if not self:isCanDraw(player) then
log.debug("复刻商店 删除小红点")
skynet.server.msgTips:ReduceAll(player,123)
end
data.unlockNumb=unlockNumb
data.selectedList=rewardStrList
--记录日志
--log.debug("复刻商店 自选礼包选择 %s",json:encode(data))
--返回信息
s2cData.data = assert(pb.encode("S2CActivityReplicaStoreChoose", data))
end
--获取礼包界面信息
function ActivityReplicaStore:OpenGift( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityReplicaStoreOpenGift", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityReplicaStoreOpenGift")
local unlockNumb=c2sData.data.unlockNumb
local data = {}
data.unlockNumb=unlockNumb
data.replicaStoreItemList={}
--检查并且获取活动信息
local playerReplicaStore=self:CheckDataAndGetActivity(player)
if playerReplicaStore == nil then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
--获取配置
local cfgReplicaStoreList=self:GetReplicaStoreConfig(player,playerReplicaStore.activityId)
local cfgReplicaStore=nil
for _, value in ipairs(cfgReplicaStoreList) do
if value.unlockNumb == unlockNumb then
cfgReplicaStore=value
break
end
end
if cfgReplicaStore == nil then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
--发奖
for _, rewardStr in ipairs(cfgReplicaStore.storeObject) do
local tmp = skynet.server.common:Split( rewardStr ,"_" )
local goodsType=tonumber(tmp[ 1 ])
local id = tonumber(tmp[ 2 ])
local volute = 0
--是否存在
local goodsCount=skynet.server.bag:GetGoodsCount(player,goodsType,id)
--头像,头像框
if goodsCount > 0 or goodsType == dataType.GoodsType_HeadAndHeadFrame then
local give,replaceRewardId = player:RewardConversion(id , goodsType)
if give then
--获取奖励配置
local rewardCfg = skynet.server.gameConfig:GetPlayerCurCfg( player , "Reward" , replaceRewardId )
volute = rewardCfg.voluteCoin
end
end
table.insert(data.replicaStoreItemList,{rewardStr=rewardStr,volute=volute})
end
--记录日志
--log.debug("复刻商店 获取礼包界面信息 %s",json:encode(data))
--返回信息
s2cData.data = assert(pb.encode("S2CActivityReplicaStoreOpenGift", data))
end
-- 定义一个回调函数
local function onEventFired(player , taskId , count)
--这里只处理金币
if taskId ~= 42 then
return
end
--原有处理逻辑
ActivityReplicaStore:CostGold(player,count)
end
-- 注册事件处理函数
taskListEvent:Register(onEventFired,"复刻商店金币任务")
skynet.server.activityReplicaStore = ActivityReplicaStore
return ActivityReplicaStore