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() --配置类型 GameConfig.ConfigType_Main = { "Main" , "GameConfig" } --配置类型1 参数1 客户端发来的字段 参数2 具体配置的文件夹名 GameConfig.ConfigType_A = { "A" , "GameConfigA" } --配置类型2 GameConfig.ConfigType_B = { "B" , "GameConfigB" } --配置类型3 --获取类型 function GameConfig:GetConfigType( configType , paramId ) if paramId < 1 or paramId > 2 or not self["ConfigType_"..configType ] then return nil end return self["ConfigType_"..configType ][ paramId ] end 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:ExpendConfig() local tmpConfig = {} for k1, v1 in pairs( self.ClusterServerConfig ) do for i = 1, v1.groupCount, 1 do local offset = ( i - 1 ) local newCfg = {} for k2, v2 in pairs( v1 ) do newCfg[ k2 ] = v2 end newCfg.serverId = newCfg.serverId + offset newCfg.clusterPort = newCfg.clusterPort + offset --组装HTTP端口 if 0 ~= newCfg.httpPort then newCfg.httpPort = newCfg.httpPort + offset if self:IsOnline() then local domain = self.BasicConfig[ "domain"..newCfg.hardware ] self.BasicConfig.domain = domain newCfg.httpUrl = string.format("https://%s/Game%d/" , domain , newCfg.httpPort ) else newCfg.httpUrl = string.format("http://%s:%s/" , newCfg.externalIp , newCfg.httpPort ) end end --组装TCP端口 if 0 ~= newCfg.tcpPort then newCfg.tcpPort = newCfg.tcpPort + offset end --组装WS端口 if 0 ~= newCfg.webSocketPort then newCfg.webSocketPort = newCfg.webSocketPort + offset if self:IsOnline() then local domain = self.BasicConfig[ "domain"..newCfg.hardware ] newCfg.webSocketUrl = string.format("wss://%s/Game%d" , domain , newCfg.webSocketPort ) else newCfg.webSocketUrl = string.format("ws://%s:%d" , newCfg.internalIp , newCfg.webSocketPort ) end end table.insert( tmpConfig , newCfg) end end self.ClusterServerConfig = tmpConfig 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() self:ExpendConfig() --加载屏蔽词 GameConfig.MaskWords = {} local fp = io.open("Server/Config/屏蔽词.txt") if fp then local keyWords = fp:read "*a" GameConfig.MaskWords = skynet.server.common:Split( keyWords , "|") end 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 --log.info(string.format("加载配置文件 %s 变量名 %s",filename, name)) end end --载入JSON配置 function GameConfig:LoadJson() log.info("开始加载JSON配置") local cmd = string.format("find '%s' -name '*.json'","Server/Config/".. self:GetConfigType( "Main" , 2 )) local fp = io.popen(cmd) for filename in fp:lines() do self:LoadOneJson( self:GetConfigType( "Main" , 2 ) , filename) end cmd = string.format("find '%s' -name '*.json'","Server/Config/".. self:GetConfigType( "A" , 2 )) fp = io.popen(cmd) for filename in fp:lines() do self:LoadOneJson( self:GetConfigType( "A" , 2 ) , filename) end cmd = string.format("find '%s' -name '*.json'","Server/Config/".. self:GetConfigType( "B" , 2 )) fp = io.popen(cmd) for filename in fp:lines() do self:LoadOneJson( self:GetConfigType( "B" , 2 ) , filename) end cmd = string.format("find '%s' -name '*.json'","Server/Config/InitHouse") fp = io.popen(cmd) for filename in fp:lines() do self:LoadOneJson( "InitHouse" , filename) end fp:close() log.info("结束加载JSON配置") end --修改三测服的时间 function GameConfig:Modify3TestServerTime( newFileName ) if self:Is3TestServer() and ( "Activity" == newFileName or "StorePack" == newFileName ) then log.info("光子服活动提前3天开启") local addDay = -3 for k, v in pairs( GameConfig[ newFileName ] ) do if 10 ~= v.activityType then --除了周赛,其他活动都减3天 if v.startTime and "" ~= v.startTime then local startTime = skynet.server.common:GetTime(v.startTime) startTime = skynet.server.common:GetSomeDayTime( startTime , addDay) startTime = skynet.server.common:GetStrTime( startTime) v.startTime = startTime end if v.endTime and "" ~= v.endTime then local endTime = skynet.server.common:GetTime(v.endTime) endTime = skynet.server.common:GetSomeDayTime( endTime , addDay) endTime = skynet.server.common:GetStrTime( endTime) v.endTime = endTime end if v.mailTime and "" ~= v.mailTime then local mailTime = skynet.server.common:GetTime(v.mailTime) mailTime = skynet.server.common:GetSomeDayTime( mailTime , addDay) mailTime = skynet.server.common:GetStrTime( mailTime) v.mailTime = mailTime end end end end end function GameConfig:LoadOneJson( cfgName , 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 startPos = string.find(filename ,cfgName.."/") + #(cfgName.."/") local endPos = string.find(filename ,"_" ) - 1 local newFileName = string.sub(filename,startPos ,endPos) local isHousePreData,_ = string.find( newFileName , "HousePreData") if "SValue" == newFileName then if self:GetConfigType( "Main" , 2 ) == cfgName then GameConfig[ newFileName ] = json:decode(source) else GameConfig[ cfgName .."_".. newFileName ] = json:decode(source) end elseif nil ~= isHousePreData then GameConfig[ cfgName .."_".. newFileName ] = json:decode(source) else if self:GetConfigType( "Main" , 2 ) == cfgName then GameConfig[ newFileName ] = json:decode(source)["items"] self:Modify3TestServerTime( newFileName ) else GameConfig[ cfgName .."_".. newFileName ] = json:decode(source)["items"] end 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 --将染色的家具id转化为正常id function GameConfig:RestoreGeneralID( id ) if id >= 100000 then id = id % 100000 end return id end --获取玩家当前配置 function GameConfig:GetInitHouseData( houseId ) return self["InitHouse_HousePreData"..houseId ] end --获取玩家当前配置 function GameConfig:GetPlayerCurCfg( player , cfgName , id ) if "Furniture" == cfgName and id > 100000 then id = id %100000 end local cfg = self[ cfgName ] --默认主配置 if self:GetConfigType("A" , 1) == player.basicInfo.configType and self[ self:GetConfigType( "A" , 2 ) .. "_"..cfgName ] then cfg = self[ self:GetConfigType( "A" , 2 ).."_"..cfgName ] elseif self:GetConfigType("B" , 1) == player.basicInfo.configType and self[ self:GetConfigType( "B" , 2 ) .. "_"..cfgName ] then cfg = self[ self:GetConfigType( "B" , 2 ).."_"..cfgName ] end if "Level" == cfgName then for k, v in pairs( cfg ) do if id == v.level then return v end end else for k, v in pairs( cfg ) do if id == v.id then return v end end end return nil end --获取玩家所有配置 function GameConfig:GetPlayerAllCfg( player , cfgName ) local configType = nil if nil == player then configType = "Main" --player为空就直接取主配置 else configType = player.basicInfo.configType end local cfg = self[ cfgName ] if self:GetConfigType("A" , 1) == configType and self[ self:GetConfigType( "A" , 2 ) "_" .. cfgName ] then cfg = self[ self:GetConfigType( "A" , 2 ) .. "_"..cfgName ] elseif self:GetConfigType("B" , 1) == configType and self[ self:GetConfigType( "B" , 2 ) .."_"..cfgName ] then cfg = self[ self:GetConfigType( "B" , 2 ) .. "_"..cfgName ] end return cfg end --获取玩家所有配置 function GameConfig:GetAllCfg( cfgName ) return self[ cfgName ] end --获取玩家所有配置 function GameConfig:GetCurCfg( cfgName , id ) for k, v in pairs( self[ cfgName ] ) do if id == v.id then return v end end return nil end --获取购买货币信息 function GameConfig:GetBuyMoney( player , cfgName , id ) local cfgCur = skynet.server.gameConfig:GetPlayerCurCfg( player , 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 --服饰物品(恒定数量为1)1=人物 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 --个人物品 if next(v.stuff)~=nil then for k1, v1 in pairs( v.stuff ) do local arr = skynet.server.common:Split(v1 , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) table.insert(reward , {type=dataType.GoodsType_HeadAndHeadFrame, id=arr[2] ,count=1 }) end end --食材 if next(v.cuisineMaterial)~=nil then for k1, v1 in pairs( v.cuisineMaterial ) do local arr = skynet.server.common:Split(v1 , "_") arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2]) table.insert(reward , {type=dataType.GoodsType_CuisineMaterial, id=arr[1] ,count=arr[1] }) end end break end end return reward end --是否为多Redis function GameConfig:IsMultiRedis() if skynet.server.redisUser1 and skynet.server.redisUser2 then return true else return false end end --是否正式服 function GameConfig:IsOnline() return self.BasicConfig.isOnline end --是否开启测试 function GameConfig:IsTest() return self.BasicConfig.isTest or false end --是否开启审核 function GameConfig:IsAudit() return self.BasicConfig.isAudit or false end --是否三测(光子服) function GameConfig:Is3TestServer() return self.BasicConfig.is3TestServer or false end --是否开启白名单 function GameConfig:IsWhiteList() return self.BasicConfig.isWhiteList or false end --是否开启MongoDB function GameConfig:IsMongoDB() if skynet.server.gameConfig.MongDBConfig then return true else return false end end skynet.server.gameConfig = GameConfig return GameConfig