local skynet = require "skynet" local oo = require "Class" local log = require "Log" local pb = require "pb" local dataType = require "DataType" local errorInfo = require "ErrorInfo" local activity = require "Activity" local json =require "json" local ActivityNewPlayerRaffle = oo.class() ActivityNewPlayerRaffle.ActivityType = dataType.ActivityType_NewPlayerRaffle --当前抽卡类型 都是家具 local goodsType = dataType.GoodsType_Furniture --构造函数 function ActivityNewPlayerRaffle:Init() end -- 每次登录需要进行修改的数据 function ActivityNewPlayerRaffle:LoginInitData(player) --判断模块是否开启 if not player:IsUnlockSystem( dataType.UnlockSystem_ActivityNewPlayerRaffle ) or self:CheckData(player) == nil then return end -- 处理红点 skynet.server.msgTips:Reset(player, 106) skynet.server.msgTips:Reset(player, 107) skynet.server.msgTips:Reset(player, 108) --新手限定设计卡池 1次 if self:IsLottery(player,1) then skynet.server.msgTips:Add(player,106) end --新手限定设计卡池 10次 if self:IsLottery(player,10) then skynet.server.msgTips:Add(player,108) end math.randomseed(skynet.GetTime()) end --是否可以设计卡池 function ActivityNewPlayerRaffle:IsLottery(player,lotteryTimes) --不存在开启的活动 local cfgNewPlayerRaffle = self:CheckData(player) --活动未开启 if cfgNewPlayerRaffle == nil then return false end --获取数值基础配置 local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue") --当前蜗壳币 local volute = player.gameData.volute --需要蜗壳币 local needVolute = lotteryTimes==1 and cfgSValue.newPlayerRafflePrice[1] or cfgSValue.newPlayerRafflePrice[2] --检查消耗资源 if volute < needVolute then --log.debug(string.format("新手设计抽卡 资源不足,needVolute:%d,volute:%d",needVolute,volute)) return false end return true end --初始玩家数据 function ActivityNewPlayerRaffle:CheckData(player) --默认空活动 local cfgNewPlayerRaffle = nil if player==nil then log.debug("新手限定设计卡池checkdata, player is nil") return cfgNewPlayerRaffle end --判断等级是否开启 local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue") if cfgSValue == nil or cfgSValue.newPlayerRaffleTrigger[1] > player.gameData.level then return cfgNewPlayerRaffle end local cfgActivitys = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity") if cfgActivitys == nil then log.debug("新手限定设计卡池未开启-未获取到有效的活动2") return cfgNewPlayerRaffle end local ifContain = false local activityId = 0 for index, v in pairs(cfgActivitys) do if v.activityType == ActivityNewPlayerRaffle.ActivityType and v.level<=player.gameData.level then ifContain=true activityId = v.activityId break end end if not ifContain then log.debug("新手限定设计卡池未开启-玩家未满足条件") return cfgNewPlayerRaffle end --初始化 if player.gameData.NewPlayerRaffleMap==nil then player.gameData.NewPlayerRaffleMap={} end --获取活动配置 cfgNewPlayerRaffle=self:GetNewPlayerRaffleConfig(player,activityId) --未获取到有效的活动 if cfgNewPlayerRaffle == nil then return cfgNewPlayerRaffle end --如果玩家已经存在活动不需要检查 if player.gameData.NewPlayerRaffleMap[activityId] then --是否过期 if self:GetActivityEndTime(player.gameData.NewPlayerRaffleMap[activityId].activityOpenTime) < skynet.GetTime() then log.debug("新手限定设计卡池已过期") return nil end return cfgNewPlayerRaffle end --存在活动初始化玩家数据 local playerActivityMatchSuff = {} playerActivityMatchSuff.id = cfgNewPlayerRaffle.id playerActivityMatchSuff.oneLotteryCount = 0 --单抽次数 playerActivityMatchSuff.oneLotterySuitCount = 0 --单抽套间产出次数 playerActivityMatchSuff.tenLotteryCount = 0 --十连抽次数 playerActivityMatchSuff.totalLotteryCount=0--累计抽卡次数 领取设计奖励使用 playerActivityMatchSuff.rewardList={}--已领取设计奖励 playerActivityMatchSuff.activityOpenTime = skynet.GetTime() --活动开启的时间戳 --更新缓存 player.gameData.NewPlayerRaffleMap[activityId] = playerActivityMatchSuff return cfgNewPlayerRaffle end --是否可以领取设计奖励 function ActivityNewPlayerRaffle:IsDrawReward(player) local isCanBuy=false --不存在开启的活动 local cfgNewPlayerRaffle=ActivityNewPlayerRaffle:CheckData(player) --活动未开启 if cfgNewPlayerRaffle == nil then return isCanBuy end local accumDesignRewardStrs=cfgNewPlayerRaffle.accumDesignReward --循环配置 for key, str in pairs(accumDesignRewardStrs) do --解析配置 local arr = skynet.server.common:Split(str, "_") local lotteryCount=tonumber(arr[1]) if #arr ~= 2 then log.debug(string.format("新手限定设计卡池活动 配置异常,accumDesignReward:%d",str)) break end --判断是否可以领取 if player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].totalLotteryCount >= lotteryCount then --没有领取数据直接返回 if #player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].rewardList <=0 then isCanBuy=true break end for _, count in ipairs(player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].rewardList) do --已经领取直接跳出 if count == lotteryCount then isCanBuy=false break end --没有领取 isCanBuy=true end --已经有结果 直接跳出 if isCanBuy then break end end end return isCanBuy end --获取配置信息 function ActivityNewPlayerRaffle:GetNewPlayerRaffleConfig(player,activityId) local cfNewPlayerRaffle=nil --获取该活动的默认初始关卡 local cfNewPlayerRaffles=skynet.server.gameConfig:GetPlayerAllCfg(player, "NewPlayerRaffle") if cfNewPlayerRaffles==nil then log.debug("cfNewPlayerRaffle is nil") return cfNewPlayerRaffle end for index, value in pairs(cfNewPlayerRaffles) do if value.id==activityId then cfNewPlayerRaffle=value break end end return cfNewPlayerRaffle end --获取显示信息 function ActivityNewPlayerRaffle:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SActivityNewPlayerRaffleShow", c2sData.data )) s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityNewPlayerRaffleShow") local data = {} data.isBuyExperienceStorePack = false data.newPlayerCount = 0 data.activityEndTime = 0 --不存在开启的活动 local cfgNewPlayerRaffle=self:CheckData(player) --活动未开启 if cfgNewPlayerRaffle == nil then log.debug("cfgNewPlayerRaffle is nil") s2cData.code = errorInfo.ErrorCode.ActivityClosed return end if player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id]~=nil then data.newPlayerCount =10 - player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].oneLotteryCount data.activityEndTime = self:GetActivityEndTime(player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].activityOpenTime) end --是否买过体验礼包 data.isBuyExperienceStorePack=(player.gameData.storePack.storePackInfo[cfgNewPlayerRaffle.storepackId] ~= nil and not player.gameData.storePack.storePackInfo[cfgNewPlayerRaffle.storepackId].IsShow)and true or false s2cData.data = assert(pb.encode("S2CActivityNewPlayerRaffleShow", data)) end --新手限定设计卡池 设计奖励展示 function ActivityNewPlayerRaffle:AwardShow( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SActivityNewPlayerRaffleAwardShow", c2sData.data )) s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityNewPlayerRaffleAwardShow") local data = {} data.designCount = 0 data.timeAwardInfos = {} --不存在开启的活动 local cfgNewPlayerRaffle=self:CheckData(player) --活动未开启 if cfgNewPlayerRaffle == nil then log.debug("cfgNewPlayerRaffle is nil") s2cData.code = errorInfo.ErrorCode.ActivityClosed return end --循环组装奖励信息 for index, value in ipairs(cfgNewPlayerRaffle.accumDesignReward) do local reward={status=0} local arr=skynet.server.common:Split(value, "_") local lotteryCount=tonumber(arr[1]) reward.needDesignCount=lotteryCount if player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].totalLotteryCount >= lotteryCount then reward.status=1 end for _, value in ipairs(player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].rewardList) do if value==lotteryCount then reward.status=2 break end end data.timeAwardInfos[index] = reward end --玩家数据 local newPlayerRaffleMap = player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id] data.designCount = newPlayerRaffleMap.totalLotteryCount s2cData.data = assert(pb.encode("S2CActivityNewPlayerRaffleAwardShow", data)) end --新手限定设计卡池 设计奖励获取 function ActivityNewPlayerRaffle:AwardGet( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SActivityNewPlayerRaffleAwardGet", c2sData.data )) s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityNewPlayerRaffleAwardGet") --参数 local timeAwardId = c2sData.data.timeAwardId --返回信息 local data = {} data.timeAwardInfos={} --不存在开启的活动 local cfgNewPlayerRaffle=self:CheckData(player) --活动未开启 if cfgNewPlayerRaffle == nil then log.debug("cfgNewPlayerRaffle is nil") s2cData.code = errorInfo.ErrorCode.ActivityClosed return end --判断配置是否存在 for index, value in ipairs(cfgNewPlayerRaffle.accumDesignReward) do local reward={status=0} local arr=skynet.server.common:Split(value, "_") local lotteryCount=tonumber(arr[1]) local rewardId=tonumber(arr[2]) reward.needDesignCount=lotteryCount if player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].totalLotteryCount >= lotteryCount then reward.status=1 end for _, value in ipairs(player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].rewardList) do if value==lotteryCount then reward.status=2 break end end --当前领取的奖励 if lotteryCount == timeAwardId then if reward.status ~= 1 then s2cData.code = errorInfo.ErrorCode.NotGet return end --领取奖励 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_118") player:GiveReward(rewardId ,eventId,1) reward.status = 2 data.rewardId = rewardId --添加更新记录 table.insert(player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].rewardList,timeAwardId) end data.timeAwardInfos[index] = reward end --玩家数据 local newPlayerRaffleMap = player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id] data.designCount = newPlayerRaffleMap.totalLotteryCount --处理红点 if not self:IsDrawReward(player) then skynet.server.msgTips:ReduceAll(player, 107) end s2cData.data = assert(pb.encode("S2CActivityNewPlayerRaffleAwardGet", data)) end --新手限定设计卡池 抽奖 function ActivityNewPlayerRaffle:Lottery(player,c2sData,s2cData) c2sData.data = assert(pb.decode("C2SActivityNewPlayerRaffleLottery", c2sData.data )) s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityNewPlayerRaffleLottery") --参数 抽奖次数 1-抽一次 2-抽十次 local lotteryTimes = c2sData.data.lotteryTimes --log.debug(string.format("新手限定设计卡池 抽卡开始,lotteryTimes:%d",c2sData.data.lotteryTimes)) --返回信息 local data = {} data.rewards={} --不存在开启的活动 local cfgNewPlayerRaffle=self:CheckData(player) --活动未开启 if cfgNewPlayerRaffle == nil then s2cData.code = errorInfo.ErrorCode.ActivityClosed --log.debug("新手设计抽卡 活动已关闭") return end --玩家数据 local newPlayerRaffleMap = player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id] --获取数值基础配置 local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue") --当前蜗壳币 local volute = player.gameData.volute --需要蜗壳币 local needVolute = lotteryTimes==1 and cfgSValue.newPlayerRafflePrice[1] or cfgSValue.newPlayerRafflePrice[2] --检查消耗资源 if volute < needVolute then s2cData.code = errorInfo.ErrorCode.VoluteNotEnough --log.debug(string.format("新手设计抽卡 资源不足,needVolute:%d,volute:%d",needVolute,volute)) return end --查找道具配置 local cfgFurnitures = skynet.server.gameConfig:GetPlayerAllCfg(player, "Furniture") -- 单抽 if lotteryTimes == 1 then --随机资源id local randomGoodsId = 0 --判断是否需要出套间id-前多少次 出多少个 if newPlayerRaffleMap.oneLotteryCount >= (tonumber(cfgSValue.newPlayerRaffleSingle[1])- (tonumber(cfgSValue.newPlayerRaffleSingle[2])-newPlayerRaffleMap.oneLotterySuitCount)) then --随机产出套间id randomGoodsId = RandomSuit(player,cfgNewPlayerRaffle.suitId) --已经全部产出套间,重置抽卡次数 if newPlayerRaffleMap.oneLotteryCount+1 >= tonumber(cfgSValue.newPlayerRaffleSingle[1]) then newPlayerRaffleMap.oneLotteryCount = 0 newPlayerRaffleMap.oneLotterySuitCount=0 else newPlayerRaffleMap.oneLotteryCount = newPlayerRaffleMap.oneLotteryCount + 1 newPlayerRaffleMap.oneLotterySuitCount = newPlayerRaffleMap.oneLotterySuitCount + 1 end --log.debug( string.format("新手限定设计卡池 单抽产出套间,套间id:%d",randomGoodsId)) else--正常单抽 --随机权重 local randWeightArr =cfgSValue.newPlayerRafflePossibility local totalWeight = 0 for _, value in ipairs(randWeightArr) do totalWeight=totalWeight+(value*100) end local randomNum =math.random(1,totalWeight) --套间 if randomNum<=randWeightArr[1]*100 then --随机产出套间id randomGoodsId= RandomSuit(player,cfgNewPlayerRaffle.suitId) --已经全部产出套间,重置抽卡次数 if newPlayerRaffleMap.oneLotterySuitCount+1 >= tonumber(cfgSValue.newPlayerRaffleSingle[2]) then newPlayerRaffleMap.oneLotteryCount = 0 newPlayerRaffleMap.oneLotterySuitCount=0 else newPlayerRaffleMap.oneLotteryCount = newPlayerRaffleMap.oneLotteryCount + 1 newPlayerRaffleMap.oneLotterySuitCount = newPlayerRaffleMap.oneLotterySuitCount + 1 end --log.debug( string.format("新手限定设计卡池 单抽产出套间,套间id:%d",randomGoodsId)) --散件稀有 elseif randomNum<=randWeightArr[1]*100+randWeightArr[2]*100 then --随机稀有物品 randomGoodsId=RandomStuff(player,cfgNewPlayerRaffle.rareStuffId) newPlayerRaffleMap.oneLotteryCount = newPlayerRaffleMap.oneLotteryCount + 1 --散件普通 elseif randomNum<=randWeightArr[1]*100+randWeightArr[2]*100+randWeightArr[3]*100 then --随机普通物品 randomGoodsId=RandomStuff(player,cfgNewPlayerRaffle.normalStuffId) newPlayerRaffleMap.oneLotteryCount = newPlayerRaffleMap.oneLotteryCount + 1 end end --组装返回数据 local item={} item.goodsType = goodsType item.goodsId = randomGoodsId item.goodsCount = 1 --添加到返回数据 data.rewards[1]={} data.rewards[1].item=item data.rewards[1].isNew = not skynet.server.illustration:IsExistGoods( player , goodsType , randomGoodsId ) local eventId = pb.enum("EnumMoneyChangeEventID","EventID_119" ) --扣除消耗 player:MoneyChange(dataType.GoodsType_Volute , -needVolute ,eventId) --发奖 skynet.server.bag:AddGoods(player, goodsType, randomGoodsId, 1) --循环套间 for _, cfgFurniture in pairs(cfgFurnitures) do if cfgFurniture.id == randomGoodsId then local quality = cfgFurniture.quality --不凡品种特殊处理(之前的规则无法兼容) if quality==4 then quality=18 end --添加经验 player:AddExpForType( 1 , quality , 1 ) end end --10连抽 else --本次产出道具列表 local outGoodsList = {} --本次抽卡出套间数量 local suitCount=0 --前6次十抽必得套间物品数量--第7次后每次10抽必得套间数量 suitCount=player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].tenLotteryCount<=6 and cfgSValue.newPlayerRaffleDisposable[1] or cfgSValue.newPlayerRaffleDisposable[2] --先产出套间物品 for i = 1, suitCount do local outGoodsIdList={} for _, value in ipairs(outGoodsList) do outGoodsIdList[value.goodsId]=true end local randomGoodsId= RandomSuit(player,cfgNewPlayerRaffle.suitId,outGoodsIdList) table.insert(outGoodsList,{goodsId=randomGoodsId,goodsType=goodsType}) --log.debug( string.format("新手限定设计卡池 十连抽产出套间,套间id:%d",randomGoodsId)) end --普通产出 for i = 1, 10-suitCount do local randomNum =math.random(1,2) local stuffIdList = randomNum == 1 and cfgNewPlayerRaffle.rareStuffId or cfgNewPlayerRaffle.normalStuffId local randomGoodsId = RandomStuff(player,stuffIdList) --随机物品 table.insert(outGoodsList,{goodsId=randomGoodsId,goodsType= goodsType}) end local eventId = pb.enum("EnumMoneyChangeEventID","EventID_119" ) --随机打乱物品 Shuffle(outGoodsList) --扣除消耗 player:MoneyChange(dataType.GoodsType_Volute , -needVolute ,eventId) for index, temp in ipairs(outGoodsList) do --组装返回数据 local item={} item.goodsType = temp.goodsType item.goodsId = temp.goodsId item.goodsCount = 1 --添加到返回数据 data.rewards[index]={} data.rewards[index].item=item data.rewards[index].isNew = not skynet.server.illustration:IsExistGoods( player , temp.goodsType , temp.goodsId ) --发奖 if not skynet.server.bag:AddGoods(player, temp.goodsType, temp.goodsId, 1) then --log.debug(string.format("家具添加失败:goodsType:%d,goodsId:%d",temp.goodsType,temp.goodsId)) s2cData.code = errorInfo.ErrorCode.OPFailed return end --循环套间 for _, cfgFurniture in pairs(cfgFurnitures) do if cfgFurniture.id == temp.goodsId then local quality = cfgFurniture.quality --不凡品种特殊处理(之前的规则无法兼容) if quality==4 then quality=18 end --添加经验 player:AddExpForType( 1 , quality , 1 ) end end end --添加次数 player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].tenLotteryCount=player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].tenLotteryCount+1 end --更新抽奖次数 player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].totalLotteryCount = player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].totalLotteryCount + (lotteryTimes == 1 and 1 or 10) --是否可以分享 if 0 == player.gameData.todayGain.designShare then data.canShare = true else data.canShare = false end data.newPlayerCount =10 - player.gameData.NewPlayerRaffleMap[cfgNewPlayerRaffle.id].oneLotteryCount --处理红点 if lotteryTimes == 1 then skynet.server.msgTips:ReduceAll(player, 106) if not self:IsLottery(player,10) then skynet.server.msgTips:ReduceAll(player, 108) end else skynet.server.msgTips:ReduceAll(player, 108) if not self:IsLottery(player,1) then skynet.server.msgTips:ReduceAll(player, 106) end end --可领取奖励 if self:IsDrawReward(player) then skynet.server.msgTips:Add(player,107) end s2cData.data = assert(pb.encode("S2CActivityNewPlayerRaffleLottery", data)) end --获取预览信息 function ActivityNewPlayerRaffle:AwardPreview( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SActivityNewPlayerRaffleAwardPreview", c2sData.data )) s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityNewPlayerRaffleAwardPreview") local data = {} data.overviewInfos ={} --不存在开启的活动 local cfgNewPlayerRaffle=self:CheckData(player) --活动未开启 if cfgNewPlayerRaffle == nil then log.debug("cfgNewPlayerRaffle is nil") s2cData.code = errorInfo.ErrorCode.ActivityClosed return end --套间列表 local cfgFurnitures = skynet.server.gameConfig:GetPlayerAllCfg(player, "Furniture") if cfgFurnitures ~= nil then for _, cfgFurniture in pairs(cfgFurnitures) do if cfgFurniture.suitType== cfgNewPlayerRaffle.suitId and skynet.server.illustration:IsExistGoods(player,goodsType,cfgFurniture.id)then table.insert(data.overviewInfos,{goodsId=cfgFurniture.id,goodsType=goodsType }) end end end --稀有物品 for _, goodsId in ipairs(cfgNewPlayerRaffle.rareStuffId) do if skynet.server.illustration:IsExistGoods(player,goodsType,goodsId)then table.insert(data.overviewInfos,{goodsId=goodsId,goodsType=goodsType }) end end --普通物品 for _, goodsId in ipairs(cfgNewPlayerRaffle.normalStuffId) do if skynet.server.illustration:IsExistGoods(player,goodsType,goodsId)then table.insert(data.overviewInfos,{goodsId=goodsId,goodsType=goodsType }) end end s2cData.data = assert(pb.encode("S2CActivityNewPlayerRaffleAwardPreview", data)) end --随机套间 function RandomSuit(player,suitId,outGoodsList) if outGoodsList == nil then outGoodsList={} end local retSuitId=0 --查找道具配置 local cfgFurnitures = skynet.server.gameConfig:GetPlayerAllCfg(player, "Furniture") if cfgFurnitures == nil then log.error("ActivityNewPlayerRaffle:randomSuit cfgFurnitures is nil") return retSuitId end local suitList = {} --循环查找套间配置 for _, value in pairs(cfgFurnitures) do if value.suitType == suitId and suitId ~= 0 then table.insert(suitList, value) end end if #suitList == 0 then log.error("ActivityNewPlayerRaffle:randomSuit suitList is nil") return retSuitId end local prioritySuitList = {} --查找未得到的套间 for _, value in ipairs(suitList) do if skynet.server.bag:GetGoodsCount(player,goodsType, value.id)<=0 and outGoodsList[value.id] == nil then table.insert(prioritySuitList,value) end end if #prioritySuitList == 0 then local index = math.random(1,#suitList) local suit =suitList[index] --返回资源 return suit.id else local index = math.random(1,#prioritySuitList) local suit =prioritySuitList[index] --返回资源 return suit.id end end --稀有物品,普通物品 function RandomStuff(player,rareStuffIds) if rareStuffIds==nil or #rareStuffIds == 0 then log.error("ActivityNewPlayerRaffle:randomStuff rareStuffIds is nil") return 0 end local index = math.random(1,#rareStuffIds) return rareStuffIds[index] end --获取活动结束时间 function ActivityNewPlayerRaffle:GetActivityEndTime(starTime) if starTime <=0 then return 0 end --获取数值基础配置 local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue") local continuousDays = cfgSValue.newPlayerRaffleTrigger[3] or 10 -- 默认值为10天 --返回10天后的时间戳 return starTime + 86400 * continuousDays end --随机打乱物品 function Shuffle(table) if type(table) ~= "table" then return end for i = #table, 2, -1 do local j = math.random(i) -- 生成[1, i]范围内的随机索引 table[i], table[j] = table[j], table[i] -- 交换元素 end end skynet.server.activityNewPlayerRaffle = ActivityNewPlayerRaffle return ActivityNewPlayerRaffle