rework PlayerData, SUV and SPV handlers

This commit is contained in:
Robert Paciorek 2024-04-03 12:06:42 +00:00 committed by Spirtix
parent a4039451f3
commit 8ca7b51161
4 changed files with 139 additions and 141 deletions

View File

@ -16,7 +16,7 @@ class SetPositionVariablesHandler : CommandHandler {
return Task.CompletedTask; return Task.CompletedTask;
} }
this.client = client; this.client = client;
spvData = receivedObject; spvData = receivedObject.Get<NetworkObject>("p");
UpdatePositionVariables(); UpdatePositionVariables();
SendSPVCommand(); SendSPVCommand();
@ -24,18 +24,17 @@ class SetPositionVariablesHandler : CommandHandler {
} }
private void UpdatePositionVariables() { private void UpdatePositionVariables() {
NetworkObject obj = spvData.Get<NetworkObject>("p"); float[] pos = spvData.Get<float[]>("U");
float[] pos = obj.Get<float[]>("U"); client.PlayerData.R = spvData.Get<float>("R");
client.PlayerData.R = obj.Get<float>("R");
client.PlayerData.P1 = pos[0]; client.PlayerData.P1 = pos[0];
client.PlayerData.P2 = pos[1]; client.PlayerData.P2 = pos[1];
client.PlayerData.P3 = pos[2]; client.PlayerData.P3 = pos[2];
client.PlayerData.R1 = pos[3]; client.PlayerData.R1 = pos[3];
client.PlayerData.R2 = pos[4]; client.PlayerData.R2 = pos[4];
client.PlayerData.R3 = pos[5]; client.PlayerData.R3 = pos[5];
client.PlayerData.Mx = obj.Get<float>("MX"); client.PlayerData.Mx = spvData.Get<float>("MX");
client.PlayerData.F = obj.Get<int>("F"); client.PlayerData.F = spvData.Get<int>("F");
client.PlayerData.Mbf = obj.Get<int>("MBF"); client.PlayerData.Mbf = spvData.Get<int>("MBF");
} }
private void SendSPVCommand() { private void SendSPVCommand() {
@ -43,18 +42,24 @@ class SetPositionVariablesHandler : CommandHandler {
NetworkObject obj = new(); NetworkObject obj = new();
NetworkArray container = new(); NetworkArray container = new();
NetworkObject vars = new(); NetworkObject vars = new();
vars.Add("MX", (float)client.PlayerData.Mx); vars.Add("R", client.PlayerData.R);
vars.Add("ST", Runtime.CurrentRuntime); vars.Add("U", new float[] { client.PlayerData.P1, client.PlayerData.P2, client.PlayerData.P3, client.PlayerData.R1, client.PlayerData.R2, client.PlayerData.R3 });
vars.Add("NT", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString()); vars.Add("MX", client.PlayerData.Mx);
vars.Add("t", (int)(Runtime.CurrentRuntime / 1000));
vars.Add("F", client.PlayerData.F); vars.Add("F", client.PlayerData.F);
vars.Add("MBF", client.PlayerData.Mbf); vars.Add("MBF", client.PlayerData.Mbf);
vars.Add("R", client.PlayerData.R);
vars.Add("U", new float[] { (float)client.PlayerData.P1, (float)client.PlayerData.P2, (float)client.PlayerData.P3, (float)client.PlayerData.R1, (float)client.PlayerData.R2, (float)client.PlayerData.R3 }); // user event
vars.Add("MID", client.ClientID); string? ue = spvData.Get<string>("UE");
string? ue = spvData.Get<NetworkObject>("p").Get<string>("UE");
if (ue != null) if (ue != null)
vars.Add("UE", ue); vars.Add("UE", ue);
// pitch
string? cup = spvData.Get<string>("CUP");
if (cup != null)
vars.Add("CUP", cup);
vars.Add("NT", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString());
vars.Add("t", (int)(Runtime.CurrentRuntime / 1000));
vars.Add("MID", client.ClientID);
container.Add(vars); container.Add(vars);
obj.Add("arr", container); obj.Add("arr", container);

View File

@ -1,7 +1,6 @@
using sodoffmmo.Attributes; using sodoffmmo.Attributes;
using sodoffmmo.Core; using sodoffmmo.Core;
using sodoffmmo.Data; using sodoffmmo.Data;
using System.Globalization;
namespace sodoffmmo.CommandHandlers; namespace sodoffmmo.CommandHandlers;
@ -22,94 +21,50 @@ class SetUserVariablesHandler : CommandHandler {
uid = suvData.Get<string>("UID"); uid = suvData.Get<string>("UID");
// TODO // TODO
if (uid != null && (client.PlayerData.Uid != uid || !client.PlayerData.IsValid)) if (uid != null && (client.PlayerData.Uid != uid || !client.PlayerData.IsValid)) {
ProcessPlayerData(); Console.WriteLine($"SUV {client.Room.Name} ({client.Room.ClientsCount}) IID: {client.ClientID} UID: {uid}");
else client.PlayerData.Uid = uid;
client.PlayerData.InitFromNetworkData(suvData);
UpdatePlayersInRoom();
SendSUVToPlayerInRoom();
} else {
UpdateVars(); UpdateVars();
}
return Task.CompletedTask; return Task.CompletedTask;
} }
private void ProcessPlayerData() {
client.PlayerData.Uid = uid;
client.PlayerData.A = suvData.Get<string>("A");
client.PlayerData.Cu = suvData.Get<string>("CU");
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");
if (udt != null)
client.PlayerData.Udt = udt;
client.PlayerData.P1 = double.Parse(suvData.Get<string>("P1"), CultureInfo.InvariantCulture);
client.PlayerData.P2 = double.Parse(suvData.Get<string>("P2"), CultureInfo.InvariantCulture);
client.PlayerData.P3 = double.Parse(suvData.Get<string>("P3"), CultureInfo.InvariantCulture);
client.PlayerData.R1 = double.Parse(suvData.Get<string>("R1"), CultureInfo.InvariantCulture);
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);
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");
client.PlayerData.Fp = suvData.Get<string>("FP");
client.PlayerData.IsValid = true;
Console.WriteLine($"SUV {client.Room.Name} ({client.Room.ClientsCount}) IID: {client.ClientID} UID: {uid}");
UpdatePlayersInRoom();
SendSUVToPlayerInRoom();
}
private void UpdateVars() { private void UpdateVars() {
string? FP = suvData.Get<string>("FP"); bool updated = false;
string? PU = suvData.Get<string>("PU");
string? A = suvData.Get<string>("A");
string? L = suvData.Get<string>("L");
if (FP is null && PU is null && A is null && L is null) {
return; // TODO
}
NetworkObject data = new();
NetworkObject data2 = new();
data.Add("u", client.ClientID);
NetworkArray vl = new(); NetworkArray vl = new();
if (FP != null) { NetworkObject data = new();
client.PlayerData.Fp = FP;
data2.Add("FP", client.PlayerData.Fp); foreach (string varName in PlayerData.SupportedVariables) {
vl.Add(NetworkArray.Param("FP", client.PlayerData.Fp)); string? value = suvData.Get<string>(varName);
if (value != null) {
client.PlayerData.SetVariable(varName, value);
updated = true;
data.Add(varName, value);
vl.Add(NetworkArray.Param(varName, value));
} }
if (PU != null) {
client.PlayerData.Pu = PU;
data2.Add("PU", client.PlayerData.Pu);
vl.Add(NetworkArray.Param("PU", client.PlayerData.Pu));
}
if (A != null) {
client.PlayerData.A = A;
data2.Add("A", client.PlayerData.A);
vl.Add(NetworkArray.Param("A", client.PlayerData.A));
}
if (L != null) {
client.PlayerData.L = L;
data2.Add("L", client.PlayerData.L);
vl.Add(NetworkArray.Param("L", client.PlayerData.L));
} }
data.Add("vl", vl); if (!updated) {
return;
}
NetworkPacket packet = NetworkObject.WrapObject(0, 12, data).Serialize(); NetworkObject data2 = new();
data2.Add("u", client.ClientID);
data2.Add("vl", vl);
NetworkPacket packet = NetworkObject.WrapObject(0, 12, data2).Serialize();
client.Room.Send(packet); client.Room.Send(packet);
NetworkObject cmd = new(); NetworkObject cmd = new();
cmd.Add("c", "SUV"); cmd.Add("c", "SUV");
NetworkObject container = new();
NetworkArray arr = new(); NetworkArray arr = new();
data2.Add("RID", "1"); data.Add("MID", client.ClientID);
data2.Add("MID", client.ClientID); arr.Add(data);
arr.Add(data2); NetworkObject container = new();
container.Add("arr", arr); container.Add("arr", arr);
cmd.Add("p", container); cmd.Add("p", container);
packet = NetworkObject.WrapObject(1, 13, cmd).Serialize(); packet = NetworkObject.WrapObject(1, 13, cmd).Serialize();

View File

@ -114,6 +114,8 @@ public class NetworkArray {
AddWithTypeObject(NetworkDataType.Int, 2, value); AddWithTypeObject(NetworkDataType.Int, 2, value);
else if (typeof(T) == typeof(double)) else if (typeof(T) == typeof(double))
AddWithTypeObject(NetworkDataType.Double, 3, value); AddWithTypeObject(NetworkDataType.Double, 3, value);
else if (typeof(T) == typeof(float))
AddWithTypeObject(NetworkDataType.Float, 3, value);
else if (typeof(T) == typeof(string)) else if (typeof(T) == typeof(string))
AddWithTypeObject(NetworkDataType.String, 4, value); AddWithTypeObject(NetworkDataType.String, 4, value);
else else

View File

@ -1,4 +1,5 @@
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Globalization;
using sodoffmmo.Core; using sodoffmmo.Core;
using sodoffmmo.Management; using sodoffmmo.Management;
@ -10,56 +11,88 @@ 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; } = "";
// avatar data
public string A { get; set; } = "";
// (not raised) pet data
public string Pu { get; set; } = "";
// raised pet data
public string Fp {
get {
return fp;
}
set {
fp = FixMountState(value);
}
}
private string fp = "";
// rotation (eulerAngles.y) // rotation (eulerAngles.y)
public double R { get; set; } public float R { get; set; }
// velocity x // velocity x
public double R1 { get; set; } public float R1 { get; set; }
// velocity y // velocity y
public double R2 { get; set; } public float R2 { get; set; }
// velocity z // velocity z
public double R3 { get; set; } public float R3 { get; set; }
// position x // position x
public double P1 { get; set; } public float P1 { get; set; }
// position y // position y
public double P2 { get; set; } public float P2 { get; set; }
// position z // position z
public double P3 { get; set; } public float P3 { get; set; }
// animation bitfield (animations used by avatar, e.g. mounted, swim, ...)
public int Mbf { get; set; }
// max speed // max speed
public double Mx { get; set; } = 6; public float Mx { get; set; } = 6;
// flags (?) // flags (?)
public int F { get; set; } public int F { get; set; }
// location (level) // animation bitfield (animations used by avatar, e.g. mounted, swim, ...)
public string L { get; set; } = ""; public int Mbf { get; set; }
// join allowed public static readonly string[] SupportedVariables = {
public string J { get; set; } = "2"; "A", // avatar data
// busy (?) "FP", // raised pet data
public string Bu { get; set; } = "False"; "RA", // XP rank (points and level)
// UDT points "UDT", // UDT points
public string Udt { get; set; } = ""; "L", // location (level)
// XP rank (points and level) "PU", // (not raised) pet data
public string Ra { get; set; } = ""; "RDE", // ride (int)
// country info (for flag?) "MU", // mood
public string Cu { get; set; } = "-1"; "MBR", // mount broom (bool)
// membership status "GU", // goggles (bool)
public string M { get; set; } = "True"; "LC", // livechat (int)
"CU", // country id (int) (for flag?)
"J", // join allowed
"BU", // busy (?)
"M" // membership status (bool)
};
// other variables (set and updated via SUV command)
private Dictionary<string, string?> variables = new();
public string GetVariable(string varName) {
return variables[varName];
}
public void SetVariable(string varName, string value) {
if (varName == "UID")
return;
if (varName == "FP")
value = FixMountState(value);
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);
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();
// set initial state for SUV data
foreach (string varName in SupportedVariables) {
string? value = suvData.Get<string>(varName);
if (value != null) {
SetVariable(varName, value);
}
}
IsValid = true;
}
public string DiplayName { get; set; } = ""; public string DiplayName { get; set; } = "";
public Role Role { get; set; } = Role.User; public Role Role { get; set; } = Role.User;
@ -72,13 +105,12 @@ public class PlayerData {
arr.Add((short)clientID); arr.Add((short)clientID);
paramArr = new(); paramArr = new();
paramArr.Add(NetworkArray.Param("NT", (double)(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()))); // network time paramArr.Add(NetworkArray.Param("NT", (double)(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()))); // network time (like PNG)
paramArr.Add(NetworkArray.Param("t", (int)(Runtime.CurrentRuntime / 1000))); // timestamp paramArr.Add(NetworkArray.Param("t", (int)(Runtime.CurrentRuntime / 1000))); // timestamp (non-decreasing integer)
paramArr.Add(NetworkArray.Param("UID", Uid)); paramArr.Add(NetworkArray.Param("UID", Uid));
paramArr.Add(NetworkArray.Param("A", A)); addVariableToArray(paramArr, "A");
paramArr.Add(NetworkArray.Param("PU", Pu)); addVariableToArray(paramArr, "FP");
paramArr.Add(NetworkArray.Param("FP", Fp));
if (IsValid) { if (IsValid) {
paramArr.Add(NetworkArray.Param("R", R)); paramArr.Add(NetworkArray.Param("R", R));
@ -91,20 +123,24 @@ public class PlayerData {
paramArr.Add(NetworkArray.Param("MX", Mx)); paramArr.Add(NetworkArray.Param("MX", Mx));
paramArr.Add(NetworkArray.Param("F", F)); paramArr.Add(NetworkArray.Param("F", F));
paramArr.Add(NetworkArray.Param("MBF", Mbf)); paramArr.Add(NetworkArray.Param("MBF", Mbf));
paramArr.Add(NetworkArray.Param("L", L));
paramArr.Add(NetworkArray.Param("J", J)); foreach (var v in variables) {
paramArr.Add(NetworkArray.Param("BU", Bu)); if (v.Value is null || v.Key == "A" || v.Key == "FP")
paramArr.Add(NetworkArray.Param("UDT", Udt)); continue;
paramArr.Add(NetworkArray.Param("RA", Ra)); paramArr.Add(NetworkArray.Param(v.Key, v.Value));
paramArr.Add(NetworkArray.Param("CU", Cu)); }
paramArr.Add(NetworkArray.Param("M", M));
} }
arr.Add(paramArr); arr.Add(paramArr);
return arr; return arr;
} }
private void addVariableToArray(NetworkArray paramArr, string varName) {
if (variables.TryGetValue (varName, out string tmp) && tmp != null) {
paramArr.Add(NetworkArray.Param(varName, tmp));
}
}
private string FixMountState(string value) { private string FixMountState(string value) {
// raised pet geometry - set from Fp // raised pet geometry - set from Fp
PetGeometryType GeometryType = PetGeometryType.Default; PetGeometryType GeometryType = PetGeometryType.Default;