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 FlowerShop = oo.class(shop) FlowerShop.FlowerpotStatus_NoBuy = 1 --未购买 FlowerShop.FlowerpotStatus_AlreadyBuy = 2 --已购买 FlowerShop.FlowerpotStatus_Lock = 3 --未解锁 FlowerShop.OrderStatus_Require = 1 --需要货物 FlowerShop.OrderStatus_Purchase = 2 --进货中 FlowerShop.shopType = dataType.ShopType_Flower --初始化数据 function FlowerShop:RefreshShop( player , shopType ) if not player:IsUnlockSystem( dataType.UnlockSystem_Map ) then return end local curShop = player.gameData.shop[ shopType ] if not skynet.server.common:IsSameDay( curShop.nextRefreshTime , skynet.GetTime()) then curShop.nextRefreshTime = skynet.GetTime() local level = player.gameData.level --获取福带种子 local randGoodsList = self:GetRandSeed( skynet.server.shop.FlowerpotType_Flower , {} , level , 1 ) curShop.bagSeedId = randGoodsList[1] log.info(string.format("玩家 %d 花店 刷新福袋种子 商品ID %d " , player.userId , curShop.bagSeedId)) --获取家具 randGoodsList = self:GetRandFurniture( {} , level , 1 , skynet.server.generalShop.FurnitureBuyType_Flower ) curShop.furnitureId = randGoodsList[1] log.info(string.format("玩家 %d 花店 刷新家具 商品ID %d " , player.userId , curShop.furnitureId)) --获取回收植物 local randQuality = math.random( skynet.server.shop.FlowerpotLevel_Common , skynet.server.shop.FlowerpotLevel_Rare) randGoodsList = self:GetRandPlant( skynet.server.shop.FlowerpotType_Flower , randQuality , 1 ) curShop.recycleId = randGoodsList[1] log.info(string.format("玩家 %d 花店 刷新回收植物 商品ID %d " , player.userId , curShop.recycleId)) --货架种子 local existGoods = {} table.insert( existGoods , { id = curShop.bagSeedId , buyCount =0 }) randGoodsList = self:GetRandSeed( skynet.server.shop.FlowerpotType_Flower , existGoods , level , 3 ) curShop.shelfSeeds = {} for k, v in pairs( randGoodsList ) do table.insert( curShop.shelfSeeds , { id = v} ) log.info(string.format("玩家 %d 花店 刷新货架种子 商品ID %d " , player.userId , v)) end --刷新货架花盆 self:RefreshFlowerpot(player) --货架家具 existGoods = {} table.insert( existGoods , { id = curShop.furnitureId , buyCount =0 }) curShop.shelfFurniture = {} --先获取摆件 randGoodsList = self:GetRandCinnabar( existGoods , level , 1 , skynet.server.generalShop.FurnitureBuyType_Flower ) for k, v in pairs( randGoodsList ) do table.insert( curShop.shelfFurniture , { id = v } ) log.info(string.format("玩家 %d 花店 刷新货架摆件 商品ID %d " , player.userId , v)) end --再获取家具 randGoodsList =self:GetRandFurniture( existGoods , level , 1 , skynet.server.generalShop.FurnitureBuyType_Flower ) for k, v in pairs( randGoodsList ) do table.insert( curShop.shelfFurniture , { id = v } ) log.info(string.format("玩家 %d 花店 刷新货架家具 商品ID %d " , player.userId , v)) end end end --花店展示 function FlowerShop:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFlowerShopShow", c2sData.data )) local data = {} local shopType = dataType.ShopType_Flower local curShop = player.gameData.shop[ shopType ] data.bagSeed = curShop.bagSeedId data.furId = curShop.furnitureId data.recycleId = curShop.recycleId data.todayBagSeedBuyTimes = player.gameData.todayGain.luckyBagBuyCount data.currentHave = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Plant , curShop.recycleId ) skynet.server.levelTask:Modify( player , 27 , 1 ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_FlowerShopShow") s2cData.data = assert(pb.encode("S2CFlowerShopShow", data)) end --花店购买 function FlowerShop:Buy( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFlowerShopBuy", c2sData.data )) local data = {} local goodsType = c2sData.data.goodsType local buyGoods = c2sData.data.buyGoods if not goodsType or not buyGoods then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else local shopType = dataType.ShopType_Flower local curShop = player.gameData.shop[ shopType ] local goodsId = buyGoods.id or 0 local goodsCount = buyGoods.count or 0 if dataType.GoodsType_Furniture == goodsType then --家具 if goodsId ~= curShop.furnitureId then s2cData.code = errorInfo.ErrorCode.NoGoodsID else local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Furniture" , goodsId ) moneyCount = moneyCount * goodsCount if moneyType and player:MoneyChange( moneyType , -moneyCount ) then skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , goodsId , goodsCount ) data.buyGoods = { id = goodsId , count = goodsCount } skynet.server.passCheck:Modify( player , 18 , moneyCount ) curShop.consumeCoin = curShop.consumeCoin + moneyCount log.info(string.format("玩家 %d 花店 展示购买家具 商品ID %d 数量 %d 货币类型 %d 扣除金额 %d" , player.userId , goodsId , goodsCount , moneyType , moneyCount )) else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end end elseif dataType.GoodsType_Seed == goodsType then --福袋种子 local cfgSValue = skynet.server.gameConfig.SValue if goodsId ~= curShop.bagSeedId then s2cData.code = errorInfo.ErrorCode.NoGoodsID elseif player.gameData.todayGain.luckyBagBuyCount >= cfgSValue.FlowerShopParas[ 3 ] then s2cData.code = errorInfo.ErrorCode.TodayMaxLimit else goodsCount = cfgSValue.FlowerShopParas[1] --福袋种子默认购买3个 local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Seed" , goodsId ) moneyCount = moneyCount * goodsCount * cfgSValue.FlowerShopParas[2] --种子单价*福袋种子数量*福袋种子折扣 if moneyType and player:MoneyChange( moneyType , - moneyCount ) then player.gameData.todayGain.luckyBagBuyCount = player.gameData.todayGain.luckyBagBuyCount + 1 skynet.server.bag:AddGoods( player , dataType.GoodsType_Seed , goodsId , goodsCount ) data.buyGoods = { id = goodsId , count = goodsCount } skynet.server.passCheck:Modify( player , 18 , moneyCount ) curShop.consumeCoin = curShop.consumeCoin + moneyCount log.info(string.format("玩家 %d 花店 展示购买种子 商品ID %d 数量 %d 货币类型 %d 扣除金额 %d" , player.userId , goodsId , goodsCount , moneyType , moneyCount * goodsCount )) else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end end end skynet.server.levelTask:Modify( player , 52 , 1 ) skynet.server.passCheck:Modify( player , 17 , 1 ) data.goodsType = goodsType data.todayBagSeedBuyTimes = player.gameData.todayGain.luckyBagBuyCount end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FlowerShopBuy") s2cData.data = assert(pb.encode("S2CFlowerShopBuy", data)) end --高价回收区售卖植物 function FlowerShop:Recycle( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFlowerShopRecycle", c2sData.data )) local shopType = dataType.ShopType_Flower local curShop = player.gameData.shop[ shopType ] local soldPlant = c2sData.data.soldPlant local goodsId = soldPlant.id local buyCount = math.abs(soldPlant.buyCount) local data = {} if not soldPlant or not goodsId or not buyCount or goodsId <= 0 or buyCount < 0 then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else local isExist = false local bagCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Plant , goodsId ) if goodsId == curShop.recycleId then isExist = true end if not isExist then s2cData.code = errorInfo.ErrorCode.NoGoodsID elseif bagCount < buyCount then s2cData.code = errorInfo.ErrorCode.NoEnoughGoods else local isSuc = skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Plant , goodsId , buyCount ) if isSuc then --成功删除 local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Plant" , goodsId ) --self:GetPlantPrice( goodsId ) moneyCount = moneyCount * buyCount if moneyType and player:MoneyChange( moneyType , moneyCount ) then data.soldPlant = { id = goodsId , buyCount = buyCount } data.currentHave = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Plant , curShop.recycleId ) skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_FlowerShopRecyclePlant , 1 ) skynet.server.achieveTask:Modify( player , 19 , 1) log.info(string.format("玩家 %d 花店 展示回收植物 商品ID %d 数量 %d 货币类型 %d 增加金额 %d" , player.userId , goodsId , buyCount , moneyType , moneyCount * buyCount )) end else s2cData.code = errorInfo.ErrorCode.NoEnoughGoods log.info(string.format("玩家 %d 花店 展示回收植物 商品ID %d 数量 %d 删除失败" , player.userId , goodsId , buyCount)) end end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FlowerShopRecycle") s2cData.data = assert(pb.encode("S2CFlowerShopRecycle", data)) end --花店货架展示 function FlowerShop:ShelfShow( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFlowerShelfShow", c2sData.data )) local data = {} local shelf = player.gameData.shop[ self.shopType ] data.shelfSeeds = {} for k, v in pairs( shelf.shelfSeeds ) do table.insert( data.shelfSeeds , v.id ) end --刷新一次花盆能不能买 self:RefreshFlowerpot( player ) data.shelfPots = shelf.shelfFlowerpot data.shelfFurs = {} for k, v in pairs( shelf.shelfFurniture ) do table.insert( data.shelfFurs , v.id ) end skynet.server.levelTask:Modify( player , 27 , 1 ) data.plantCount = player.gameData.aquaticPlantCount data.nextRefreshTime = 0 s2cData.cmd = pb.enum("MsgType","CMD_S2C_FlowerShelfShow") s2cData.data = assert(pb.encode("S2CFlowerShelfShow", data)) end --花店货架购买 function FlowerShop:ShelfBuy( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFlowerShelfBuy", c2sData.data )) local data = {} local goodsType = c2sData.data.goodsType local buyGoods = c2sData.data.buyGoods if not goodsType or not buyGoods then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else local shopType = dataType.ShopType_Flower local curShop = player.gameData.shop[ shopType ] local goodsId = buyGoods.id or 0 buyGoods.buyCount = buyGoods.buyCount or 1 if buyGoods.buyCount <= 0 then buyGoods.buyCount = 1 end local goodsCount = buyGoods.buyCount goodsCount = math.abs(goodsCount) data.goodsType = goodsType if dataType.GoodsType_Furniture == goodsType then --家具 if not self:IsExistGoodsId( goodsId , curShop.shelfFurniture ) then s2cData.code = errorInfo.ErrorCode.NoGoodsID else local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Furniture" , goodsId ) moneyCount = moneyCount * goodsCount if moneyType and player:MoneyChange( moneyType , -moneyCount) then skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , goodsId , goodsCount ) data.buyGoods = { id = goodsId , count = goodsCount } skynet.server.passCheck:Modify( player , 18 , moneyCount ) curShop.consumeCoin = curShop.consumeCoin + moneyCount local exp = skynet.server.bag:CalcExp( dataType.GoodsType_Furniture , goodsId , goodsCount ) player:AddExp( exp ) log.info(string.format("玩家 %d 花店 货架购买家具 商品ID %d 数量 %d 货币类型 %d 扣除金额 %d" , player.userId , goodsId , goodsCount , moneyType , moneyCount )) else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end end elseif dataType.GoodsType_Flowerpot == goodsType then --花盆 local goodsIndex= 0 --花盆数据索引 local isBuy = false for k, v in pairs(curShop.shelfFlowerpot ) do if goodsId == v.id and v.buyCount > 0 then isBuy = true end end if not self:IsExistGoodsId( goodsId , curShop.shelfFlowerpot ) then s2cData.code = errorInfo.ErrorCode.NoGoodsID elseif isBuy then s2cData.code = errorInfo.ErrorCode.AlreadyGet else local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Flowerpot" , goodsId ) --self:GetFlowerpotPrice( goodsId ) moneyCount = moneyCount * goodsCount if moneyType and player:MoneyChange( moneyType , -moneyCount ) then skynet.server.bag:AddGoods( player , dataType.GoodsType_Flowerpot , goodsId , goodsCount ) for k, v in pairs(curShop.shelfFlowerpot ) do if goodsId == v.id then v.buyCount = v.buyCount + 1 v.status = self.FlowerpotStatus_AlreadyBuy end end data.buyGoods = { id = goodsId , count = goodsCount } skynet.server.passCheck:Modify( player , 18 , moneyCount ) curShop.consumeCoin = curShop.consumeCoin + moneyCount log.info(string.format("玩家 %d 花店 货架购买花盆 商品ID %d 数量 %d 货币类型 %d 扣除金额 %d" , player.userId , goodsId , goodsCount , moneyType , moneyCount )) else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end end elseif dataType.GoodsType_Seed == goodsType then --种子 local cfgSValue = skynet.server.gameConfig.SValue if not self:IsExistGoodsId( goodsId , curShop.shelfSeeds ) then s2cData.code = errorInfo.ErrorCode.NoGoodsID else local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Seed" , goodsId ) --self:GetSeedPrice( goodsId ) moneyCount = moneyCount * goodsCount if moneyType and player:MoneyChange( moneyType , -moneyCount ) then skynet.server.bag:AddGoods( player , dataType.GoodsType_Seed , goodsId , goodsCount ) data.buyGoods = { id = goodsId , count = goodsCount } skynet.server.passCheck:Modify( player , 18 , moneyCount ) curShop.consumeCoin = curShop.consumeCoin + moneyCount log.info(string.format("玩家 %d 花店 货架购买种子 商品ID %d 数量 %d 货币类型 %d 扣除金额 %d" , player.userId , goodsId , goodsCount , moneyType , moneyCount )) else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end end end skynet.server.levelTask:Modify( player , 52 , 1 ) skynet.server.passCheck:Modify( player , 17 , 1 ) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FlowerShelfBuy") s2cData.data = assert(pb.encode("S2CFlowerShelfBuy", data)) end --刷新货架花盆 function FlowerShop:RefreshFlowerpot( player ) local curShop = player.gameData.shop[ self.shopType ] --货架花盆 local unlockCount = player.gameData.aquaticPlantCount --水生植物数量 local flowerpotList = self:GetUnLockFlowerpot( skynet.server.shop.FlowerpotType_Flower , unlockCount ) curShop.shelfFlowerpot = {} for k1, v1 in pairs( flowerpotList ) do local isExistFlowerpot = false --是否存在花盆 for k2, v2 in pairs( curShop.shelfFlowerpot ) do if v1 == v2.id then isExistFlowerpot = true break end end if not isExistFlowerpot then --玩家可以购买该花盆 local buyCount = 0 if player:IsBuyGoods( dataType.GoodsType_Flowerpot , v1 ) then buyCount = 1 end table.insert( curShop.shelfFlowerpot , { id = v1 , buyCount = buyCount } ) log.info(string.format("玩家 %d 花店 刷新货架花盆 商品ID %d " , player.userId , v1)) end end end skynet.server.flowerShop = FlowerShop return FlowerShop