fixes for SuperSecret

- added logout handler
- support for api 0.x (MID as string)
- support for using SUV insted of SPV
- use zoneName from login request when no roomName in join room request
This commit is contained in:
Robert Paciorek 2024-04-20 01:33:39 +00:00
parent 7288957a78
commit 0f161d899c
7 changed files with 84 additions and 15 deletions

View File

@ -17,6 +17,11 @@ class HandshakeHandler : CommandHandler
return Task.CompletedTask;
}
string? api = receivedObject.Get<string>("api");
if (api != null && api[0] == '0') {
client.OldApi = true;
}
NetworkObject obj = new();
obj.Add("tk", RandomString(32));

View File

@ -10,6 +10,9 @@ class JoinRoomHandler : CommandHandler
public override Task Handle(Client client, NetworkObject receivedObject)
{
string roomName = receivedObject.Get<NetworkObject>("p").Get<string>("rn");
if (roomName is null) {
roomName = client.PlayerData.ZoneName;
}
Room room = Room.GetOrAdd(roomName);
client.SetRoom(room);
return Task.CompletedTask;

View File

@ -11,6 +11,8 @@ class LoginHandler : CommandHandler
public override Task Handle(Client client, NetworkObject receivedObject)
{
client.PlayerData.UNToken = receivedObject.Get<string>("un");
client.PlayerData.ZoneName = receivedObject.Get<string>("zn");
if (!ValidToken(client)) {
NetworkObject obj = new();
obj.Add("dr", (byte)1);
@ -61,7 +63,7 @@ class LoginHandler : CommandHandler
NetworkObject content = new();
content.Add("rl", rl);
content.Add("zn", "JumpStart");
content.Add("zn", client.PlayerData.ZoneName);
content.Add("rs", (short)5);
content.Add("un", client.PlayerData.UNToken);
content.Add("id", client.ClientID);

View File

@ -0,0 +1,22 @@
using sodoffmmo.Attributes;
using sodoffmmo.Core;
using sodoffmmo.Data;
namespace sodoffmmo.CommandHandlers;
[CommandHandler(2)]
class LogoutHandler : CommandHandler
{
public override Task Handle(Client client, NetworkObject receivedObject)
{
client.SetRoom(null);
client.PlayerData.UNToken = null;
client.PlayerData.ZoneName = null;
NetworkObject content = new();
content.Add("zn", "");
client.Send(NetworkObject.WrapObject(0, 2, content).Serialize());
return Task.CompletedTask;
}
}

View File

@ -62,7 +62,12 @@ class SetUserVariablesHandler : CommandHandler {
NetworkObject cmd = new();
cmd.Add("c", "SUV");
NetworkArray arr = new();
if (client.OldApi) {
data.Add("MID", client.ClientID.ToString());
} else {
data.Add("MID", client.ClientID);
}
data.Add("RID", client.Room.Id.ToString());
arr.Add(data);
NetworkObject container = new();
container.Add("arr", arr);
@ -97,7 +102,11 @@ class SetUserVariablesHandler : CommandHandler {
NetworkObject obj = new();
cmd.Add("c", "SUV");
if (client.OldApi) {
obj.Add("MID", client.ClientID.ToString());
} else {
obj.Add("MID", client.ClientID);
}
cmd.Add("p", obj);
NetworkPacket packet = NetworkObject.WrapObject(1, 13, cmd).Serialize();

View File

@ -11,6 +11,7 @@ public class Client {
public int ClientID { get; private set; }
public PlayerData PlayerData { get; set; } = new();
public Room? Room { get; private set; }
public bool OldApi { get; set; } = false;
public bool TempMuted { get; set; } = false;
private readonly Socket socket;
@ -78,7 +79,11 @@ public class Client {
NetworkObject cmd = new();
NetworkObject obj = new();
cmd.Add("c", "SUV");
if (OldApi) {
obj.Add("MID", c.ClientID.ToString());
} else {
obj.Add("MID", c.ClientID);
}
cmd.Add("p", obj);
Send(NetworkObject.WrapObject(1, 13, cmd).Serialize());
}

View File

@ -11,6 +11,8 @@ public class PlayerData {
public string Uid { get; set; } = "";
// client token
public string UNToken { get; set; } = "";
// client zone
public string ZoneName { get; set; } = "";
// rotation (eulerAngles.y)
public float R { get; set; }
@ -28,7 +30,7 @@ public class PlayerData {
public float P3 { get; set; }
// max speed
public float Mx { get; set; } = 6;
// flags (?)
// flags
public int F { get; set; }
// animation bitfield (animations used by avatar, e.g. mounted, swim, ...)
public int Mbf { get; set; }
@ -51,7 +53,10 @@ public class PlayerData {
"CU", // country id (int) (for flag?)
"J", // join allowed
"BU", // busy (?)
"M" // membership status (bool)
"M", // membership status (bool)
"P", // position vector (older games)
"R", // rotation (older games - updated via SUV, not SPV)
"F", // flags (older games - updated via SUV, not SPV)
};
// other variables (set and updated via SUV command)
@ -62,29 +67,47 @@ public class PlayerData {
}
public void SetVariable(string varName, string value) {
if (varName == "UID")
// do not store in variables directory
if (varName == "UID") {
return;
if (varName == "FP")
}
if (varName == "R") {
R = float.Parse(value, CultureInfo.InvariantCulture);
return;
}
if (varName == "F") {
F = unchecked((int)Convert.ToUInt32(value, 16));
return;
}
// fix variable value before store
if (varName == "FP") {
value = FixMountState(value);
}
// store in directory
variables[varName] = value;
}
public void InitFromNetworkData(NetworkObject suvData) {
// set initial state for SPV data
R = float.Parse(suvData.Get<string>("R"), CultureInfo.InvariantCulture);
P1 = float.Parse(suvData.Get<string>("P1"), CultureInfo.InvariantCulture);
string? p1 = suvData.Get<string>("P1");
if (p1 != null) {
P1 = float.Parse(p1, CultureInfo.InvariantCulture);
P2 = float.Parse(suvData.Get<string>("P2"), CultureInfo.InvariantCulture);
P3 = float.Parse(suvData.Get<string>("P3"), CultureInfo.InvariantCulture);
R1 = float.Parse(suvData.Get<string>("R1"), CultureInfo.InvariantCulture);
R2 = float.Parse(suvData.Get<string>("R2"), CultureInfo.InvariantCulture);
R3 = float.Parse(suvData.Get<string>("R3"), CultureInfo.InvariantCulture);
}
string? mbf = suvData.Get<string>("MBF");
if (mbf != null)
Mbf = int.Parse(mbf);
F = int.Parse(suvData.Get<string>("F"));
// reset all variables values
variables.Clear();
// variables.Clear();
// set initial state for SUV data
foreach (string varName in SupportedVariables) {