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 FurnitureWorkShop = oo.class() FurnitureWorkShop.SlotStatusUnLock = 1 --格子状态 未解锁 FurnitureWorkShop.SlotStatusBlank = 2 --格子状态 空白 FurnitureWorkShop.SlotStatusTime = 3 --格子状态 计时 FurnitureWorkShop.SlotStatusGet = 4 --格子状态 领取 function FurnitureWorkShop:Init() end --登陆初始化数据 function FurnitureWorkShop:LoginInitData( player ) self:InitData( player ) end --初始玩家家具工坊的数据 function FurnitureWorkShop:InitData( player ) --重置制作红点 skynet.server.msgTips:Reset(player , 61) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local maxSlotNumber = 0 for k ,v in pairs(cfgSValue.makeSpace) do maxSlotNumber = maxSlotNumber + v end if not player.gameData.furnitureWorkShop.isInit and cfgSValue.colorUnlockLvl <= player.gameData.level then --if true then -- 开始给格子进行赋值 for i = 1, maxSlotNumber , 1 do player.gameData.furnitureWorkShop.slotData[ i ] ={} player.gameData.furnitureWorkShop.slotData[ i ].slotId = i --格子位置 player.gameData.furnitureWorkShop.slotData[ i ].furId = 0 --制作家具Id player.gameData.furnitureWorkShop.slotData[ i ].finishTime = 0 --完成制作的时间戳 -- 默认解锁2个格子 if i <= cfgSValue.makeSpace[ 1 ] then player.gameData.furnitureWorkShop.slotData[ i ].status = 2 --格子状态 1 未解锁 2 空白 3计时中 4待领取 else player.gameData.furnitureWorkShop.slotData[ i ].status = 1 --格子状态 1 未解锁 2 空白 3计时中 4待领取 end player.gameData.furnitureWorkShop.slotData[ i ].number = 1 --制作的数量(最多3个) end player.gameData.furnitureWorkShop.isInit = true --月卡权益 self:UnlockByMonthCard( player ) end --检查一下有没有完成的制作 增加对应红点 for k ,v in pairs(player.gameData.furnitureWorkShop.slotData) do if v.status == self.SlotStatusGet then skynet.server.msgTips:AddNoNotice(player , 61) elseif v.status == self.SlotStatusTime and skynet.GetTime() >= v.finishTime then self:ChangeSlotType(player , v.slotId , self.SlotStatusGet) skynet.server.msgTips:AddNoNotice(player , 61) end end end --家具工坊显示 显示所有slot的状态 function FurnitureWorkShop:ShowSlots( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFurMakeShowSlots", c2sData.data )) -- 获取玩家家具工坊格子的信息 local data = {} data.slotInfos = {} for k , v in pairs(player.gameData.furnitureWorkShop.slotData) do local nowTime = skynet.GetTime() --检查一下有没有完成的制作 修改对应的格子状态 if nowTime>=v.finishTime and v.status==self.SlotStatusTime then v.status=self.SlotStatusGet self:ChangeSlotType(player , k , self.SlotStatusGet) skynet.server.msgTips:Add(player , 61) end table.insert(data.slotInfos , v) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurMakeShowSlots") s2cData.data = assert(pb.encode("S2CFurMakeShowSlots", data)) end --家具工坊可制作家具显示 显示所有可以制作的家具id function FurnitureWorkShop:ShowFurs( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFurMakeShowFurs", c2sData.data )) local data = {} local cfgFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture") data.furIds = {} for k ,v in pairs( cfgFurniture ) do --只有shopType为 1 3 5 并且玩家获得过的家具才可以进行制作 if (v.shopType == 1 or v.shopType == 3 or v.shopType == 5) and skynet.server.illustration:IsExistGoods(player,dataType.GoodsType_Furniture,v.id) then table.insert(data.furIds , v.id) end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurMakeShowFurs") s2cData.data = assert(pb.encode("S2CFurMakeShowFurs", data)) end --家具工坊制作 function FurnitureWorkShop:Make( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFurMakeMake", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") data.slotInfo = {} local slotId = c2sData.data.slotId local furId = c2sData.data.furId --家具id local number = c2sData.data.number if number > 3 then number = 3 elseif number < 0 then number = - number end if not slotId or not number or not number then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else --获取玩家的格子对应数据 local slotData = player.gameData.furnitureWorkShop.slotData[ slotId ] if slotData.status == self.SlotStatusBlank then --获取该家具需要消耗的时间和金币 local cfgOneFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , furId) if 0 == cfgOneFurniture.furnitureMakeCoin then s2cData.code = errorInfo.ErrorCode.CurFurnitureNoMake else local needCoin = number*(cfgOneFurniture.furnitureMakeCoin) local needTime = number*(cfgOneFurniture.furnitureMakeCoin * cfgSValue.makeTimeRatio)*60 --完成时间 local finishTime=math.ceil(skynet.GetTime()+needTime) local eventId = pb.enum("EnumMoneyChangeEventID","EventID_50" ) local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "Coin"), -needCoin , eventId) if isSuc == false then --制作失败 金币不足 s2cData.code = errorInfo.ErrorCode.NoEnoughMoney elseif isSuc then --制作成功 同时修改格子的数据 data.slotInfo= {slotId = slotId , furId = furId , finishTime = finishTime , status = self.SlotStatusTime, number = number} player.gameData.furnitureWorkShop.slotData[ slotId ] = data.slotInfo end end end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurMakeMake") s2cData.data = assert(pb.encode("S2CFurMakeMake", data)) end --家具工坊领取 function FurnitureWorkShop:Prize( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFurMakePrize", c2sData.data )) local data = {} data.slotInfo = {} local slotId = c2sData.data.slotId --获取玩家的格子对应数据 local slotData = player.gameData.furnitureWorkShop.slotData[ slotId ] --判断格子信息是否正确 if not slotData.status == self.SlotStatusGet then --判断格子状态是否符合 s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError else --增加家具 skynet.server.bag:AddGoods(player , dataType.GoodsType_Furniture , slotData.furId ,slotData.number) --判断月卡格子标识 --修改格子数据为空白状态的数据 data.slotInfo = self:InitSlotData( slotId ) if slotData.waitforlock then player.gameData.furnitureWorkShop.slotData[ slotId ] = data.slotInfo self:ChangeSlotType(player,slotId,self.SlotStatusUnLock) else player.gameData.furnitureWorkShop.slotData[ slotId ] = data.slotInfo end skynet.server.msgTips:Reduce(player , 61) --领取制作之后 消除对应红点 --等级任务 & 通行证任务 skynet.server.levelTask:Modify( player , 72 , 1 ) skynet.server.taskListEvent:Modify( player , 35 , 1 ) --在巧手工坊完成家具或摆件制作 local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture",slotData.furId) --必须是摆件和家具 if cfgFurniture ~= nil and (cfgFurniture.type ==4 or cfgFurniture.type ==3) then skynet.server.taskListEvent:Modify( player , 72 , 1) end player:AddExpCount( 3 ) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurMakePrize") s2cData.data = assert(pb.encode("S2CFurMakePrize", data)) end --家具工坊加速 function FurnitureWorkShop:SpeedUp( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFurMakeSpeedUp", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") data.slotInfo = {} local slotId = c2sData.data.slotId local slotData = player.gameData.furnitureWorkShop.slotData[ slotId ] -- 判断格子状态是否符合 if slotData.status == self.SlotStatusTime then --进行加速 if skynet.server.bag:GetGoodsCount(player , dataType.GoodsType_Prop, 6) > 0 then --消耗玩家一个加速券 skynet.server.bag:RemoveGoods(player , dataType.GoodsType_Prop, 6 , 1) slotData.finishTime = slotData.finishTime - cfgSValue.speedCouponTime * 60 --制作的完成时间减去十分钟 local nowTime = skynet.GetTime() if nowTime >= slotData.finishTime then --修改格子状态为领取 self:ChangeSlotType(player , slotId , self.SlotStatusGet) data.slotInfo = {slotId = slotId , furId = slotData.furId , finishTime = 0 , status = self.SlotStatusGet, number = slotData.number} if player.gameData.furnitureWorkShop.slotData[ slotId ].waitforlock then player.gameData.furnitureWorkShop.slotData[ slotId ] = data.slotInfo player.gameData.furnitureWorkShop.slotData[ slotId ].waitforlock = true else player.gameData.furnitureWorkShop.slotData[ slotId ] = data.slotInfo end skynet.server.msgTips:Add(player , 61) --制作完成 增加对应红点 else data.slotInfo = player.gameData.furnitureWorkShop.slotData[ slotId ] end else --获取玩家染色完成需要的时间 local time = slotData.finishTime local nowTime = skynet.GetTime() --进行计算立刻完成需要多少蜗壳币 local needVolute = math.ceil((time - nowTime) / 60 / cfgSValue.timeExchangeVoluteCoin[2] * cfgSValue.timeExchangeVoluteCoin[1]) --if (time-nowTime) <= cfgSValue.makeTimeVoluteCoin[1] *60 then -- --当时间小于设定数值 消耗的数值恒定 -- needVolute = cfgSValue.makeTimeVoluteCoin[2] --else -- --当时间大于设定数值 (T-a)/b*y+x -- needVolute = math.ceil(math.ceil((time-nowTime)/60-cfgSValue.makeTimeVoluteCoin[1])/cfgSValue.makeTimeVoluteRatio[1]) * cfgSValue.makeTimeVoluteRatio[2] + cfgSValue.makeTimeVoluteCoin[2] --end if needVolute < 0 then s2cData.code = errorInfo.ErrorCode.ErrRequestParam s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurMakeSpeedUp") return end local eventId = pb.enum("EnumMoneyChangeEventID","EventID_51" ) local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "VoluteCoin" ), -needVolute ,eventId) if isSuc == false then --加速失败 蜗壳币不足 s2cData.code = errorInfo.ErrorCode.NoEnoughMoney else --加速成功 修改格子状态为领取 self:ChangeSlotType(player , slotId , self.SlotStatusGet) data.slotInfo = {slotId = slotId , furId = slotData.furId , finishTime = 0 , status = self.SlotStatusGet, number = slotData.number} if player.gameData.furnitureWorkShop.slotData[ slotId ].waitforlock then player.gameData.furnitureWorkShop.slotData[ slotId ] = data.slotInfo player.gameData.furnitureWorkShop.slotData[ slotId ].waitforlock = true else player.gameData.furnitureWorkShop.slotData[ slotId ] = data.slotInfo end skynet.server.msgTips:Add(player , 61) --制作完成 增加对应红点 --使用蜗壳币进行加速 修改相关数据 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 end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurMakeSpeedUp") s2cData.data = assert(pb.encode("S2CFurMakeSpeedUp", data)) end --家具工坊解锁 function FurnitureWorkShop:Unlock( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SFurMakeUnlock", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") data.slotInfo = {} local slotId = c2sData.data.slotId local slotData = player.gameData.furnitureWorkShop.slotData[ slotId ] -- 判断格子状态是否符合 且格子是用蜗壳币进行解锁的 if not slotData or slotData.status ~= self.SlotStatusUnLock or slotId > (cfgSValue.makeSpace[1]+cfgSValue.makeSpace[2]) then s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError else local eventId = pb.enum("EnumMoneyChangeEventID","EventID_52" ) local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "VoluteCoin"), - cfgSValue.makeSpaceVoluteCoin , eventId) if isSuc == false then --解锁失败 蜗壳币不足 s2cData.code = errorInfo.ErrorCode.NoEnoughMoney else --解锁成功 同时初始化格子的数据 data.slotInfo = self:InitSlotData( slotId ) player.gameData.furnitureWorkShop.slotData[ slotId ] = data.slotInfo end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurMakeUnlock") s2cData.data = assert(pb.encode("S2CFurMakeUnlock", data)) end --家具工坊解锁 月卡权益 function FurnitureWorkShop:UnlockByMonthCard( player ) --未解锁直接返回 if not player.gameData.furnitureWorkShop.isInit then return end local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local maxSlotNumber = 0 for k ,v in pairs(cfgSValue.makeSpace) do maxSlotNumber = maxSlotNumber + v end local makeSpace = cfgSValue.makeSpace if player.gameData.storePack.monthCard.buyStatus then --解锁 for i = makeSpace[1]+makeSpace[2]+1,maxSlotNumber,1 do if (player.gameData.furnitureWorkShop.slotData[ i ].waitforlock ~=nil and player.gameData.furnitureWorkShop.slotData[ i ].waitforlock ~= true) or player.gameData.furnitureWorkShop.slotData[ i ].furId <= 0 then player.gameData.furnitureWorkShop.slotData[ i ] = self:InitSlotData(i) else player.gameData.furnitureWorkShop.slotData[ i ].waitforlock = false end end else --上锁 for i = makeSpace[1]+makeSpace[2]+1,maxSlotNumber,1 do local slotData = player.gameData.furnitureWorkShop.slotData[ i ] --对于制作中的家具单独打上标记 if slotData.furId > 0 then slotData.waitforlock = true else slotData = self:InitSlotData(i) self:ChangeSlotType(player,i,self.SlotStatusUnLock) end end end end --改变格子状态 function FurnitureWorkShop:ChangeSlotType( player, slotId , status) player.gameData.furnitureWorkShop.slotData[ slotId ].status = status end --重置格子数据 function FurnitureWorkShop:InitSlotData(slotId) local slots = {} slots = {slotId = slotId , furId = 0 , finishTime = 0 , status = self.SlotStatusBlank, number = 1} return slots end skynet.server.furnitureWorkShop = FurnitureWorkShop return FurnitureWorkShop