From 8893dfa406e35cba6b8f0fdc88af8045dfdc74c3 Mon Sep 17 00:00:00 2001 From: Reider745 <70357814+Reider745@users.noreply.github.com> Date: Sat, 11 May 2024 19:36:00 +0300 Subject: [PATCH] =?UTF-8?q?Fixed:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BB=D0=BE=D0=BC=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлена команда dimensions_list - Событие остановки сервера перенесено в ServerStopEvent --- README.md | 1 + src/main/java/com/reider745/Main.java | 8 ----- .../reider745/commands/CommandsHelper.java | 1 + .../reider745/commands/DimensionsList.java | 30 +++++++++++++++++ .../com/reider745/event/EventListener.java | 12 +++++++ .../java/com/reider745/hooks/ServerHooks.java | 5 --- .../api/container/ItemContainer.java | 13 +++++++- .../multiplayer/server/ModdedServer.java | 2 +- .../api/NativeItemInstanceExtra.java | 14 +++++++- .../api/mod/ui/container/Container.java | 14 +++++++- .../runtime/saver/ObjectSaverRegistry.java | 33 ++++++++++++++++--- .../innercore/coreengine/core-engine.dev.js | 8 +++-- 12 files changed, 118 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/reider745/commands/DimensionsList.java diff --git a/README.md b/README.md index 717fc6d5..4a9fe226 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ max-packet-sending: 200 + inner_core_network — выводит список подключенных к протоколу игроков на сервере + state — выводит стейты блока по рантайм идентификатору + profilecallback [enabled] [showParameters] — отладка и профайлинг калбеков ++ dimensions_list - выводит список измерений > Все команды предназначены для операторов и не могут быть вызваны игроками. diff --git a/src/main/java/com/reider745/Main.java b/src/main/java/com/reider745/Main.java index 9cf9c0d1..20708694 100644 --- a/src/main/java/com/reider745/Main.java +++ b/src/main/java/com/reider745/Main.java @@ -27,14 +27,6 @@ public class Main { public static void start(Server server) { innerCoreServer.start(); } - - public static void stop(Server server) throws Exception { - try { - innerCoreServer.left(); - } catch (Exception e) { - e.printStackTrace(); - } - } } public static void main(String[] args) throws Throwable { diff --git a/src/main/java/com/reider745/commands/CommandsHelper.java b/src/main/java/com/reider745/commands/CommandsHelper.java index 30e1d338..f949ec59 100644 --- a/src/main/java/com/reider745/commands/CommandsHelper.java +++ b/src/main/java/com/reider745/commands/CommandsHelper.java @@ -16,5 +16,6 @@ public class CommandsHelper { map.register(tag, new GenChunksCommands()); map.register(tag, new CallbackProfilingCommand()); map.register(tag, new GetAllPlayersIdCommand()); + map.register(tag, new DimensionsList()); } } diff --git a/src/main/java/com/reider745/commands/DimensionsList.java b/src/main/java/com/reider745/commands/DimensionsList.java new file mode 100644 index 00000000..e2b4edb6 --- /dev/null +++ b/src/main/java/com/reider745/commands/DimensionsList.java @@ -0,0 +1,30 @@ +package com.reider745.commands; + +import cn.nukkit.Server; +import cn.nukkit.command.Command; +import cn.nukkit.command.CommandSender; +import com.reider745.world.FakeDimensions; + +public class DimensionsList extends Command { + public DimensionsList() { + super("dimensions_list", "get list dimensions"); + } + + @Override + public boolean execute(CommandSender commandSender, String commandLabel, String[] args) { + if (!commandSender.isOp()) + return false; + + StringBuilder builder = new StringBuilder(); + + builder.append("====Dimensions===="); + Server.getInstance().getLevels().forEach((levelId, level) -> + builder.append("\nid: ") + .append(FakeDimensions.getFakeIdForLevel(level)) + .append(", name: ") + .append(level.getName())); + + commandSender.sendMessage(builder.toString()); + return true; + } +} diff --git a/src/main/java/com/reider745/event/EventListener.java b/src/main/java/com/reider745/event/EventListener.java index 9fd137b6..c677fca6 100644 --- a/src/main/java/com/reider745/event/EventListener.java +++ b/src/main/java/com/reider745/event/EventListener.java @@ -21,6 +21,7 @@ import cn.nukkit.event.level.ChunkPopulateEvent; import cn.nukkit.event.player.*; import cn.nukkit.event.redstone.RedstoneUpdateEvent; import cn.nukkit.event.server.ServerCommandEvent; +import cn.nukkit.event.server.ServerStopEvent; import cn.nukkit.form.response.FormResponse; import cn.nukkit.form.response.FormResponseModal; import cn.nukkit.form.response.FormResponseSimple; @@ -34,6 +35,8 @@ import cn.nukkit.level.Position; import cn.nukkit.level.format.FullChunk; import cn.nukkit.math.Vector3; import cn.nukkit.network.protocol.UpdateBlockPacket; +import com.reider745.InnerCoreServer; +import com.reider745.Main; import com.reider745.world.BiomesMethods; import com.reider745.world.FakeDimensions; import oshi.hardware.NetworkIF; @@ -522,6 +525,15 @@ public class EventListener implements Listener { } } + @EventHandler + public void stopServer(ServerStopEvent event){ + try { + Main.innerCoreServer.left(); + } catch (Exception e) { + e.printStackTrace(); + } + } + // TODO: onPathNavigationDone // TODO: onBlockSpawnResources diff --git a/src/main/java/com/reider745/hooks/ServerHooks.java b/src/main/java/com/reider745/hooks/ServerHooks.java index 679d0f9c..ea5e547e 100644 --- a/src/main/java/com/reider745/hooks/ServerHooks.java +++ b/src/main/java/com/reider745/hooks/ServerHooks.java @@ -82,11 +82,6 @@ public class ServerHooks implements HookClass { } - @Inject - public static void forceShutdown(Server server, String reason) throws Exception { - Main.LoadingStages.stop(server); - } - @Inject(type = TypeHook.AFTER) public static void reload(Server server) { InnerCoreServer.singleton.reload(); diff --git a/src/main/java/com/zhekasmirnov/apparatus/api/container/ItemContainer.java b/src/main/java/com/zhekasmirnov/apparatus/api/container/ItemContainer.java index 247faa89..5daee7fa 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/api/container/ItemContainer.java +++ b/src/main/java/com/zhekasmirnov/apparatus/api/container/ItemContainer.java @@ -26,7 +26,7 @@ import org.mozilla.javascript.ScriptableObject; import java.util.*; -public class ItemContainer implements WorkbenchField { +public class ItemContainer implements WorkbenchField, ObjectSaverRegistry.IHashSaver { private static final Object playerInventoryLock = new Object(); public static void loadClass() { @@ -161,6 +161,17 @@ public class ItemContainer implements WorkbenchField { return packet; }); + private int id; + + @Override + public int getId() { + return id; + } + + @Override + public void setId(int id) { + this.id = id; + } public interface Transaction { diff --git a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/server/ModdedServer.java b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/server/ModdedServer.java index 041c2089..e792cdcb 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/server/ModdedServer.java +++ b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/server/ModdedServer.java @@ -81,7 +81,7 @@ public class ModdedServer implements SocketServer.IClientConnectListener, Native } public List getConnectedClients() { - return connectedClients; + return new ArrayList<>(connectedClients); } public ConnectedClient getConnectedClientForPlayer(long player) { diff --git a/src/main/java/com/zhekasmirnov/innercore/api/NativeItemInstanceExtra.java b/src/main/java/com/zhekasmirnov/innercore/api/NativeItemInstanceExtra.java index c151325e..1d2a2a27 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/NativeItemInstanceExtra.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/NativeItemInstanceExtra.java @@ -25,7 +25,7 @@ import org.mozilla.javascript.Wrapper; * Created by zheka on 14.02.2018. */ -public class NativeItemInstanceExtra { +public class NativeItemInstanceExtra implements ObjectSaverRegistry.IHashSaver { private static final int saverId; static { @@ -590,4 +590,16 @@ public class NativeItemInstanceExtra { } return extra; } + + private int id; + + @Override + public int getId() { + return id; + } + + @Override + public void setId(int id) { + this.id = id; + } } diff --git a/src/main/java/com/zhekasmirnov/innercore/api/mod/ui/container/Container.java b/src/main/java/com/zhekasmirnov/innercore/api/mod/ui/container/Container.java index 97fca0b2..7b8bcdb3 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/mod/ui/container/Container.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/mod/ui/container/Container.java @@ -21,7 +21,7 @@ import java.util.HashMap; */ @Deprecated(since = "Zote") -public class Container implements WorkbenchField, UiAbstractContainer { +public class Container implements WorkbenchField, UiAbstractContainer, ObjectSaverRegistry.IHashSaver { public static final boolean isContainer = true; private static final int saverId; @@ -208,6 +208,18 @@ public class Container implements WorkbenchField, UiAbstractContainer { } } + private int id; + + @Override + public int getId() { + return id; + } + + @Override + public void setId(int id) { + this.id = id; + } + public interface OnCloseListener { void onClose(Container c, IWindow win); } diff --git a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/ObjectSaverRegistry.java b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/ObjectSaverRegistry.java index 362a98e7..f9f9c61b 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/ObjectSaverRegistry.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/ObjectSaverRegistry.java @@ -1,11 +1,15 @@ package com.zhekasmirnov.innercore.api.runtime.saver; +import com.zhekasmirnov.horizon.runtime.logger.Logger; import com.zhekasmirnov.innercore.api.NativeItemInstanceExtra; +import com.zhekasmirnov.innercore.api.mod.ScriptableObjectHelper; import com.zhekasmirnov.innercore.api.mod.ui.container.Container; import com.zhekasmirnov.innercore.api.runtime.saver.world.WorldDataSaver; +import org.json.JSONObject; import org.mozilla.javascript.*; import java.util.HashMap; +import java.util.Map; /** * Created by zheka on 19.08.2017. @@ -14,11 +18,12 @@ import java.util.HashMap; public class ObjectSaverRegistry { public static final String PROPERTY_IGNORE_SAVE = "_json_ignore"; public static final String PROPERTY_SAVER_ID = "_json_saver_id"; + public static final String PROPERTY_SAVER_ENABLE = "_json_saver_enable"; private static final ScriptableObject scope; private static HashMap saverMap = new HashMap<>(); - private static HashMap saverByObjectHash = new HashMap<>(); + //private static HashMap saverByObjectHash = new HashMap<>(); private static HashMap saverNameById = new HashMap<>(); static { @@ -28,7 +33,10 @@ public class ObjectSaverRegistry { NativeItemInstanceExtra.initSaverId(); } - + public interface IHashSaver { + int getId(); + void setId(int id); + } public static int registerSaver(String name, ObjectSaver saver) { int saverId = name.hashCode(); @@ -57,7 +65,16 @@ public class ObjectSaverRegistry { } public static ObjectSaver getSaverFor(Object object) { - ObjectSaver saver = saverByObjectHash.get(object.hashCode()); + ObjectSaver saver = null; + if(object instanceof ScriptableObject scriptable){ + int id = ScriptableObjectHelper.getIntProperty(scriptable, PROPERTY_SAVER_ENABLE, -1); + if(id != -1) + saver = saverMap.get(id); + }else if(object instanceof IHashSaver hashSaver){ + saver = saverMap.get(hashSaver.getId()); + }else if(object instanceof JSONObject json && json.has(PROPERTY_SAVER_ENABLE)){ + saver = saverMap.get(json.getInt(PROPERTY_SAVER_ENABLE)); + } if (saver != null) { return saver; } @@ -151,7 +168,15 @@ public class ObjectSaverRegistry { throw new IllegalArgumentException("no saver found for id " + saverId + " use only registerObjectSaver return values"); } object = unwrapIfNeeded(object); - saverByObjectHash.put(object.hashCode(), saverMap.get(saverId)); + if (object instanceof ScriptableObject scriptable){ + scriptable.put(PROPERTY_SAVER_ENABLE, scriptable, saverId); + }else if(object instanceof JSONObject json){ + json.put(PROPERTY_SAVER_ENABLE, saverId); + }else if(object instanceof IHashSaver hashSaver){ + hashSaver.setId(saverId); + }else { + Logger.warning("Error registerObject "+object.getClass().getName()+", serverId: "+saverId); + } } public static void setObjectIgnored(ScriptableObject object, boolean ignore) { diff --git a/src/main/resources/innercore/coreengine/core-engine.dev.js b/src/main/resources/innercore/coreengine/core-engine.dev.js index f9cb800a..705e9b14 100755 --- a/src/main/resources/innercore/coreengine/core-engine.dev.js +++ b/src/main/resources/innercore/coreengine/core-engine.dev.js @@ -1082,8 +1082,12 @@ var TileEntity = { return null; }, destroyTileEntity: function(tileEntity, fromDestroyBlock, isDropAllowed) { - if (tileEntity.destroy(fromDestroyBlock || false, isDropAllowed || false)) { - return false; + try{ + if (tileEntity.destroy(fromDestroyBlock || false, isDropAllowed || false)) { + return false; + } + }catch(e){ + print("Error destroy tile "+e); } tileEntity.update = function() {}; // make sure tile entity will not tick anymore, because it is already cleaned up if (tileEntity.networkEntity) {