HomeServer/Server/AllServer/GameServer/Raffle.lua

2097 lines
76 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 errorInfo = require "ErrorInfo"
local json =require "json"
local dataType = require "DataType"
local Raffle = oo.class()
Raffle.ActivityType = dataType.ActivityType_Raffle
Raffle.BoxType_Normal = 1 --签到奖励类型 普通
Raffle.BoxType_Blind = 2 --签到奖励类型 盲盒
Raffle.BoxType_Optional = 3 --签到奖励类型 自选
Raffle.LotteryType_1= 1 --初级家具卡池
Raffle.LotteryType_2= 2 --高级家具卡池
Raffle.LotteryType_3= 3 --限时家具卡池
Raffle.LotteryType_4= 4 --不凡家具卡池
Raffle.TicketType_1= 1 --高级设计稿
Raffle.TicketType_2= 2 --初级设计稿
Raffle.TicketType_3= 3 --限时设计稿
Raffle.TicketType_4= 4 --限时不凡设计稿
--构造函数
function Raffle:Init()
end
-- 每次登录需要进行修改的数据
function Raffle:LoginInitData(player)
--功能未开启
if not player:IsUnlockSystem( dataType.UnlockSystem_DesignHouse ) then
log.debug("设计空间未开启-等级不足")
return
end
--获取开启的设计卡池
local activitys = self:CheckDataAndGetActivity(player)
for lotteryType, activity in pairs(activitys) do
--活动未开启
if activity.activityId == 0 then
goto continue
end
local raffle=player.gameData.RaffleMap[activity.activityId]
--兼容有问题的号
if raffle.totalDesignCount == nil then
raffle.totalDesignCount=0
end
if raffle.damnedGoodsIds== nil then
raffle.damnedGoodsIds={}
end
--是否有免费次数
if raffle.freeTime <= skynet.GetTime() then
if lotteryType == self.LotteryType_2 then
skynet.server.msgTips:Reset(player , 31)
elseif lotteryType == self.LotteryType_1 then
skynet.server.msgTips:Reset(player , 34)
end
end
--是否包含签到奖励
if raffle.timeSignIn == nil or not next(raffle.timeSignIn) then
goto continue
end
--登录天数是否今日
if os.date("%Y-%m-%d",raffle.loginTime) ~= os.date("%Y-%m-%d",skynet.GetTime()) then
raffle.loginTime=skynet.GetTime()
--检查签到奖励
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) then
goto continue
end
--初始化下一天的签到奖励
for day, _ in ipairs(cfgRaffle.signReward) do
if day == #raffle.timeSignIn+1 then
table.insert(raffle.timeSignIn , {day = day,status = 1})
break
end
end
end
::continue::
end
--初始化积分
if player.gameData.design==nil then
player.gameData.design={}
end
if player.gameData.design.highStorePoints == nil then
--积分
player.gameData.design.highStorePoints = 0
end
--初始化灵感碎片
if player.gameData.design.fragmentNum == nil then
player.gameData.design.fragmentNum = 0
end
--红点处理
skynet.server.msgTips:Reset(player , 68)
skynet.server.msgTips:Reset(player , 69)
math.randomseed(skynet.GetTime())
--测试d代码
--self:TimeFragmentShow(player,{},{})
end
--初始玩家数据返回设计id信息index1:初级设计id,index2:高级设计id,index3:限时设计id
function Raffle:CheckDataAndGetActivity(player)
--查询类型
local LotteryTypes={self.LotteryType_1,self.LotteryType_2,self.LotteryType_3,self.LotteryType_4}
--返回开启的活动id
local activitys= {}
for _, LotteryType in ipairs(LotteryTypes) do
local activityId,startTime,endTime,id = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , LotteryType )
--活动开启,不存在玩家数据
if activityId~=0 and (player.gameData.RaffleMap == nil or player.gameData.RaffleMap[activityId] == nil) then
if player.gameData.RaffleMap== nil then
player.gameData.RaffleMap= {}
end
--初始化玩家数据
player.gameData.RaffleMap[activityId]= {}
player.gameData.RaffleMap[activityId].id=id
player.gameData.RaffleMap[activityId].freeTime=skynet.GetTime() --初始存在免费
--单抽设计次数
player.gameData.RaffleMap[activityId].designCount=0
--单抽累计设计次数
player.gameData.RaffleMap[activityId].totalDesignCount=0
player.gameData.RaffleMap[activityId].isBuyStorePack8 = false
--初始化时间(用于计算登录天数)
player.gameData.RaffleMap[activityId].loginTime=skynet.GetTime()
--获取对应卡池信息
local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , activityId )
--限时签到
if cfgRaffle ~= nil and next(cfgRaffle.signReward) then
player.gameData.RaffleMap[activityId].timeSignIn={}
table.insert( player.gameData.RaffleMap[activityId].timeSignIn , {day = 1,status = 1})
--十连抽次数
player.gameData.RaffleMap[activityId].totalTimeTenNum=0
end
--累计抽卡
if cfgRaffle ~= nil and next(cfgRaffle.raffleNum) then
player.gameData.RaffleMap[activityId].totalTimeReward={}
end
--保底套间已经得到的信息
player.gameData.RaffleMap[activityId].damnedGoodsIds={}
end
if activityId ~= 0 then
activitys[LotteryType]={activityId=activityId,startTime=startTime,endTime=endTime}
end
end
return activitys
end
--获取免费的设计稿
function Raffle:GetFreeDesign( player )
--可免费抽卡类型
local freeTypes ={}
--开启的活动
local activitys=self:CheckDataAndGetActivity(player)
--循环检查
for lotteryType, activity in pairs(activitys) do
--活动未开启
if activity.activityId == 0 then
goto continue
end
if player.gameData.RaffleMap[activity.activityId].freeTime < skynet.GetTime() then
table.insert(freeTypes,lotteryType)
end
::continue::
end
return freeTypes
end
--根据类型获取设计信息
function Raffle:GetCfgRaffleByRaffleType( player , raffleTypes )
local cfgRaffle=nil
--获取活动信息
local activitys=self:CheckDataAndGetActivity(player)
for _, raffleType in pairs(raffleTypes) do
--活动未开启
if activitys[raffleType] ~= nil and activitys[raffleType].activityId ~= 0 then
--获取对应卡池信息
cfgRaffle= skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , activitys[raffleType].activityId )
return cfgRaffle
end
end
return cfgRaffle
end
--获取随机家具配置
function Raffle:GetFurniture( player , lotteryId , quality )
--家具和装修
local goodIds = {}
local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , lotteryId )
--添加散件家具
if dataType.FurnitureQuality_Common == quality then
goodIds = skynet.server.common:DeepCopy(cfgRaffle.ordinaryFurId)
elseif dataType.FurnitureQuality_Special == quality then
goodIds = skynet.server.common:DeepCopy(cfgRaffle.rarityFurId)
if cfgRaffle.raffleType ==self.LotteryType_1 then
--添加套装家具(这里套间认为是稀有)
local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture")
for _, v2 in pairs(cfgAllFurniture) do
if cfgRaffle.suitId == v2.suitType then
table.insert(goodIds,v2.id)
end
end
end
elseif dataType.FurnitureQuality_Rare == quality then
goodIds = skynet.server.common:DeepCopy(cfgRaffle.rareFurId)
if cfgRaffle.raffleType ~=self.LotteryType_4 then
--添加套装家具
local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture")
for _, v2 in pairs(cfgAllFurniture) do
if cfgRaffle.suitId == v2.suitType then
table.insert(goodIds,v2.id)
end
end
end
elseif dataType.FurnitureQuality_Splendid == quality then
--添加套装家具
local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture")
for _, v2 in pairs(cfgAllFurniture) do
if cfgRaffle.suitId == v2.suitType then
table.insert(goodIds,v2.id)
end
end
end
return goodIds
end
--获取券信息
function Raffle:GetTicket( player )
local data = {}
data.basicBluePrint = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 1)
data.advancedBluePrint = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 2)
--检查并且获取活动信息
local activitys=self:CheckDataAndGetActivity(player)
if activitys ~= nil and activitys[self.TicketType_3] ~= nil then
local cfgTimeRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , activitys[self.TicketType_3].activityId )
data.limitedBluePrint = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , cfgTimeRaffle.ticket)
elseif activitys ~= nil and activitys[self.TicketType_4] ~= nil then
local cfgTimeRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , activitys[self.TicketType_4].activityId )
data.limitedBluePrint = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , cfgTimeRaffle.ticket)
else
data.limitedBluePrint = 0
end
--玩家高级卡池的积分
data.highStorePoints = player.gameData.design.highStorePoints
return data
end
--商城充值
function Raffle:Pay( player , storeId )
local activitys =self:CheckDataAndGetActivity(player)
for _, activity in pairs(activitys) do
--活动是否开启
if activity.activityId == 0 then
goto continue
end
local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , activity.activityId )
--一元礼包显示控制
if cfgRaffle.limitPack == storeId then
player.gameData.RaffleMap[activity.activityId].isBuyStorePack8 = true
end
::continue::
end
end
--是否有签到奖励可领取
function Raffle:CheckSignIn( player )
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) then
return false
end
local raffle=player.gameData.RaffleMap[cfgRaffle.id]
for _, value in ipairs(raffle.timeSignIn) do
if value.status == 1 then
return true
end
end
return false
end
--限时卡池是否有奖励可以领取
function Raffle:CheckTimeAward( player )
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) or cfgRaffle.raffleNum== nil or not next(cfgRaffle.raffleNum) then
return false
end
local raffle=player.gameData.RaffleMap[cfgRaffle.id]
local totalCount =raffle.totalDesignCount+ raffle.totalTimeTenNum*10
for _ ,num in ipairs(cfgRaffle.raffleNum) do
--是否解锁
local function ifGreaterNum ()
return totalCount >= num
end
--是否购买
local function ifBuy ()
for _, numTemp in ipairs(raffle.totalTimeReward) do
if numTemp == num then
return true
end
end
return false
end
--已解锁 未购买
if ifGreaterNum() and not ifBuy() then
return true
end
end
return false
end
--是否有免费抽卡
function Raffle:CheckFreeDesign( player , lotteryTypeParam)
--获取开启的设计卡池
local activitys = self:CheckDataAndGetActivity(player)
for lotteryType, activity in pairs(activitys) do
--活动未开启
if activity.activityId == 0 or lotteryType ~= lotteryTypeParam then
goto continue
end
local raffle=player.gameData.RaffleMap[activity.activityId]
--是否有免费次数
if raffle.freeTime <= skynet.GetTime() then
return true
end
::continue::
end
return false
end
--获取进阶礼包信息
function Raffle:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignShow", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignShow")
local data = {}
data.cardPoolInfos={}
data.isShowUI={}
data.isBuyStorePack8 =false
--检查并且获取活动信息
local activitys=self:CheckDataAndGetActivity(player)
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
--循环开启的活动
for raffleType, activity in pairs(activitys) do
local isShowUI = false
--活动未开启
if activity.activityId ~= 0 then
--获取对应卡池配置信息
local cfgRaffle= skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , activity.activityId )
--卡池信息
table.insert(data.cardPoolInfos,{raffleId=activity.activityId,raffleType=raffleType,startTime=activity.startTime,endTime=activity.endTime})
--免费设计时间
local freeTime = player.gameData.RaffleMap[activity.activityId].freeTime
--设计次数
local designCount = player.gameData.RaffleMap[activity.activityId].designCount
--初级免费抽奖时间戳(秒)
if cfgRaffle.raffleType ==self.LotteryType_1 then
data.basicFreeTime=freeTime
--高级免费抽奖时间戳(秒)
elseif cfgRaffle.raffleType == self.LotteryType_2 then
data.advancedFreeTime = freeTime
--距离高级卡池保底次数
data.highCount=tonumber(cfgSValue.limitRaffleRareNewGua)- designCount
--显示设计
elseif cfgRaffle.raffleType == self.LotteryType_3 then
data.timeCount = tonumber(cfgSValue.voluteRaffleRareNewGua) - designCount
elseif cfgRaffle.raffleType == self.LotteryType_4 then
data.timeCount = tonumber(cfgSValue.splendidRaffleSingle) - designCount
end
--是否购买过礼包
if player.gameData.RaffleMap[activity.activityId].isBuyStorePack8 then
data.isBuyStorePack8 = true
end
isShowUI=true
end
table.insert(data.isShowUI , isShowUI)
end
data.designCurrency=self:GetTicket(player)
--返回信息
s2cData.data = assert(pb.encode("S2CDesignShow", data))
end
--根据参数随机几个道具randomGoodsMap 随机资源key权重val:道具列表。lotteryTimes 抽奖次数
function Raffle:LotteryGoods(player, randomGoodsMap , lotteryTimes )
--已经产出的道具
local outPutGoods = {}
--不存在随机配置
if not randomGoodsMap or not next(randomGoodsMap) then
return outPutGoods
end
--svalu配置
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
--总概率
local totalRandom = 0
--统计总概率
for weight, _ in pairs(randomGoodsMap) do
totalRandom=totalRandom+weight
end
--循环产出
for i = 1, lotteryTimes, 1 do
::continue::--已经重复了,需要重新随机
local random = math.random(1,totalRandom)
--随机道具列表
local goods = {}
--以及比较过的权重
local alreadyWeight = 0
for weight, goodsTemp in pairs(randomGoodsMap) do
if random<= alreadyWeight+weight then
goods =goodsTemp
break
end
alreadyWeight=alreadyWeight+weight
end
if not next(goods) then
goto continue
end
--随机一个家具
local goodsId = goods[math.random(1,#goods)]
--重复个数
local repetitionNum=0
--判断是否重复
for _, valueGoodsId in ipairs(outPutGoods) do
if valueGoodsId == goodsId then
repetitionNum=repetitionNum+1
if repetitionNum >= cfgSValue.raffleTenDropRepeatLimit then
goto continue
end
end
end
table.insert(outPutGoods,goodsId)
end
--返回信息
return outPutGoods
end
--领取进阶礼包信息
function Raffle:Lottery( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignLottery", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignLottery")
local data = {}
data.rewards={}
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
local goodsType=dataType.GoodsType_Furniture
--//抽奖类型 1-初级家具卡池 2-高级家具卡池 3-限时家具卡池
local lotteryType = c2sData.data.lotteryType
data.lotteryType=lotteryType
--//抽奖次数 1-抽一次 2-抽十次
local lotteryTimes = c2sData.data.lotteryTimes==2 and 10 or 1
--获取对应卡池配置信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {lotteryType} )
if cfgRaffle== nil then
cfgRaffle=self:GetCfgRaffleByRaffleType( player , {self.LotteryType_4} )
if cfgRaffle== nil then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
end
--玩家设计空间信息
local raffle=player.gameData.RaffleMap[cfgRaffle.id]
local isFree = false; --是不是免费抽奖
--获取需要随机的随机家具
local commonGoods = self:GetFurniture( player , cfgRaffle.id , dataType.FurnitureQuality_Common ) --普通家具
local specialGoods = self:GetFurniture( player , cfgRaffle.id , dataType.FurnitureQuality_Special ) --稀有家具
local rareGoods = self:GetFurniture( player , cfgRaffle.id , dataType.FurnitureQuality_Rare ) --罕见家具
local splendidGoods = self:GetFurniture( player , cfgRaffle.id , dataType.FurnitureQuality_Splendid ) --不凡家具
--产出道具
local outPutGoods={}
--初级设计空间
if cfgRaffle.raffleType == self.LotteryType_1 then --初级设计空间
--是否免费
local isFree = false
--单抽,是否免费
if lotteryTimes ==1 and raffle.freeTime <= skynet.GetTime() then
isFree = true
raffle.freeTime = skynet.GetTime() + (cfgSValue.goldRaffleTypeFreeTime * 60 )
end
--判断资源是否足够(移除资源 需要注意 如果失败了怎么办)
if not isFree and not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , 1 , lotteryTimes) then
s2cData.code = errorInfo.ErrorCode.NoEnoughGoods
return
end
--组装随机资源参数
local randomGoodsMap = {
[math.floor(tonumber(cfgSValue.goldRaffleFurnitureRatio[1])*100)] = specialGoods,
[math.floor(tonumber(cfgSValue.goldRaffleFurnitureRatio[2])*100)] = commonGoods,
}
--随机产出
outPutGoods = self:LotteryGoods(player, randomGoodsMap , lotteryTimes )
--任务
--skynet.server.taskListEvent:Modify( player , 9 , 1 )--这个任务看起来有问题,先注释掉
skynet.server.levelTask:Modify( player , 69 , lotteryTimes )
skynet.server.taskListEvent:Modify( player , 69 , lotteryTimes )
--高级设计空间
elseif cfgRaffle.raffleType == self.LotteryType_2 then --高级设计空间
--是否免费
local isFree = false
--单抽,是否免费
if lotteryTimes ==1 and raffle.freeTime <= skynet.GetTime() then
isFree=true
raffle.freeTime = skynet.GetTime() + (cfgSValue.voluteRaffleTypeFreeTime * 60 )
end
--判断资源是否足够(移除资源 需要注意 如果失败了怎么办)
if not isFree and not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , 2 , lotteryTimes) then
s2cData.code = errorInfo.ErrorCode.NoEnoughGoods
return
end
--未获取的套间道具
local notExistSuitGoods ={}
for _, goodsId in ipairs(rareGoods) do
if not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) then
table.insert( notExistSuitGoods , goodsId )
end
end
--所有都得到,直接全部随机
if not next(notExistSuitGoods) then
--过滤当前已经获得的套间道具
for _, goodsId in ipairs(rareGoods) do
for _, value in ipairs(raffle.damnedGoodsIds) do
if goodsId == value then
goto continue
end
end
table.insert( notExistSuitGoods , goodsId )
::continue::
end
end
--到这里如果还没套间,则全部随机
if not next(notExistSuitGoods) then
for _, goodsId in ipairs(rareGoods) do
table.insert( notExistSuitGoods , goodsId )
end
end
--组装随机资源参数
local randomGoodsMap = {}
--是否是单抽
if lotteryTimes ==1 then
--是否出保底
if raffle.designCount +1 >= tonumber(cfgSValue.limitRaffleRareNewGua) then
--随机一个套间道具
table.insert(outPutGoods,notExistSuitGoods[math.random(1,#notExistSuitGoods)])
else
randomGoodsMap = {
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[1])*100)] = notExistSuitGoods,
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[2])*100)] = specialGoods,
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[3])*100)] = commonGoods,
}
--随机一个套间道具
outPutGoods = self:LotteryGoods(player, randomGoodsMap , lotteryTimes )
raffle.designCount = raffle.designCount +1
end
--判断是否出套间id
for _, goodsId1 in ipairs(outPutGoods) do
for _, goodsId2 in ipairs(notExistSuitGoods) do
if goodsId1 == goodsId2 then
raffle.designCount = 0
table.insert( raffle.damnedGoodsIds , goodsId1 )
break
end
end
end
--十连抽
else
randomGoodsMap = {
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[2])*100)] = specialGoods,
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[3])*100)] = commonGoods,
}
--先随机
outPutGoods = self:LotteryGoods(player, randomGoodsMap , lotteryTimes )
--随机套间id
local suitGoods = notExistSuitGoods[math.random(1,#notExistSuitGoods)]
outPutGoods[math.random(1,#outPutGoods)]=suitGoods
--添加到已获得
table.insert( raffle.damnedGoodsIds , suitGoods )
end
--添加积分
player.gameData.design.highStorePoints = player.gameData.design.highStorePoints + cfgSValue.raffleIntegral*lotteryTimes
--任务
skynet.server.levelTask:Modify( player , 48 , lotteryTimes )
--skynet.server.taskListEvent:Modify( player , 10 , 1 )--看起来这个任务有问题,先注释掉
skynet.server.taskListEvent:Modify( player , 48 , lotteryTimes )
--套间是否已经全部获得
if #raffle.damnedGoodsIds == #rareGoods then
raffle.damnedGoodsIds={}
end
--限时设计空间
elseif cfgRaffle.raffleType == self.LotteryType_3 then --限时设计空间
--判断资源是否足够(移除资源 需要注意 如果失败了怎么办)
if not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , cfgRaffle.ticket , lotteryTimes) then
s2cData.code = errorInfo.ErrorCode.NoEnoughGoods
return
end
--未获取的套间道具
local notExistSuitGoods ={}
for _, goodsId in ipairs(rareGoods) do
if not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) then
table.insert( notExistSuitGoods , goodsId )
end
end
--所有都得到,直接全部随机
if not next(notExistSuitGoods) then
--过滤已经获得的套间道具
for _, goodsId in ipairs(rareGoods) do
for _, value in ipairs(raffle.damnedGoodsIds) do
if goodsId == value then
goto continue
end
end
table.insert( notExistSuitGoods , goodsId )
::continue::
end
end
--到这里如果还没套间,则全部随机
if not next(notExistSuitGoods) then
for _, goodsId in ipairs(rareGoods) do
table.insert( notExistSuitGoods , goodsId )
end
end
--组装随机资源参数
local randomGoodsMap = {}
--是否是单抽
if lotteryTimes ==1 then
--是否出保底
if raffle.designCount+1 >= tonumber(cfgSValue.voluteRaffleRareNewGua) then
--随机一个套间道具
table.insert(outPutGoods,notExistSuitGoods[math.random(1,#notExistSuitGoods)])
else
randomGoodsMap = {
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[1])*100)] = notExistSuitGoods,
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[2])*100)] = specialGoods,
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[3])*100)] = commonGoods,
}
--随机一个套间道具
outPutGoods = self:LotteryGoods(player, randomGoodsMap , lotteryTimes )
raffle.designCount = raffle.designCount +1
end
--判断是否出套间id
for _, goodsId1 in ipairs(outPutGoods) do
for _, goodsId2 in ipairs(notExistSuitGoods) do
if goodsId1 == goodsId2 then
raffle.designCount = 0
table.insert( raffle.damnedGoodsIds , goodsId1 )
break
end
end
end
--添加累计单抽
raffle.totalDesignCount=raffle.totalDesignCount +1
--十连抽
else
randomGoodsMap = {
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[2])*100)] = specialGoods,
[math.floor(tonumber(cfgSValue.seniorRaffleFurnitureRatio[3])*100)] = commonGoods,
}
--先随机
outPutGoods = self:LotteryGoods(player, randomGoodsMap , lotteryTimes )
--罕见家具个数
local rareNum =1
if (raffle.totalTimeTenNum+1)%cfgSValue.hiddenRafflePositive[1]==0 then
rareNum=cfgSValue.hiddenRafflePositive[2]
end
--已经随机过的位置
local posList ={}
for i = 1, rareNum, 1 do
::continue::--重新随机位置
local pos = math.random(1,#outPutGoods)
--判断是否随机过
for _, value in ipairs(posList) do
if pos == value then
goto continue
end
end
--添加随机位置
table.insert( posList , pos )
--随机罕见道具
local goodsId = notExistSuitGoods[math.random(1,#notExistSuitGoods)]
--随机套间id
outPutGoods[pos]=goodsId
--删除已经得到过的罕见道具
for i = 1, #notExistSuitGoods, 1 do
if notExistSuitGoods[i] == goodsId then
table.remove( notExistSuitGoods , i )
break
end
end
--添加到已产出的套间
table.insert( raffle.damnedGoodsIds , goodsId )
--套间是否已经全部获得
if #raffle.damnedGoodsIds == #rareGoods or not next(notExistSuitGoods) then
raffle.damnedGoodsIds={}
notExistSuitGoods=rareGoods
end
end
--第一次触发礼包
if raffle.totalTimeTenNum == 0 then
skynet.server.store:TriggerPackMultiDraw(player,cfgRaffle)
end
--添加次数
raffle.totalTimeTenNum=raffle.totalTimeTenNum+1
end
--套间是否已经全部获得
if #raffle.damnedGoodsIds == #rareGoods then
raffle.damnedGoodsIds={}
end
elseif cfgRaffle.raffleType == self.LotteryType_4 then --限时设计空间-不凡
--判断资源是否足够(移除资源 需要注意 如果失败了怎么办)
if not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , cfgRaffle.ticket , lotteryTimes) then
s2cData.code = errorInfo.ErrorCode.NoEnoughGoods
return
end
--未获取的套间道具
local notExistSuitGoods ={}
for _, goodsId in ipairs(splendidGoods) do
if not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) then
table.insert( notExistSuitGoods , goodsId )
end
end
--所有都得到,直接全部随机
if not next(notExistSuitGoods) then
for _, goodsId in ipairs(splendidGoods) do
for _, value in ipairs(raffle.damnedGoodsIds) do
if goodsId == value then
goto continue
end
end
table.insert( notExistSuitGoods , goodsId )
::continue::
end
end
--到这里如果还没套间,则全部随机
if not next(notExistSuitGoods) then
for _, goodsId in ipairs(splendidGoods) do
table.insert( notExistSuitGoods , goodsId )
end
end
--组装随机资源参数
local randomGoodsMap = {}
--是否是单抽
if lotteryTimes ==1 then
--是否出保底
if raffle.designCount+1 >= tonumber(cfgSValue.splendidRaffleSingle) then
--随机一个套间道具
table.insert(outPutGoods,notExistSuitGoods[math.random(1,#notExistSuitGoods)])
else
randomGoodsMap = {
[math.floor(tonumber(cfgSValue.splendidRaffleRatio[1])*100)] = notExistSuitGoods,
[math.floor(tonumber(cfgSValue.splendidRaffleRatio[2])*100)] = rareGoods,
[math.floor(tonumber(cfgSValue.splendidRaffleRatio[3])*100)] = specialGoods,
[math.floor(tonumber(cfgSValue.splendidRaffleRatio[4])*100)] = commonGoods,
}
--随机一个套间道具
outPutGoods = self:LotteryGoods(player, randomGoodsMap , lotteryTimes )
raffle.designCount = raffle.designCount +1
end
--判断是否出套间id
for _, goodsId1 in ipairs(outPutGoods) do
for _, goodsId2 in ipairs(notExistSuitGoods) do
if goodsId1 == goodsId2 then
raffle.designCount = 0
table.insert( raffle.damnedGoodsIds , goodsId1 )
break
end
end
end
--添加累计单抽
raffle.totalDesignCount=raffle.totalDesignCount +1
--十连抽
else
randomGoodsMap = {
[math.floor(tonumber(cfgSValue.splendidRaffleRatio[2])*100)] = rareGoods,
[math.floor(tonumber(cfgSValue.splendidRaffleRatio[3])*100)] = specialGoods,
[math.floor(tonumber(cfgSValue.splendidRaffleRatio[4])*100)] = commonGoods,
}
--先随机
outPutGoods = self:LotteryGoods(player, randomGoodsMap , lotteryTimes )
--不凡家具个数
local rareNum =1
-- if (raffle.totalTimeTenNum+1)%cfgSValue.hiddenRafflePositive[1]==0 then
-- rareNum=cfgSValue.hiddenRafflePositive[2]
-- end
--已经随机过的位置
local posList ={}
for i = 1, rareNum, 1 do
::continue::--重新随机位置
local pos = math.random(1,#outPutGoods)
--判断是否随机过
for _, value in ipairs(posList) do
if pos == value then
goto continue
end
end
--添加随机位置
table.insert( posList , pos )
--随机罕见道具
local goodsId = notExistSuitGoods[math.random(1,#notExistSuitGoods)]
--随机套间id
outPutGoods[pos]=goodsId
--删除已经得到过的罕见道具
for i = 1, #notExistSuitGoods, 1 do
if notExistSuitGoods[i] == goodsId then
table.remove( notExistSuitGoods , i )
break
end
end
--添加到已产出的套间
table.insert( raffle.damnedGoodsIds , goodsId )
--套间是否已经全部获得
if #raffle.damnedGoodsIds == #splendidGoods or not next(notExistSuitGoods) then
raffle.damnedGoodsIds={}
notExistSuitGoods=splendidGoods
end
end
--第一次触发礼包
if raffle.totalTimeTenNum == 0 then
skynet.server.store:TriggerPackMultiDraw(player,cfgRaffle)
end
--添加次数
raffle.totalTimeTenNum=raffle.totalTimeTenNum+1
end
--套间是否已经全部获得
if #raffle.damnedGoodsIds == #splendidGoods then
raffle.damnedGoodsIds={}
end
end
--发放奖励
for _, goodsId in pairs( outPutGoods ) do
local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的
log.debug(string.format("玩家 %d 设计间 发放奖励 商品类型 %d 商品ID %d 商品数量 %d", player.userId , goodsType , goodsId , 1 ))
skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , goodsId , 1 )
table.insert( data.rewards ,{ item = {goodsType=goodsType,goodsId=goodsId,goodsCount=1} , isNew = isNewGoods } )
--成就任务处理
local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , goodsId )
if cfgFurniture.quality ~= 3 then
skynet.server.achieveTask:Modify( player , 60 , 1) --未获取到罕见家具
skynet.server.taskListEvent:Modify( player , 60 , 1) --未获取到罕见家具
end
end
--红点
if cfgRaffle.raffleType == self.LotteryType_1 and not self:CheckFreeDesign(player,self.LotteryType_1) then
skynet.server.msgTips:ReduceAll(player , 34)
end
if cfgRaffle.raffleType == self.LotteryType_2 and not self:CheckFreeDesign(player,self.LotteryType_2) then
skynet.server.msgTips:ReduceAll(player , 31)
end
--红点处理
if self:CheckTimeAward(player) then
skynet.server.msgTips:Add(player , 68)
end
--任务
skynet.server.levelTask:Modify( player , 37 , lotteryTimes )
skynet.server.achieveTask:Modify( player , 37 , lotteryTimes)
skynet.server.taskListEvent:Modify( player , 37 , lotteryTimes)
data.designCurrency=self:GetTicket(player)
data.highCount=self:GetTicketNum(player,self.TicketType_2)
data.timeCount=self:GetTicketNum(player,self.TicketType_3)
--是否可以分享
if 0 == player.gameData.todayGain.designShare then
data.canShare = true
else
data.canShare = false
end
data.isFree=isFree
local cData={}
local sData={}
local rData={}
local spDta={}
for _, value in ipairs(outPutGoods) do
for _, value1 in ipairs(commonGoods) do
if value==value1 then
table.insert(cData,value)
goto continue
end
end
for _, value1 in ipairs(specialGoods) do
if value==value1 then
table.insert(sData,value)
goto continue
end
end
for _, value1 in ipairs(rareGoods) do
if value==value1 then
table.insert(rData,value)
goto continue
end
end
for _, value1 in ipairs(splendidGoods) do
if value==value1 then
table.insert(spDta,value)
goto continue
end
end
::continue::
end
s2cData.data = assert(pb.encode("S2CDesignLottery", data))
end
--获取保底次数
function Raffle:GetTicketNum(player,lotteryType)
--获取对应卡池配置信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {lotteryType} )
if cfgRaffle== nil then
cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_4} )
if cfgRaffle == nil then
return 0
end
end
--设计次数
local designCount = player.gameData.RaffleMap[cfgRaffle.id].designCount
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
if cfgRaffle.raffleType == self.LotteryType_2 then
--距离高级卡池保底次数
return tonumber(cfgSValue.limitRaffleRareNewGua)- designCount
elseif cfgRaffle.raffleType == self.LotteryType_3 then
return tonumber(cfgSValue.voluteRaffleRareNewGua) - designCount
elseif cfgRaffle.raffleType == self.LotteryType_4 then
return tonumber(cfgSValue.splendidRaffleSingle) - designCount
end
return 0
end
--设计分享
function Raffle:Share( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignShare", c2sData.data ))
local data = {}
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
local haveReward = false
if 0 == player.gameData.todayGain.designShare then
--本日未分享 发放对应奖励并修改相关数据
player.gameData.todayGain.designShare = 1
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_24")
player:MoneyChange( cfgSValue.shareReward[1] , cfgSValue.shareReward[2] , eventId)
haveReward = true
end
data.designShare = player.gameData.todayGain.designShare
data.haveReward = haveReward
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignShare")
s2cData.data = assert(pb.encode("S2CDesignShare", data))
end
--限时累计卡池奖励界面显示
function Raffle:TimeAwardShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignTimeAwardShow", c2sData.data ))
local data = {}
data.timeAwardInfos = {}
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) or cfgRaffle.raffleNum== nil or not next(cfgRaffle.raffleNum) then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--获取活动信息
local activitys=self:CheckDataAndGetActivity(player)
local raffle=player.gameData.RaffleMap[cfgRaffle.id]
local totalCount =raffle.totalDesignCount+ raffle.totalTimeTenNum*10
data.designCount = totalCount
for index ,num in ipairs(cfgRaffle.raffleNum) do
--获取奖励配置
local rewardInfo = cfgRaffle.numReward[index]
if rewardInfo == nil then
s2cData.code=errorInfo.ErrorCode.OpFailed
return
end
local rewardInfo = skynet.server.common:Split(rewardInfo,"_" )
rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
local rewardItem = {id = num,status = 0,needDesignCount = num,rewardType = rewardInfo[1],rewardId = 0,optionalRewardIds={}}
if rewardInfo[1] == self.BoxType_Normal then
rewardItem.rewardId = rewardInfo[2]
elseif rewardInfo[1] == self.BoxType_Optional then--自选奖励
for _, goodsId in ipairs(cfgRaffle.frameId) do
if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Furniture ,goodsId) > 0 then
table.insert(rewardItem.optionalRewardIds,goodsId)
end
end
end
--是否解锁
if totalCount >= num then
rewardItem.status = 1
end
--检查是否已经购买
for _, numTemp in ipairs(raffle.totalTimeReward) do
if numTemp == num then
rewardItem.status = 2
end
end
table.insert(data.timeAwardInfos,rewardItem)
end
if activitys[self.LotteryType_3] ~=nil then
data.endTime =activitys[self.LotteryType_3].endTime
data.startTime = activitys[self.LotteryType_3].startTime
else
data.endTime =activitys[self.LotteryType_4].endTime
data.startTime = activitys[self.LotteryType_4].startTime
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeAwardShow")
s2cData.data = assert(pb.encode("S2CDesignTimeAwardShow", data))
end
--限时累计卡池奖励获取
function Raffle:TimeAwardGet( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignTimeAwardGet", c2sData.data ))
local data = {}
local timeAwardId = c2sData.data.timeAwardId --奖励id
local optionptionalRewardId = c2sData.data.optionptionalRewardId --自选id
data.timeAwardInfos = {}
data.conversionInfo = {}
data.timeAwardId=timeAwardId
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) or cfgRaffle.raffleNum== nil or not next(cfgRaffle.raffleNum) then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--获取活动信息
local activitys=self:CheckDataAndGetActivity(player)
local raffle=player.gameData.RaffleMap[cfgRaffle.id]
local totalCount = raffle.totalDesignCount+ raffle.totalTimeTenNum*10
data.designCount = totalCount
for index ,num in ipairs(cfgRaffle.raffleNum) do
--获取奖励配置
local rewardInfo = cfgRaffle.numReward[index]
if rewardInfo == nil then
s2cData.code=errorInfo.ErrorCode.OpFailed
return
end
local rewardInfo = skynet.server.common:Split(rewardInfo,"_" )
rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
if num == timeAwardId and totalCount >= num then
local isBuy =false
--检查是否已经购买
for _, numTemp in ipairs(raffle.totalTimeReward) do
if numTemp == num then
isBuy = true
break
end
end
if not isBuy then
--普通奖励
if rewardInfo[1] == self.BoxType_Normal then --普通
--发放对应奖励 并修改相关数据
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_61")
--被转化的奖励
local conversionInfo = player:GiveReward(rewardInfo[2] , eventId ,1)
local rewards = skynet.server.playerLand:GetRewardInfo(player , rewardInfo[2])
data.rewardInfos = rewards
data.conversionInfo = conversionInfo
--判断奖励是否包含头像或头像框
local haveHead = false
for k1 , v1 in pairs(rewards) do
if v1.type == dataType.GoodsType_HeadAndHeadFrame then
haveHead = true
break
end
end
if haveHead then
--主动推送一下玩家个人信息
local data1 = {}
data1.newOwn = {}
for k1 , v1 in pairs(rewards) do
local cfgHead = skynet.server.gameConfig:GetPlayerCurCfg( player , "Head" , v1.id )
table.insert(data1.newOwn , {ownType = cfgHead.type , ownId = v1.id})
end
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_PersonalUpdateOwnInfo" , data1 )
end
elseif rewardInfo[1] == self.BoxType_Blind then--盲盒
--盲盒奖励
local reward = self:BoxReward(player,cfgRaffle.id)
for k1 , v1 in pairs(reward) do
skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , v1.id , v1.count )
end
data.rewardInfos = reward
elseif rewardInfo[1] == self.BoxType_Optional then--自选
local isExist= false
--验证配置自选是否存在
for index, value in ipairs(cfgRaffle.frameId) do
if value == optionptionalRewardId then
isExist=true
end
end
if not isExist then
s2cData.code=errorInfo.ErrorCode.OpFailed
return
end
--发放对应奖励 并修改相关数据
skynet.server.bag:AddGoods(player, dataType.GoodsType_Furniture, optionptionalRewardId, 1)
--返回奖励信息
data.rewardInfos = {{ type = dataType.GoodsType_Furniture , id = optionptionalRewardId , count = 1}}
end
table.insert(raffle.totalTimeReward,num)
skynet.server.msgTips:Reduce(player , 68)
end
end
--添加返回值
local rewardItem = {id = num,status = 0,needDesignCount = num,rewardType = rewardInfo[1],rewardId = 0,optionalRewardIds={}}
if rewardInfo[1] == self.BoxType_Normal then
rewardItem.rewardId = rewardInfo[2]
elseif rewardInfo[1] == self.BoxType_Optional then--自选奖励
for _, goodsId in ipairs(cfgRaffle.frameId) do
if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Furniture ,goodsId) > 0 then
table.insert(rewardItem.optionalRewardIds,goodsId)
end
end
end
--是否解锁
if totalCount >= num then
rewardItem.status = 1
end
--检查是否已经购买
for _, numTemp in ipairs(raffle.totalTimeReward) do
if numTemp == num then
rewardItem.status = 2
end
end
table.insert(data.timeAwardInfos,rewardItem)
end
--红点处理
if not self:CheckTimeAward(player) then
skynet.server.msgTips:ReduceAll(player , 68)
end
if activitys[self.LotteryType_3] ~=nil then
data.endTime =activitys[self.LotteryType_3].endTime
else
data.endTime =activitys[self.LotteryType_4].endTime
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeAwardGet")
s2cData.data = assert(pb.encode("S2CDesignTimeAwardGet", data))
end
--高级卡池兑换商店显示
function Raffle:HighStoreShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignHighStoreShow", c2sData.data ))
local data = {}
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_2} )
if cfgRaffle== nil then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
local raffle=player.gameData.RaffleMap[cfgRaffle.id]
data.highStorePoints = player.gameData.design.highStorePoints
data.highStoreInfos = self:GetHighStoreInfo( player , cfgRaffle)
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignHighStoreShow")
s2cData.data = assert(pb.encode("S2CDesignHighStoreShow", data))
end
--高级卡池兑换商店兑换
function Raffle:HighStoreRedeem( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignHighStoreRedeem", c2sData.data ))
local data = {}
local goodsType = c2sData.data.goodsType
local goodsId = c2sData.data.goodsId
local redeemCount = c2sData.data.redeemCount
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_2} )
if cfgRaffle== nil then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--判断是否拥有
if dataType.GoodsType_Decorate == goodsType and player:IsBuyGoods(goodsType,goodsId) then
s2cData.code = errorInfo.ErrorCode.AlreadyExchange
return
end
local cfgDecoration = skynet.server.gameConfig:GetPlayerAllCfg( player , "Decoration")
if dataType.GoodsType_Furniture == goodsType then
local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , goodsId )
local needPoints = cfgFurniture.integral * redeemCount --需要的积分
if player.gameData.design.highStorePoints >= needPoints then
--积分足够 扣除相应积分 增加对应物品
player.gameData.design.highStorePoints = player.gameData.design.highStorePoints - needPoints
skynet.server.bag:AddGoods(player,goodsType,goodsId,redeemCount)
data.highRedeemPoints = player.gameData.design.highStorePoints
data.highRedeemInfos = self:GetHighStoreInfo( player ,cfgRaffle)
data.awards = {type = goodsType,id = goodsId,count = redeemCount}
else
s2cData.code = errorInfo.ErrorCode.NoEnoughPoint
end
elseif dataType.GoodsType_Decorate == goodsType then
local needPoints = cfgDecoration[goodsId].integral * redeemCount --需要的积分
if player.gameData.design.highStorePoints >= needPoints then
--积分足够 扣除相应积分 增加对应物品
player.gameData.design.highStorePoints = player.gameData.design.highStorePoints - needPoints
skynet.server.bag:AddGoods(player,goodsType,goodsId,redeemCount)
data.highRedeemPoints = player.gameData.design.highStorePoints
data.highRedeemInfos = self:GetHighStoreInfo( player ,cfgRaffle)
data.awards = {type = goodsType,id = goodsId,count = redeemCount}
else
s2cData.code = errorInfo.ErrorCode.NoEnoughPoint
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignHighStoreRedeem")
s2cData.data = assert(pb.encode("S2CDesignHighStoreRedeem", data))
end
--限时卡池签到显示
function Raffle:TimeSignInShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignTimeSignInShow", c2sData.data ))
local data = {}
data.timeSignIns = {}
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
local raffle=player.gameData.RaffleMap[cfgRaffle.id]
--循环配置
for index, cfgSignReward in ipairs(cfgRaffle.signReward) do
local showData={id=index,status=0,day=index,rewardId=cfgSignReward}
--检查是否已经购买
for _, timeSignIn in ipairs(raffle.timeSignIn) do
if index == timeSignIn.day then
showData={id=index,status=timeSignIn.status,day=timeSignIn.day,rewardId=cfgSignReward}
break
end
end
table.insert(data.timeSignIns,showData)
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeSignInShow")
s2cData.data = assert(pb.encode("S2CDesignTimeSignInShow", data))
end
--限时卡池签到获取
function Raffle:TimeSignInGet( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDesignTimeSignInGet", c2sData.data ))
local data = {}
local day = c2sData.data.day
data.timeSignIns = {}
local isShowUI = true
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
local raffle=player.gameData.RaffleMap[cfgRaffle.id]
--循环配置
for index, cfgSignReward in ipairs(cfgRaffle.signReward) do
--是否是购买礼包天数
if index == day then
--检查是否已经购买
for _, timeSignIn in ipairs(raffle.timeSignIn) do
--不是改礼包
if index ~= timeSignIn.day then
goto continue1
end
--是否可领取
if timeSignIn.status ~= 1 then
goto continue1
end
--发奖
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_62")
player:GiveReward(cfgSignReward , eventId , 1)
data.rewardId = cfgSignReward
timeSignIn.status = 2
break
::continue1::
end
end
local showData={id=index,status=0,day=index,rewardId=cfgSignReward}
--检查是否已经购买
for _, timeSignIn in ipairs(raffle.timeSignIn) do
if index == timeSignIn.day then
showData={id=index,status=timeSignIn.status,day=timeSignIn.day,rewardId=cfgSignReward}
break
end
end
-- if not isShowUI and showData.status ~= 2 then
-- isShowUI =true
-- end
table.insert(data.timeSignIns,showData)
end
if not self:CheckSignIn(player) then
skynet.server.msgTips:ReduceAll(player , 69)
end
--领取做一个标记,特殊处理
raffle.isGetSign = true
data.isShowUI = isShowUI
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeSignInGet")
s2cData.data = assert(pb.encode("S2CDesignTimeSignInGet", data))
end
--设计概览
function Raffle:OverviewShow( player , c2sData ,s2cData )
c2sData.data = assert(pb.decode("C2SDesignOverviewShow", c2sData.data ))
local data = {}
data.overviewInfos = {}
local designType = c2sData.data.designType
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {designType} )
if cfgRaffle== nil then
cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_4} )
if cfgRaffle==nil then
log.debug("设计空间预览 未找到开启的活动designType:",designType)
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
end
data.overviewInfos = self:GetGoodsInfo( player , cfgRaffle)
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignOverviewShow")
s2cData.data = assert(pb.encode("S2CDesignOverviewShow", data))
end
--盲盒随机奖励
function Raffle:BoxReward( player , raffleId )
local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , raffleId )
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue" )
local rewards = {}
local frameId = cfgRaffle.frameId --所有可以进行随机的家具id
local raffleBlindBoxReward = cfgSValue.raffleBlindBoxReward --设计奖励盲盒开启的已拥有套间家具与未拥有套间家具的占比
local haveFur = {} --拥有的家具id集合
local notFur = {} --未拥有的家具id集合
for k , v in pairs(frameId) do
local have = skynet.server.illustration:IsExistGoods( player , dataType.GoodsType_Furniture , v ) --是否拥有
if have then
table.insert(haveFur , v)
else
table.insert(notFur , v)
end
end
--没有未拥有的家具 则不用看中间值了
if #notFur == 0 then
local count = math.random(1 , #haveFur)
table.insert(rewards ,{ type = dataType.GoodsType_Furniture , id = haveFur[count] , count = 1})
else
--依照比例确定本次盲盒奖励是拥有还是未拥有
local count = math.random(1 , 10)
if count <= 10 * raffleBlindBoxReward and next(haveFur) then
local count1 = math.random(1 , #haveFur)
table.insert(rewards ,{ type = dataType.GoodsType_Furniture , id = haveFur[count1] , count = 1})
else
local count1 = math.random(1 , #notFur)
table.insert(rewards ,{ type = dataType.GoodsType_Furniture , id = notFur[count1] , count = 1})
end
end
return rewards
end
--获取该玩家高级卡池兑换商店物品的信息
function Raffle:GetHighStoreInfo( player,cfgRaffle )
local cfgFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture")
--存储兑换物品相关信息
local highStoreInfos = {}
--普通家具
for k ,v in pairs(cfgRaffle.ordinaryFurId) do
local have = player:IsBuyGoods(dataType.GoodsType_Furniture,v) --是否拥有
local needPoints = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , v).integral --需要的积分
table.insert(highStoreInfos , {goodsId=v , goodsType=dataType.GoodsType_Furniture,needPoints = needPoints,status = have,suitId = 0})
end
-- --普通装修
-- for k ,v in pairs(cfgRaffle.ordinaryDecId) do
-- local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v) --是否拥有
-- local needPoints = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , v).integral --需要的积分
-- table.insert(highStoreInfos , {goodsId=v , goodsType=dataType.GoodsType_Decorate,needPoints=needPoints,status=have,suitId = 0})
-- end
--稀有家具
for k ,v in pairs(cfgRaffle.rarityFurId) do
local have = player:IsBuyGoods(dataType.GoodsType_Furniture,v) --是否拥有
local needPoints = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , v).integral --需要的积分
table.insert(highStoreInfos , {goodsId=v , goodsType=dataType.GoodsType_Furniture,needPoints=needPoints,status=have,suitId = 0})
end
-- --稀有装修
-- for k ,v in pairs(cfgRaffle.rarityDecId) do
-- local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v) --是否拥有
-- local needPoints = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , v).integral --需要的积分
-- table.insert(highStoreInfos , {goodsId=v , goodsType=dataType.GoodsType_Decorate,needPoints=needPoints,status=have,suitId = 0})
-- end
--罕见家具
for k ,v in pairs(cfgRaffle.rareFurId) do
local have = player:IsBuyGoods(dataType.GoodsType_Furniture,v) --是否拥有
local needPoints = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , v).integral --需要的积分
table.insert(highStoreInfos , {goodsId=v , goodsType=dataType.GoodsType_Furniture,needPoints=needPoints,status=have,suitId = 0})
end
-- --罕见装修
-- for k ,v in pairs(cfgRaffle.rareDecId) do
-- local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v) --是否拥有
-- local needPoints = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , v).integral --需要的积分
-- table.insert(highStoreInfos , {goodsId=v , goodsType=dataType.GoodsType_Decorate,needPoints=needPoints,status=have,suitId = 0})
-- end
--新增装修
for k ,v in pairs(cfgRaffle.decoRedeem) do
local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v) --是否拥有
local needPoints = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , v).integral --需要的积分
table.insert(highStoreInfos , {goodsId=v , goodsType=dataType.GoodsType_Decorate,needPoints=needPoints,status=have,suitId = 0})
end
--套装物品
for k1, v1 in pairs( cfgFurniture ) do
if cfgRaffle.suitId == v1.suitType then
local have = player:IsBuyGoods(dataType.GoodsType_Furniture,v1.id) --是否拥有
local needPoints = v1.integral --需要的积分
table.insert(highStoreInfos , {goodsId=v1.id , goodsType=dataType.GoodsType_Furniture,needPoints=needPoints,status=have,suitId = cfgRaffle.suitId})
end
end
return highStoreInfos
end
--获取该玩家对应卡池的物品相关信息
function Raffle:GetGoodsInfo( player , cfgRaffle)
local cfgFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture")
local cfgDecoration = skynet.server.gameConfig:GetPlayerAllCfg( player , "Decoration")
--存储兑换物品相关信息
local overviewInfos = {}
for k ,v in pairs(cfgRaffle.ordinaryFurId) do
local have = player:IsBuyGoods(dataType.GoodsType_Furniture,v) --是否拥有
if have then
table.insert(overviewInfos , {goodsId = v , goodsType = dataType.GoodsType_Furniture})
end
end
-- --普通装修
-- for k ,v in pairs(cfgRaffle.ordinaryDecId) do
-- local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v) --是否拥有
-- if have then
-- table.insert(overviewInfos , {goodsId = v , goodsType = dataType.GoodsType_Decorate})
-- end
-- end
--稀有家具
for k ,v in pairs(cfgRaffle.rarityFurId) do
local have = player:IsBuyGoods(dataType.GoodsType_Furniture,v) --是否拥有
if have then
table.insert(overviewInfos , {goodsId = v , goodsType = dataType.GoodsType_Furniture})
end
end
-- --稀有装修
-- for k ,v in pairs(cfgRaffle.rarityDecId) do
-- local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v) --是否拥有
-- if have then
-- table.insert(overviewInfos , {goodsId = v , goodsType = dataType.GoodsType_Decorate})
-- end
-- end
--罕见家具
for k ,v in pairs(cfgRaffle.rareFurId) do
local have = player:IsBuyGoods(dataType.GoodsType_Furniture,v) --是否拥有
if have then
table.insert(overviewInfos , {goodsId = v , goodsType = dataType.GoodsType_Furniture})
end
end
-- --罕见装修
-- for k ,v in pairs(cfgRaffle.rareDecId) do
-- local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v) --是否拥有
-- if have then
-- table.insert(overviewInfos , {goodsId = v , goodsType = dataType.GoodsType_Decorate})
-- end
-- end
--新增装修字段
for k ,v in pairs(cfgRaffle.decoRedeem) do
local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v) --是否拥有
if have then
table.insert(overviewInfos , {goodsId = v , goodsType = dataType.GoodsType_Decorate})
end
end
--套装物品
for k1, v1 in pairs( cfgFurniture ) do
if cfgRaffle.suitId == v1.suitType then
local have = player:IsBuyGoods(dataType.GoodsType_Furniture,v1.id) --是否拥有
if have then
table.insert(overviewInfos , {goodsId = v1.id , goodsType = dataType.GoodsType_Furniture})
end
end
end
for k1, v1 in pairs( cfgDecoration ) do
if cfgRaffle.suitId == v1.suitType then
local have = player:IsBuyGoods(dataType.GoodsType_Decorate,v1.id) --是否拥有
if have then
table.insert(overviewInfos , {goodsId = v1.id , goodsType = dataType.GoodsType_Decorate})
end
end
end
return overviewInfos
end
--获取灵感碎片信息
function Raffle:TimeFragmentShow( player, c2sData ,s2cData )
c2sData.data = assert(pb.decode("C2SDesignTimeFragmentShow", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeFragmentShow")
local data = {}
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--获取碎片配置信息
local cfgRaffleFragment = skynet.server.gameConfig:GetPlayerCurCfg( player , "RaffleFragment",cfgRaffle.fragmentId)
--灵感碎片
data.fragmentNum=player.gameData.design.fragmentNum
if cfgRaffleFragment==nil then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--兑换家具
data.goodsIds={}
for _, furniture in ipairs(cfgRaffleFragment.redeemFurniture) do
--判断道具是存在
if skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , furniture) > 0 then
table.insert(data.goodsIds,furniture)
end
end
--转换家具
data.transitions={}
--判断家具是否在使用
local notUseGoodss=skynet.server.bag:GetUnusedGoodsInfo( player , dataType.GoodsType_Furniture )
for _, furniture in ipairs(self:SortTransition(player,cfgRaffleFragment.transferFurniture)) do
--判断道具是存在
local goodsNum=skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , furniture)
if goodsNum> 0 then
--是否可以转换
local isUse=false
for _, goodsItem in ipairs(notUseGoodss) do
if goodsItem.id == furniture then
goodsNum=goodsItem.count--设置可用家具数量
isUse =true
break
end
end
--是否正在使用
if isUse then
table.insert(data.transitions,{goodsId=furniture,goodsNum=goodsNum})
end
end
end
s2cData.data = assert(pb.encode("S2CDesignTimeFragmentShow", data))
end
--灵感碎片兑换信息
function Raffle:TimeFragmentExchange( player, c2sData ,s2cData )
c2sData.data = assert(pb.decode("C2SDesignTimeFragmentExchange", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeFragmentExchange")
local goodsId=c2sData.data.goodsId
local goodsNum=c2sData.data.goodsNum
local data = {}
data.goodsId=goodsId
data.goodsNum=goodsNum
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--获取碎片配置信息
local cfgRaffleFragment = skynet.server.gameConfig:GetPlayerCurCfg( player , "RaffleFragment",cfgRaffle.fragmentId)
local isExist=false
--兑换道具是否存在
for _, value in ipairs(cfgRaffleFragment.redeemFurniture) do
if value==goodsId then
isExist=true
break
end
end
if not isExist then
s2cData.code = errorInfo.ErrorCode.OpFailed
log.debug("灵感碎片兑换道具不存在",goodsId)
return
end
--获取道具配置
local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture",goodsId)
--检查配置是否有误
if cfgFurniture.fragmentNum==0 then
s2cData.code = errorInfo.ErrorCode.OpFailed
log.debug("道具配置有误,灵感积分配置为0",goodsId)
return
end
--灵感碎片是足够
if player.gameData.design.fragmentNum == nil then
player.gameData.design.fragmentNum = 0
end
if player.gameData.design.fragmentNum<cfgFurniture.fragmentNum*goodsNum then
s2cData.code = errorInfo.ErrorCode.OpFailed
log.debug("灵感碎片不足",goodsId)
return
end
--扣除灵感碎片
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_135")
player:MoneyChange( dataType.GoodsType_Fragment , -(cfgFurniture.fragmentNum*goodsNum) , eventId)
--添加家具
skynet.server.bag:AddGoods(player, dataType.GoodsType_Furniture, goodsId, goodsNum)
--灵感碎片
data.fragmentNum=player.gameData.design.fragmentNum
--兑换家具
data.goodsIds={}
for _, furniture in ipairs(cfgRaffleFragment.redeemFurniture) do
--判断道具是存在
if skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , furniture) > 0 then
table.insert(data.goodsIds,furniture)
end
end
--转换家具
data.transitions={}
--判断家具是否在使用
local notUseGoodss=skynet.server.bag:GetUnusedGoodsInfo( player , dataType.GoodsType_Furniture )
for _, furniture in ipairs(self:SortTransition(player,cfgRaffleFragment.transferFurniture)) do
--判断道具是存在
local goodsNum=skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , furniture)
if goodsNum> 0 then
--是否可以转换
local isUse=false
for _, goodsItem in ipairs(notUseGoodss) do
if goodsItem.id == furniture then
goodsNum=goodsItem.count--设置可用家具数量
isUse =true
break
end
end
--是否正在使用
if isUse then
table.insert(data.transitions,{goodsId=furniture,goodsNum=goodsNum})
end
end
end
s2cData.data = assert(pb.encode("S2CDesignTimeFragmentExchange", data))
end
--灵感碎片转换信息
function Raffle:TimeFragmentTransition( player, c2sData ,s2cData )
c2sData.data = assert(pb.decode("C2SDesignTimeFragmentTransition", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeFragmentTransition")
local goodsId=c2sData.data.goodsId
local goodsNum=c2sData.data.goodsNum
local data = {}
--获取对应卡池信息
local cfgRaffle = self:GetCfgRaffleByRaffleType( player , {self.LotteryType_3,self.LotteryType_4} )
if cfgRaffle== nil or cfgRaffle.signReward == nil or not next(cfgRaffle.signReward) then
s2cData.code = errorInfo.ErrorCode.OpFailed
return
end
--获取碎片配置信息
local cfgRaffleFragment = skynet.server.gameConfig:GetPlayerCurCfg( player , "RaffleFragment",cfgRaffle.fragmentId)
local isExist=false
--兑换道具是否存在
for _, value in ipairs(self:SortTransition(player,cfgRaffleFragment.transferFurniture)) do
if value==goodsId then
isExist=true
break
end
end
if not isExist then
s2cData.code = errorInfo.ErrorCode.OpFailed
log.debug("灵感碎片兑换道具不存在",goodsId)
return
end
--获取道具配置
local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture",goodsId)
--检查配置是否有误
if cfgFurniture.fragmentNum==0 then
s2cData.code = errorInfo.ErrorCode.OpFailed
log.debug("道具配置有误,灵感积分配置为0",goodsId)
return
end
--判断道具是否足够
if skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , goodsId) < goodsNum then
s2cData.code = errorInfo.ErrorCode.OpFailed
log.debug("转换家具不足",goodsId)
return
end
--判断家具是否在使用
local notUseGoodss=skynet.server.bag:GetUnusedGoodsInfo( player , dataType.GoodsType_Furniture )
--是否可以转换
local isUse=false
for _, goodsItem in ipairs(notUseGoodss) do
if goodsItem.id == goodsId and goodsItem.count >= goodsNum then
isUse =true
break
end
end
--是否正在使用
if not isUse then
s2cData.code = errorInfo.ErrorCode.PropUsing
return
end
--扣除家具
skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Furniture, goodsId, goodsNum)
--添加积分
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_136")
player:MoneyChange( dataType.GoodsType_Fragment , cfgFurniture.fragmentNum*goodsNum , eventId)
--灵感碎片
data.fragmentNum=player.gameData.design.fragmentNum
--兑换家具
data.goodsIds={}
for _, furniture in ipairs(cfgRaffleFragment.redeemFurniture) do
--判断道具是存在
if skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , furniture) > 0 then
table.insert(data.goodsIds,furniture)
end
end
--转换家具
data.transitions={}
for _, furniture in ipairs(self:SortTransition(player,cfgRaffleFragment.transferFurniture)) do
--判断道具是存在
local goodsNum=skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , furniture)
if goodsNum> 0 then
--是否可以转换
local isUse=false
for _, goodsItem in ipairs(notUseGoodss) do
if goodsItem.id == furniture then
goodsNum=goodsItem.count--设置可用家具数量
-- if goodsItem.id == goodsId then
-- goodsNum=goodsNum-c2sData.data.goodsNum
-- end
--大于0才能设置成可用
if goodsNum>0 then
isUse =true
end
break
end
end
--是否正在使用
if isUse then
table.insert(data.transitions,{goodsId=furniture,goodsNum=goodsNum})
end
end
end
s2cData.data = assert(pb.encode("S2CDesignTimeFragmentTransition", data))
end
--排序转换道具
function Raffle:SortTransition(player, transferFurniture )
if transferFurniture == nil then
return transferFurniture
end
local sortData={}
for _, value in ipairs(transferFurniture) do
local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture",value)
table.insert(sortData,{id=value,sort=cfgFurniture.fragmentNum})
end
--倒序排序
table.sort(sortData,function(a,b)
return a.sort > b.sort
end)
local result={}
for _, value in ipairs(sortData) do
table.insert(result,value.id)
end
return result
end
skynet.server.raffle = Raffle
return Raffle