HomeServer/lualib-src/Server-main/Common/GameConfig.lua

424 lines
13 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 protoc = require "protoc"
local pb = require "pb"
local json =require "json"
local dataType = require "DataType"
local GameConfig = oo.class()
skynet.cfgRoomCenter = {}
skynet.cfgRoomCenter.CheckRoomTime = 30 --多少时间检测一下所有房间
skynet.cfgRoomCenter.MaxTimeNoStart = 30 --最长多少秒不开始游戏(秒)
skynet.cfgRoomCenter.MaxTimeGame = 900 --一局游戏最长时间
function GameConfig:GetClusterServerConfig( name )
for k, v in pairs(skynet.server.gameConfig.ClusterServerConfig) do
if name == v.serverName then
return v
end
end
end
function GameConfig:LoadConfig()
log.info("开始加载配置")
local cmd = string.format("find %s -name *.config","Server")
local fp = io.popen(cmd)
for filename in fp:lines() do
self:LoadOneConfig(filename)
end
fp:close()
log.info("结束加载配置")
end
function GameConfig:LoadOneConfig(filename)
local newModule = {}
if filename then
local f = assert(io.open(filename))
local source = f:read "*a"
f:close()
assert(load(source, "@"..filename, "t", newModule))()
end
for name,config in pairs(newModule) do
GameConfig[name] = config
local str = string.format("加载配置文件 %s 变量名 %s",filename, name)
log.info(str)
end
end
function GameConfig:LoadJson()
log.info("开始加载JSON配置")
local cmd = string.format("find %s -name *.json","Server")
local fp = io.popen(cmd)
for filename in fp:lines() do
self:LoadOneJson(filename)
end
--转换染色家具
--[[
self.oldFruniture = {} -- 保存下需要改动的旧家具ID方便后面转换老用户的数据
for k, v in pairs(self.Furniture) do
--家具配置对染色家具ID进行转换
if 2 == #v.dyeFurTrans and 0 == math.floor( v.id /1000000 ) then
local oldId = v.id
v.id = v.dyeFurTrans[2] * 100000 + v.dyeFurTrans[1];
self.oldFruniture [ oldId ] = v.id
end
end
for k1, v1 in pairs(self.FurnitureBook) do
for k2, v2 in pairs(v1.furnitrueId) do
local newId = skynet.server.gameConfig.oldFruniture[ v2 ]
if newId then
v1.furnitrueId[ k2 ] = newId
end
end
end
]]
fp:close()
log.info("结束加载JSON配置")
end
function GameConfig:LoadOneJson(filename)
if filename then
local f = assert(io.open(filename))
local source = f:read("*all")
f:close()
local startPos = string.find(filename ,"GameConfig/") + #"GameConfig/"
local endPos = string.find(filename ,"_" ) - 1
local newFileName = string.sub(filename,startPos ,endPos)
if "SValue" ==newFileName then
GameConfig[ newFileName ] = json:decode(source)
else
GameConfig[ newFileName ] = json:decode(source)["items"]
end
log.info(string.format("加载配置文件 %s 变量名 %s",filename, newFileName))
end
end
--载入PB协议
function GameConfig:LoadProto()
log.info("开始加载ProtoBuf")
local cmd = string.format("find %s -name *.proto","Server")
local fp = io.popen(cmd)
for filename in fp:lines() do
self:LoadOneProto(filename)
end
fp:close()
log.info("结束加载ProtoBuf")
end
function GameConfig:LoadOneProto(filename)
local newModule = {}
if filename then
local f = assert(io.open(filename))
log.info("加载ProtoBuf文件" , filename)
local source = f:read "*a"
f:close()
protoc:load(source)
end
end
--获取当前服的集群配置
function GameConfig:GetCurClusterServerCfg( id )
for k, v in pairs( self.ClusterServerConfig ) do
if id == v.serverId then
return v
end
end
return nil
end
--获取当前植物的配置
function GameConfig:GetCurPlantCfg( id )
for k, v in pairs( self.Plant ) do
if id == v.id then
return v
end
end
return nil
end
--获取当前家具配置
function GameConfig:GetCurFurnitureCfg( id )
--将染色的家具id转化为正常id
id = self:RestoreGeneralID( id )
for k, v in pairs( self.Furniture ) do
if id == v.id then
return v
end
end
return nil
end
--将染色的家具id转化为正常id
function GameConfig:RestoreGeneralID( id )
if id >= 100000 then
id = id % 100000
end
return id
end
--获取当前装修配置
function GameConfig:GetCurDecorationCfg( id )
for k, v in pairs( self.Decoration ) do
if id == v.id then
return v
end
end
return nil
end
--获取最大进度值
function GameConfig:GetTaskConfig( id )
local cfgTask = skynet.server.gameConfig.Task --任务配置
for k, v in pairs( cfgTask ) do
if id == v.id then
return v
end
end
return nil
end
--获取色彩配置
function GameConfig:GetColorCfg( id )
local cfg = skynet.server.gameConfig.Color
for k, v in pairs( cfg ) do
if id == v.id then
return v
end
end
return nil
end
--获取方案配置
function GameConfig:GetSchemeCfg( id )
local cfg = skynet.server.gameConfig.Scheme
for k, v in pairs( cfg ) do
if id == v.combineID then
return v
end
end
return nil
end
--获取植物商品的配置
function GameConfig:GetPlantCfg( goodsId )
local cfgPlant = skynet.server.gameConfig.Plant
for k, v in pairs( cfgPlant ) do
if goodsId == v.id then
return v
end
end
return nil
end
--获取装修的配置
function GameConfig:GetDecorationCfg( goodsId )
local cfgPlant = skynet.server.gameConfig.Decoration
for k, v in pairs( cfgPlant ) do
if goodsId == v.id then
return v
end
end
return nil
end
--获取手机消息
function GameConfig:GetPhoneMsgCfg( msgId )
local cfgPhone = skynet.server.gameConfig.PhoneMsg
for k, v in pairs( cfgPhone ) do
if msgId == v.id then
return v
end
end
return nil
end
--获取手机消息
function GameConfig:GetLevelCfg( level )
local cfgLevel = skynet.server.gameConfig.Level
for k, v in pairs( cfgLevel ) do
if level == v.level then
return v
end
end
return nil
end
--获取每日任务
function GameConfig:GetEventsDailyTaskCfg( id )
local cfg = skynet.server.gameConfig.DailyTask
for k, v in pairs( cfg ) do
if id == v.id then
return v
end
end
return nil
end
--获取商场价格
function GameConfig:GetStorePriceCfg( id )
local cfg = skynet.server.gameConfig.StorePrice
for k, v in pairs( cfg ) do
if id == v.storePackId then
return v
end
end
return nil
end
--获取当前配置
function GameConfig:GetCurCfg( cfgName , id )
local cfg = skynet.server.gameConfig[ cfgName ]
for k, v in pairs( cfg ) do
if id == v.id then
return v
end
end
return nil
end
function GameConfig:Is()
end
--获取所有配置
function GameConfig:GetAllCfg( cfgName )
local cfg = skynet.server.gameConfig[ cfgName ]
return cfg
end
--获取购买货币信息
function GameConfig:GetBuyMoney( cfgName , id )
local cfgCur = skynet.server.gameConfig:GetCurCfg( cfgName , id )
if dataType.MoneyType_No == cfgCur.currencyBuy then
return cfgCur.currencyBuy , 0
elseif dataType.MoneyType_Coin == cfgCur.currencyBuy then
return cfgCur.currencyBuy , cfgCur.coin
elseif dataType.MoneyType_Map == cfgCur.currencyBuy then
return cfgCur.currencyBuy , cfgCur.mapCoin
elseif dataType.MoneyType_Volute == cfgCur.currencyBuy then
return cfgCur.currencyBuy , cfgCur.voluteCoin
end
end
--通过awardId获取对应奖励的信息 货币奖励Player:GiveReward()处理
function GameConfig:AwardInfo( rewardId )
local Reward = self.Reward --获取配置文件Reward中的数据
local Furniture = self.Furniture --获取配置文件Furniture中的数据
local Clothes = self.Clothes --获取配置文件Clothes中的数据
local PetClothes = self.PetClothes --获取配置文件PetClothes中的数据
local ClothesSuit = self.ClothesSuit --获取配置文件ClothesSuit中的数据
local reward = {}
for k ,v in pairs(Reward) do
if rewardId==v.id then
--场景物品恒定数量为1 1=furniture 2=decoration 物品类型_物品id 1_123
if next(v.sceneObject) ~=nil then
for k1 ,v1 in pairs(v.sceneObject) do
local arr = skynet.server.common:Split(v1 , "_")
arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2])
if arr[1]==1 then
local type = pb.enum("EnumGoodsType" , "Furniture")
table.insert(reward , {type=type, id=arr[2] ,count=1})
elseif arr[1]==2 then
local type = pb.enum("EnumGoodsType" , "Decorate")
table.insert(reward , {type=type, id=arr[2] ,count=1})
end
end
end
--服饰物品恒定数量为11=人物 2=宠物 类型_衣服id 1_123
if next(v.appearanceObject) ~=nil then
for k1 ,v1 in pairs(v.appearanceObject) do
local arr = skynet.server.common:Split(v1 , "_")
arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2])
if arr[1]==1 then
local type = pb.enum("EnumGoodsType" , "Clothes")
table.insert(reward , {type=type, id=arr[2] ,count=1})
elseif arr[1]==2 then
local type = pb.enum("EnumGoodsType" , "PetClothes")
table.insert(reward , {type=type, id=arr[2] ,count=1})
end
end
end
--套装物品恒定数量为1 1=家装 2=服装 类型_套装id 1_1
if next(v.suitObject)~=nil then
for k1 ,v1 in pairs(v.suitObject) do
local arr = skynet.server.common:Split(v1 , "_")
arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2])
if arr[1]==1 then
--获取家具对应的套装物品
for k2 ,v2 in pairs(Furniture) do
if v2.suitType == arr[2] then
local type = pb.enum("EnumGoodsType" , "Furniture")
table.insert(reward , {type=type, id=v2.id ,count=1})
end
end
elseif arr[1]==2 then
local type = nil
for k2 ,v2 in pairs(ClothesSuit) do
if v2.id==arr[2] then
--获取该套装类型
type = v2.type
end
end
if type == 1 then
--获取人物服装对应的套装物品
for k2 ,v2 in pairs(Clothes) do
if v2.suitId == arr[2] then
local type = pb.enum("EnumGoodsType" , "Clothes")
table.insert(reward , {type=type, id=v2.id ,count=1})
end
end
elseif type == 2 then
--获取动物服装对应的套装物品
for k2 ,v2 in pairs(PetClothes) do
if v2.suitId == arr[2] then
local type = pb.enum("EnumGoodsType" , "PetClothes")
table.insert(reward , {type=type, id=v2.id ,count=1})
end
end
end
end
end
end
--道具 类型_数量 id 3_10
if next(v.ticket)~=nil then
for k1 ,v1 in pairs(v.ticket) do
local arr = skynet.server.common:Split(v1 , "_")
arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2])
local type = pb.enum("EnumGoodsType" , "Prop")
table.insert(reward , {type=type, id=arr[1] ,count=arr[2]})
end
end
--种子 id_数量 id 3_10
if next(v.seed)~=nil then
for k1 ,v1 in pairs(v.seed) do
local arr = skynet.server.common:Split(v1 , "_")
arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2])
table.insert(reward , {type=dataType.GoodsType_Seed, id=arr[1] ,count=arr[2]})
end
end
end
end
return reward
end
--是否正式服
function GameConfig:IsOnline()
return self.BasicConfig.isOnline
end
--是否开启审核
function GameConfig:IsAudit()
return self.BasicConfig.isAudit
end
skynet.server.gameConfig = GameConfig
return GameConfig