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