HomeServer/lualib-src/Server-main/AllServer/GameServer/Shop/DyeWorkShop.lua
2024-11-20 15:41:37 +08:00

255 lines
12 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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