mirror of
https://github.com/SoDOff-Project/sodoff-mmo.git
synced 2025-10-11 08:18:49 -07:00
rework PlayerData, SUV and SPV handlers
This commit is contained in:
parent
a4039451f3
commit
8ca7b51161
@ -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);
|
||||||
|
@ -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) {
|
||||||
if (PU != null) {
|
client.PlayerData.SetVariable(varName, value);
|
||||||
client.PlayerData.Pu = PU;
|
updated = true;
|
||||||
data2.Add("PU", client.PlayerData.Pu);
|
data.Add(varName, value);
|
||||||
vl.Add(NetworkArray.Param("PU", client.PlayerData.Pu));
|
vl.Add(NetworkArray.Param(varName, value));
|
||||||
}
|
}
|
||||||
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();
|
||||||
|
@ -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
|
||||||
@ -121,7 +123,7 @@ public class NetworkArray {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void AddWithTypeObject(NetworkDataType dataType, byte typeId, object? obj) {
|
private void AddWithTypeObject(NetworkDataType dataType, byte typeId, object? obj) {
|
||||||
Add(new DataWrapper(NetworkDataType.Byte,typeId));
|
Add(new DataWrapper(NetworkDataType.Byte, typeId));
|
||||||
Add(new DataWrapper(dataType, obj));
|
Add(new DataWrapper(dataType, obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user