mirror of
https://github.com/SoDOff-Project/sodoff-mmo.git
synced 2025-10-11 08:18:49 -07:00
keep some PlayerData while changing room
this is needed when several players are joined in a short time to fix race condition (to fix missing players in race lobby room)
This commit is contained in:
parent
13248e70c3
commit
6a34677ab2
@ -16,7 +16,7 @@ class SetUserVariablesHandler : ICommandHandler {
|
||||
uid = suvData.Get<string>("UID");
|
||||
|
||||
// TODO
|
||||
if (uid != null && client.PlayerData.Uid != uid)
|
||||
if (uid != null && (client.PlayerData.Uid != uid || !client.PlayerData.IsValid))
|
||||
ProcessPlayerData();
|
||||
else
|
||||
UpdateVars();
|
||||
@ -45,8 +45,9 @@ class SetUserVariablesHandler : ICommandHandler {
|
||||
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} IID: {client.ClientID}");
|
||||
Console.WriteLine($"SUV {client.Room.Name} ({client.Room.ClientsCount}) IID: {client.ClientID} UID: {uid}");
|
||||
|
||||
UpdatePlayersInRoom();
|
||||
SendSUVToPlayerInRoom();
|
||||
@ -55,8 +56,9 @@ class SetUserVariablesHandler : ICommandHandler {
|
||||
private void UpdateVars() {
|
||||
string? FP = suvData.Get<string>("FP");
|
||||
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 && L is null) {
|
||||
if (FP is null && PU is null && A is null && L is null) {
|
||||
return; // TODO
|
||||
}
|
||||
NetworkObject data = new();
|
||||
@ -74,6 +76,11 @@ class SetUserVariablesHandler : ICommandHandler {
|
||||
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);
|
||||
|
@ -80,7 +80,7 @@ public class Client {
|
||||
}
|
||||
|
||||
public void InvalidatePlayerData() {
|
||||
PlayerData = new();
|
||||
PlayerData.IsValid = false;
|
||||
}
|
||||
|
||||
public void Disconnect() {
|
||||
|
@ -100,6 +100,7 @@ public class Room {
|
||||
|
||||
NetworkArray userList = new();
|
||||
foreach (Client player in Clients) {
|
||||
if (player.PlayerData.Uid != "")
|
||||
userList.Add(player.PlayerData.GetNetworkData(player.ClientID, out _));
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,27 @@ using sodoffmmo.Core;
|
||||
|
||||
namespace sodoffmmo.Data;
|
||||
public class PlayerData {
|
||||
public bool IsValid { get; set; } = false;
|
||||
|
||||
// viking uid
|
||||
public string Uid { get; set; } = "";
|
||||
// client token
|
||||
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)
|
||||
public double R { get; set; }
|
||||
// velocity x
|
||||
@ -11,54 +32,83 @@ public class PlayerData {
|
||||
public double R2 { get; set; }
|
||||
// velocity z
|
||||
public double R3 { get; set; }
|
||||
// max speed
|
||||
public double Mx { get; set; } = 6;
|
||||
// UDT points
|
||||
public string Udt { get; set; } = "";
|
||||
// position x
|
||||
public double P1 { get; set; }
|
||||
// position y
|
||||
public double P2 { get; set; }
|
||||
// position z
|
||||
public double P3 { get; set; }
|
||||
|
||||
|
||||
// join (?)
|
||||
public string J { get; set; } = "2";
|
||||
// flags (?)
|
||||
public int F { get; set; }
|
||||
// animation bitfield (animations used by avatar, e.g. mounted, swim, ...)
|
||||
public int Mbf { get; set; }
|
||||
// max speed
|
||||
public double Mx { get; set; } = 6;
|
||||
// flags (?)
|
||||
public int F { get; set; }
|
||||
// location (level)
|
||||
public string L { get; set; } = "";
|
||||
|
||||
// join allowed
|
||||
public string J { get; set; } = "2";
|
||||
// busy (?)
|
||||
public string Bu { get; set; } = "False";
|
||||
// viking uid
|
||||
public string Uid { get; set; } = "";
|
||||
// (not raised) pet data
|
||||
public string Pu { get; set; } = "";
|
||||
// avatar data
|
||||
public string A { get; set; } = "";
|
||||
// UDT points
|
||||
public string Udt { get; set; } = "";
|
||||
// XP rank (points and level)
|
||||
public string Ra { get; set; } = "";
|
||||
// country info (for flag?)
|
||||
public string Cu { get; set; } = "-1";
|
||||
// membership status
|
||||
public string M { get; set; } = "False";
|
||||
// location (level)
|
||||
public string L { get; set; } = "";
|
||||
// client token
|
||||
public string UNToken { get; set; } = "";
|
||||
// raised pet geometry - set from Fp
|
||||
public PetGeometryType GeometryType { get; set; } = PetGeometryType.Default;
|
||||
// raised pet age - set from Fp
|
||||
public PetAge PetAge { get; set; } = PetAge.Adult;
|
||||
// raised pet mounted - set from Fp
|
||||
public bool PetMounted { get; set; } = false;
|
||||
// raised pet data
|
||||
public string Fp {
|
||||
get {
|
||||
return fp;
|
||||
public string M { get; set; } = "True";
|
||||
|
||||
public NetworkArray GetNetworkData(int clientID, out NetworkArray paramArr) {
|
||||
NetworkArray arr = new();
|
||||
arr.Add(clientID);
|
||||
arr.Add(Uid);
|
||||
arr.Add((short)1);
|
||||
arr.Add((short)clientID);
|
||||
|
||||
paramArr = new();
|
||||
paramArr.Add(NetworkArray.Param("NT", (double)(Runtime.CurrentRuntime))); // network time
|
||||
paramArr.Add(NetworkArray.Param("t", (int)(Runtime.CurrentRuntime / 1000))); // timestamp
|
||||
|
||||
paramArr.Add(NetworkArray.Param("UID", Uid));
|
||||
paramArr.Add(NetworkArray.Param("A", A));
|
||||
paramArr.Add(NetworkArray.Param("PU", Pu));
|
||||
paramArr.Add(NetworkArray.Param("FP", Fp));
|
||||
|
||||
if (IsValid) {
|
||||
paramArr.Add(NetworkArray.Param("R", R));
|
||||
paramArr.Add(NetworkArray.Param("R1", R1));
|
||||
paramArr.Add(NetworkArray.Param("R2", R2));
|
||||
paramArr.Add(NetworkArray.Param("R3", R3));
|
||||
paramArr.Add(NetworkArray.Param("P1", P1));
|
||||
paramArr.Add(NetworkArray.Param("P2", P2));
|
||||
paramArr.Add(NetworkArray.Param("P3", P3));
|
||||
paramArr.Add(NetworkArray.Param("MX", Mx));
|
||||
paramArr.Add(NetworkArray.Param("F", F));
|
||||
paramArr.Add(NetworkArray.Param("MBF", Mbf));
|
||||
paramArr.Add(NetworkArray.Param("L", L));
|
||||
|
||||
paramArr.Add(NetworkArray.Param("J", J));
|
||||
paramArr.Add(NetworkArray.Param("BU", Bu));
|
||||
paramArr.Add(NetworkArray.Param("UDT", Udt));
|
||||
paramArr.Add(NetworkArray.Param("RA", Ra));
|
||||
paramArr.Add(NetworkArray.Param("CU", Cu));
|
||||
paramArr.Add(NetworkArray.Param("M", M));
|
||||
}
|
||||
set {
|
||||
|
||||
arr.Add(paramArr);
|
||||
return arr;
|
||||
}
|
||||
|
||||
private string FixMountState(string value) {
|
||||
// raised pet geometry - set from Fp
|
||||
PetGeometryType GeometryType = PetGeometryType.Default;
|
||||
// raised pet age - set from Fp
|
||||
PetAge PetAge = PetAge.Adult;
|
||||
// raised pet mounted - set from Fp
|
||||
bool PetMounted = false;
|
||||
|
||||
string[] array = value.Split('*');
|
||||
Dictionary<string, string> keyValPairs = new();
|
||||
foreach (string str in array) {
|
||||
@ -66,8 +116,6 @@ public class PlayerData {
|
||||
if (keyValPair.Length == 2)
|
||||
keyValPairs[keyValPair[0]] = keyValPair[1];
|
||||
}
|
||||
GeometryType = PetGeometryType.Default;
|
||||
PetAge = PetAge.Adult;
|
||||
if (keyValPairs.TryGetValue("G", out string geometry))
|
||||
if (geometry.ToLower().Contains("terribleterror"))
|
||||
GeometryType = PetGeometryType.Terror;
|
||||
@ -88,49 +136,11 @@ public class PlayerData {
|
||||
(GeometryType == PetGeometryType.Default && PetAge < PetAge.Teen
|
||||
|| GeometryType == PetGeometryType.Terror && PetAge < PetAge.Titan)
|
||||
) {
|
||||
fp = Regex.Replace(value, "^U\\$[01]\\*", "U$-1*");
|
||||
return Regex.Replace(value, "^U\\$[01]\\*", "U$-1*");
|
||||
} else {
|
||||
fp = value;
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
private string fp = "";
|
||||
|
||||
public NetworkArray GetNetworkData(int clientID, out NetworkArray paramArr) {
|
||||
NetworkArray arr = new();
|
||||
arr.Add(clientID);
|
||||
arr.Add(Uid);
|
||||
arr.Add((short)1);
|
||||
arr.Add((short)clientID);
|
||||
|
||||
paramArr = new();
|
||||
paramArr.Add(NetworkArray.Param("R1", R1));
|
||||
paramArr.Add(NetworkArray.Param("FP", Fp));
|
||||
paramArr.Add(NetworkArray.Param("MX", Mx));
|
||||
paramArr.Add(NetworkArray.Param("UDT", Udt));
|
||||
paramArr.Add(NetworkArray.Param("P2", P2));
|
||||
paramArr.Add(NetworkArray.Param("NT", (double)(Runtime.CurrentRuntime))); // network time
|
||||
paramArr.Add(NetworkArray.Param("t", (int)(Runtime.CurrentRuntime / 1000))); // timestamp
|
||||
paramArr.Add(NetworkArray.Param("J", J));
|
||||
paramArr.Add(NetworkArray.Param("F", F));
|
||||
paramArr.Add(NetworkArray.Param("MBF", Mbf));
|
||||
paramArr.Add(NetworkArray.Param("R2", R2));
|
||||
paramArr.Add(NetworkArray.Param("R", R));
|
||||
paramArr.Add(NetworkArray.Param("BU", Bu));
|
||||
paramArr.Add(NetworkArray.Param("P1", P1));
|
||||
paramArr.Add(NetworkArray.Param("UID", Uid));
|
||||
paramArr.Add(NetworkArray.Param("R3", R3));
|
||||
paramArr.Add(NetworkArray.Param("PU", Pu));
|
||||
paramArr.Add(NetworkArray.Param("A", A));
|
||||
paramArr.Add(NetworkArray.Param("RA", Ra));
|
||||
paramArr.Add(NetworkArray.Param("P3", P3));
|
||||
paramArr.Add(NetworkArray.Param("CU", Cu));
|
||||
paramArr.Add(NetworkArray.Param("M", M));
|
||||
paramArr.Add(NetworkArray.Param("L", L));
|
||||
|
||||
arr.Add(paramArr);
|
||||
return arr;
|
||||
}
|
||||
}
|
||||
|
||||
public enum PetGeometryType {
|
||||
|
Loading…
x
Reference in New Issue
Block a user