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)
This commit is contained in:
Robert Paciorek 2024-04-02 12:51:00 +00:00 committed by Spirtix
parent a03f6b8dc0
commit 04b906b21c
6 changed files with 26 additions and 7 deletions

View File

@ -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<NetworkObject>("p");
string roomName = p.Get<string>("rn") + "_" + p.Get<string>("0");
Room room = Room.GetOrAdd(roomName, autoRemove: true);
client.SetRoom(room);
}
}

View File

@ -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);

View File

@ -36,7 +36,7 @@ class SetUserVariablesHandler : ICommandHandler {
client.PlayerData.M = suvData.Get<string>("M");
client.PlayerData.L = suvData.Get<string>("L");
client.PlayerData.Ra = suvData.Get<string>("RA");
string udt = suvData.Get<string>("UDT");
string? udt = suvData.Get<string>("UDT");
if (udt != null)
client.PlayerData.Udt = udt;
client.PlayerData.P1 = double.Parse(suvData.Get<string>("P1"), CultureInfo.InvariantCulture);
@ -46,7 +46,9 @@ class SetUserVariablesHandler : ICommandHandler {
client.PlayerData.R2 = double.Parse(suvData.Get<string>("R2"), CultureInfo.InvariantCulture);
client.PlayerData.R3 = double.Parse(suvData.Get<string>("R3"), CultureInfo.InvariantCulture);
client.PlayerData.R = double.Parse(suvData.Get<string>("R"), CultureInfo.InvariantCulture);
client.PlayerData.Mbf = int.Parse(suvData.Get<string>("MBF"));
string? mbf = suvData.Get<string>("MBF");
if (mbf != null)
client.PlayerData.Mbf = int.Parse(mbf);
client.PlayerData.F = int.Parse(suvData.Get<string>("F"));
client.PlayerData.J = suvData.Get<string>("J");
client.PlayerData.Bu = suvData.Get<string>("BU");

View File

@ -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];
}
}

View File

@ -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));

View File

@ -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",