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;
|
||||
}
|
||||
|
||||
string? api = receivedObject.Get<string>("api");
|
||||
if (api != null && api[0] == '0') {
|
||||
client.OldApi = true;
|
||||
}
|
||||
|
||||
NetworkObject obj = new();
|
||||
|
||||
obj.Add("tk", RandomString(32));
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
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();
|
||||
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();
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user