339 lines
16 KiB
Lua
339 lines
16 KiB
Lua
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 |