Closed Hatsune-Imagine closed 8 months ago
第三項 我強制將sv_hibernate_when_empty改成0 所以不是沒有作用 你可以試試看
g_hConVarHibernate = FindConVar("sv_hibernate_when_empty");
g_hConVarHibernate.AddChangeHook(ConVarChanged_Hibernate);
void ConVarChanged_Hibernate(ConVar hCvar, const char[] sOldVal, const char[] sNewVal)
{
g_hConVarHibernate.SetBool(false);
}
第一項可以加入 第二項我會再做修改 因為有的服會開服後會再換圖刷新一次
嗯嗯不好意思昨晚出门了没有及时回复,关于第三项,今天我试了一下最新的2.8版,是正常的,没有问题。之前在您的2.7版本基础上我只加上了 sm_crash
的命令,其他的代码都没有任何改动,但是服务器启动后,这时在控制台输入 sm_crash
后没有任何反应(当时看了伺服器是 hibernating 状态),当有人加入伺服器后这时才突然执行了奔溃重启。
当时我在 server.cfg
中加上了 sm_cvar sb_all_bot_game 1
之后就正常了,伺服器会保持 not hibernating 状态,在控制台执行 sm_crash
也能正常奔溃重启了。
是的,第二项的话如果 “開服後會再換圖刷新一次” 这种情况的话,我这样的逻辑确实会有问题,会无限重启的,您现在的2.8版本应该对于这种情况能正常处理。
sm_crash
指令,管理员可在伺服器控制台中输入sm_crash
或在游戏聊天框中输入/crash
或!crash
来使得伺服器强制崩溃。player_disconnect
事件导致。且在OnMapStart()
方法中未实时获取当前是否有玩家在伺服器内,且方法中的判断逻辑有部分漏洞。原本逻辑如下:
在判断
if(g_bNoOneInServer || (!g_bFirstMap && g_bCmdMap))
中,可能因为玩家在伺服器切换章节时退出导致未成功触发player_disconnect
事件,从而导致g_bNoOneInServer
变量值仍然为false。且此时g_bFirstMap
变量值一定为false,g_bCmdMap
变量值一定也为false,从而导致不触发自动奔溃重启的逻辑。改进后的逻辑如下:
去除了
g_bNoOneInServer
变量,使用CheckPlayerInGame(0)
方法实时判断当前是否有玩家。且判断逻辑改为当伺服器触发过map指令 或 (此时无人在伺服器中 且 伺服器不是刚刚启动的)
,此时的逻辑则无漏洞。将设置
sv_hibernate_when_empty
为0的逻辑去除,改为 设置sb_all_bot_game
为1的逻辑。经过测试,当伺服器sb_all_bot_game
为0时,即使设置sv_hibernate_when_empty
为0,伺服器无人时也会处于休眠状态(status中可看到hibernating)。此时,如果在伺服器控制台中输入sm_crash
命令,则不会进行处理,输入后没有任何事情发生,当有玩家加入伺服器后,伺服器这时才突然执行了奔溃重启。本次修复了此情况,当达成自动奔溃重启条件或手动输入
sm_crash
时,将伺服器的sb_all_bot_game
设置为1。