forked from SoDOff-Project/sodoff-mmo
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:
parent
7288957a78
commit
0f161d899c
@ -17,6 +17,11 @@ class HandshakeHandler : CommandHandler
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string? api = receivedObject.Get<string>("api");
|
||||||
|
if (api != null && api[0] == '0') {
|
||||||
|
client.OldApi = true;
|
||||||
|
}
|
||||||
|
|
||||||
NetworkObject obj = new();
|
NetworkObject obj = new();
|
||||||
|
|
||||||
obj.Add("tk", RandomString(32));
|
obj.Add("tk", RandomString(32));
|
||||||
|
@ -10,6 +10,9 @@ class JoinRoomHandler : CommandHandler
|
|||||||
public override Task Handle(Client client, NetworkObject receivedObject)
|
public override Task Handle(Client client, NetworkObject receivedObject)
|
||||||
{
|
{
|
||||||
string roomName = receivedObject.Get<NetworkObject>("p").Get<string>("rn");
|
string roomName = receivedObject.Get<NetworkObject>("p").Get<string>("rn");
|
||||||
|
if (roomName is null) {
|
||||||
|
roomName = client.PlayerData.ZoneName;
|
||||||
|
}
|
||||||
Room room = Room.GetOrAdd(roomName);
|
Room room = Room.GetOrAdd(roomName);
|
||||||
client.SetRoom(room);
|
client.SetRoom(room);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
@ -11,6 +11,8 @@ class LoginHandler : CommandHandler
|
|||||||
public override Task Handle(Client client, NetworkObject receivedObject)
|
public override Task Handle(Client client, NetworkObject receivedObject)
|
||||||
{
|
{
|
||||||
client.PlayerData.UNToken = receivedObject.Get<string>("un");
|
client.PlayerData.UNToken = receivedObject.Get<string>("un");
|
||||||
|
client.PlayerData.ZoneName = receivedObject.Get<string>("zn");
|
||||||
|
|
||||||
if (!ValidToken(client)) {
|
if (!ValidToken(client)) {
|
||||||
NetworkObject obj = new();
|
NetworkObject obj = new();
|
||||||
obj.Add("dr", (byte)1);
|
obj.Add("dr", (byte)1);
|
||||||
@ -61,7 +63,7 @@ class LoginHandler : CommandHandler
|
|||||||
|
|
||||||
NetworkObject content = new();
|
NetworkObject content = new();
|
||||||
content.Add("rl", rl);
|
content.Add("rl", rl);
|
||||||
content.Add("zn", "JumpStart");
|
content.Add("zn", client.PlayerData.ZoneName);
|
||||||
content.Add("rs", (short)5);
|
content.Add("rs", (short)5);
|
||||||
content.Add("un", client.PlayerData.UNToken);
|
content.Add("un", client.PlayerData.UNToken);
|
||||||
content.Add("id", client.ClientID);
|
content.Add("id", client.ClientID);
|
||||||
|
22
src/CommandHandlers/LogoutHandler.cs
Normal file
22
src/CommandHandlers/LogoutHandler.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@ -62,7 +62,12 @@ class SetUserVariablesHandler : CommandHandler {
|
|||||||
NetworkObject cmd = new();
|
NetworkObject cmd = new();
|
||||||
cmd.Add("c", "SUV");
|
cmd.Add("c", "SUV");
|
||||||
NetworkArray arr = new();
|
NetworkArray arr = new();
|
||||||
data.Add("MID", client.ClientID);
|
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);
|
arr.Add(data);
|
||||||
NetworkObject container = new();
|
NetworkObject container = new();
|
||||||
container.Add("arr", arr);
|
container.Add("arr", arr);
|
||||||
@ -97,7 +102,11 @@ class SetUserVariablesHandler : CommandHandler {
|
|||||||
NetworkObject obj = new();
|
NetworkObject obj = new();
|
||||||
|
|
||||||
cmd.Add("c", "SUV");
|
cmd.Add("c", "SUV");
|
||||||
obj.Add("MID", client.ClientID);
|
if (client.OldApi) {
|
||||||
|
obj.Add("MID", client.ClientID.ToString());
|
||||||
|
} else {
|
||||||
|
obj.Add("MID", client.ClientID);
|
||||||
|
}
|
||||||
cmd.Add("p", obj);
|
cmd.Add("p", obj);
|
||||||
|
|
||||||
NetworkPacket packet = NetworkObject.WrapObject(1, 13, cmd).Serialize();
|
NetworkPacket packet = NetworkObject.WrapObject(1, 13, cmd).Serialize();
|
||||||
|
@ -11,6 +11,7 @@ public class Client {
|
|||||||
public int ClientID { get; private set; }
|
public int ClientID { get; private set; }
|
||||||
public PlayerData PlayerData { get; set; } = new();
|
public PlayerData PlayerData { get; set; } = new();
|
||||||
public Room? Room { get; private set; }
|
public Room? Room { get; private set; }
|
||||||
|
public bool OldApi { get; set; } = false;
|
||||||
public bool TempMuted { get; set; } = false;
|
public bool TempMuted { get; set; } = false;
|
||||||
|
|
||||||
private readonly Socket socket;
|
private readonly Socket socket;
|
||||||
@ -78,7 +79,11 @@ public class Client {
|
|||||||
NetworkObject cmd = new();
|
NetworkObject cmd = new();
|
||||||
NetworkObject obj = new();
|
NetworkObject obj = new();
|
||||||
cmd.Add("c", "SUV");
|
cmd.Add("c", "SUV");
|
||||||
obj.Add("MID", c.ClientID);
|
if (OldApi) {
|
||||||
|
obj.Add("MID", c.ClientID.ToString());
|
||||||
|
} else {
|
||||||
|
obj.Add("MID", c.ClientID);
|
||||||
|
}
|
||||||
cmd.Add("p", obj);
|
cmd.Add("p", obj);
|
||||||
Send(NetworkObject.WrapObject(1, 13, cmd).Serialize());
|
Send(NetworkObject.WrapObject(1, 13, cmd).Serialize());
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,8 @@ public class PlayerData {
|
|||||||
public string Uid { get; set; } = "";
|
public string Uid { get; set; } = "";
|
||||||
// client token
|
// client token
|
||||||
public string UNToken { get; set; } = "";
|
public string UNToken { get; set; } = "";
|
||||||
|
// client zone
|
||||||
|
public string ZoneName { get; set; } = "";
|
||||||
|
|
||||||
// rotation (eulerAngles.y)
|
// rotation (eulerAngles.y)
|
||||||
public float R { get; set; }
|
public float R { get; set; }
|
||||||
@ -28,7 +30,7 @@ public class PlayerData {
|
|||||||
public float P3 { get; set; }
|
public float P3 { get; set; }
|
||||||
// max speed
|
// max speed
|
||||||
public float Mx { get; set; } = 6;
|
public float Mx { get; set; } = 6;
|
||||||
// flags (?)
|
// flags
|
||||||
public int F { get; set; }
|
public int F { get; set; }
|
||||||
// animation bitfield (animations used by avatar, e.g. mounted, swim, ...)
|
// animation bitfield (animations used by avatar, e.g. mounted, swim, ...)
|
||||||
public int Mbf { get; set; }
|
public int Mbf { get; set; }
|
||||||
@ -51,7 +53,10 @@ public class PlayerData {
|
|||||||
"CU", // country id (int) (for flag?)
|
"CU", // country id (int) (for flag?)
|
||||||
"J", // join allowed
|
"J", // join allowed
|
||||||
"BU", // busy (?)
|
"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)
|
// other variables (set and updated via SUV command)
|
||||||
@ -62,29 +67,47 @@ public class PlayerData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void SetVariable(string varName, string value) {
|
public void SetVariable(string varName, string value) {
|
||||||
if (varName == "UID")
|
// do not store in variables directory
|
||||||
|
if (varName == "UID") {
|
||||||
return;
|
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);
|
value = FixMountState(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// store in directory
|
||||||
variables[varName] = value;
|
variables[varName] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InitFromNetworkData(NetworkObject suvData) {
|
public void InitFromNetworkData(NetworkObject suvData) {
|
||||||
// set initial state for SPV data
|
// set initial state for SPV data
|
||||||
R = float.Parse(suvData.Get<string>("R"), CultureInfo.InvariantCulture);
|
R = float.Parse(suvData.Get<string>("R"), CultureInfo.InvariantCulture);
|
||||||
P1 = float.Parse(suvData.Get<string>("P1"), CultureInfo.InvariantCulture);
|
string? p1 = suvData.Get<string>("P1");
|
||||||
P2 = float.Parse(suvData.Get<string>("P2"), CultureInfo.InvariantCulture);
|
if (p1 != null) {
|
||||||
P3 = float.Parse(suvData.Get<string>("P3"), CultureInfo.InvariantCulture);
|
P1 = float.Parse(p1, CultureInfo.InvariantCulture);
|
||||||
R1 = float.Parse(suvData.Get<string>("R1"), CultureInfo.InvariantCulture);
|
P2 = float.Parse(suvData.Get<string>("P2"), CultureInfo.InvariantCulture);
|
||||||
R2 = float.Parse(suvData.Get<string>("R2"), CultureInfo.InvariantCulture);
|
P3 = float.Parse(suvData.Get<string>("P3"), CultureInfo.InvariantCulture);
|
||||||
R3 = float.Parse(suvData.Get<string>("R3"), 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");
|
string? mbf = suvData.Get<string>("MBF");
|
||||||
if (mbf != null)
|
if (mbf != null)
|
||||||
Mbf = int.Parse(mbf);
|
Mbf = int.Parse(mbf);
|
||||||
F = int.Parse(suvData.Get<string>("F"));
|
F = int.Parse(suvData.Get<string>("F"));
|
||||||
|
|
||||||
// reset all variables values
|
// reset all variables values
|
||||||
variables.Clear();
|
// variables.Clear();
|
||||||
|
|
||||||
// set initial state for SUV data
|
// set initial state for SUV data
|
||||||
foreach (string varName in SupportedVariables) {
|
foreach (string varName in SupportedVariables) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user