HomeServer/lualib-src/Server-main/AllServer/GameServer/Shop/DyeWorkShop.lua

255 lines
12 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 DyeWorkShop = oo.class()
-- 测试用 具体数值看配置文件Furniture和SValue 中
DyeWorkShop.SlotStatusUnLock = 1 --格子状态 未解锁
DyeWorkShop.SlotStatusBlank = 2 --格子状态 空白
DyeWorkShop.SlotStatusTime = 3 --格子状态 计时
DyeWorkShop.SlotStatusGet = 4 --格子状态 领取
--初始化函数 可以获取配置文件中的数据 函数名必须为Init() Start.lua 122 行进行调用
function DyeWorkShop:Init()
--SValue
local SValue = skynet.server.gameConfig.SValue --获取配置文件SValue中的数据
self.TimeRatio = SValue.dyeTimeRatio --染色时间系数 dyeTimeRatio
self.DyeWorkShopSpace = SValue.dyeSpace --SValue.dyeSpace --染色的免费、付费、月卡位置数量 dyeSpace
local number=0
for k , v in pairs(self.DyeWorkShopSpace) do
number = number+v
end
self.MaxSlotNumber = number --格子最大数量 DyeWorkShopSpace之和
self.TimeVoluteCoin = SValue.dyeTimeVoluteCoin --小于初始时间的蜗壳价格 时间,价格 (60,15) dyeTimeVoluteCoin 小于60分钟 15蜗壳
self.TimeVoluteRatio = SValue.dyeTimeVoluteRatio --跳过染色时间的增加系数 时间,价格 (30,5) dyeTimeVoluteRatio 每多30分钟 5 蜗壳
self.SpaceVoluteCoin = SValue.dyeSpaceVoluteCoin --购买染色位置的蜗壳币数量 dyeSpaceVoluteCoin
--Furniture
self.GoodsNeedTimeCoinData = {} --每个物品染色消耗的时间和金币价格 dyeCoinPrice {id ,time, coin}
local goods = skynet.server.gameConfig.Furniture --获取配置文件Furniture中的数据
local count=1;
for k , v in pairs(goods) do
self.GoodsNeedTimeCoinData[ count ] = {}
self.GoodsNeedTimeCoinData[ count ].id = v.id
--需要的金币数量
self.GoodsNeedTimeCoinData[ count ].coin = v.dyeCoinPrice
--需要的染色时间【消耗金币*时间系数】
self.GoodsNeedTimeCoinData[ count ].time = v.dyeCoinPrice *self.TimeRatio*60 --分钟*60 对应的时间戳
count=count+1
end
end
-- 初始玩家染色工坊的数据
function DyeWorkShop:InitData( player )
--重置染色红点
skynet.server.msgTips:Reset(player , 41)
if not player.gameData.dyeWorkShop.isInit then
--if true then
-- 开始给格子进行赋值
for i = 1, self.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<=self.DyeWorkShopSpace[ 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
end
--检查一下有没有完成的染色 增加对应红点
for k ,v in pairs(player.gameData.dyeWorkShop.slotData) do
if v.status == self.SlotStatusGet then
skynet.server.msgTips:Add(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)
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 slotId = c2sData.data.slotId
local originFur = c2sData.data.originFur --家具id
local colorId = c2sData.data.colorId
local number = c2sData.data.number
if not slotId or not colorId or not number or not number 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(self.GoodsNeedTimeCoinData) do
if originFur==v.id or originFur%100000==v.id then
local needCoin = number*(v.coin)
local needTime = number*(v.time)
--完成时间
local finishTime=math.ceil(skynet.GetTime()+needTime)
local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "Coin"), -needCoin)
if isSuc==false then
--染色失败 金币不足
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
else
--染色成功 同时修改格子的数据
--移除家具 RemoveGoods() 参数: 玩家 类型 id 数量
local isSuc = skynet.server.bag:RemoveGoods(player , dataType.GoodsType_Furniture , originFur , number)
if not isSuc then
--移除家具失败
s2cData.code = errorInfo.ErrorCode.GetGoodsFailed
end
data.slots= {slotId = slotId , originFur = originFur , colorId = colorId , finishTime = finishTime , status = self.SlotStatusTime, number = number}
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
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 ]
--判断格子信息是否正确
local nowTime = skynet.GetTime()
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 )
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
skynet.server.levelTask:Modify( player , 24 , 1 )
skynet.server.achieveTask:Modify( player , 24 , 1)
skynet.server.passCheck:Modify( player , 19 , 1 )
skynet.server.msgTips:Reduce(player , 41) --领取染色之后 消除对应红点
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 slotId = c2sData.data.slotId
local data = {}
data.slots = {}
local slotData = player.gameData.dyeWorkShop.slotData[ slotId ]
--获取玩家染色完成需要的时间
local time = slotData.finishTime
local nowTime = skynet.GetTime()
--进行计算立刻完成需要多少蜗壳币
local needVolute =0
if (time-nowTime) <= self.TimeVoluteCoin[1] *60 then
--当时间小于设定数值 消耗的数值恒定
needVolute = self.TimeVoluteCoin[2]
else
--当时间大于设定数值 (T-a)/b*y+x
needVolute = math.ceil(math.ceil((time-nowTime)/60-self.TimeVoluteCoin[1])/self.TimeVoluteRatio[1]) *self.TimeVoluteRatio[2] + self.TimeVoluteCoin[2]
end
-- 判断格子状态是否符合
if not slotData.status==self.SlotStatusTime then
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
else
local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "VoluteCoin"), -needVolute)
if isSuc==false then
--加速失败 蜗壳币不足
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
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}
player.gameData.dyeWorkShop.slotData[ slotId ] = data.slots
skynet.server.msgTips:Add(player , 41) --染色完成 增加对应红点
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 = {}
data.slots = {}
local slotData = player.gameData.dyeWorkShop.slotData[ slotId ]
-- 判断格子状态是否符合 且格子是用蜗壳币进行解锁的
if not slotData or not slotData.status==self.SlotStatusUnLock or slotId>(self.DyeWorkShopSpace[1]+self.DyeWorkShopSpace[2]) then
s2cData.code = errorInfo.ErrorCode.DyeWorkSlotInfoError
else
local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "VoluteCoin"), -self.SpaceVoluteCoin)
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: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