diff --git a/README.md b/README.md index 803bd77b..49ad211b 100644 --- a/README.md +++ b/README.md @@ -33,12 +33,18 @@ pack: Inner Core Test pack-version: 2.3.0b116 test pack-version-code: 153 +# Устанавливает список модов и конфигураций для загрузки, вы можете +# указать название, имя папки модпака из /modpacks или путь. +modpack: innercore + # Использование ванильного интерфейса верстака, вместо кастомного. -# Внимание: в настоящее время не поддерживается и пользовательские рецепты не будут отображаться. +# Внимание: в настоящее время не поддерживается +# и пользовательские рецепты не будут отображаться. use-legacy-workbench-override: on -# Отключение исправления инвентаря для подключенных клиентов, устаревшие версии не -# работают должным образом с ним, не позволяя перемещать предметы по инвентарю. +# Отключение исправления инвентаря для подключенных клиентов, +# устаревшие версии не работают должным образом с ним, +# не позволяя перемещать предметы по инвентарю. use-legacy-inventory: on # Переключение режима отладки для неподдерживаемых методов (например, клиентских). @@ -54,18 +60,18 @@ allow-unsafe-scripting: on # о работе ядра, а также профайлинг методов. developer-mode: off -# Период сохранения данных inner core +# Время в секундах между запусками автосохранения данных модов (любое от 20), +# а также мира, если он включен в другой опции. auto-save-period: 60 -# Обновлять вместе с сохранениями inner core сохранения мира +# Нужно ли помимо данных модов сохранять еще и миры. auto-save-world: on - -# Состояние сокет сервера -# Для сокета сервера требуется дополнительный порт, подключение через сокет серверы более стабильное +# Включен ли сокетный сервер или нет. +# Сокеты требуют дополнительного порта, подключение через серверные сокеты более стабильное. socket-server-enable: on -# Порт сокет сервера +# Порт серверного сокета, обычно должен быть между 10000 и 24999. socket-port: 2304 ``` diff --git a/src/main/java/com/reider745/InnerCoreServer.java b/src/main/java/com/reider745/InnerCoreServer.java index b34936b0..02bb18ac 100644 --- a/src/main/java/com/reider745/InnerCoreServer.java +++ b/src/main/java/com/reider745/InnerCoreServer.java @@ -280,7 +280,7 @@ public class InnerCoreServer { NativeCallback.onFinalInitComplete(); JSONObject object = new JSONObject(); - object.put("fix", server.getPropertyBoolean("inner_core.legacy_inventory", true)); + object.put("fix", getPropertyBoolean("use-legacy-inventory", true)); Network.getSingleton().addServerInitializationPacket("server_fixed.inventory", (client) -> object, (v, v1) -> { // legacy inner core for mod ServerFixed }); diff --git a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/Network.java b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/Network.java index ace668de..dd633d1a 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/Network.java +++ b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/Network.java @@ -1,12 +1,10 @@ package com.zhekasmirnov.apparatus.multiplayer; -import cn.nukkit.Player; import com.zhekasmirnov.apparatus.adapter.innercore.EngineConfig; import com.zhekasmirnov.apparatus.adapter.innercore.game.Minecraft; import com.zhekasmirnov.apparatus.job.InstantJobExecutor; import com.zhekasmirnov.apparatus.job.JobExecutor; import com.zhekasmirnov.apparatus.job.MainThreadJobExecutor; -//import com.zhekasmirnov.apparatus.mcpe.NativeNetworking; import com.zhekasmirnov.apparatus.mcpe.NativeNetworking; import com.zhekasmirnov.apparatus.multiplayer.channel.data.DataChannel; import com.zhekasmirnov.apparatus.multiplayer.channel.data.DataChannelFactory; @@ -15,7 +13,6 @@ import com.zhekasmirnov.apparatus.multiplayer.client.ModdedClient; import com.zhekasmirnov.apparatus.multiplayer.server.ConnectedClient; import com.zhekasmirnov.apparatus.multiplayer.server.ModdedServer; import com.zhekasmirnov.horizon.runtime.logger.Logger; -import com.zhekasmirnov.innercore.api.log.ICLog; import com.zhekasmirnov.innercore.api.runtime.MainThreadQueue; import org.json.JSONObject; @@ -76,12 +73,7 @@ public class Network { }); server.addOnClientDisconnectedListener((ConnectedClient client, String reason) -> { - Logger.debug("client disconnected, reason: " + reason); - if (EngineConfig.isDeveloperMode()) { - Logger.debug("server: client disconnected player=" + client.getPlayerUid() + " reason=" + reason); - } else { - Logger.debug("server: client disconnected reason=" + reason); - } + Logger.debug("server: client disconnected player=" + client.getPlayerUid() + " reason=" + reason); }); } @@ -123,7 +115,7 @@ public class Network { Socket socket = new Socket(address, port); int protocolId = config.getClientProtocolId(); socket.getOutputStream().write(protocolId); - return DataChannelFactory.newDataChannel(socket, protocolId); + return DataChannelFactory.newDataChannelViaSupportedProtocol(socket, protocolId); } private DataChannel tryOpenClientToServerNativeDataChannel(int timeout) throws IOException { @@ -150,7 +142,7 @@ public class Network { channel = tryOpenClientToServerNativeDataChannel(getConfig().getNativeChannelPingPongTimeout()); } catch (IOException e) { if (EngineConfig.isDeveloperMode()) { - //UserDialog.toast("failed to connect via native protocol, trying socket connection"); + Logger.info("failed to connect via native protocol, trying socket connection"); } channel = tryOpenClientToServerSocketDataChannel(address, port); } @@ -159,26 +151,29 @@ public class Network { channel = tryOpenClientToServerSocketDataChannel(address, port); } catch (IOException e) { if (EngineConfig.isDeveloperMode()) { - // UserDialog.toast("failed to connect via socket, trying native protocol"); + Logger.info("failed to connect via socket, trying native protocol"); } channel = tryOpenClientToServerNativeDataChannel(getConfig().getNativeChannelPingPongTimeout()); } } + if (channel == null) { + return; + } if (channel instanceof NativeDataChannel) { - //UserDialog.toast("connected to " + address + " via native protocol"); + Logger.info("connected to " + address + " via native protocol"); } else { - //UserDialog.toast("connected to " + address + " via socket at port " + port); + Logger.info("connected to " + address + " via socket at port " + port); } client.start(channel); if (!client.awaitAllInitializationPackets(config.getInitializationTimeout())) { - //UserDialog.dialog("Connection Error", "Failed to connect to server - not all initialization packets were sent to client"); + Logger.info("Connection Error", "Failed to connect to server - not all initialization packets were sent to client"); handler.stop(); shutdown(); } else { - //UserDialog.toast("successfully started client"); + Logger.info("successfully started client"); } handler.stop(); @@ -201,7 +196,7 @@ public class Network { if (!client.awaitAllInitializationPackets(config.getInitializationTimeout())) { if (!client.isRunning()) { - ICLog.i("LAN Server Error", "Failed to startup LAN server - not all initialization packets were sent to client"); + Logger.info("LAN Server Error", "Failed to startup LAN server - not all initialization packets were sent to client"); } handler.stop(); shutdown(); diff --git a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/channel/data/DataChannelFactory.java b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/channel/data/DataChannelFactory.java index 120f5063..b71d11e8 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/channel/data/DataChannelFactory.java +++ b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/channel/data/DataChannelFactory.java @@ -3,14 +3,28 @@ package com.zhekasmirnov.apparatus.multiplayer.channel.data; import java.io.IOException; import java.net.Socket; +import com.reider745.InnerCoreServer; +import com.zhekasmirnov.horizon.runtime.logger.Logger; + public class DataChannelFactory { public static DataChannel newDataChannel(Socket socket, int protocolId) throws IOException { switch (protocolId) { case DirectDataChannel.PROTOCOL_ID: - throw new IOException("failed to create DataChannel: DirectDataChannel is not a network channel protocol"); + throw new IOException( + "failed to create DataChannel: DirectDataChannel is not a network channel protocol"); case SocketDataChannel.PROTOCOL_ID: return new SocketDataChannel(socket); } throw new IOException("failed to create DataChannel: invalid protocol id " + protocolId); } + + public static DataChannel newDataChannelViaSupportedProtocol(Socket socket, int protocolId) throws IOException { + if (protocolId == SocketDataChannel.PROTOCOL_ID) { + return newDataChannel(socket, protocolId); + } + if (InnerCoreServer.isDeveloperMode()) { + Logger.warning("failed to create DataChannel: invalid protocol id " + protocolId); + } + return null; + } } diff --git a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/socket/SocketServer.java b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/socket/SocketServer.java index 6e9ea1ef..c7e707b4 100644 --- a/src/main/java/com/zhekasmirnov/apparatus/multiplayer/socket/SocketServer.java +++ b/src/main/java/com/zhekasmirnov/apparatus/multiplayer/socket/SocketServer.java @@ -3,8 +3,7 @@ package com.zhekasmirnov.apparatus.multiplayer.socket; import com.zhekasmirnov.apparatus.multiplayer.ThreadTypeMarker; import com.zhekasmirnov.apparatus.multiplayer.channel.data.DataChannel; import com.zhekasmirnov.apparatus.multiplayer.channel.data.DataChannelFactory; -import com.zhekasmirnov.innercore.api.log.ICLog; - +import com.zhekasmirnov.horizon.runtime.logger.Logger; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; @@ -46,7 +45,12 @@ public class SocketServer { try { int protocol = socket.getInputStream().read(); - DataChannel channel = DataChannelFactory.newDataChannel(socket, protocol); + DataChannel channel = DataChannelFactory.newDataChannelViaSupportedProtocol(socket, protocol); + + if (channel == null) { + isRunning = false; + return; + } boolean isChannelManaged = false; for (IClientConnectListener listener : clientConnectListeners) { @@ -55,13 +59,13 @@ public class SocketServer { } } } catch (IOException exception) { - ICLog.e("socket server error", "error in creating channel", exception); - exception.printStackTrace(); + Logger.error("socket server error", "error in creating channel", exception); try { socket.close(); } catch (IOException e) { e.printStackTrace(); } + isRunning = false; } } }).start(); @@ -81,5 +85,4 @@ public class SocketServer { } } } - } diff --git a/src/main/java/com/zhekasmirnov/innercore/api/NativeItemModel.java b/src/main/java/com/zhekasmirnov/innercore/api/NativeItemModel.java index 257564f4..db9758dc 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/NativeItemModel.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/NativeItemModel.java @@ -460,7 +460,7 @@ public class NativeItemModel { } public NativeItemModel setItemTexturePath(String path) { - if (!path.endsWith(".png")) { + if (path != null && !path.endsWith(".png")) { path += ".png"; } mItemTexturePath = path; diff --git a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/ScriptableSaverScope.java b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/ScriptableSaverScope.java index 8b2086da..a9bc85df 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/ScriptableSaverScope.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/ScriptableSaverScope.java @@ -1,6 +1,8 @@ package com.zhekasmirnov.innercore.api.runtime.saver.world; import com.zhekasmirnov.innercore.api.runtime.saver.serializer.ScriptableSerializer; + +import org.apache.commons.math3.exception.NullArgumentException; import org.mozilla.javascript.Scriptable; import java.io.IOException; @@ -8,7 +10,9 @@ public abstract class ScriptableSaverScope implements WorldDataScopeRegistry.Sav @Override public void readJson(Object json) throws Exception { Object scriptable = ScriptableSerializer.scriptableFromJson(json); - if (scriptable instanceof Scriptable) { + if (scriptable == null) { + throw new NullArgumentException(); + } else if (scriptable instanceof Scriptable) { read((Scriptable) scriptable); } else { throw new IOException("scriptable saver scope readJson() de-serialized into non scriptable"); diff --git a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/WorldDataSaverHandler.java b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/WorldDataSaverHandler.java index 0f93f1ca..a79aeb7b 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/WorldDataSaverHandler.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/WorldDataSaverHandler.java @@ -29,7 +29,7 @@ public class WorldDataSaverHandler { final int auto_save_period = InnerCoreServer.getAutoSavePeriod(); setParams( - auto_save_period > 10, + auto_save_period >= 20, InnerCoreServer.canAutoSaveWorld(), auto_save_period * 1000 ); diff --git a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/WorldDataScopeRegistry.java b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/WorldDataScopeRegistry.java index 4b54c5d6..3bf1cde5 100644 --- a/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/WorldDataScopeRegistry.java +++ b/src/main/java/com/zhekasmirnov/innercore/api/runtime/saver/world/WorldDataScopeRegistry.java @@ -2,6 +2,8 @@ package com.zhekasmirnov.innercore.api.runtime.saver.world; import com.zhekasmirnov.innercore.api.mod.ScriptableObjectHelper; import com.zhekasmirnov.innercore.api.runtime.Callback; + +import org.apache.commons.math3.exception.NullArgumentException; import org.json.JSONObject; import org.mozilla.javascript.ScriptableObject; @@ -68,6 +70,8 @@ public class WorldDataScopeRegistry { Object data = json.opt(key); try { entry.getValue().readJson(data); + } catch (NullArgumentException err) { + // Data does not exists in json, skipping } catch (Throwable err) { errorHandler.handle(key, err); } diff --git a/src/main/resources/zotecore.yml b/src/main/resources/zotecore.yml index 98769e93..cf621039 100644 --- a/src/main/resources/zotecore.yml +++ b/src/main/resources/zotecore.yml @@ -1,11 +1,11 @@ # Change resolution of pack that client should have to log into server. # However, no deprecated or unimplemented methods will be added. pack: Inner Core Test -pack-version: 2.3.0b115 test -pack-version-code: 152 +pack-version: 2.3.0b116 test +pack-version-code: 153 # Sets the list of mods and configs to load, you can specify -# folder name of a modpack from /modpacks or a path. +# name, folder name of a modpack from /modpacks or a path. # modpack: StoneBlock # Use vanilla crafting table interface, instead of custom one. @@ -29,16 +29,17 @@ pack-version-code: 152 # about engine operation, as well as profiling of methods. # developer-mode: on -# Период сохранения данных inner core -# auto-save-period: 60 +# Time in seconds between auto-saving data of mods (any value above 20), +# as well as the world if it is included in another option. +# auto-save-period: 180 -# Обновлять вместе с сохранениями inner core сохранения мира -# auto-save-world: on +# Whether to save worlds in addition to mod data. +# auto-save-world: off +# Whether socket server enabled or not. +# Server socket requires an additional port, connection +# through server sockets is more stable. +# socket-server-enable: off -# Состояние сокет сервера -# Для сокета сервера требуется дополнительный порт, подключение через сокет серверы более стабильное -# socket-server-enable: on - -# Порт сокет сервера -# socket-port: 2304 \ No newline at end of file +# Server socket port, usually should be between 10000 and 24999. +# socket-port: 19131