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

658 lines
20 KiB
Lua
Raw 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 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