From b92ae5ea64d668c5216b146151c74bcab976d52e Mon Sep 17 00:00:00 2001 From: MaXFeeD Date: Tue, 13 Feb 2024 05:00:20 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9F=D1=80=D0=B8=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B0=20=D1=82=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=D1=85,=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B8=D0=B3=D1=80=D0=BE=D0=BA=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Если после повторного включения не пройдет небольшой таймаут до следующей ошибки, сервер перезапустится. --- .../innercore/api/NativeCallback.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/com/zhekasmirnov/innercore/api/NativeCallback.java b/src/main/java/com/zhekasmirnov/innercore/api/NativeCallback.java index 6eee5ec5..67584a51 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/NativeCallback.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/NativeCallback.java @@ -7,6 +7,7 @@ import cn.nukkit.level.Level; import com.reider745.InnerCoreServer; import com.reider745.entity.EntityMethod; +import com.reider745.hooks.PlayerHooks; import com.zhekasmirnov.apparatus.adapter.innercore.EngineConfig; import com.zhekasmirnov.apparatus.adapter.innercore.game.Minecraft; import com.zhekasmirnov.apparatus.adapter.innercore.game.block.BlockBreakResult; @@ -176,6 +177,7 @@ public class NativeCallback { private static boolean isFirstServerTick = true; private static boolean isServerTickDisabledDueToError = false; + private static long serverTickDisabledDueToErrorMillis = 0; private static int globalServerTickCounter = 0; // this is called, when ServerLevel is constructed @@ -254,6 +256,7 @@ public class NativeCallback { globalServerTickCounter = 0; isFirstServerTick = true; isServerTickDisabledDueToError = false; + serverTickDisabledDueToErrorMillis = 0; // check, if we are required to call legacy callback: if we are the server, call // it for server leave game, otherwise call for client @@ -380,7 +383,21 @@ public class NativeCallback { } catch (Throwable e) { isServerTickDisabledDueToError = true; 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