local skynet = require "skynet" local oo = require "Class" local log = require "Log" local defense = require "Defense" local json =require "json" local sqlUrl = require "SqlUrl" local curServerId = tonumber(skynet.getenv "serverId") local cmd = require "GameCmd" local manageCmd = require "ManageCmd" local clusterServer = require "ClusterServer" local ServerManage = oo.class() function ServerManage:Init() end --每5秒调一次 function ServerManage:On5SecTimer() end --执行服务器命令 function ServerManage:DoManageCmd( c2sData , s2cData) local cmd = c2sData.cmd local userId = c2sData.userId or nil local value = c2sData.value or nil s2cData.data = {} s2cData.data.serverId = curServerId s2cData.data.isSuc = false log.info("执行服务器命令" ,cmd ,userId ,value) if cmd > manageCmd.AllServerStart and cmd < manageCmd.AllServerEnd then --所有服务器 local server = nil --找出对应的服务器信息 if curServerId == clusterServer.centerServerID then server = skynet.server.centerServer elseif curServerId >= clusterServer.routerServerMinID and curServerId <= clusterServer.routerServerMaxID then server = skynet.server.routerServer elseif curServerId == clusterServer.multiServerID then server = skynet.server.multiServer elseif curServerId >= clusterServer.gameServerMinID and curServerId <= clusterServer.gameServerMaxID then server = skynet.server.gameServer end if manageCmd.ReloadClusterConfig == cmd then self:ReloadClusterConfig( server ) elseif manageCmd.Reg == cmd then self:Reg( server ) elseif manageCmd.UnReg == cmd then self:UnReg( server ) elseif manageCmd.ShutDown == cmd then self:ShutDown( server ) end elseif cmd > manageCmd.MultiServerStart and cmd < manageCmd.MultiServerEnd then --多功能服务器 elseif cmd > manageCmd.GameServerStart and cmd < manageCmd.GameServerEnd then --游戏服务器 if manageCmd.NeedPlayerCount == cmd then self:NeedPlayerCount( value , s2cData) elseif manageCmd.SaveUserToDB == cmd then self:SaveUserToDB( userId , s2cData) elseif manageCmd.SaveUserToTxt == cmd then self:SaveUserToTxt( userId , value , s2cData ) elseif manageCmd.ForceUserOffline == cmd then self:ForceUserOffline( userId , s2cData ) elseif manageCmd.QueryPlayerInServer == cmd then self:QueryPlayerInServer( userId , s2cData ) end else s2cData.code = cmd.ErrorCode.ErrRequestParam end return s2cData end --重新注册服务器 function ServerManage:ReReg( server ) server:Reg() log.info("成功注册服务") end --注销服务器 function ServerManage:UnReg( server ) server:UnReg() log.info("成功注销服务") end --关闭服务器 function ServerManage:ShutDown( server ) server:UnReg() server:StopServer() log.info("成功关闭服务") end --关闭服务器 function ServerManage:ReloadClusterConfig( server ) server:ReloadClusterNode() log.info("成功载入集群配置") end --需要玩家数量 function ServerManage:NeedPlayerCount( value , s2cData) skynet.server.gameServer.serverInfo.needPlayerCount = tonumber(value.needCount) s2cData.data.isSuc = true log.info(string.format("游戏服需要 %d 个玩家", skynet.server.gameServer.serverInfo.needPlayerCount)) end --保存用户数据到DB function ServerManage:SaveUserToDB( userId , s2cData) local playerList = skynet.server.playerCenter:GetPlayerList() for curUseId, value in pairs( playerList ) do if curUseId == userId then skynet.server.accountServer:SavePlayerToDB( value.player , true ) s2cData.data.isSuc = true log.info(string.format("玩家 %d 强制将玩家数据保存到DB ", userId )) end end end --保存用户数据到Txt function ServerManage:SaveUserToTxt( userId , value , s2cData ) local playerList = skynet.server.playerCenter:GetPlayerList() for curUseId, v in pairs( playerList ) do if curUseId == userId then local basicInfo = v.player.basicInfo local gameData = v.player.gameData local archiveData =v.player.archiveData local file = io.open("UserData.txt", "a+") file:write( userId ) if value.isJson then file:write( json:encode( basicInfo )) file:write("\r\n") file:write( json:encode( gameData )) file:write("\r\n") file:write( json:encode( archiveData )) file:write("\r\n") log.info(string.format("玩家 %d 强制将玩家数据以Json格式保存到Txt ", userId )) s2cData.data.isSuc = true else file:write( skynet.server.common:TableToString( basicInfo )) file:write("\r\n") file:write( skynet.server.common:TableToString( gameData )) file:write("\r\n") file:write( skynet.server.common:TableToString( archiveData )) file:write("\r\n") log.info(string.format("玩家 %d 强制将玩家数据以文本格式保存到Txt ", userId )) s2cData.data.isSuc = true end file:close() break end end end --强制玩家下线 function ServerManage:ForceUserOffline( userId , s2cData) local playerList = skynet.server.playerCenter:GetPlayerList() for curUseId, value in pairs( playerList ) do if curUseId == userId then log.info(string.format("玩家 %d 强制将玩家数据保存到DB ", userId )) skynet.server.accountServer:SavePlayerToDB( value.player , true ) skynet.server.playerCenter:UserExit( userId ) log.info(string.format("玩家 %d 强制玩家下线 ", userId )) s2cData.data.isSuc = true break end end end --查询玩家在哪个游戏服 function ServerManage:QueryPlayerInServer( userId , s2cData ) local playerList = skynet.server.playerCenter:GetPlayerList() for curUseId, value in pairs( playerList ) do if curUseId == userId then s2cData.data.isSuc = true break end end end skynet.server.serverManage = ServerManage return ServerManage