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 CuisineShop = oo.class() CuisineShop.ShopType = dataType.ShopType_Cuisine CuisineShop.NPCId = 6 --茂星 function CuisineShop:Init() end --玩家料理店数据初始化 function CuisineShop:InitData(player , shopType) --料理相关数据 local cfgCuisineMenu = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMenu") --菜品数据 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") --套餐数据 --玩家料理店相关数据 player.gameData.shop[ shopType ] = {} player.gameData.shop[ shopType ].cuisineInfos = {} --玩家菜品的相关信息 player.gameData.shop[ shopType ].menuInfos = {} --玩家菜单的相关信息 player.gameData.shop[ shopType ].mealInfos = {} --玩家套餐制作的相关信息 player.gameData.shop[ shopType ].plotInfos = {} --玩家菜地的相关信息 player.gameData.shop[ shopType ].restockInfos = {} --玩家进货的相关信息 player.gameData.shop[ shopType ].failMenuInfos = {} --玩家失败料理的相关信息 --玩家菜品相关数据赋值 for k ,v in pairs(cfgCuisineMenu) do local count = v.id player.gameData.shop[ shopType ].cuisineInfos[ count ] = {} player.gameData.shop[ shopType ].cuisineInfos[ count ].id = v.id --菜品id player.gameData.shop[ shopType ].cuisineInfos[ count ].status = 0 --菜品状态 0 未完成 1 已完成 默认未完成 player.gameData.shop[ shopType ].cuisineInfos[ count ].setChoiceCount = 0 --套餐选择该菜品的次数 end --玩家菜单相关数据赋值 for k ,v in pairs(cfgCuisineMenu) do --如果玩家没有该等级菜单则进行赋值 if not player.gameData.shop[ shopType ].menuInfos [ v.menuLevel ] and v.menuLevel > 0 then local count = v.menuLevel player.gameData.shop[ shopType ].menuInfos [ count ] = {} player.gameData.shop[ shopType ].menuInfos [ count ].level = count --菜单等级level player.gameData.shop[ shopType ].menuInfos [ count ].status = 0 --菜单状态 0 未解锁 1 未完成 2 已完成 默认未解锁 player.gameData.shop[ shopType ].menuInfos [ count ].cuisineIds = {} --菜单包含的菜品id for k1 , v1 in pairs(cfgCuisineMenu) do if count == v1.menuLevel then table.insert(player.gameData.shop[ shopType ].menuInfos [ count ].cuisineIds , v1.id) end end end end --玩家套餐相关数据赋值 料理店套餐难度分布(简单,中等,困难) 2,1,1 local difficulty = 1 local count = 1 for k ,v in pairs(cfgSValue.foodShopSetDifficultyNum) do for k1=1,v,1 do player.gameData.shop[ shopType ].mealInfos[ count ] = {} player.gameData.shop[ shopType ].mealInfos[ count ].id = count --套餐索引 player.gameData.shop[ shopType ].mealInfos[ count ].difficulty = difficulty --套餐难度 player.gameData.shop[ shopType ].mealInfos[ count ].status = 0 --套餐状态 0 未开启该套餐 1 未完成 2 可以完成 3 已完成 默认未开启该套餐 player.gameData.shop[ shopType ].mealInfos[ count ].cuisineInclude = {} --套餐完成包含的菜品 count = count + 1 end difficulty = difficulty + 1 end --玩家菜地相关数据赋值 默认5块地 for i=1,5,1 do player.gameData.shop[ shopType ].plotInfos[ i ] = {} player.gameData.shop[ shopType ].plotInfos[ i ].id = i --菜地id player.gameData.shop[ shopType ].plotInfos[ i ].status = 0 --菜地状态 0未解锁 1未种植 2幼苗 3初枝 4成枝 5成熟 默认未种植 player.gameData.shop[ shopType ].plotInfos[ i ].matId = 0 --植物id 初始为0 player.gameData.shop[ shopType ].plotInfos[ i ].nextStatusTime = 0 --下个植物状态的时间戳 player.gameData.shop[ shopType ].plotInfos[ i ].startPlantTime = 0 --开始种植的时间戳 end --玩家进货相关数据赋值 player.gameData.shop[ shopType ].restockInfos.status = 2 --进货状态 0 可进货 1 进货中 2 可领取进货 player.gameData.shop[ shopType ].restockInfos.restockLevel = 1 --上次进货的货源等级 player.gameData.shop[ shopType ].restockInfos.finishTime = 0 --进货完成时间戳 初始为0 player.gameData.shop[ shopType ].restockInfos.rewards = {} --进货的货品 --玩家当前的菜单等级 初始默认为1 player.gameData.shop[ shopType ].menuLevel = 1 player.gameData.shop[ shopType ].menuInfos [ 1 ].status = 1 --对应菜单等级的数据修改 --刷新食材 local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") for k , v in pairs(cfgCuisineMaterial) do if v.menuLevel == 1 and v.materialType == 2 then table.insert(player.gameData.shop[ self.ShopType ].restockInfos.rewards,{type = dataType.GoodsType_CuisineMaterial , id = v.id , count = v.gainNum}) end end self:LoginInitData(player) --将玩家的菜单等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail( player.gameData.partner.id ,"cuisineLevel", player.gameData.shop[ shopType ].menuLevel) end --每次登录需要进行修改的数据 function CuisineShop:LoginInitData(player) --重置料理店红点 skynet.server.msgTips:Reset(player , 51) --种植成熟的红点 skynet.server.msgTips:Reset(player , 58) --可进货的红点 skynet.server.msgTips:Reset(player , 59) --菜单奖励可领取的红点 skynet.server.msgTips:Reset(player , 73) --套餐可以完成的红点 local cfgCuisineMenu = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMenu") --菜品数据 local curShop = player.gameData.shop[ self.ShopType ] for k, v in pairs( cfgCuisineMenu ) do if curShop and not curShop.cuisineInfos[ v.id ] then curShop.cuisineInfos[ v.id ] = {} curShop.cuisineInfos[ v.id ].id = v.id --菜品id curShop.cuisineInfos[ v.id ].status = 0 --菜品状态 0 未完成 1 已完成 默认未完成 curShop.cuisineInfos[ v.id ].setChoiceCount = 0 --套餐选择该菜品的次数 end end local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") local cfgCuisineSet = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineSet") if player.gameData.shop[ self.ShopType ] then --判断玩家的菜地是否需要修改状态 local nowTime = skynet.GetTime() for k, v in pairs(player.gameData.shop[ self.ShopType ].plotInfos) do if v.matId > 0 and v.status < 4 and v.status > 0 and nowTime >= v.nextStatusTime then local timeCoefficient = skynet.server.store:GetTimeCoefficient(player , 3) --获取该植物所有状态的到达时间 local allStatusTime = self:GetAllStatusTime(player,cfgCuisineMaterial[v.matId].plantId, v.status, v.nextStatusTime, timeCoefficient) for k1 ,v1 in pairs(allStatusTime) do if nowTime >= v1.nextStatusTime then if v1.status == 4 then v.status = 5 v.nextStatusTime = 0 break else v.status = v1.status v.nextStatusTime = v1.nextStatusTime end else v.status = v1.status v.nextStatusTime = v1.nextStatusTime break end end elseif v.matId > 0 and v.status == 4 and nowTime >= v.nextStatusTime then v.status = 5 v.nextStatusTime = 0 end end --判断玩家的进货是否需要刷新 if nowTime >= player.gameData.shop[ self.ShopType ].restockInfos.finishTime and 1 == player.gameData.shop[ self.ShopType ].restockInfos.status then player.gameData.shop[ self.ShopType ].restockInfos.status = 2 player.gameData.shop[ self.ShopType ].restockInfos.finishTime = 0 end --判断玩家的套餐是否需要刷新 if player.gameData.shop[ self.ShopType ].menuLevel >= 2 then for k ,v in pairs(player.gameData.shop[ self.ShopType ].mealInfos) do if v.status == 0 then self:RefreshSetMeal(player , v.difficulty , v.id) --刷新对应难度的套餐 end end end --检查玩家菜地是否能够解锁 self:PlotUnlock(player) --红点系统 if player.gameData.shop[ self.ShopType ].restockInfos.status == 2 then --进货红点 skynet.server.msgTips:AddNoNotice(player , 58) end for k ,v in pairs(player.gameData.shop[ self.ShopType ].plotInfos) do --种植红点 if v.status == 5 then skynet.server.msgTips:AddNoNotice(player , 51) end end for k ,v in pairs(player.gameData.shop[ self.ShopType ].menuInfos) do --菜单领取的红点 if v.status == 2 then skynet.server.msgTips:AddNoNotice(player , 59) end end if player.gameData.shop[ self.ShopType ].menuLevel >= 2 then --套餐可完成的红点 for k ,v in pairs(player.gameData.shop[ self.ShopType ].mealInfos) do --判断刷新的套餐是否可以完成 if v.status == 1 then local finish = true for k1 ,v1 in pairs(v.cuisineInclude) do local menuCount = skynet.server.bag:GetGoodsCount(player , dataType.GoodsType_CuisineMenu, v1) --获取玩家背包中该菜品的数量 if 0 == menuCount then finish = false end end if finish then v.status = 2 --增加对应红点 skynet.server.msgTips:AddNoNotice(player , 73) end elseif v.status == 2 then --增加对应红点 skynet.server.msgTips:AddNoNotice(player , 73) end end end end end --料理店信息展示 function CuisineShop:CuisineShow(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineShow", c2sData.data )) local data = {} data.plotInfos = {} --菜地信息 local nowTime = skynet.GetTime() local plotInfos = player.gameData.shop[ self.ShopType ].plotInfos local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") --判断玩家的菜品数据是否需要进行修改 for k,v in pairs(player.gameData.shop[ self.ShopType ].cuisineInfos) do if skynet.server.bag:GetGoodsCount(player , dataType.GoodsType_CuisineMenu, v.id) > 0 and 0 == v.status then v.status = 1 self:FinishMenu(player) end end for k ,v in pairs(plotInfos) do --检查一下该玩家有没有到下个状态的植物 if nowTime >= v.nextStatusTime and v.status < 5 and v.nextStatusTime > 0 then local timeCoefficient = skynet.server.store:GetTimeCoefficient(player , 3) --修改对应的数据 local allStatusTime = self:GetAllStatusTime(player,cfgCuisineMaterial[v.matId].plantId, v.status, v.nextStatusTime, timeCoefficient ) for k1 ,v1 in pairs(allStatusTime) do if nowTime >= v1.nextStatusTime then if v1.status == 4 then v.status = 5 v.nextStatusTime = 0 v.startPlantTime = 0 --添加对应红点 skynet.server.msgTips:Add(player , 51) break else v.status = v1.status v.nextStatusTime = v1.nextStatusTime end else v.status = v1.status v.nextStatusTime = v1.nextStatusTime break end end end table.insert(data.plotInfos,v) end --将种植时间处理为完成时间 for k ,v in pairs(data.plotInfos) do if v.matId > 0 then v.totalTime = self:GetAllTime(player , v.startPlantTime , v.matId) end end data.menuLevel = player.gameData.shop[ self.ShopType ].menuLevel skynet.server.levelTask:Modify( player , 78 , 1 ) skynet.server.taskListEvent:Modify( player , 78 , 1 ) --判断玩家的进货是否需要刷新 if nowTime >= player.gameData.shop[ self.ShopType ].restockInfos.finishTime and 1 == player.gameData.shop[ self.ShopType ].restockInfos.status then player.gameData.shop[ self.ShopType ].restockInfos.status = 2 player.gameData.shop[ self.ShopType ].restockInfos.finishTime = 0 skynet.server.msgTips:Add(player , 58) --进货红点 end data.restockInfo = player.gameData.shop[ self.ShopType ].restockInfos s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineShow") s2cData.data = assert(pb.encode("S2CCuisineShow", data)) end --显示玩家可以种植的植物id Vegetables and fruits function CuisineShop:CuisineShowVF(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineShowVF", c2sData.data )) local data = {} local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") data.matIds = {} local level = player.gameData.shop[ self.ShopType ].menuLevel for k ,v in pairs(cfgCuisineMaterial) do if v.menuLevel <= level and 1 == v.materialType then table.insert( data.matIds , v.id) end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineShowVF") s2cData.data = assert(pb.encode("S2CCuisineShowVF", data)) end --蔬果种植 Vegetables and fruits function CuisineShop:CuisinePlantVF(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisinePlantVF", c2sData.data )) local data = {} local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") data.plotInfos = {} local matId = c2sData.data.matId --植物id local plotId = c2sData.data.plotId --菜地id local plotInfos = player.gameData.shop[ self.ShopType ].plotInfos for k , v in pairs(plotInfos) do if v.id == plotId and v.status == 1 then local plantId = cfgCuisineMaterial[matId].plantId --修改玩家菜地相关数据 v.matId = matId v.startPlantTime = skynet.GetTime() local timeCoefficient = skynet.server.store:GetTimeCoefficient(player , 3) v.status,v.nextStatusTime = self:GetNextStatusTime( player , plantId , v.startPlantTime , timeCoefficient) data.plotInfos = v --将种植时间处理为完成时间 data.plotInfos.totalTime = self:GetAllTime(player , v.startPlantTime , v.matId) break end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisinePlantVF") s2cData.data = assert(pb.encode("S2CCuisinePlantVF", data)) end --改变蔬果生长 移除或者加速 function CuisineShop:CuisineChangeVF(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineChangeVF", c2sData.data )) local data = {} local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") data.plotInfos = {} local plotId = c2sData.data.plotId --菜地id local type = c2sData.data.type --1 删除 2 加速 local methodType = c2sData.data.methodType --加速类型 local plotInfos = player.gameData.shop[ self.ShopType ].plotInfos if 1 == type then self:InitPlot(player,plotId) data.plotInfos = plotInfos[ plotId ] elseif 2 == type then --进行加速 local isSuc = false --是否加速成功 if methodType == dataType.AccelerateType_Volute then --消耗玩家蜗壳币 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_12") isSuc = player:MoneyChange(dataType.GoodsType_Volute , -cfgSValue.plantGrowupCost , eventId) if false == isSuc then s2cData.code = errorInfo.ErrorCode.NoEnoughMoney else --使用蜗壳币进行施加营养 修改相关数据 player.gameData.todayGain.plantUseCount = player.gameData.todayGain.plantUseCount + 1 if player.gameData.todayGain.plantUseCount == cfgSValue.triggerPlantPack[ 1 ] then skynet.server.store:TriggerPack(player , skynet.server.store.TriggerPack_Plant) end end elseif methodType == dataType.AccelerateType_AccTicket and skynet.server.bag:GetGoodsCount(player , dataType.GoodsType_Prop, 5) > 0 then --消耗玩家一个营养液 skynet.server.bag:RemoveGoods(player , dataType.GoodsType_Prop, 5 , 1) isSuc = true elseif methodType == dataType.AccelerateType_ADTicket and skynet.server.ad:CanWatch( player , "AccelerateVegetable") and skynet.server.ad:PayADTicket( player , "AccelerateVegetable") then isSuc = true elseif methodType == dataType.AccelerateType_WatchAD and skynet.server.ad:CanWatch( player , "AccelerateVegetable")then skynet.server.ad:Update(player, "AccelerateVegetable") isSuc = true end if isSuc then local plantId = cfgCuisineMaterial[plotInfos[ plotId ].matId].plantId --获取植物成熟的所需时间 local timeCoefficient = skynet.server.store:GetTimeCoefficient(player , 3) local growTime = cfgSValue.plantGrowTimeRatio local curCfgPlant = skynet.server.gameConfig:GetPlayerCurCfg( player , "Plant", plantId ) local allTime = math.ceil(( curCfgPlant.coin * (growTime[1]+growTime[2]+growTime[3])) * 60 * timeCoefficient) --跳转的时间为总生长时间的1/3 plotInfos[ plotId ].startPlantTime = plotInfos[ plotId ].startPlantTime - math.ceil(allTime / 3) plotInfos[ plotId ].status,plotInfos[ plotId ].nextStatusTime = self:GetNextStatusTime( player , plantId , plotInfos[ plotId ].startPlantTime , timeCoefficient) --如果植物成熟修改对应数据 if plotInfos[ plotId ].status == dataType.FlowerpotStatus_Ripe then plotInfos[ plotId ].startPlantTime = 0 skynet.server.msgTips:Add(player , 51) end data.plotInfos = plotInfos[ plotId ] data.plotInfos.totalTime = data.plotInfos.startPlantTime + allTime end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineChangeVF") s2cData.data = assert(pb.encode("S2CCuisineChangeVF", data)) end --蔬果获取 function CuisineShop:CuisineGetVF(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineGetVF", c2sData.data )) local data = {} local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") data.plotInfo = {} local plotId = c2sData.data.plotId --菜地id if 5 == player.gameData.shop[ self.ShopType ].plotInfos[ plotId ].status then --添加对应的植物 local plantId = player.gameData.shop[ self.ShopType ].plotInfos[ plotId ].matId local count = cfgCuisineMaterial[ player.gameData.shop[ self.ShopType ].plotInfos[ plotId ].matId ].gainNum skynet.server.bag:AddGoods(player, dataType.GoodsType_CuisineMaterial , plantId , count) --修改玩家菜地相关数据 self:InitPlot(player,plotId) --领取后消除红点 skynet.server.msgTips:Reduce(player , 51) skynet.server.levelTask:Modify( player , 81 , 1 ) skynet.server.taskListEvent:Modify( player ,81, 1) skynet.server.taskListEvent:Modify( player , 24 , 1 ) end data.plotInfo = player.gameData.shop[ self.ShopType ].plotInfos[ plotId ] s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineGetVF") s2cData.data = assert(pb.encode("S2CCuisineGetVF", data)) end --进货展示 function CuisineShop:CuisineShowFI(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineShowFI", c2sData.data )) local data = {} --判断玩家的进货是否需要刷新 local nowTime = skynet.GetTime() if nowTime >= player.gameData.shop[ self.ShopType ].restockInfos.finishTime and 1 == player.gameData.shop[ self.ShopType ].restockInfos.status then player.gameData.shop[ self.ShopType ].restockInfos.status = 2 player.gameData.shop[ self.ShopType ].restockInfos.finishTime = 0 skynet.server.msgTips:Add(player , 58) --进货红点 end data.restockInfo = player.gameData.shop[ self.ShopType ].restockInfos s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineShowFI") s2cData.data = assert(pb.encode("S2CCuisineShowFI", data)) end --食材开始进货 function CuisineShop:CuisineStartFI(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineStartFI", c2sData.data )) local data = {} local restockLevel = c2sData.data.restockLevel --玩家本次进货的等级 data.restockInfo = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") --只能选择小于或等于当前菜单等级的货源 if player.gameData.shop[ self.ShopType ].menuLevel >= restockLevel and 0 == player.gameData.shop[ self.ShopType ].restockInfos.status then local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") player.gameData.shop[ self.ShopType ].restockInfos.status = 1 player.gameData.shop[ self.ShopType ].restockInfos.restockLevel = restockLevel local needTime = 0 --本次进货需要的时间 local replenishCount = 0 --补充数量 for k , v in pairs(cfgCuisineMaterial) do if v.menuLevel == restockLevel and v.materialType == 2 then needTime = needTime + v.gainNum * v.restockTime --激活了豪华月卡,数量增加 if skynet.server.luxuryCard:IsActivate( player ) then replenishCount = cfgSValue.luxuryCardProteinGainTimes * v.gainNum else replenishCount = v.gainNum end table.insert(player.gameData.shop[ self.ShopType ].restockInfos.rewards,{type = dataType.GoodsType_CuisineMaterial , id = v.id , count = replenishCount }) end end --进货的完成时间 local timeCoefficient = skynet.server.store:GetTimeCoefficient(player , 6) --月卡权益 时间系数 player.gameData.shop[ self.ShopType ].restockInfos.finishTime = skynet.GetTime() + math.ceil(needTime * timeCoefficient) data.restockInfo = player.gameData.shop[ self.ShopType ].restockInfos end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineStartFI") s2cData.data = assert(pb.encode("S2CCuisineStartFI", data)) end --食材进货获取 Food ingredient function CuisineShop:CuisineGetFI(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineGetFI", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") data.restockInfo = {} if 2 == player.gameData.shop[ self.ShopType ].restockInfos.status then --增加对应食材 for k ,v in pairs(player.gameData.shop[ self.ShopType ].restockInfos.rewards) do skynet.server.bag:AddGoods(player, v.type , v.id , v.count) end --修改对应数据 player.gameData.shop[ self.ShopType ].restockInfos.status = 0 player.gameData.shop[ self.ShopType ].restockInfos.finishTime = 0 player.gameData.shop[ self.ShopType ].restockInfos.rewards = {} data.restockInfo = player.gameData.shop[ self.ShopType ].restockInfos --领取后消除红点 skynet.server.msgTips:Reduce(player , 58) skynet.server.levelTask:Modify( player , 82 , 1 ) skynet.server.taskListEvent:Modify( player , 82 , 1 ) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineGetFI") s2cData.data = assert(pb.encode("S2CCuisineGetFI", data)) end --加速进货 function CuisineShop:CuisineAccelerateRestock(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineAccelerateRestock", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local nowTime = skynet.GetTime() local restockInfos = player.gameData.shop[ self.ShopType ].restockInfos local methodType = c2sData.data.methodType if 1 ~= restockInfos.status then return else --根据类型进行加速 if methodType == dataType.AccelerateType_Volute then --消耗玩家蜗壳币 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_11") --进行计算立刻完成需要多少蜗壳币 local needVolute = math.ceil((restockInfos.finishTime - nowTime) / 60 / cfgSValue.timeExchangeVoluteCoin[2] * cfgSValue.timeExchangeVoluteCoin[1]) local isSuc = player:MoneyChange(dataType.GoodsType_Volute , -needVolute , eventId) if false == isSuc then s2cData.code = errorInfo.ErrorCode.NoEnoughMoney else restockInfos.status = 2 restockInfos.finishTime = 0 skynet.server.msgTips:Add(player , 58) --使用蜗壳币进行加速 修改相关数据 player.gameData.todayGain.speedUpUseCount = player.gameData.todayGain.speedUpUseCount + 1 if player.gameData.todayGain.speedUpUseCount == cfgSValue.triggerPlantPack[ 1 ] then skynet.server.store:TriggerPack(player , skynet.server.store.TriggerPack_SpeedUp) end end elseif methodType == dataType.AccelerateType_AccTicket and skynet.server.bag:GetGoodsCount(player , dataType.GoodsType_Prop, 6) > 0 then --消耗玩家一个加速券 skynet.server.bag:RemoveGoods(player , dataType.GoodsType_Prop, 6 , 1) restockInfos.finishTime = restockInfos.finishTime - cfgSValue.speedCouponTime * 60 --十分钟 --restockInfos.finishTime = restockInfos.finishTime - 600 --十分钟 --判断是否可以进货 if nowTime >= restockInfos.finishTime then restockInfos.status = 2 restockInfos.finishTime = 0 skynet.server.msgTips:Add(player , 58) end elseif methodType == dataType.AccelerateType_ADTicket and skynet.server.ad:CanWatch( player , "AccelerateRestock") and skynet.server.ad:PayADTicket( player , "AccelerateRestock") then --修改料理店数据 restockInfos.status = 2 restockInfos.finishTime = 0 skynet.server.msgTips:Add(player , 58) elseif methodType == dataType.AccelerateType_WatchAD and skynet.server.ad:CanWatch( player , "AccelerateRestock") then skynet.server.ad:Update(player, "AccelerateRestock") --修改料理店数据 restockInfos.status = 2 restockInfos.finishTime = 0 skynet.server.msgTips:Add(player , 58) end end data.restockInfo = restockInfos s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineAccelerateRestock") s2cData.data = assert(pb.encode("S2CCuisineAccelerateRestock", data)) end --展示玩家拥有的蔬果和肉类 function CuisineShop:CuisineShowMaterials(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineShowMaterials", c2sData.data )) local data = {} local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") data.materialInfos = {} for k ,v in pairs(player.gameData.bag) do if dataType.GoodsType_CuisineMaterial == v.type then table.insert(data.materialInfos,{type = v.type , id = v.id , count = v.count , materialType = cfgCuisineMaterial[v.id].materialType}) end end data.menuIds = {} for k ,v in pairs(player.gameData.shop[ self.ShopType ].cuisineInfos) do if 1 == v.status then table.insert(data.menuIds , v.id) end end data.failMenuInfos = {} for k ,v in pairs(player.gameData.shop[ self.ShopType ].failMenuInfos) do table.insert(data.failMenuInfos, {ids = v}) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineShowMaterials") s2cData.data = assert(pb.encode("S2CCuisineShowMaterials", data)) end --菜品制作 function CuisineShop:CuisineMakeCuisine(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineMakeCuisine", c2sData.data )) local data = {} local cfgCuisineMenu = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMenu") local cfgCuisineSet = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineSet") local materialIds = c2sData.data.materialIds --所有食材的id if #materialIds > 4 then return end table.sort(materialIds) --排序一下 local finishDish = false --是否完成 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_80") for k ,v in pairs(cfgCuisineMenu) do if player.gameData.shop[ self.ShopType ].menuLevel >= v.menuLevel then local isEqual = self:IsEqual(materialIds,v.ingredient) if isEqual and 0 == player.gameData.shop[ self.ShopType ].cuisineInfos[ v.id ].status then player.gameData.shop[ self.ShopType ].cuisineInfos[ v.id ].status = 1 --完成对应菜品 player:GiveRewardNpc(v.finishedReward, self.NPCId , eventId) --发放对应的完成奖励 奖励id npcId finishDish = true data.isFinish = finishDish data.cuisineId = v.id --判断该菜品完成后当前等级菜单是否完成 data.isNewLevel = self:FinishMenu(player) data.isReward = true skynet.server.levelTask:Modify( player , 79 , 1 ) skynet.server.taskListEvent:Modify( player , 79 , 1 ) --如果是隐藏料理 完成对应npc任务 if v.foodType == 2 then skynet.server.npcTask:Modify( player , 99 , 1 , 0 , v.id ) skynet.server.taskListEvent:Modify( player , 99 , 1 ) end break elseif isEqual and 1 == player.gameData.shop[ self.ShopType ].cuisineInfos[ v.id ].status then --如果是隐藏料理 完成对应npc任务 if v.foodType == 2 then skynet.server.npcTask:Modify( player , 99 , 1 , 0 , v.id ) skynet.server.taskListEvent:Modify( player , 99 , 1 ) end finishDish = true data.isFinish = finishDish data.cuisineId = v.id data.isReward = false break end end end --如果制作菜品失败 发送未完成奖励 if not finishDish then for k ,v in pairs(cfgCuisineMenu) do if 3 == v.foodType then player:GiveRewardNpc(v.finishedReward, self.NPCId , eventId) data.isFinish = finishDish data.cuisineId = 0 data.isReward = true break end end --将失败的材料id存储 table.insert(player.gameData.shop[ self.ShopType ].failMenuInfos,materialIds) else --完成了做菜 添加对应的数据 skynet.server.bag:AddGoods(player , dataType.GoodsType_CuisineMenu , data.cuisineId , 1) end --消耗掉对应的材料 for k ,v in pairs(materialIds) do skynet.server.bag:RemoveGoods(player , dataType.GoodsType_CuisineMaterial, v , 1) --移除背包中对应材料的数据 end data.menuLevel = player.gameData.shop[ self.ShopType ].menuLevel --套餐红点 self:SetMealRedDot( player ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineMakeCuisine") s2cData.data = assert(pb.encode("S2CCuisineMakeCuisine", data)) end --展示玩家当前套餐 function CuisineShop:CuisineShowSetMeal(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineShowSetMeal", c2sData.data )) skynet.server.msgTips:ReduceAll(player , 73) local data = {} local cfgCuisineSet = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineSet") data.setMealInfos = {} --如果有套餐难度还未开启 判断是否可以进行刷新 for k ,v in pairs(player.gameData.shop[ self.ShopType ].mealInfos) do if v.status == 0 then self:RefreshSetMeal(player , v.difficulty , v.id) end end for k ,v in pairs(player.gameData.shop[ self.ShopType ].mealInfos) do --判断刷新的套餐是否可以完成 if v.status ~= 0 then local cuisineCounts = {} --菜品信息 local finish = true for k1 ,v1 in pairs(v.cuisineInclude) do local count = skynet.server.bag:GetGoodsCount(player , dataType.GoodsType_CuisineMenu, v1) --获取玩家背包中该菜品的数量 if 0 == count then finish = false end table.insert(cuisineCounts , {id = v1 , count = count}) end --获取对应难度菜单的奖励id local cuisineSetReward = 0 for k1 ,v1 in pairs(cfgCuisineSet) do if v1.difficulty == v.difficulty then cuisineSetReward = v1.reward break end end if finish then v.status = 2 --增加对应红点 skynet.server.msgTips:AddNoNotice(player , 73) table.insert(data.setMealInfos , {status = 2 , rewardId = cuisineSetReward , cuisineCounts = cuisineCounts , setId = v.id}) else v.status = 1 table.insert(data.setMealInfos , {status = 1 , rewardId = cuisineSetReward , cuisineCounts = cuisineCounts , setId = v.id}) end end end skynet.server.msgTips:SendLastTips(player , 73) s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineShowSetMeal") s2cData.data = assert(pb.encode("S2CCuisineShowSetMeal", data)) end --套餐制作 function CuisineShop:CuisineMakeSetMeal(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineMakeSetMeal", c2sData.data )) local data = {} local cfgCuisineSet = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineSet") data.setMealInfos = {} local setMealId = c2sData.data.setMealId --套餐id --判断该套餐是否可以完成 if player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].status == 2 then local rewardId = 0 for k , v in pairs(cfgCuisineSet) do if v.difficulty == player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].difficulty then rewardId = v.reward end end --发放对应的奖励 同时修改玩家背包和套餐相关数据 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_80") player:GiveRewardNpc(rewardId, self.NPCId , eventId) data.rewardId = rewardId for k , v in pairs(player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].cuisineInclude) do skynet.server.bag:RemoveGoods(player , dataType.GoodsType_CuisineMenu, v , 1) --移除背包中对应菜品的数据 end --再次刷新对应套餐难度的所需菜品 self:RefreshSetMeal(player , player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].difficulty , setMealId) -- 完成元气套餐 if player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].difficulty == 2 then skynet.server.taskListEvent:Modify( player , 114 , 1) elseif player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].difficulty == 3 then skynet.server.taskListEvent:Modify( player , 115 , 1) end --重置对应红点 skynet.server.msgTips:ReduceAll(player , 73) --成就任务 skynet.server.achieveTask:Modify( player , 63 , 1) --npc任务 skynet.server.npcTask:Modify( player , 63 , 1 ) skynet.server.taskListEvent:Modify( player , 26 , 1 ) --嘉年华任务 skynet.server.taskListEvent:Modify( player ,63, 1) player:AddExpCount( 5 ) end --返回玩家新的套餐信息 for k ,v in pairs(player.gameData.shop[ self.ShopType ].mealInfos) do --判断刷新的套餐是否可以完成 if v.status ~= 0 then local cuisineCounts = {} local finish = true for k1 ,v1 in pairs(v.cuisineInclude) do local count = skynet.server.bag:GetGoodsCount(player , dataType.GoodsType_CuisineMenu, v1) --获取玩家背包中该菜品的数量 if count == 0 then finish = false end table.insert(cuisineCounts , {id = v1 , count = count}) end --获取对应难度菜单的奖励id local cuisineSetReward = 0 for k1 ,v1 in pairs(cfgCuisineSet) do if v1.difficulty == v.difficulty then cuisineSetReward = v1.reward break end end if finish then v.status = 2 --增加对应红点 skynet.server.msgTips:AddNoNotice(player , 73) table.insert(data.setMealInfos , {status = 2 , rewardId = cuisineSetReward , cuisineCounts = cuisineCounts , setId = v.id}) else v.status = 1 table.insert(data.setMealInfos , {status = 1 , rewardId = cuisineSetReward , cuisineCounts = cuisineCounts , setId = v.id}) end end end skynet.server.msgTips:SendLastTips(player , 73) s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineMakeSetMeal") s2cData.data = assert(pb.encode("S2CCuisineMakeSetMeal", data)) end --展示菜单 function CuisineShop:CuisineShowMenu(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineShowMenu", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local cfgCuisineMenu = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMenu") local type = c2sData.data.type --1 普通菜单 2 隐藏菜单 data.type = type if 1 == type then data.menuInfos = {} for k ,v in pairs(player.gameData.shop[ self.ShopType ].menuInfos) do local cuisineInfos = {} --玩家该菜单对应的菜品数据 --只需要判断当前菜单等级的菜品 if player.gameData.shop[ self.ShopType ].menuLevel == v.level then local finish = true for k1 , v1 in pairs(v.cuisineIds) do local status = player.gameData.shop[ self.ShopType ].cuisineInfos[ v1 ].status if status == 0 then finish = false end table.insert(cuisineInfos , {id = v1 , status = status}) end if finish and v.status == 1 then v.status = 2 table.insert(data.menuInfos, {level = v.level , status = v.status , cuisineInfos = cuisineInfos , rewardId = cfgSValue.restaurantMenuLvlReward[ v.level ]}) else table.insert(data.menuInfos, {level = v.level , status = v.status , cuisineInfos = cuisineInfos , rewardId = cfgSValue.restaurantMenuLvlReward[ v.level ]}) end else for k1 , v1 in pairs(v.cuisineIds) do local status = player.gameData.shop[ self.ShopType ].cuisineInfos[ v1 ].status table.insert(cuisineInfos , {id = v1 , status = status}) end table.insert(data.menuInfos, {level = v.level , status = v.status , cuisineInfos = cuisineInfos , rewardId = cfgSValue.restaurantMenuLvlReward[ v.level ]}) end end elseif 2 == type then data.spMenuInfos = {} for k,v in pairs(player.gameData.shop[ self.ShopType ].cuisineInfos) do if 2 == cfgCuisineMenu[ v.id ].foodType then table.insert(data.spMenuInfos , {id = v.id,status = v.status}) end end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineShowMenu") s2cData.data = assert(pb.encode("S2CCuisineShowMenu", data)) end --领取菜单奖励 function CuisineShop:CuisineMenuAward(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineMenuAward", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local level = c2sData.data.level --获取的菜单Id if player.gameData.shop[ self.ShopType ].menuInfos[ level ].status == 2 then --发放对应的奖励 local rewardId = cfgSValue.restaurantMenuLvlReward[ level ] local eventId = pb.enum("EnumMoneyChangeEventID","EventID_75") player:GiveReward(rewardId , eventId , 1) data.rewardId = rewardId --修改玩家相关数据 player.gameData.shop[ self.ShopType ].menuInfos[ level ].status = 3 --领取后消除红点 skynet.server.msgTips:Reduce(player , 59) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineMenuAward") s2cData.data = assert(pb.encode("S2CCuisineMenuAward", data)) end --一键制作 function CuisineShop:CuisineMassProduce(player, c2sData , s2cData) c2sData.data = assert(pb.decode("C2SCuisineMassProduce", c2sData.data )) local data = {} local cuisineId = c2sData.data.cuisineId --制作菜品id local number = c2sData.data.number --制作菜品数量 local cfgCuisineMenu = skynet.server.gameConfig:GetPlayerCurCfg( player , "CuisineMenu" , cuisineId) --菜单3级才开启一键制作 if player.gameData.shop[ self.ShopType ].menuLevel >= 3 then --判断玩家对应材料是否足够 local canDoCuisine = true --是否可以完成做菜 for k , v in pairs(cfgCuisineMenu.ingredient) do local count = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_CuisineMaterial, v ) --获取玩家背包中该材料的数量 if count < number then canDoCuisine = false break end end --如果可以完成 扣除材料增加菜品 if canDoCuisine then for k , v in pairs(cfgCuisineMenu.ingredient) do skynet.server.bag:RemoveGoods( player , dataType.GoodsType_CuisineMaterial, v , number) end skynet.server.bag:AddGoods( player , dataType.GoodsType_CuisineMenu , cuisineId , number) --套餐红点 self:SetMealRedDot( player ) --返回客户端需要的数据暂定 data.isFinish = true data.cuisineId = cuisineId --如果是隐藏料理 完成对应npc任务 if cfgCuisineMenu.foodType == 2 then skynet.server.npcTask:Modify( player , 99 , 1 , 0 , cuisineId ) skynet.server.taskListEvent:Modify( player , 99 , 1) end else s2cData.code = errorInfo.ErrorCode.NoEnoughMaterial end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_CuisineMassProduce") s2cData.data = assert(pb.encode("S2CCuisineMassProduce", data)) end --菜单是否完成 function CuisineShop:FinishMenu(player) --玩家当前的菜单等级 和菜单所对应的菜品id local level = player.gameData.shop[ self.ShopType ].menuLevel local cuisineIds = player.gameData.shop[ self.ShopType ].menuInfos[ level ].cuisineIds local finish = true for k ,v in pairs(cuisineIds) do if 0 == player.gameData.shop[ self.ShopType ].cuisineInfos[ v ].status then finish = false break end end --如果该菜单已经完成了 修改玩家对应数据 if finish and 1 == player.gameData.shop[ self.ShopType ].menuInfos[ level ].status then player.gameData.shop[ self.ShopType ].menuInfos[ level ].status = 2 --该菜单状态修改为已完成 if level < 4 then player.gameData.shop[ self.ShopType ].menuLevel = level + 1 --菜单当前等级加1 player.gameData.shop[ self.ShopType ].menuInfos[ player.gameData.shop[ self.ShopType ].menuLevel ].status = 1 --菜单相关状态修改 end --到达二级过后刷新套餐 if 2 == player.gameData.shop[ self.ShopType ].menuLevel then for k ,v in pairs(player.gameData.shop[ self.ShopType ].mealInfos) do if v.status == 0 then self:RefreshSetMeal(player , v.difficulty , v.id) --刷新对应难度的套餐 end end skynet.server.npcTask:Modify( player , 96 , 2 ) skynet.server.taskListEvent:Modify( player , 96 , 2 ) else skynet.server.npcTask:Modify( player , 96 , 1 ) skynet.server.taskListEvent:Modify( player , 96 , 1 ) end --解锁菜单对应的菜地 self:PlotUnlock(player) --将玩家的菜单等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail( player.gameData.partner.id ,"cuisineLevel", player.gameData.shop[ self.ShopType ].menuLevel) --添加对应红点 skynet.server.msgTips:Add(player , 59) --发送最新的料理店信息给客户端 local s2cData = {} self:CuisineShow(player , {} ,s2cData) local data = assert(pb.decode("S2CCuisineShow", s2cData.data)) skynet.server.gameServer:SendMsgToUser(player.userId, "CMD_S2C_CuisineShow", data) end return finish end --土块初始化 function CuisineShop:InitPlot(player, plotId) player.gameData.shop[ self.ShopType ].plotInfos[ plotId ].status = 1 player.gameData.shop[ self.ShopType ].plotInfos[ plotId ].matId = 0 player.gameData.shop[ self.ShopType ].plotInfos[ plotId ].nextStatusTime = 0 player.gameData.shop[ self.ShopType ].plotInfos[ plotId ].startPlantTime = 0 end --食材进货刷新 取消 function CuisineShop:RefreshFI(player) local level = player.gameData.shop[ self.ShopType ].menuLevel local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") --获取该玩家所有可以进货的食材 local allFI = {} for k ,v in pairs( cfgCuisineMaterial ) do if v.menuLevel <= level and v.materialType == 2 then table.insert(allFI , {type = dataType.GoodsType_CuisineMaterial , id = v.id , count = v.gainNum}) end end --每次进货物品 local getFI = {} --玩家得到的货物 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local stockNum = cfgSValue.restaurantMeatType for i=1,stockNum,1 do local count = math.random(1,#allFI) --添加到获取表中 同时防止进货物品重复 table.insert( getFI , allFI[count]) table.remove( allFI , count) end return getFI end --套餐刷新 function CuisineShop:RefreshSetMeal(player, type, setId) local cfgCuisineSet = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineSet") --本次刷新套餐难度需要的菜品数量 local needCuisineNum = 0 --本次刷新套餐难度中包含的菜品 local setIncludeMenus = {} for k , v in pairs(cfgCuisineSet) do if v.difficulty == type then needCuisineNum = v.cuisineNum setIncludeMenus = v.cuisineInclude break end end local canDoMenus = {} --存储玩家该套餐难度可以做的菜 local priDoMenus = {} --存储玩家该套餐难度优先做的菜 for k , v in pairs(setIncludeMenus) do local cuisineInfo = player.gameData.shop[ self.ShopType ].cuisineInfos[v] if cuisineInfo.status == 1 and cuisineInfo.setChoiceCount == 0 then table.insert(priDoMenus,cuisineInfo.id) elseif cuisineInfo.status == 1 then table.insert(canDoMenus,cuisineInfo.id) end end --判断是否可以进行刷新 if #canDoMenus + #priDoMenus < needCuisineNum then return end --开始刷新本次套餐的对应菜品 player.gameData.shop[ self.ShopType ].mealInfos[setId].status = 1 player.gameData.shop[ self.ShopType ].mealInfos[setId].cuisineInclude = {} if #priDoMenus >= needCuisineNum then --优先做菜的数量比需要的数量多时 直接在优先里面进行随机 for k=1,needCuisineNum,1 do local key = math.random(1,#priDoMenus) table.insert(player.gameData.shop[ self.ShopType ].mealInfos[setId].cuisineInclude,priDoMenus[key]) --修改对应的菜品被套餐选中的次数 player.gameData.shop[self.ShopType].cuisineInfos[priDoMenus[key]].setChoiceCount = 1 --移除对应的菜品 防止刷新到同一个 table.remove(priDoMenus , key) end elseif #priDoMenus < needCuisineNum and #priDoMenus > 0 then --优先做菜的数量比需要的数量少但是比0大时 直接选择优先的菜,剩余的菜从可以做的菜里面随机 for k , v in pairs(priDoMenus) do table.insert(player.gameData.shop[ self.ShopType ].mealInfos[setId].cuisineInclude,v) player.gameData.shop[self.ShopType].cuisineInfos[v].setChoiceCount = 1 end local residueCount = needCuisineNum - #priDoMenus --还需要刷新的菜品数量 for k=1,residueCount,1 do local key = math.random(1,#canDoMenus) table.insert(player.gameData.shop[ self.ShopType ].mealInfos[setId].cuisineInclude,canDoMenus[key]) --修改对应的菜品被套餐选中的次数 player.gameData.shop[self.ShopType].cuisineInfos[canDoMenus[key]].setChoiceCount = player.gameData.shop[self.ShopType].cuisineInfos[canDoMenus[key]].setChoiceCount + 1 --移除对应的菜品 防止刷新到同一个 table.remove(canDoMenus , key) end elseif #priDoMenus == 0 then --没有优先做菜时 直接在可以做的菜里面进行随机 for k=1,needCuisineNum,1 do local key = math.random(1,#canDoMenus) table.insert(player.gameData.shop[ self.ShopType ].mealInfos[setId].cuisineInclude,canDoMenus[key]) --修改对应的菜品被套餐选中的次数 player.gameData.shop[self.ShopType].cuisineInfos[canDoMenus[key]].setChoiceCount = player.gameData.shop[self.ShopType].cuisineInfos[canDoMenus[key]].setChoiceCount + 1 --移除对应的菜品 防止刷新到同一个 table.remove(canDoMenus , key) end end end --套餐刷新(旧) function CuisineShop:OldRefreshSetMeal(player,type) local cfgCuisineSet = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineSet") local setMealInfos = {} --setMealInfos存储还可以进行刷新的套餐 local count = 2 --存储还需要刷新的套餐数量 local number = 9999 --存储套餐最小的完成次数 if 1 ~= type then count = 1 end local canDoMenu = {} --存储玩家已经做过的菜 for k ,v in pairs(player.gameData.shop[ self.ShopType ].cuisineInfos) do if 1 == v.status then canDoMenu[ v.id ] = v.id end end --存储玩家可以完成的套餐 for k ,v in pairs(cfgCuisineSet) do if v.difficulty == type then local canFinish = true for k1 ,v1 in pairs(v.cuisineInclude) do if canDoMenu[v1] == nil then canFinish = false end end if canFinish then --使用套餐id作为key setMealInfos[ v.id ] = {} setMealInfos[ v.id ].id = v.id end end end --判断是否还有可以进行刷新的套餐 if next(setMealInfos) == nil then return end for k ,v in pairs(player.gameData.shop[ self.ShopType ].mealInfos) do if 0 == v.status and type == cfgCuisineSet[ v.id ].difficulty then if v.number < number and setMealInfos[v.id] ~= nil then number = v.number setMealInfos[ v.id ].number = v.number end elseif (1 == v.status or 2 == v.status) and type == cfgCuisineSet[ v.id ].difficulty then count = count - 1 elseif 3 == v.status and type == cfgCuisineSet[ v.id ].difficulty then --完成了的套餐将其status置为0 且完成次数加1 v.status = 0 v.number = v.number + 1 end end --根据规则进行刷新套餐 local nowSetMealInfos = {} --存储符合本次刷新条件的简单套餐 if count > 0 and 1 == type then for k , v in pairs(setMealInfos) do if v.number == number then table.insert(nowSetMealInfos , v.id) end end if #nowSetMealInfos == 0 then return end --进行刷新套餐 if #nowSetMealInfos >= count then --刷新套餐数量大于0 同时满足刷新的套餐数量大于需要的套餐数量 for i=1 ,count ,1 do local key = math.random(1,#nowSetMealInfos) local setMealId = nowSetMealInfos[ key ] --随机的套餐id player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].status = 1 --修改对应套餐的状态 table.remove(nowSetMealInfos , key) --移除本次刷新套餐中的数据 防止刷新到同一个 end elseif #nowSetMealInfos < count then local needCount = count - #nowSetMealInfos --还需刷新的套餐数量 for i=1 ,count - needCount ,1 do local key = math.random(1,#nowSetMealInfos) local setMealId = nowSetMealInfos[ key ] --随机的套餐id player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].status = 1 --修改对应套餐的状态 table.remove(nowSetMealInfos , key) --移除本次刷新套餐中的数据 防止刷新到同一个 end --再访问一次本方法 self:OldRefreshSetMeal(player) end elseif count > 0 and 1 ~= type then for k , v in pairs(setMealInfos) do if v.number == number then table.insert(nowSetMealInfos , v.id) end end if #nowSetMealInfos == 0 then return end --进行刷新套餐 因为只有一个不存在满足条件的套餐数量不够 for i=1 ,count ,1 do local key = math.random(1,#nowSetMealInfos) local setMealId = nowSetMealInfos[ key ] --随机的套餐id player.gameData.shop[ self.ShopType ].mealInfos[ setMealId ].status = 1 --修改对应套餐的状态 table.remove(nowSetMealInfos , key) --移除本次刷新套餐中的数据 防止刷新到同一个 end end end --判断食材是否符合菜品所需食材 function CuisineShop:IsEqual(a,b) local _a,_b = 0, 0 for _ak, _av in pairs(a) do _a = _a + 1 end for _bk, _bv in pairs(b) do _b = _b + 1 end if _a ~= _b then return false end for a_k, a_v in pairs(a) do if a_v ~= b[a_k] then return false end end return true end --获取到成熟状态的所有时间 植物id 植物当前状态 下个状态的时间 月卡时间系数 function CuisineShop:GetAllStatusTime( player , plantId , status , nextStatusTime , timeCoefficient) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local growTime = cfgSValue.plantGrowTimeRatio local curCfgPlant = skynet.server.gameConfig:GetPlayerCurCfg( player , "Plant", plantId ) local allStatusTime = {} --往allStatusTime 插入对应数据 local count = status allStatusTime[ count ] = {} allStatusTime[ count ].status = status allStatusTime[ count ].nextStatusTime = nextStatusTime for i = status + 1 , 4 , 1 do --((出售价格 * 系数) = 分钟数) * 60秒 = 所需要的秒数 购买了月卡的话缩短时间 if dataType.FlowerpotStatus_Sprout == i then --发芽 local nextTime = allStatusTime[i-1].nextStatusTime + math.ceil(( curCfgPlant.coin * growTime[2]) * 60 * timeCoefficient) count = count + 1 allStatusTime[ count ] = {} allStatusTime[ count ].status = i allStatusTime[ count ].nextStatusTime = nextTime elseif dataType.FlowerpotStatus_Bud == i then --花苞 local nextTime = allStatusTime[i-1].nextStatusTime + math.ceil(( curCfgPlant.coin * growTime[3]) * 60 * timeCoefficient) count = count + 1 allStatusTime[ count ] = {} allStatusTime[ count ].status = i allStatusTime[ count ].nextStatusTime = nextTime end end return allStatusTime end --获取当前状态和下一个状态的时间 function CuisineShop:GetNextStatusTime( player , plantId , startPlantTime , timeCoefficient) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local growTime = cfgSValue.plantGrowTimeRatio local nextStatusTime = startPlantTime local curCfgPlant = skynet.server.gameConfig:GetPlayerCurCfg( player , "Plant", plantId ) local status = dataType.FlowerpotStatus_Seed --植物的状态最起码是种子 for k , v in pairs(growTime) do --开始种植的时间 + 下个状态的所需时间 ((出售价格 * 系数) = 分钟数) * 60秒 = 所需要的秒数 nextStatusTime = nextStatusTime + math.ceil(( curCfgPlant.coin * v ) * 60 * timeCoefficient) if skynet.GetTime() < nextStatusTime then return status,nextStatusTime else status = status + 1 end end --没有返回则代表植物已经成熟了 return status,0 end --获取好友送礼 刷新相关数据 function CuisineShop:RefreshData( player, goodsId) local cfgOneCuisineMenu = skynet.server.gameConfig:GetPlayerCurCfg( player , "CuisineMenu" , goodsId ) --如果是隐藏料理 完成对应npc任务 if cfgOneCuisineMenu.foodType == 2 then skynet.server.npcTask:Modify( player , 99 , 1 , 0 , goodsId ) skynet.server.taskListEvent:Modify( player , 99 , 1) end end --完成做菜后 判断套餐红点 function CuisineShop:SetMealRedDot( player ) if player.gameData.shop[ self.ShopType ].menuLevel >= 2 then --套餐可完成的红点 for k ,v in pairs(player.gameData.shop[ self.ShopType ].mealInfos) do --判断刷新的套餐是否可以完成 if v.status ~= 0 then local finish = true for k1 ,v1 in pairs(v.cuisineInclude) do local count = skynet.server.bag:GetGoodsCount(player , dataType.GoodsType_CuisineMenu, v1) --获取玩家背包中该菜品的数量 if 0 == count then finish = false end end if finish then v.status = 2 --增加对应红点 skynet.server.msgTips:Add(player , 73) end end end end end --检查玩家菜地是否能够解锁 function CuisineShop:PlotUnlock( player ) local plotInfos = player.gameData.shop[ self.ShopType ].plotInfos local menuLevel = player.gameData.shop[ self.ShopType ].menuLevel --玩家菜单等级 --菜地plot对应菜单解锁等级 local foodShopPlotUnlock = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue").foodShopPlotUnlock for k , v in pairs(foodShopPlotUnlock) do local arr = skynet.server.common:Split(v , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) if plotInfos[ arr[1] ].status == 0 and menuLevel >= arr[2] then plotInfos[ arr[1] ].status = 1 end end end --根据种植时间获取植物所有生长时间 function CuisineShop:GetAllTime( player , startPlantTime , matId ) local timeCoefficient = skynet.server.store:GetTimeCoefficient(player , 3) --月卡权益 local growTime = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue").plantGrowTimeRatio local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial") local plantId = cfgCuisineMaterial[matId].plantId local curCfgPlant = skynet.server.gameConfig:GetPlayerCurCfg( player , "Plant", plantId ) return startPlantTime + math.ceil(( curCfgPlant.coin * (growTime[1]+growTime[2]+growTime[3])) * 60 * timeCoefficient) end skynet.server.cuisineShop = CuisineShop return CuisineShop