HomeServer/Server/AllServer/GameServer/Shop/FurnitureWorkShop.lua

339 lines
16 KiB
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
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