From 04b906b21c76034462df82e8a3cb72287527e628 Mon Sep 17 00:00:00 2001 From: Robert Paciorek Date: Tue, 2 Apr 2024 12:51:00 +0000 Subject: [PATCH] add "JO" handler, fix "NT" value, support for WoJS - add "JO" handler (private room join, like farm) - "NT" param should be Unix timestamp in milliseconds - "MBF" is not used by some games (e.g. WoJS) --- src/CommandHandlers/JoinPrivateRoomHandler.cs | 17 +++++++++++++++++ .../SetPositionVariablesHandler.cs | 2 +- src/CommandHandlers/SetUserVariablesHandler.cs | 6 ++++-- src/Core/Room.cs | 4 ++-- src/Data/PlayerData.cs | 2 +- src/appsettings.json | 2 +- 6 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 src/CommandHandlers/JoinPrivateRoomHandler.cs diff --git a/src/CommandHandlers/JoinPrivateRoomHandler.cs b/src/CommandHandlers/JoinPrivateRoomHandler.cs new file mode 100644 index 0000000..3e91fa3 --- /dev/null +++ b/src/CommandHandlers/JoinPrivateRoomHandler.cs @@ -0,0 +1,17 @@ +using sodoffmmo.Attributes; +using sodoffmmo.Core; +using sodoffmmo.Data; + +namespace sodoffmmo.CommandHandlers; + +[ExtensionCommandHandler("JO")] +class JoinPrivateRoomHandler : ICommandHandler +{ + public void Handle(Client client, NetworkObject receivedObject) + { + var p = receivedObject.Get("p"); + string roomName = p.Get("rn") + "_" + p.Get("0"); + Room room = Room.GetOrAdd(roomName, autoRemove: true); + client.SetRoom(room); + } +} diff --git a/src/CommandHandlers/SetPositionVariablesHandler.cs b/src/CommandHandlers/SetPositionVariablesHandler.cs index 9b32e69..b24f6b3 100644 --- a/src/CommandHandlers/SetPositionVariablesHandler.cs +++ b/src/CommandHandlers/SetPositionVariablesHandler.cs @@ -43,7 +43,7 @@ class SetPositionVariablesHandler : ICommandHandler { NetworkObject vars = new(); vars.Add("MX", (float)client.PlayerData.Mx); vars.Add("ST", Runtime.CurrentRuntime); - vars.Add("NT", Runtime.CurrentRuntime.ToString()); + vars.Add("NT", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString()); vars.Add("t", (int)(Runtime.CurrentRuntime / 1000)); vars.Add("F", client.PlayerData.F); vars.Add("MBF", client.PlayerData.Mbf); diff --git a/src/CommandHandlers/SetUserVariablesHandler.cs b/src/CommandHandlers/SetUserVariablesHandler.cs index b10567c..12a8d4b 100644 --- a/src/CommandHandlers/SetUserVariablesHandler.cs +++ b/src/CommandHandlers/SetUserVariablesHandler.cs @@ -36,7 +36,7 @@ class SetUserVariablesHandler : ICommandHandler { client.PlayerData.M = suvData.Get("M"); client.PlayerData.L = suvData.Get("L"); client.PlayerData.Ra = suvData.Get("RA"); - string udt = suvData.Get("UDT"); + string? udt = suvData.Get("UDT"); if (udt != null) client.PlayerData.Udt = udt; client.PlayerData.P1 = double.Parse(suvData.Get("P1"), CultureInfo.InvariantCulture); @@ -46,7 +46,9 @@ class SetUserVariablesHandler : ICommandHandler { client.PlayerData.R2 = double.Parse(suvData.Get("R2"), CultureInfo.InvariantCulture); client.PlayerData.R3 = double.Parse(suvData.Get("R3"), CultureInfo.InvariantCulture); client.PlayerData.R = double.Parse(suvData.Get("R"), CultureInfo.InvariantCulture); - client.PlayerData.Mbf = int.Parse(suvData.Get("MBF")); + string? mbf = suvData.Get("MBF"); + if (mbf != null) + client.PlayerData.Mbf = int.Parse(mbf); client.PlayerData.F = int.Parse(suvData.Get("F")); client.PlayerData.J = suvData.Get("J"); client.PlayerData.Bu = suvData.Get("BU"); diff --git a/src/Core/Room.cs b/src/Core/Room.cs index 741ff29..e832370 100644 --- a/src/Core/Room.cs +++ b/src/Core/Room.cs @@ -78,10 +78,10 @@ public class Room { public static Room Get(string name) => rooms[name]; - public static Room GetOrAdd(string name) { + public static Room GetOrAdd(string name, bool autoRemove = false) { lock(RoomsListLock) { if (!Room.Exists(name)) - return new Room(name); + return new Room(name, autoRemove: autoRemove); return rooms[name]; } } diff --git a/src/Data/PlayerData.cs b/src/Data/PlayerData.cs index 5bce063..34b3c55 100644 --- a/src/Data/PlayerData.cs +++ b/src/Data/PlayerData.cs @@ -72,7 +72,7 @@ public class PlayerData { arr.Add((short)clientID); paramArr = new(); - paramArr.Add(NetworkArray.Param("NT", (double)(Runtime.CurrentRuntime))); // network time + paramArr.Add(NetworkArray.Param("NT", (double)(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()))); // network time paramArr.Add(NetworkArray.Param("t", (int)(Runtime.CurrentRuntime / 1000))); // timestamp paramArr.Add(NetworkArray.Param("UID", Uid)); diff --git a/src/appsettings.json b/src/appsettings.json index ca46722..86fb74e 100644 --- a/src/appsettings.json +++ b/src/appsettings.json @@ -1,6 +1,6 @@ { "MMOServer": { - "// ListenIP": "Listening IP address for the asset server, default is '*' which represents all IPv4 and IPv6 addresses", + "// ListenIP": "Listening IP address for the MMO server, default is '*' which represents all IPv4 and IPv6 addresses", "ListenIP": "*", "// Port": "Listening port number for the MMO server",