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

181 lines
6.5 KiB
Lua

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