347 lines
17 KiB
Lua
347 lines
17 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 DyeWorkShop = oo.class()
|
|||
|
|
|
|||
|
|
-- 测试用 具体数值看配置文件Furniture和SValue 中
|
|||
|
|
|
|||
|
|
DyeWorkShop.SlotStatusUnLock = 1 --格子状态 未解锁
|
|||
|
|
DyeWorkShop.SlotStatusBlank = 2 --格子状态 空白
|
|||
|
|
DyeWorkShop.SlotStatusTime = 3 --格子状态 计时
|
|||
|
|
DyeWorkShop.SlotStatusGet = 4 --格子状态 领取
|
|||
|
|
|
|||
|
|
--初始化函数 可以获取配置文件中的数据 函数名必须为:Init() Start.lua 122 行进行调用
|
|||
|
|
function DyeWorkShop:Init()
|
|||
|
|
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--登陆初始化数据
|
|||
|
|
function DyeWorkShop:LoginInitData( player )
|
|||
|
|
self:InitData( player )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 初始玩家染色工坊的数据
|
|||
|
|
function DyeWorkShop:InitData( player )
|
|||
|
|
--重置染色红点
|
|||
|
|
skynet.server.msgTips:Reset(player , 41)
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
local maxSlotNumber = 0
|
|||
|
|
for k , v in pairs(cfgSValue.dyeSpace) do
|
|||
|
|
maxSlotNumber = maxSlotNumber + v
|
|||
|
|
end
|
|||
|
|
if not player.gameData.dyeWorkShop.isInit and cfgSValue.colorUnlockLvl <= player.gameData.level then
|
|||
|
|
--if true then
|
|||
|
|
-- 开始给格子进行赋值
|
|||
|
|
for i = 1, maxSlotNumber , 1 do
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ] ={}
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ].slotId = i --格子位置
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ].originFur = 0 --初始家具Id
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ].colorId = 0 --颜色代号
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ].finishTime = 0 --完成染色的时间戳
|
|||
|
|
-- 默认解锁两个格子
|
|||
|
|
if i <= cfgSValue.dyeSpace[ 1 ] then
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ].status = 2 --格子状态 1 未解锁 2 空白 3计时中 4待领取
|
|||
|
|
else
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ].status = 1 --格子状态 1 未解锁 2 空白 3计时中 4待领取
|
|||
|
|
end
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ].number = 1 --染色的数量
|
|||
|
|
end
|
|||
|
|
player.gameData.dyeWorkShop.isInit = true
|
|||
|
|
--月卡权益
|
|||
|
|
self:UnlockByMonthCard( player )
|
|||
|
|
end
|
|||
|
|
--检查一下有没有完成的染色 增加对应红点
|
|||
|
|
for k ,v in pairs(player.gameData.dyeWorkShop.slotData) do
|
|||
|
|
if v.status == self.SlotStatusGet then
|
|||
|
|
skynet.server.msgTips:AddNoNotice(player , 41)
|
|||
|
|
elseif v.status == self.SlotStatusTime and skynet.GetTime() >= v.finishTime then
|
|||
|
|
self:ChangeSlotType(player , v.slotId , self.SlotStatusGet )
|
|||
|
|
skynet.server.msgTips:AddNoNotice(player , 41)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--染色工坊显示 显示所有slot的状态
|
|||
|
|
function DyeWorkShop:Show( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SFurDyeShow", c2sData.data ))
|
|||
|
|
-- 获取玩家染色工坊格子的信息
|
|||
|
|
local data = {}
|
|||
|
|
data.slots = {}
|
|||
|
|
for k , v in pairs(player.gameData.dyeWorkShop.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 , 41)
|
|||
|
|
end
|
|||
|
|
table.insert(data.slots , v)
|
|||
|
|
end
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurDyeShow")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CFurDyeShow", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--染色工坊染色 这里需要额外传回 moneyChange 来做金币的改动
|
|||
|
|
--当点击染色以后传给服务器, 进入染色倒计时, 计时规则见数据表SValue. 格子不为空或者金币不足都是非法操作
|
|||
|
|
function DyeWorkShop:Attempt( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SFurDyeAttempt", c2sData.data ))
|
|||
|
|
local data ={}
|
|||
|
|
data.slots = {}
|
|||
|
|
|
|||
|
|
local cfgFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture")
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
|
|||
|
|
local slotId = c2sData.data.slotId
|
|||
|
|
local originFur = c2sData.data.originFur --家具id
|
|||
|
|
local colorId = c2sData.data.colorId
|
|||
|
|
local number = c2sData.data.number
|
|||
|
|
number = math.abs(number)
|
|||
|
|
|
|||
|
|
if not slotId or not colorId or not number or number <= 0 then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
else
|
|||
|
|
--获取玩家的格子对应数据
|
|||
|
|
local slotData = player.gameData.dyeWorkShop.slotData[ slotId ]
|
|||
|
|
if slotData.status == self.SlotStatusBlank then
|
|||
|
|
--获取该家具需要消耗的时间和金币
|
|||
|
|
for k , v in pairs( cfgFurniture ) do
|
|||
|
|
if originFur == v.id or originFur%100000 == v.id then
|
|||
|
|
|
|||
|
|
--是否可以变色
|
|||
|
|
if v.Dyable ~= 1 or v.dyeCoinPrice <= 0 then
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurDyeAttempt")
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local needCoin = number*(v.dyeCoinPrice)
|
|||
|
|
local needTime = number*math.floor((v.dyeCoinPrice * cfgSValue.dyeTimeRatio * 60))
|
|||
|
|
|
|||
|
|
--完成时间
|
|||
|
|
local finishTime=math.ceil(skynet.GetTime()+needTime)
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_39" )
|
|||
|
|
local isSuc1 = player:MoneyChange(pb.enum("EnumGoodsType", "Coin"), -needCoin , eventId)
|
|||
|
|
if isSuc1 == false then
|
|||
|
|
--染色失败 金币不足
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
|
|||
|
|
elseif isSuc1 then
|
|||
|
|
local isSuc2 = skynet.server.bag:RemoveGoods(player , dataType.GoodsType_Furniture , originFur , number)
|
|||
|
|
if not isSuc2 then
|
|||
|
|
--移除家具失败 归还玩家金币
|
|||
|
|
player:MoneyChange(pb.enum("EnumGoodsType", "Coin"), needCoin ,eventId)
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.GetGoodsFailed
|
|||
|
|
else
|
|||
|
|
--染色成功 同时修改格子的数据
|
|||
|
|
data.slots= {slotId = slotId , originFur = originFur , colorId = colorId , finishTime = finishTime , status = self.SlotStatusTime, number = number}
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
else
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurDyeAttempt")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CFurDyeAttempt", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--染色工坊领取
|
|||
|
|
--倒计时结束点击领取, 减少id为originFur的家具, 增加 colorId*100000+(originFur%100000)的家具, 格子状态不符合为非法操作
|
|||
|
|
function DyeWorkShop:Prize( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SFurDyeSlotPrize", c2sData.data ))
|
|||
|
|
local slotId = c2sData.data.slotId
|
|||
|
|
local data = {}
|
|||
|
|
data.slots = {}
|
|||
|
|
--获取玩家的格子对应数据
|
|||
|
|
local slotData = player.gameData.dyeWorkShop.slotData[ slotId ]
|
|||
|
|
--判断格子信息是否正确
|
|||
|
|
if not slotData.status==self.SlotStatusGet then --判断格子状态是否符合
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
|
|||
|
|
else
|
|||
|
|
--家具id修改
|
|||
|
|
local changeId = slotData.originFur%100000+slotData.colorId*100000
|
|||
|
|
--增加家具 Update() 参数: 玩家 类型 id 数量
|
|||
|
|
skynet.server.bag:AddGoods(player , dataType.GoodsType_Furniture , changeId ,slotData.number)
|
|||
|
|
--修改格子数据为空白状态的数据
|
|||
|
|
data.slots = self:InitSlotData( slotId )
|
|||
|
|
if slotData.waitforlock then
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
|
|||
|
|
self:ChangeSlotType(player,slotId,self.SlotStatusUnLock)
|
|||
|
|
else
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
skynet.server.levelTask:Modify( player , 24 , 1 )
|
|||
|
|
skynet.server.achieveTask:Modify( player , 24 , 1)
|
|||
|
|
skynet.server.msgTips:Reduce(player , 41) --领取染色之后 消除对应红点
|
|||
|
|
skynet.server.taskListEvent:Modify( player , 24 , 1 )
|
|||
|
|
|
|||
|
|
local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture",changeId)
|
|||
|
|
|
|||
|
|
--必须是摆件和家具
|
|||
|
|
if cfgFurniture ~= nil and (cfgFurniture.type ==4 or cfgFurniture.type ==3) then
|
|||
|
|
skynet.server.taskListEvent:Modify( player , 24 , 1)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
player:AddExpForType( 13 )
|
|||
|
|
end
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurDyeSlotPrize")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CFurDyeSlotPrize", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--染色工坊加速 这里需要额外传回 moneyChange 来做蜗壳币的改动
|
|||
|
|
--加速染色格的倒计时,直接进入可领取状态, 每30分钟需要消耗5蜗壳币, 见数据表. 蜗壳币不足和格子状态不在加速中为非法操作
|
|||
|
|
function DyeWorkShop:SpeedUp( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SFurDyeSlotSpeedUp", c2sData.data ))
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
local slotId = c2sData.data.slotId
|
|||
|
|
local data = {}
|
|||
|
|
data.slots = {}
|
|||
|
|
local nowTime = skynet.GetTime()
|
|||
|
|
local slotData = player.gameData.dyeWorkShop.slotData[ slotId ]
|
|||
|
|
-- 判断格子状态是否符合
|
|||
|
|
if not slotData.status==self.SlotStatusTime then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
|
|||
|
|
elseif slotData.finishTime <= nowTime then--完成时间已到
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
else
|
|||
|
|
--进行加速
|
|||
|
|
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 --染色的完成时间减去十分钟
|
|||
|
|
|
|||
|
|
if nowTime >= slotData.finishTime then
|
|||
|
|
--修改格子状态为领取
|
|||
|
|
self:ChangeSlotType(player , slotId , self.SlotStatusGet)
|
|||
|
|
data.slots = {slotId = slotId , originFur = slotData.originFur , colorId = slotData.colorId , finishTime = 0 , status = self.SlotStatusGet, number = slotData.number}
|
|||
|
|
if player.gameData.dyeWorkShop.slotData[ slotId ].waitforlock then
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ].waitforlock = true
|
|||
|
|
else
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
|
|||
|
|
end
|
|||
|
|
skynet.server.msgTips:Add(player , 41) --染色完成 增加对应红点
|
|||
|
|
else
|
|||
|
|
data.slots = player.gameData.dyeWorkShop.slotData[ slotId ]
|
|||
|
|
end
|
|||
|
|
else
|
|||
|
|
--获取玩家染色完成需要的时间
|
|||
|
|
local time = slotData.finishTime
|
|||
|
|
--进行计算立刻完成需要多少蜗壳币
|
|||
|
|
local needVolute = math.ceil((time - nowTime) / 60 / cfgSValue.timeExchangeVoluteCoin[2] * cfgSValue.timeExchangeVoluteCoin[1])
|
|||
|
|
if needVolute <= 0 then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurDyeSlotSpeedUp")
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_40" )
|
|||
|
|
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.slots = {slotId = slotId , originFur = slotData.originFur , colorId = slotData.colorId , finishTime = 0 , status = self.SlotStatusGet, number = slotData.number}
|
|||
|
|
if player.gameData.dyeWorkShop.slotData[ slotId ].waitforlock then
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ].waitforlock = true
|
|||
|
|
else
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
|
|||
|
|
end
|
|||
|
|
skynet.server.msgTips:Add(player , 41) --染色完成 增加对应红点
|
|||
|
|
--使用蜗壳币进行加速 修改相关数据
|
|||
|
|
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_FurDyeSlotSpeedUp")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CFurDyeSlotSpeedUp", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--染色空间解锁 这里需要额外传回moneyChange来做蜗壳币的改动
|
|||
|
|
--花费蜗壳币解锁格子. 蜗壳币不足或者格子不是未解锁状态都是非法操作
|
|||
|
|
function DyeWorkShop:Unlock( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SFurDyeSlotUnlock", c2sData.data ))
|
|||
|
|
local slotId = c2sData.data.slotId
|
|||
|
|
local data = {}
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
data.slots = {}
|
|||
|
|
local slotData = player.gameData.dyeWorkShop.slotData[ slotId ]
|
|||
|
|
-- 判断格子状态是否符合 且格子是用蜗壳币进行解锁的
|
|||
|
|
if not slotData or not slotData.status == self.SlotStatusUnLock or slotId > (cfgSValue.dyeSpace[1]+cfgSValue.dyeSpace[2]) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
|
|||
|
|
else
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_45" )
|
|||
|
|
local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "VoluteCoin"), -cfgSValue.dyeSpaceVoluteCoin , eventId)
|
|||
|
|
if isSuc==false then
|
|||
|
|
--解锁失败 蜗壳币不足
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
|
|||
|
|
else
|
|||
|
|
--解锁成功 同时初始化格子的数据
|
|||
|
|
data.slots=self:InitSlotData( slotId )
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FurDyeSlotUnlock")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CFurDyeSlotUnlock", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--染色空间解锁 月卡权益
|
|||
|
|
function DyeWorkShop:UnlockByMonthCard( player )
|
|||
|
|
--未解锁直接返回
|
|||
|
|
if not player.gameData.dyeWorkShop.isInit then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
local maxSlotNumber = 0
|
|||
|
|
for k , v in pairs(cfgSValue.dyeSpace) do
|
|||
|
|
maxSlotNumber = maxSlotNumber + v
|
|||
|
|
end
|
|||
|
|
if player.gameData.storePack.monthCard.buyStatus then
|
|||
|
|
--解锁
|
|||
|
|
for i = cfgSValue.dyeSpace[1]+cfgSValue.dyeSpace[2]+1,maxSlotNumber,1 do
|
|||
|
|
if (player.gameData.dyeWorkShop.slotData[ i ].waitforlock ~=nil and player.gameData.dyeWorkShop.slotData[ i ].waitforlock ~= true) or player.gameData.dyeWorkShop.slotData[ i ].originFur <= 0 then
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ] = self:InitSlotData(i)
|
|||
|
|
else
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ].waitforlock = false
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
else
|
|||
|
|
--上锁
|
|||
|
|
for i = cfgSValue.dyeSpace[1]+cfgSValue.dyeSpace[2]+1,maxSlotNumber,1 do
|
|||
|
|
local slotData = player.gameData.dyeWorkShop.slotData[ i ]
|
|||
|
|
--如果有物品在上色 则把物品返还给玩家
|
|||
|
|
if slotData.originFur > 0 then
|
|||
|
|
slotData.waitforlock = true
|
|||
|
|
else
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ i ] = self:InitSlotData(i)
|
|||
|
|
self:ChangeSlotType(player,i,self.SlotStatusUnLock)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--改变格子状态
|
|||
|
|
function DyeWorkShop:ChangeSlotType( player, slotId , status)
|
|||
|
|
player.gameData.dyeWorkShop.slotData[ slotId ].status = status
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--重置格子数据
|
|||
|
|
function DyeWorkShop:InitSlotData(slotId)
|
|||
|
|
local slots = {}
|
|||
|
|
slots = {slotId = slotId , originFur = 0 , colorId = 0 , finishTime = 0 , status = self.SlotStatusBlank, number = 1}
|
|||
|
|
return slots
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
skynet.server.dyeworkshop = DyeWorkShop
|
|||
|
|
return DyeWorkShop
|