feat: Приостановка тика при ошибках, сообщение игрокам
- Если после повторного включения не пройдет небольшой таймаут до следующей ошибки, сервер перезапустится.
This commit is contained in:
@@ -7,6 +7,7 @@ import cn.nukkit.level.Level;
|
|||||||
|
|
||||||
import com.reider745.InnerCoreServer;
|
import com.reider745.InnerCoreServer;
|
||||||
import com.reider745.entity.EntityMethod;
|
import com.reider745.entity.EntityMethod;
|
||||||
|
import com.reider745.hooks.PlayerHooks;
|
||||||
import com.zhekasmirnov.apparatus.adapter.innercore.EngineConfig;
|
import com.zhekasmirnov.apparatus.adapter.innercore.EngineConfig;
|
||||||
import com.zhekasmirnov.apparatus.adapter.innercore.game.Minecraft;
|
import com.zhekasmirnov.apparatus.adapter.innercore.game.Minecraft;
|
||||||
import com.zhekasmirnov.apparatus.adapter.innercore.game.block.BlockBreakResult;
|
import com.zhekasmirnov.apparatus.adapter.innercore.game.block.BlockBreakResult;
|
||||||
@@ -176,6 +177,7 @@ public class NativeCallback {
|
|||||||
|
|
||||||
private static boolean isFirstServerTick = true;
|
private static boolean isFirstServerTick = true;
|
||||||
private static boolean isServerTickDisabledDueToError = false;
|
private static boolean isServerTickDisabledDueToError = false;
|
||||||
|
private static long serverTickDisabledDueToErrorMillis = 0;
|
||||||
private static int globalServerTickCounter = 0;
|
private static int globalServerTickCounter = 0;
|
||||||
|
|
||||||
// this is called, when ServerLevel is constructed
|
// this is called, when ServerLevel is constructed
|
||||||
@@ -254,6 +256,7 @@ public class NativeCallback {
|
|||||||
globalServerTickCounter = 0;
|
globalServerTickCounter = 0;
|
||||||
isFirstServerTick = true;
|
isFirstServerTick = true;
|
||||||
isServerTickDisabledDueToError = false;
|
isServerTickDisabledDueToError = false;
|
||||||
|
serverTickDisabledDueToErrorMillis = 0;
|
||||||
|
|
||||||
// check, if we are required to call legacy callback: if we are the server, call
|
// check, if we are required to call legacy callback: if we are the server, call
|
||||||
// it for server leave game, otherwise call for client
|
// it for server leave game, otherwise call for client
|
||||||
@@ -380,7 +383,21 @@ public class NativeCallback {
|
|||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
isServerTickDisabledDueToError = true;
|
isServerTickDisabledDueToError = true;
|
||||||
ICLog.e("INNERCORE-CALLBACK", "error occurred in server tick callback", e);
|
ICLog.e("INNERCORE-CALLBACK", "error occurred in server tick callback", e);
|
||||||
|
|
||||||
|
if (serverTickDisabledDueToErrorMillis
|
||||||
|
+ 15000 >= (serverTickDisabledDueToErrorMillis = System.currentTimeMillis())) {
|
||||||
|
Server.getInstance().shutdown();
|
||||||
|
} else {
|
||||||
|
for (long playerUid : Network.getSingleton().getServer().getConnectedPlayers()) {
|
||||||
|
PlayerHooks.showExceptionForm(EntityMethod.getPlayerById(playerUid), "FATAL ERROR",
|
||||||
|
"Fatal error occurred in ticking callback, it will be re-enabled in a few minutes.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else if (serverTickDisabledDueToErrorMillis != 0
|
||||||
|
&& System.currentTimeMillis() - serverTickDisabledDueToErrorMillis >= 30000) {
|
||||||
|
isServerTickDisabledDueToError = false;
|
||||||
|
serverTickDisabledDueToErrorMillis = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
// call server player handlers
|
// call server player handlers
|
||||||
|
|||||||
Reference in New Issue
Block a user