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 shop = require "Shop" local Design = oo.class(shop) Design.lotteryType = dataType.LotteryType_LongTime Design.BoxType_Normal = 1 --签到奖励类型 普通 Design.BoxType_Blind = 2 --签到奖励类型 盲盒 Design.LotteryType_1= 1 --初级家具卡池 Design.LotteryType_2= 2 --高级家具卡池 Design.LotteryType_3= 3 --限时家具卡池 Design.TicketType_1= 1 --高级设计稿 Design.TicketType_2= 2 --初级设计稿 Design.TicketType_3= 3 --限时设计稿 Design.LotteryId = {} local configType = skynet.server.gameConfig:GetConfigType( "Main" , 1 ) Design.LotteryId[ configType ] = {} Design.LotteryId[ configType ].limitedLotteryId = 0 Design.LotteryId[ configType ].goldLotteryId = 1 Design.LotteryId[ configType ].advancedLotteryId = 2 configType = skynet.server.gameConfig:GetConfigType( "A" , 1 ) Design.LotteryId[ configType ] = {} Design.LotteryId[ configType ].limitedLotteryId = 0 Design.LotteryId[ configType ].goldLotteryId = 1 Design.LotteryId[ configType ].advancedLotteryId = 2 configType = skynet.server.gameConfig:GetConfigType( "B" , 1 ) Design.LotteryId[ configType ] = {} Design.LotteryId[ configType ].limitedLotteryId = 0 Design.LotteryId[ configType ].goldLotteryId = 1 Design.LotteryId[ configType ].advancedLotteryId = 2 Design.LotteryTimes_One = 1 --抽一次 Design.LotteryTimes_Ten = 2 --抽十次 --设置开奖的ID function Design:SetLotteryId( player , keyName , keyValue ) local configType = player.basicInfo.configType self.LotteryId[ configType][ keyName] = tonumber(keyValue) end --获取开奖的ID function Design:GetLotteryId( player , keyName , keyValue ) local configType = player.basicInfo.configType return self.LotteryId[ configType][ keyName] end --初始化数据 function Design:InitData( player ) --初始化设计空间相关信息 --没有对应数据进行初始化 兼容老玩家数据 if not player.gameData.design.timeCardPoints then player.gameData.design.timeCardPoints = {} end --限时卡池数据 local activityId,startTime,endTime,id = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , self.LotteryType_3 ) if activityId > 0 then local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , activityId ) player.gameData.design.timeCardPoolInfo.id = activityId --该限时卡池的id player.gameData.design.timeCardPoolInfo.activityId = id --该活动的id player.gameData.design.timeCardPoolInfo.ticket = cfgRaffle.ticket --该限时卡池使用的卡券 end if player.gameData.design.timeCardPoolInfo.id then --获取对应卡池信息 local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , player.gameData.design.timeCardPoolInfo.id ) player.gameData.design.timeCardPoolInfo.timeCount = 0 --限时卡池的保底抽数 每次保底后清除 player.gameData.design.timeCardPoolInfo.designCount = 0 --限时卡池的设计次数 player.gameData.design.timeCardPoolInfo.first10Design = false --本次限时卡池的第一次十连抽 player.gameData.design.timeCardPoolInfo.last10FurCount = 0 --上次十连抽抽中的罕见套间家具数量 player.gameData.design.timeCardPoolInfo.design10Count = 0 --十连抽的数量 用于暗保 player.gameData.design.timeCardPoolInfo.timeAward = {} --限时卡池的奖励信息 local count = 1 for k ,v in pairs(cfgRaffle.raffleNum) do player.gameData.design.timeCardPoolInfo.timeAward[ count ] = {} player.gameData.design.timeCardPoolInfo.timeAward[ count ].id = count --id 用于领取 player.gameData.design.timeCardPoolInfo.timeAward[ count ].status = 0 --当前状态 0 未解锁 1 未领取 2 已领取 player.gameData.design.timeCardPoolInfo.timeAward[ count ].needDesignCount = v --需要的设计次数 player.gameData.design.timeCardPoolInfo.timeAward[ count ].rewardInfo = cfgRaffle.numReward[ k ] --奖励信息 count = count + 1 end player.gameData.design.timeCardPoolInfo.timeSignIn = {} --限时卡池的签到信息 player.gameData.design.timeCardPoolInfo.timeSignInCount = 0 --限时卡池的签到天数 count = 1 for k ,v in pairs(cfgRaffle.signReward) do if count == 1 then --第一天默认可以领取 player.gameData.design.timeCardPoolInfo.timeSignIn[ count ] = {} player.gameData.design.timeCardPoolInfo.timeSignIn[ count ].day = count --day 用于领取 player.gameData.design.timeCardPoolInfo.timeSignIn[ count ].status = 1 --当前状态 0 未解锁 1 未领取 2 已领取 player.gameData.design.timeCardPoolInfo.timeSignIn[ count ].rewardId = v --奖励id count = count + 1 skynet.server.msgTips:Add(player , 69) else player.gameData.design.timeCardPoolInfo.timeSignIn[ count ] = {} player.gameData.design.timeCardPoolInfo.timeSignIn[ count ].day = count --day 用于领取 player.gameData.design.timeCardPoolInfo.timeSignIn[ count ].status = 0 --当前状态 0 未解锁 1 未领取 2 已领取 player.gameData.design.timeCardPoolInfo.timeSignIn[ count ].rewardId = v --奖励id count = count + 1 end end --新玩家当天未解锁限时卡池不会访问该方法,会导致签到天数未更新 if skynet.server.common:IsSameDay( player.basicInfo.lastLoginTime , skynet.GetTime()) then player.gameData.design.timeCardPoolInfo.timeSignInCount = 1 end end --限时卡池开启的时候有对应的限时累充活动开启 local activityId1,startTime1,endTime1 = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_LimitedAccum ) if activityId1 > 0 then local cfgLimitedAccum = skynet.server.gameConfig:GetPlayerCurCfg( player , "LimitedAccum" , activityId1 ) if player.gameData.design.timeCardPoints[ cfgLimitedAccum.id ] == nil then --初始对应限时卡池累充信息 player.gameData.design.timeCardPoints[ cfgLimitedAccum.id ] = {} player.gameData.design.timeCardPoints[ cfgLimitedAccum.id ].raffleId = player.gameData.design.timeCardPoolInfo.id player.gameData.design.timeCardPoints[ cfgLimitedAccum.id ].points = 0 player.gameData.design.timeCardPoints[ cfgLimitedAccum.id ].pointsInfo = {} local count1 = 1 for k , v in pairs(cfgLimitedAccum.value) do player.gameData.design.timeCardPoints[ cfgLimitedAccum.id ].pointsInfo[ count1 ] = {} player.gameData.design.timeCardPoints[ cfgLimitedAccum.id ].pointsInfo[ count1 ].id = count1 player.gameData.design.timeCardPoints[ cfgLimitedAccum.id ].pointsInfo[ count1 ].isGet = 0 --0 不可领取 1 可以领取 2 已领取 count1 = count1 + 1 end end end end --登录时需修改的数据 function Design:LoginChangeData( player ) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") if cfgSValue.drawUnlockLvl <= player.gameData.level then skynet.server.msgTips:Reset(player , 68) skynet.server.msgTips:Reset(player , 69) skynet.server.msgTips:Reset(player , 94) --检查是否有可以领取的限时奖励 self:CheckCanGetReward(player) --如果限时卡池过期了 则将未领取的奖励通过邮件发放给玩家 同时清除相关数据 if player.gameData.design.timeCardPoolInfo.id then local nowTime = skynet.GetTime() local id,startTime,endTime = 0,0,0 local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player , "Activity") if nil == player.gameData.design.timeCardPoolInfo.activityId then local activityId,startTime,endTime,id = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , self.LotteryType_3 ) if activityId > 0 then player.gameData.design.timeCardPoolInfo.activityId = id end end for k , v in pairs(cfgActivity) do if v.id == player.gameData.design.timeCardPoolInfo.activityId then id = v.id startTime = skynet.server.common:GetTime(v.startTime) endTime = skynet.server.common:GetTime(v.endTime) break end end if nowTime > endTime then --未领取累抽奖励补发 local award = {} for k, v in pairs(player.gameData.design.timeCardPoolInfo.timeAward) do if 1 == v.status then local rewardInfo = skynet.server.common:Split(v.rewardInfo, "_") rewardInfo[1], rewardInfo[2] = tonumber(rewardInfo[1]), tonumber(rewardInfo[2]) local rewards = {} if rewardInfo[1] == self.BoxType_Normal then table.insert(award, {type = dataType.GoodsType_RewardId , id = rewardInfo[2] , count = 1}) elseif rewardInfo[1] == self.BoxType_Blind then rewards = self:BoxReward(player, player.gameData.design.timeCardPoolInfo.id) for k1, v1 in pairs(rewards) do table.insert(award, v1) end end end end if 0 ~= #award then skynet.server.mail:AddNewMail(player, skynet.server.mail.MailType_Award, "未领取的奖励", "限时卡池中未领取的奖励", award, true) end --限时卡池 午后甜茶额外发送邮件 且 有多余的草莓设计稿 local haveCount = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 22) if id == cfgSValue.couponExchangeActivityMail[1] and haveCount > 0 then local exchangeCount = math.min(cfgSValue.strawberryCouponExchangeLimit, math.ceil(haveCount / cfgSValue.strawberryCouponExchangeRate[1] * cfgSValue.strawberryCouponExchangeRate[2])) local extraAward = {} table.insert(extraAward, { type = dataType.GoodsType_Prop, id = 2, count = exchangeCount }) local cfgOneMail = skynet.server.gameConfig:GetPlayerCurCfg(player, "Mail", cfgSValue.couponExchangeActivityMail[2]) skynet.server.mail:AddNewMail(player, skynet.server.mail.MailType_Award, cfgOneMail.mailTitle, cfgOneMail.mailContent, extraAward, true) --减少对应的设计稿 skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 22, haveCount) end --初始限时卡池 player.gameData.design.timeCardPoolInfo = {} --初始对应一元礼包购买状态 player.gameData.design.isBuyStorePack8 = false elseif nowTime >= startTime and nowTime <= endTime then --红点系统 for k, v in pairs(player.gameData.design.timeCardPoolInfo.timeAward) do if v.status == 1 then skynet.server.msgTips:AddNoNotice(player, 68) end end for k, v in pairs(player.gameData.design.timeCardPoolInfo.timeSignIn) do if v.status == 1 then skynet.server.msgTips:AddNoNotice(player, 69) end end for k, v in pairs(player.gameData.design.timeCardPoints) do if player.gameData.design.timeCardPoolInfo.id == v.raffleId then for k1, v1 in pairs(v.pointsInfo) do if v1.isGet == 1 then skynet.server.msgTips:AddNoNotice(player, 94) end end end end else --都不满足的条件下只有修改了服务器时间 self:InitData(player) end end --检查是否有新的限时卡池 if next(player.gameData.design.timeCardPoolInfo) == nil then self:InitData(player) end end end --设计抽奖展示 function Design:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignShow", c2sData.data )) local data = {} if not player:IsUnlockSystem( dataType.UnlockSystem_DesignHouse ) then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else local design = player.gameData.design local cfgRaffle = skynet.server.gameConfig:GetPlayerAllCfg( player , "Raffle") --初级卡池 local activityId1,startTime1,endTime1 = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , self.LotteryType_1 ) --高级卡池 local activityId2,startTime2,endTime2 = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , self.LotteryType_2 ) --限时卡池 local activityId3,startTime3,endTime3 = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , self.LotteryType_3 ) if activityId1 ~= 0 then self:SetLotteryId( player , "goldLotteryId" , activityId1 ) else self:SetLotteryId( player , "goldLotteryId" , 1 ) end if activityId2 ~= 0 then self:SetLotteryId( player , "advancedLotteryId" , activityId2 ) else self:SetLotteryId( player , "advancedLotteryId" , 2 ) end if activityId3 ~= 0 then --在线玩家活动开启的时候修改对应数据 if player.gameData.design.timeCardPoolInfo.id == nil or player.gameData.design.timeCardPoolInfo.id ~= activityId3 then --玩家只有首次初始化卡池数据,新的一期都不会初始化了,加个 player.gameData.design.timeCardPoolInfo.id ~= activityId3 判断,才会初始化 self:InitData( player ) end --self:SetLotteryId( player , "limitedLotteryId" , player.gameData.design.timeCardPoolInfo.id ) --self.TicketType_3 = player.gameData.design.timeCardPoolInfo.ticket --上面两句不知道陈林为啥会去修改当前配置,导致一个玩家上线,可能把旧配置给更上去,导致卡池不是当期,所以注释掉 self:SetLotteryId( player , "limitedLotteryId" , activityId3 ) local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , activityId3 ) self.TicketType_3 = cfgRaffle.ticket --该限时卡池使用的卡券 else self:SetLotteryId( player , "limitedLotteryId" , 0 ) self.TicketType_3 = 3 self:LoginChangeData( player ) end data.cardPoolInfos = {} table.insert(data.cardPoolInfos , {raffleId = self:GetLotteryId( player , "goldLotteryId" ) , raffleType = self.LotteryType_1 , startTime = startTime1 , endTime = endTime1}) table.insert(data.cardPoolInfos , {raffleId = self:GetLotteryId( player , "advancedLotteryId" ) , raffleType = self.LotteryType_2 , startTime = startTime2 , endTime = endTime2}) if self:GetLotteryId( player , "limitedLotteryId" ) > 0 then table.insert(data.cardPoolInfos , {raffleId = self:GetLotteryId( player , "limitedLotteryId" ) , raffleType = self.LotteryType_3 , startTime = startTime3 , endTime = endTime3}) end data.designCurrency = self:GetTicket( player ) data.basicFreeTime = design.basicFreeTime data.advancedFreeTime = design.advancedFreeTime data.isBuyStorePack8 = design.isBuyStorePack8 --保底次数 data.highCount = 10 - design.highCount --高级 if player.gameData.design.timeCardPoolInfo.id then data.timeCount = 10 - design.timeCardPoolInfo.timeCount --限时 end --是否可以显示相关UI 按照顺序 限时卡池签到 data.isShowUI = {} if player.gameData.design.timeCardPoolInfo.id then local isShowUI = false for k ,v in pairs(player.gameData.design.timeCardPoolInfo.timeSignIn) do if v.status ~= 2 then isShowUI = true break end end table.insert(data.isShowUI , isShowUI) end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignShow") s2cData.data = assert(pb.encode("S2CDesignShow", data)) end --设计抽奖展示 function Design:Lottery( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignLottery", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local lotteryType = c2sData.data.lotteryType local lotteryTimes = c2sData.data.lotteryTimes if not lotteryType or not lotteryTimes or lotteryType < self.LotteryType_1 or lotteryType > self.LotteryType_3 or lotteryTimes < self.LotteryTimes_One or lotteryTimes > self.LotteryTimes_Ten then s2cData.code = errorInfo.ErrorCode.ErrRequestParam elseif self.LotteryType_3 == lotteryType and 0 == self:GetLotteryId( player , "limitedLotteryId" ) then s2cData.code = errorInfo.ErrorCode.ActivityClosed elseif not player:IsUnlockSystem( dataType.UnlockSystem_DesignHouse ) then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else local design = player.gameData.design local moneyType,moneyCount = 0,0 local reduceCount = 0 --扣除券数量 data.isFree = false --客户端打点用 是不是免费抽 if self.LotteryTimes_One == lotteryTimes then --抽一次 reduceCount = 1 if self.LotteryType_1 == lotteryType and skynet.GetTime() >= design.basicFreeTime then reduceCount = 0 data.isFree = true design.basicFreeTime = skynet.GetTime() + (cfgSValue.goldRaffleTypeFreeTime * 60 ) --1天后再领 end if self.LotteryType_2 == lotteryType and skynet.GetTime() >= design.advancedFreeTime then reduceCount = 0 data.isFree = true design.advancedFreeTime = skynet.GetTime() + (cfgSValue.voluteRaffleTypeFreeTime * 60 ) --1天后再领 end if self.LotteryType_2 == lotteryType then --增加对应高级卡池的积分 一次加10分 design.highStorePoints = design.highStorePoints + cfgSValue.raffleIntegral design.highCount = design.highCount + 1 --增加高级卡池的保底次数 elseif self.LotteryType_3 == lotteryType then design.timeCardPoolInfo.designCount = design.timeCardPoolInfo.designCount + 1 --增加限时卡池的设计次数 design.timeCardPoolInfo.timeCount = design.timeCardPoolInfo.timeCount + 1 --增加限时卡池的保底次数 --判断是否达到设计次数奖励 self:CheckCanGetReward(player) end elseif self.LotteryTimes_Ten == lotteryTimes then --抽十次 reduceCount = 10 if self.LotteryType_2 == lotteryType then --增加对应高级卡池的积分 design.highStorePoints = design.highStorePoints + reduceCount * cfgSValue.raffleIntegral design.highCount = design.highCount + 10 --增加高级卡池的保底次数 elseif self.LotteryType_3 == lotteryType then design.timeCardPoolInfo.designCount = design.timeCardPoolInfo.designCount + 10 --增加限时卡池的设计次数 design.timeCardPoolInfo.timeCount = design.timeCardPoolInfo.timeCount + 10 --增加限时卡池的保底次数 design.timeCardPoolInfo.design10Count = design.timeCardPoolInfo.design10Count + 1 --增加限时卡池的十连抽次数 --判断是否达到设计次数奖励 self:CheckCanGetReward(player) end end log.debug(string.format("玩家 %d 设计间 抽奖类型 %d 抽奖次数 %d 扣除前 金币数量 %d 蜗壳数量 %d 券数量 %d %d %d", player.userId , lotteryType,reduceCount, player.gameData.coin , player.gameData.volute , skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 1) , skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 2) , skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , self.TicketType_3) )) --开始计算扣除货币数量 local isEnoughMoney = false local lotteryId = 0 if self.LotteryType_1 == lotteryType then --初级家具卡池 if 0 ~= reduceCount and not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , 1 , reduceCount) then s2cData.code = errorInfo.ErrorCode.NoEnoughGoods else isEnoughMoney = true end lotteryId = self:GetLotteryId( player , "goldLotteryId" ) elseif self.LotteryType_2 == lotteryType then --高级家具卡池 if 0 ~= reduceCount and not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , 2 , reduceCount) then s2cData.code = errorInfo.ErrorCode.NoEnoughGoods else isEnoughMoney = true end lotteryId = self:GetLotteryId( player , "advancedLotteryId" ) elseif self.LotteryType_3 == lotteryType then --限时家具卡池 --if 0 ~= reduceCount and not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , player.gameData.design.timeCardPoolInfo.ticket , reduceCount) then if 0 ~= reduceCount and not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , self.TicketType_3 , reduceCount) then s2cData.code = errorInfo.ErrorCode.NoEnoughGoods else isEnoughMoney = true end lotteryId = self:GetLotteryId( player , "limitedLotteryId" ) end if not isEnoughMoney then s2cData.code = errorInfo.ErrorCode.NoEnoughMoney else log.debug(string.format("玩家 %d 设计间 扣除券数量 %d 扣除后 金币数量 %d 蜗壳数量 %d 券数量 %d %d %d", player.userId , reduceCount , player.gameData.coin , player.gameData.volute , skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 1) , skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 2) , skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , self.TicketType_3))) local goods1 = self:GetFurniture( player , lotteryId , dataType.FurnitureQuality_Common ) --普通家具 local goods2 = self:GetFurniture( player , lotteryId , dataType.FurnitureQuality_Special ) --稀有家具 local goods3 = self:GetFurniture( player , lotteryId , dataType.FurnitureQuality_Rare ) --罕见家具 log.debug(string.format("玩家 %d 设计间 商品数量 %d %d %d", player.userId , #goods1 , #goods2 , #goods3)) --开始抽奖 data.rewards = {} local goodsType = 0 local goodsId = 0 if self.LotteryTimes_One == lotteryTimes then --抽一次 --判断是否触发保底 就只有初级卡池没有保底 if lotteryType == self.LotteryType_2 and design.highCount >= 10 then design.highCount = design.highCount - 10 goodsType,goodsId = self:StartLottery( player , lotteryType , true , goods1 , goods2 , goods3 ) local goodsInfo = { goodsType = goodsType , goodsId = goodsId , goodsCount = 1 } --local isNewGoods = not player:IsBuyGoods( goodsType , goodsId ) --不存在就是新的 local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的 table.insert( data.rewards ,{ item = goodsInfo , isNew = isNewGoods } ) skynet.server.msgTips:Reduce(player , 31) elseif lotteryType == self.LotteryType_3 and design.timeCardPoolInfo.timeCount >= 10 then design.timeCardPoolInfo.timeCount = design.timeCardPoolInfo.timeCount - 10 goodsType,goodsId = self:StartLottery( player , lotteryType , true , goods1 , goods2 , goods3 ) local goodsInfo = { goodsType = goodsType , goodsId = goodsId , goodsCount = 1 } --local isNewGoods = not player:IsBuyGoods( goodsType , goodsId ) --不存在就是新的 local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的 table.insert( data.rewards ,{ item = goodsInfo , isNew = isNewGoods } ) else goodsType,goodsId = self:StartLottery( player , lotteryType , false , goods1 , goods2 , goods3 ) local goodsInfo = { goodsType = goodsType , goodsId = goodsId , goodsCount = 1 } --local isNewGoods = not player:IsBuyGoods( goodsType , goodsId ) --不存在就是新的 local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的 table.insert( data.rewards ,{ item = goodsInfo , isNew = isNewGoods } ) if self.LotteryType_1 == lotteryType then skynet.server.msgTips:Reduce(player , 34) elseif self.LotteryType_2 == lotteryType then skynet.server.msgTips:Reduce(player , 31) end end --判断是否需要归零保底 local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , goodsId ) if lotteryType == self.LotteryType_2 and cfgFurniture.quality > 1 and cfgFurniture.suitType > 0 then --高级保底品质为套装 design.highCount = 0 elseif lotteryType == self.LotteryType_3 and cfgFurniture.quality > 2 then --限时保底品质为罕见 design.timeCardPoolInfo.timeCount = 0 end elseif self.LotteryTimes_Ten == lotteryTimes then --抽十次 local rand = 0 --10连抽必定触发保底 local count = 0 --用于处理提前出货 local rareSuitCount = 0 --记录限时卡池一次十连抽中的罕见套装家具数量 if self.LotteryType_2 == lotteryType then rand = 10 - design.highCount%10 count = design.highCount elseif self.LotteryType_3 == lotteryType then rand = 10 - design.timeCardPoolInfo.timeCount%10 count = design.timeCardPoolInfo.timeCount end for i = 1, 10, 1 do if rand == i and ( self.LotteryType_2 == lotteryType or self.LotteryType_3 == lotteryType ) then --只有高级和限时卡池才有保底 goodsType,goodsId = self:StartLottery( player , lotteryType , true , goods1 , goods2 , goods3 ) local goodsInfo = { goodsType = goodsType , goodsId = goodsId , goodsCount = 1 } --local isNewGoods = not player:IsBuyGoods( goodsType , goodsId ) --不存在就是新的 local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的 table.insert( data.rewards ,{ item = goodsInfo , isNew = isNewGoods } ) count = rand else goodsType,goodsId = self:StartLottery( player , lotteryType , false , goods1 , goods2 , goods3 ) local goodsInfo = { goodsType = goodsType , goodsId = goodsId , goodsCount = 1 } --local isNewGoods = not player:IsBuyGoods( goodsType , goodsId ) --不存在就是新的 local isNewGoods = not skynet.server.illustration:IsExistGoods( player , goodsType , goodsId ) --不存在就是新的 table.insert( data.rewards ,{ item = goodsInfo , isNew = isNewGoods } ) --提前出货 修改相关数据 local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , goodsId ) if lotteryType == self.LotteryType_2 and cfgFurniture.quality > 1 and cfgFurniture.suitType > 0 then --本次就不会再有保底 rand = 0 count = i elseif lotteryType == self.LotteryType_3 and cfgFurniture.quality > 2 then --本次就不会再有保底 rand = 0 count = i end end --移除限时卡池已经获取到罕见物品 local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , goodsId ) if lotteryType == self.LotteryType_3 and cfgFurniture.quality > 2 then for k, v in pairs(goods3) do if goodsId == v.id then table.remove( goods3 , k) if v.isSuit then rareSuitCount = rareSuitCount + 1 end break end end end if dataType.GoodsType_Decorate == goodsType then self:DeleteAlreadyDec( goodsType , goodsId , goods1 , goods2 , goods3 ) end --如果罕见家具为空了 则重新获取一次道具 if 0 == #goods3 then goods3 = self:GetFurniture( player , lotteryId , dataType.FurnitureQuality_Rare , true ) end end --修改对应的卡池保底 if lotteryType == self.LotteryType_2 then design.highCount = 10 - count elseif lotteryType == self.LotteryType_3 then --暗保机制 只用于限时卡池 --log.info("count",count) --log.info("design.timeCardPoolInfo.timeCount",design.timeCardPoolInfo.timeCount) --log.info("rareSuitCount",rareSuitCount) --log.info("design.timeCardPoolInfo.last10FurCount",design.timeCardPoolInfo.last10FurCount) --log.info("design.timeCardPoolInfo.design10Count",design.timeCardPoolInfo.design10Count) if design.timeCardPoolInfo.last10FurCount >= cfgSValue.hiddenRaffleNegative[1] then --如果上一次十连抽中的罕见套间数量大于配置数量 则本次抽中的罕见套间数量固定 if rareSuitCount > cfgSValue.hiddenRaffleNegative[2] then --只用处理抽中的数量大于固定数量的情况 local needGetNew = false local nowCount = count for i=1,10,1 do local reward = data.rewards[i] local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , reward.item.goodsId ) --如果该套件家具的索引小于保底索引 则不用重新获取 if cfgFurniture.quality > 2 and cfgFurniture.suitType > 0 then if needGetNew then --重新获取一次 local allGoods = goods1 for k , v in pairs(goods2) do table.insert(allGoods,v) end local goodsType1,goodsId1 = self:AppointLottery(allGoods,false) reward.item.goodsType = goodsType1 reward.item.goodsId = goodsId1 reward.isNew = not skynet.server.illustration:IsExistGoods( player , goodsType1 , goodsId1 ) --不存在就是新的 elseif i <= nowCount then nowCount = i needGetNew = true end end end design.timeCardPoolInfo.design10Count = 1 design.timeCardPoolInfo.last10FurCount = cfgSValue.hiddenRaffleNegative[2] design.timeCardPoolInfo.timeCount = 10 - nowCount else if rareSuitCount < cfgSValue.hiddenRaffleNegative[2] then --如果保底的不是套间家具 则重新获取一次 local reward = data.rewards[count] local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , reward.item.goodsId ) if cfgFurniture.quality > 2 and cfgFurniture.suitType == 0 then --重新获取一次 local goodsType1,goodsId1 = self:AppointLottery(goods3,true) reward.item.goodsType = goodsType1 reward.item.goodsId = goodsId1 reward.isNew = not skynet.server.illustration:IsExistGoods( player , goodsType1 , goodsId1 ) end end design.timeCardPoolInfo.design10Count = 1 design.timeCardPoolInfo.last10FurCount = cfgSValue.hiddenRaffleNegative[2] design.timeCardPoolInfo.timeCount = 10 - count end elseif design.timeCardPoolInfo.design10Count > cfgSValue.hiddenRafflePositive[1] and design.timeCardPoolInfo.last10FurCount <= cfgSValue.hiddenRaffleNegative[2] then --如果本次十连抽数为暗保抽数 且 上一次抽到的罕见套间为保底个数 design.timeCardPoolInfo.design10Count = 0 --暗保后重置 design.timeCardPoolInfo.last10FurCount = cfgSValue.hiddenRafflePositive[2] if rareSuitCount == cfgSValue.hiddenRaffleNegative[2] then --如果保底的不是套间家具 则重新获取一次 local reward = data.rewards[count] local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , reward.item.goodsId ) if cfgFurniture.quality > 2 and cfgFurniture.suitType == 0 then --重新获取一次 local goodsType1,goodsId1 = self:AppointLottery(goods3,true) reward.item.goodsType = goodsType1 reward.item.goodsId = goodsId1 reward.isNew = not skynet.server.illustration:IsExistGoods( player , goodsType1 , goodsId1 ) end --如果本次抽到的罕见套间为保底个数 则新增一个 while(true) do local random = math.random(1,10) if random ~= count then if random > count then design.timeCardPoolInfo.timeCount = 10 - random else design.timeCardPoolInfo.timeCount = 10 - count end --重新获取一次 local goodsType1,goodsId1 = self:AppointLottery(goods3,true) data.rewards[random].item.goodsType = goodsType1 data.rewards[random].item.goodsId = goodsId1 data.rewards[random].isNew = not skynet.server.illustration:IsExistGoods( player , goodsType1 , goodsId1 ) --不存在就是新的 break end end elseif rareSuitCount < cfgSValue.hiddenRaffleNegative[2] then --如果本次抽到的罕见套间比保底个数还少 则新增至暗堡个数 local random = 0 if count > 1 then random = math.random(1,count-1) else random = math.random(count+1,10) end --额外获取一个套间家具 local goodsType1,goodsId1 = self:AppointLottery(goods3,true) data.rewards[random].item.goodsType = goodsType1 data.rewards[random].item.goodsId = goodsId1 data.rewards[random].isNew = not skynet.server.illustration:IsExistGoods( player , goodsType1 , goodsId1 ) --保底的重新获取 将之修改为套间家具 goodsType1,goodsId1 = self:AppointLottery(goods3,true) data.rewards[count].item.goodsType = goodsType1 data.rewards[count].item.goodsId = goodsId1 data.rewards[count].isNew = not skynet.server.illustration:IsExistGoods( player , goodsType1 , goodsId1 ) design.timeCardPoolInfo.timeCount = count == 1 and 10 - random or 10 - count elseif rareSuitCount > cfgSValue.hiddenRafflePositive[2] then --如果本次抽到的罕见套间大于暗保个数 则减少对应个数至暗保个数 for i=1,rareSuitCount - cfgSValue.hiddenRafflePositive[2] ,1 do for k , v in pairs(data.rewards) do local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , v.item.goodsId ) if cfgFurniture.quality > 2 and cfgFurniture.suitType > 0 then --重新获取一次 local allGoods = goods1 for k1 , v1 in pairs(goods2) do table.insert(allGoods,v1) end local goodsType1,goodsId1 = self:AppointLottery(allGoods,false) v.item.goodsType = goodsType1 v.item.goodsId = goodsId1 break end end end design.timeCardPoolInfo.timeCount = 10 - count elseif rareSuitCount == cfgSValue.hiddenRafflePositive[2] then design.timeCardPoolInfo.timeCount = 10 - count end elseif design.timeCardPoolInfo.design10Count < cfgSValue.hiddenRafflePositive[1] and rareSuitCount >= cfgSValue.hiddenRaffleNegative[1] then --如果本次十连抽数不是暗保抽数 且 且本次抽到的罕见套间大于固定数量 design.timeCardPoolInfo.design10Count = 0 --直接重置暗保抽数 design.timeCardPoolInfo.timeCount = 10 - count design.timeCardPoolInfo.last10FurCount = rareSuitCount else design.timeCardPoolInfo.timeCount = 10 - count design.timeCardPoolInfo.last10FurCount = rareSuitCount end end end --发放奖励 for k, v in pairs( data.rewards ) do log.debug(string.format("玩家 %d 设计间 发放奖励 商品类型 %d 商品ID %d 商品数量 %d", player.userId , v.item.goodsType , v.item.goodsId , v.item.goodsCount )) skynet.server.bag:AddGoods( player , v.item.goodsType , v.item.goodsId , v.item.goodsCount ) end end end --如果是第一次限定卡池的十连抽 触发商城对应礼包 if lotteryType == self.LotteryType_3 and lotteryTimes == self.LotteryTimes_Ten then if not player.gameData.design.timeCardPoolInfo.first10Design then player.gameData.design.timeCardPoolInfo.first10Design = true skynet.server.store:TriggerPackMultiDraw(player) end end data.lotteryType = lotteryType data.designCurrency = self:GetTicket( player ) --保底次数 data.highCount = 10 - player.gameData.design.highCount --高级 if player.gameData.design.timeCardPoolInfo.id then if player.gameData.design.timeCardPoolInfo.timeCount >= 10 then player.gameData.design.timeCardPoolInfo.timeCount = player.gameData.design.timeCardPoolInfo.timeCount%10 end data.timeCount = 10 - player.gameData.design.timeCardPoolInfo.timeCount --限时 end --是否可以分享 if 0 == player.gameData.todayGain.designShare then data.canShare = true else data.canShare = false end s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignLottery") s2cData.data = assert(pb.encode("S2CDesignLottery", data)) end --设计分享 function Design: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 Design:TimeAwardShow( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignTimeAwardShow", c2sData.data )) local data = {} local design = player.gameData.design data.designCount = design.timeCardPoolInfo.designCount data.timeAwardInfos = {} for k ,v in pairs(design.timeCardPoolInfo.timeAward) do local rewardInfo = skynet.server.common:Split( v.rewardInfo ,"_" ) rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2]) if rewardInfo[1] == self.BoxType_Normal then table.insert(data.timeAwardInfos , {id = v.id,status = v.status,needDesignCount = v.needDesignCount,rewardType = rewardInfo[1],rewardId = rewardInfo[2]}) else table.insert(data.timeAwardInfos , {id = v.id,status = v.status,needDesignCount = v.needDesignCount,rewardType = rewardInfo[1],rewardId = 0}) end end local activityId,startTime,endTime = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , self.LotteryType_3 ) data.endTime = endTime data.startTime = startTime s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeAwardShow") s2cData.data = assert(pb.encode("S2CDesignTimeAwardShow", data)) end --限时卡池奖励获取 function Design:TimeAwardGet( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignTimeAwardGet", c2sData.data )) local data = {} local timeAwardId = c2sData.data.timeAwardId local design = player.gameData.design data.designCount = design.timeCardPoolInfo.designCount data.timeAwardInfos = {} data.conversionInfo = {} for k , v in pairs(design.timeCardPoolInfo.timeAward) do local rewardInfo = skynet.server.common:Split( v.rewardInfo ,"_" ) rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2]) if v.id == timeAwardId and 1 == v.status 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 else --盲盒奖励 local reward = self:BoxReward(player,player.gameData.design.timeCardPoolInfo.id) for k1 , v1 in pairs(reward) do skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , v1.id , v1.count ) end data.rewardInfos = reward end v.status = 2 skynet.server.msgTips:Reduce(player , 68) end if rewardInfo[1] == self.BoxType_Normal then table.insert(data.timeAwardInfos , {id = v.id,status = v.status,needDesignCount = v.needDesignCount,rewardType = rewardInfo[1],rewardId = rewardInfo[2]}) else table.insert(data.timeAwardInfos , {id = v.id,status = v.status,needDesignCount = v.needDesignCount,rewardType = rewardInfo[1],rewardId = 0}) end end local activityId,startTime,endTime = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , self.LotteryType_3 ) data.endTime = endTime s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeAwardGet") s2cData.data = assert(pb.encode("S2CDesignTimeAwardGet", data)) end --高级卡池兑换商店显示 function Design:HighStoreShow( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignHighStoreShow", c2sData.data )) local data = {} data.highStorePoints = player.gameData.design.highStorePoints data.highStoreInfos = self:GetHighStoreInfo( player ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignHighStoreShow") s2cData.data = assert(pb.encode("S2CDesignHighStoreShow", data)) end --高级卡池兑换商店兑换 function Design:HighStoreRedeem( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignHighStoreRedeem", c2sData.data )) local data = {} local cfgDecoration = skynet.server.gameConfig:GetPlayerAllCfg( player , "Decoration") local goodsType = c2sData.data.goodsType local goodsId = c2sData.data.goodsId local redeemCount = c2sData.data.redeemCount 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 ) 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 ) 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 Design:TimeSignInShow( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignTimeSignInShow", c2sData.data )) local data = {} data.timeSignIns = {} if player.gameData.design.timeCardPoolInfo.id then for k ,v in pairs(player.gameData.design.timeCardPoolInfo.timeSignIn) do table.insert(data.timeSignIns , v) end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeSignInShow") s2cData.data = assert(pb.encode("S2CDesignTimeSignInShow", data)) end --限时卡池签到获取 function Design:TimeSignInGet( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDesignTimeSignInGet", c2sData.data )) local data = {} local day = c2sData.data.day data.timeSignIns = {} local isShowUI = false if player.gameData.design.timeCardPoolInfo.id then for k , v in pairs(player.gameData.design.timeCardPoolInfo.timeSignIn) do if v.day == day and v.status == 1 then v.status = 2 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_62") player:GiveReward(v.rewardId , eventId , 1) data.rewardId = v.rewardId skynet.server.msgTips:Reduce(player , 69) end if v.status ~= 2 then isShowUI = true end table.insert(data.timeSignIns , v) end end data.isShowUI = isShowUI s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimeSignInGet") s2cData.data = assert(pb.encode("S2CDesignTimeSignInGet", data)) end --设计概览 function Design:OverviewShow( player , c2sData ,s2cData ) c2sData.data = assert(pb.decode("C2SDesignOverviewShow", c2sData.data )) local data = {} data.overviewInfos = {} local designType = c2sData.data.designType if designType == self.LotteryType_1 then local raffleId = self:GetLotteryId( player , "goldLotteryId" ) data.overviewInfos = self:GetGoodsInfo( player , raffleId) elseif designType == self.LotteryType_2 then local raffleId = self:GetLotteryId( player , "advancedLotteryId" ) data.overviewInfos = self:GetGoodsInfo( player , raffleId) elseif designType == self.LotteryType_3 then local raffleId = self:GetLotteryId( player , "limitedLotteryId" ) data.overviewInfos = self:GetGoodsInfo( player , raffleId) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignOverviewShow") s2cData.data = assert(pb.encode("S2CDesignOverviewShow", data)) end --限时累积充值展示 function Design:TimePointsShow( player , c2sData ,s2cData ) c2sData.data = assert(pb.decode("C2SDesignTimePointsShow", c2sData.data )) local data = {} --玩家积分 local raffleId = player.gameData.design.timeCardPoolInfo.id --没有数据进行初始化 if raffleId == nil then self:InitData(player) raffleId = player.gameData.design.timeCardPoolInfo.id end if raffleId then for k , v in pairs(player.gameData.design.timeCardPoints) do if raffleId == v.raffleId then data.points = v.points data.pointsInfos = {} for k1 ,v1 in pairs(v.pointsInfo) do table.insert(data.pointsInfos , v1) end data.accumId = k break end end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimePointsShow") s2cData.data = assert(pb.encode("S2CDesignTimePointsShow", data)) end --限时累积充值获取 function Design:TimePointsGet( player , c2sData ,s2cData ) c2sData.data = assert(pb.decode("C2SDesignTimePointsGet", c2sData.data )) local id = c2sData.data.id local data = {} data.id = id data.pointsInfos = {} --获取玩家对应配置文件ValueAccumulate local raffleId = player.gameData.design.timeCardPoolInfo.id if raffleId then for k , v in pairs(player.gameData.design.timeCardPoints) do if raffleId == v.raffleId then local cfgLimitedAccum = skynet.server.gameConfig:GetPlayerCurCfg( player , "LimitedAccum" , k ) for k1 ,v1 in pairs(v.pointsInfo) do if v1.id == id and v1.isGet == 1 then --进行发放奖励 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_107") player:GiveReward(cfgLimitedAccum.rewardId[k1], eventId , 1) v1.isGet = 2 skynet.server.msgTips:Reduce(player , 94) end table.insert(data.pointsInfos,v1) end data.accumId = k end end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_DesignTimePointsGet") s2cData.data = assert(pb.encode("S2CDesignTimePointsGet", data)) end --开始抽奖 function Design:StartLottery( player , lotteryType , isTenFloor , goods1 , goods2 , goods3 ) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local design = player.gameData.design local tenMustCount = cfgSValue.voluteRaffleRareNewGua --十连抽奖必出数量 --获取抽取概率 local rate = {} --1-普通 2-稀有 3-罕见 if self.LotteryType_1 == lotteryType then rate[1],rate[2],rate[3] = cfgSValue.goldRaffleFurnitureRatio[2] * 100,cfgSValue.goldRaffleFurnitureRatio[1] * 100,0 skynet.server.taskListEvent:Modify( player , 9 , 1 ) elseif self.LotteryType_2 == lotteryType then skynet.server.levelTask:Modify( player , 48 , 1 ) skynet.server.taskListEvent:Modify( player , 10 , 1 ) skynet.server.taskListEvent:Modify( player , 48 , 1 ) rate[1],rate[2],rate[3] = cfgSValue.seniorRaffleFurnitureRatio[3] * 100,cfgSValue.seniorRaffleFurnitureRatio[2] * 100,cfgSValue.seniorRaffleFurnitureRatio[1] * 100 elseif self.LotteryType_3 == lotteryType then rate[1],rate[2],rate[3] = cfgSValue.voluteRaffleFurnitureRatio[3] * 100,cfgSValue.voluteRaffleFurnitureRatio[2] * 100,cfgSValue.voluteRaffleFurnitureRatio[1] * 100 end rate[1],rate[2],rate[3] = math.floor(rate[1]),math.floor(rate[2]),math.floor(rate[3]) --取个整 local allRate = 0 --统计总概率 for k, v in pairs( rate ) do allRate = allRate + v end local rand = math.random(1,allRate) --随机概率 local randIndex = 0 --对应概率索引 local allCount = 0 for k, v in pairs( rate ) do allCount = allCount + v if rand <= allCount then randIndex = k break end end log.debug(string.format("玩家 %d 设计间 概率区间【1, %d】 分别抽取概率 %d %d %d 随机值 %d 商品品质 %d", player.userId , allRate , rate[1],rate[2],rate[3] ,rand ,randIndex)) local goodsType = 0 local goodsId = 0 if isTenFloor then --开启保底 local noBuyGoods = {} --把未购买的家具和装修选出来 for k, v in pairs( goods3 ) do if v.isSuit and not player:IsBuyGoods( v.type , v.id ) then table.insert( noBuyGoods , v ) end end --确实都是购买了的,那么只随机家具 if 0 == #noBuyGoods then for k, v in pairs( goods3 ) do if dataType.GoodsType_Furniture == v.type then table.insert( noBuyGoods , v ) end end end goodsType,goodsId = self:GetRandOneGoods( noBuyGoods ) else --不保底 if dataType.FurnitureQuality_Common == randIndex then goodsType,goodsId = self:GetRandOneGoods( goods1 ) elseif dataType.FurnitureQuality_Special == randIndex then goodsType,goodsId = self:GetRandOneGoods( goods2 ) elseif dataType.FurnitureQuality_Rare == randIndex then goodsType,goodsId = self:GetRandOneGoods( goods3 ) end end design.curLotteryCount = design.curLotteryCount + 1 skynet.server.levelTask:Modify( player , 37 , 1 ) skynet.server.achieveTask:Modify( player , 37 , 1) skynet.server.taskListEvent:Modify( player , 37 , 1) if self.LotteryType_1 == lotteryType then skynet.server.levelTask:Modify( player , 69 , 1 ) skynet.server.taskListEvent:Modify( player , 69 , 1 ) end log.debug(string.format("玩家 %d 设计间 随机商品 %d", player.userId , goodsId or 0 )) --成就任务处理 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 return goodsType,goodsId end --指定抽奖 用于暗保 function Design:AppointLottery( allGoods , isFloor ) local goodsType = dataType.GoodsType_Furniture local goodsId = 0 local count = 0 while(count < 100) do if isFloor then local index = math.random(1,#allGoods) if allGoods[index].isSuit then goodsId = allGoods[index].id break end count = count + 1 else local index = math.random(1,#allGoods) goodsId = allGoods[index].id break end end if goodsId == 0 then local index = math.random(1,#allGoods) goodsId = allGoods[index].id end return goodsType,goodsId end --商城充值 function Design:Pay( player , storeId ) if next(player.gameData.design.timeCardPoolInfo) ~= nil then local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , player.gameData.design.timeCardPoolInfo.id ) --一元礼包显示控制 if cfgRaffle.limitPack == storeId then player.gameData.design.isBuyStorePack8 = true end --对应限时累充数据修改 --找到对应礼包充值价格 local packPrice = 0 local cfgAllStorePrice = skynet.server.gameConfig:GetPlayerAllCfg( player , "StorePrice") for k , v in pairs(cfgAllStorePrice) do if v.storePackId == storeId then packPrice = v.price break end end --修改玩家的卡池累充额度 for k , v in pairs(player.gameData.design.timeCardPoints) do if cfgRaffle.id == v.raffleId then local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue" ) v.points = v.points + packPrice/100 * cfgSValue.valueAccumulatePoint --判断积分是否达到可以领取对应的积分奖励 local cfgLimitedAccum = skynet.server.gameConfig:GetPlayerCurCfg( player , "LimitedAccum" , k ) for k1 ,v1 in pairs(cfgLimitedAccum.value) do if v.points >= v1 and v.pointsInfo[k1].isGet == 0 then v.pointsInfo[k1].isGet = 1 --修改为可以领取 skynet.server.msgTips:Add(player , 94) --同时添加对应红点 end end end end end end --获取家具 去除装修类型的物品 function Design:GetFurniture( player , lotteryId , quality , getAll) local goods = {} --家具和装修 local cfgFur = {} local cfgDec = {} local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , lotteryId ) --添加散件家具 if dataType.FurnitureQuality_Common == quality then cfgFur = cfgRaffle.ordinaryFurId cfgDec = cfgRaffle.ordinaryDecId elseif dataType.FurnitureQuality_Special == quality then cfgFur = cfgRaffle.rarityFurId cfgDec = cfgRaffle.rarityDecId elseif dataType.FurnitureQuality_Rare == quality then cfgFur = skynet.server.common:DeepCopy(cfgRaffle.rareFurId) cfgDec = cfgRaffle.rareDecId end for k, v in pairs( cfgFur ) do table.insert( goods , { type = dataType.GoodsType_Furniture , id = v , isSuit = false }) end --获取装修 装修类只能通过其他方式获取 --for k, v in pairs( cfgDec ) do -- if not player:IsBuyGoods( dataType.GoodsType_Decorate , v ) then -- --未购买的装修才加入进来 -- table.insert( goods , { type = dataType.GoodsType_Decorate , id = v , isSuit = false }) -- end --end local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture") if self.LotteryType_3 == cfgRaffle.raffleType then --如果是限时卡池 则只能抽取未拥有的罕见家具 goods = {} local ownGoods = {} --存储拥有的家具 --套装 for k1, v1 in pairs( cfgRaffle.suitId ) do for k2, v2 in pairs(cfgAllFurniture) do if v1 == v2.suitType and quality == v2.quality and not player:IsBuyGoods( dataType.GoodsType_Furniture , v2.id ) then table.insert( goods , { type = dataType.GoodsType_Furniture , id = v2.id , isSuit = true }) elseif v1 == v2.suitType and quality == v2.quality and player:IsBuyGoods( dataType.GoodsType_Furniture , v2.id ) then table.insert( ownGoods , { type = dataType.GoodsType_Furniture , id = v2.id , isSuit = true }) end end end --散件 if self.LotteryType_3 == cfgRaffle.raffleType and dataType.FurnitureQuality_Rare == quality then for k, v in pairs( cfgFur ) do if not player:IsBuyGoods( dataType.GoodsType_Furniture , v ) then --如果不拥有则添加进去 table.insert( goods , { type = dataType.GoodsType_Furniture , id = v , isSuit = false }) end end end --全都有了 就随便抽了 or 特殊处理保底问题 if 0 == #goods or getAll then --套装 goods = ownGoods --散件 for k, v in pairs( cfgFur ) do table.insert( goods , { type = dataType.GoodsType_Furniture , id = v , isSuit = false }) end end elseif self.LotteryType_2 == cfgRaffle.raffleType then --高级卡池的罕见家具替换为套装家具 for k1, v1 in pairs( cfgRaffle.suitId ) do for k2, v2 in pairs(cfgAllFurniture) do if v1 == v2.suitType and (quality - 1) == v2.quality then table.insert( goods , { type = dataType.GoodsType_Furniture , id = v2.id , isSuit = true }) end end end elseif self.LotteryType_1 == cfgRaffle.raffleType then for k1, v1 in pairs( cfgRaffle.suitId ) do for k2, v2 in pairs(cfgAllFurniture) do if v1 == v2.suitType and quality == v2.quality then table.insert( goods , { type = dataType.GoodsType_Furniture , id = v2.id , isSuit = true }) end end end end --套装装修 --local cfgAllDecoration = skynet.server.gameConfig:GetPlayerAllCfg( player , "Decoration") --for k1, v1 in pairs( cfgRaffle.suitId ) do -- for k2, v2 in pairs(cfgAllDecoration) do -- if v1 == v2.suitType and quality == v2.quality and not player:IsBuyGoods( dataType.GoodsType_Decorate , v2.id ) then -- table.insert( goods , { type = dataType.GoodsType_Decorate , id = v2.id , isSuit = true }) -- end -- end --end return goods end --获取券信息 function Design:GetTicket( player ) local design = player.gameData.design local data = {} data.basicBluePrint = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 1) data.advancedBluePrint = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 2) --if player.gameData.design.timeCardPoolInfo.ticket then --data.limitedBluePrint = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , player.gameData.design.timeCardPoolInfo.ticket) --else data.limitedBluePrint = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , self.TicketType_3) --end --玩家高级卡池的积分 data.highStorePoints = player.gameData.design.highStorePoints return data end --获取不重复的商品 function Design:GetRandOneGoods( cfgAllGoods) local randList = {} local randIndex = nil local newGoods = {} local whileCount = 0 local goodsType = 0 local goodsId = 0 while true do if 0 == #cfgAllGoods then break end randIndex = math.random( 1, #cfgAllGoods) if not randList[ randIndex ] then --不存在新的列表就添加进去 goodsType = cfgAllGoods[ randIndex ].type goodsId = cfgAllGoods[ randIndex ].id randList[ randIndex ] = true end --找够了数据或者循环了1000次就退出 if 0 ~= goodsType or whileCount >= 1000 then break end whileCount = whileCount + 1 end return goodsType,goodsId end --删除已购买的装修 function Design:DeleteAlreadyDec( goodsType , goodsId , goods1 , goods2 , goods3 ) for k, v in pairs(goods1) do if goodsType == v.type and goodsId == v.id then table.remove( goods1 , k) break end end for k, v in pairs(goods2) do if goodsType == v.type and goodsId == v.id then table.remove( goods2 , k) break end end for k, v in pairs(goods3) do if goodsType == v.type and goodsId == v.id then table.remove( goods3 , k) break end end end --检查是否有可以领取的限时奖励 function Design:CheckCanGetReward( player ) if player.gameData.design.timeCardPoolInfo.timeAward then for k ,v in pairs(player.gameData.design.timeCardPoolInfo.timeAward) do if player.gameData.design.timeCardPoolInfo.designCount >= v.needDesignCount and 0 == v.status then v.status = 1 skynet.server.msgTips:Add(player , 68) end end end end --获取该玩家高级卡池兑换商店物品的信息 function Design:GetHighStoreInfo( player ) local cfgRaffle = skynet.server.gameConfig:GetPlayerAllCfg( player , "Raffle") local cfgFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture") --存储兑换物品相关信息 local highStoreInfos = {} --普通家具 local advancedLotteryId = self:GetLotteryId( player , "advancedLotteryId" ) for k ,v in pairs(cfgRaffle[ advancedLotteryId ].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[ advancedLotteryId ].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[ advancedLotteryId ].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[ advancedLotteryId ].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[ advancedLotteryId ].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[ advancedLotteryId ].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[ advancedLotteryId ].suitId) do for k1, v1 in pairs( cfgFurniture ) do if v == 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 = v}) end end end return highStoreInfos end --获取该玩家对应卡池的物品相关信息 function Design:GetGoodsInfo( player , raffleId) local cfgRaffle = skynet.server.gameConfig:GetPlayerCurCfg( player , "Raffle" , raffleId) 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.suitId) do for k1, v1 in pairs( cfgFurniture ) do if v == 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 v == 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 end return overviewInfos end --限时卡池即将过期 发送公告(取消) function Design:TimeCardPoolExpiredCancel( player ) local nowTime = skynet.GetTime() local activityId,startTime,endTime = skynet.server.activity:GetActivityInfo( player , dataType.ActivityType_Raffle , self.LotteryType_3 ) --确保该活动开启了 if activityId > 0 and nowTime > startTime then --判断该活动是否是最后一天 if nowTime >= endTime - 24 * 60 * 60 and nowTime < endTime then --发送公告 local title = "限时活动即将结束" local content = "限时活动套件剩余时间已不足一天,请各位蜗宝们及时换取心仪的套件家具~" skynet.server.announcement:AddAnnouncementByBS(title , content , skynet.server.announcement.EventAnnouncement) end end end --盲盒随机奖励 function Design: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 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 skynet.server.design = Design return Design