GenericMessage handler and various fixes

This commit is contained in:
Spirtix 2023-09-05 19:02:38 +02:00
parent 68e0f7a723
commit 3b93594c8b
9 changed files with 57 additions and 36 deletions

View File

@ -0,0 +1,14 @@
using sodoffmmo.Attributes;
using sodoffmmo.Core;
using sodoffmmo.Data;
namespace sodoffmmo.CommandHandlers;
[CommandHandler(7)]
class GenericMessageHandler : ICommandHandler {
public void Handle(Client client, NetworkObject receivedObject) {
NetworkPacket packet = NetworkObject.WrapObject(0, 7, receivedObject).Serialize();
foreach (var roomClient in client.Room.Clients)
roomClient.Send(packet);
}
}

View File

@ -17,7 +17,7 @@ class JoinRoomHandler : ICommandHandler
if (!Room.Exists(roomName)) if (!Room.Exists(roomName))
Room.Add(roomName); Room.Add(roomName);
room = Room.Get(roomName); room = Room.Get(roomName);
Console.WriteLine($"Join Room: {roomName} RoomID: {room.Id} IID: {client.internalId}"); Console.WriteLine($"Join Room: {roomName} RoomID: {room.Id} IID: {client.ClientID}");
this.client = client; this.client = client;
RespondJoinRoom(); RespondJoinRoom();
@ -43,7 +43,7 @@ class JoinRoomHandler : ICommandHandler
NetworkArray userList = new(); NetworkArray userList = new();
foreach (Client player in room.Clients) { foreach (Client player in room.Clients) {
userList.Add(player.PlayerData.GetNetworkData()); userList.Add(player.PlayerData.GetNetworkData(player.ClientID));
} }
obj.Add("r", roomInfo); obj.Add("r", roomInfo);
@ -97,7 +97,7 @@ class JoinRoomHandler : ICommandHandler
NetworkObject cmd = new(); NetworkObject cmd = new();
NetworkObject obj = new(); NetworkObject obj = new();
cmd.Add("c", "SUV"); cmd.Add("c", "SUV");
obj.Add("MID", c.PlayerData.Id); obj.Add("MID", c.ClientID);
cmd.Add("p", obj); cmd.Add("p", obj);
client.Send(NetworkObject.WrapObject(1, 13, cmd).Serialize()); client.Send(NetworkObject.WrapObject(1, 13, cmd).Serialize());
} }

View File

@ -9,6 +9,7 @@ class LoginHandler : ICommandHandler
{ {
public void Handle(Client client, NetworkObject receivedObject) public void Handle(Client client, NetworkObject receivedObject)
{ {
client.PlayerData.UNToken = receivedObject.Get<string>("un");
NetworkArray rl = new(); NetworkArray rl = new();
NetworkArray r1 = new(); NetworkArray r1 = new();
@ -54,8 +55,8 @@ class LoginHandler : ICommandHandler
content.Add("rl", rl); content.Add("rl", rl);
content.Add("zn", "JumpStart"); content.Add("zn", "JumpStart");
content.Add("rs", (short)5); content.Add("rs", (short)5);
content.Add("un", "005fd387-c264-410f-acf3-dbe3a06aaffa"); content.Add("un", client.PlayerData.UNToken);
content.Add("id", 1143760); content.Add("id", client.ClientID);
content.Add("pi", (short)1); content.Add("pi", (short)1);
client.Send(NetworkObject.WrapObject(0, 1, content).Serialize()); client.Send(NetworkObject.WrapObject(0, 1, content).Serialize());

View File

@ -43,7 +43,7 @@ class SetPositionVariablesHandler : ICommandHandler {
vars.Add("MBF", client.PlayerData.Mbf); vars.Add("MBF", client.PlayerData.Mbf);
vars.Add("R", client.PlayerData.R); 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 }); 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 });
vars.Add("MID", client.PlayerData.Id); vars.Add("MID", client.ClientID);
container.Add(vars); container.Add(vars);
obj.Add("arr", container); obj.Add("arr", container);

View File

@ -45,8 +45,7 @@ class SetUserVariablesHandler : ICommandHandler {
client.PlayerData.J = suvData.Get<string>("J"); client.PlayerData.J = suvData.Get<string>("J");
client.PlayerData.Bu = suvData.Get<string>("BU"); client.PlayerData.Bu = suvData.Get<string>("BU");
client.PlayerData.Fp = suvData.Get<string>("FP"); client.PlayerData.Fp = suvData.Get<string>("FP");
client.PlayerData.Id = client.Room.NextPlayerId(); Console.WriteLine($"SUV {client.Room.Name} IID: {client.ClientID}");
Console.WriteLine($"SUV {client.Room.Name} IID: {client.internalId}");
client.Room.AddClient(client); client.Room.AddClient(client);
UpdatePlayersInRoom(); UpdatePlayersInRoom();
SendSUVToPlayerInRoom(); SendSUVToPlayerInRoom();
@ -61,7 +60,7 @@ class SetUserVariablesHandler : ICommandHandler {
} }
NetworkObject data = new(); NetworkObject data = new();
NetworkObject data2 = new(); NetworkObject data2 = new();
data.Add("u", client.PlayerData.Id); data.Add("u", client.ClientID);
NetworkArray vl = new(); NetworkArray vl = new();
if (FP != null) { if (FP != null) {
@ -83,11 +82,9 @@ class SetUserVariablesHandler : ICommandHandler {
NetworkPacket packet = NetworkObject.WrapObject(0, 12, data).Serialize(); NetworkPacket packet = NetworkObject.WrapObject(0, 12, data).Serialize();
lock (client.Room.roomLock) { lock (client.Room.roomLock) {
foreach (var roomClient in client.Room.Clients) { foreach (var roomClient in client.Room.Clients)
if (roomClient != client)
roomClient.Send(packet); roomClient.Send(packet);
} }
}
NetworkObject cmd = new(); NetworkObject cmd = new();
cmd.Add("c", "SUV"); cmd.Add("c", "SUV");
@ -96,7 +93,7 @@ class SetUserVariablesHandler : ICommandHandler {
NetworkArray arr = new(); NetworkArray arr = new();
data2.Add("RID", "1"); data2.Add("RID", "1");
data2.Add("MID", client.PlayerData.Id); data2.Add("MID", client.ClientID);
arr.Add(data2); arr.Add(data2);
container.Add("arr", arr); container.Add("arr", arr);
cmd.Add("p", container); cmd.Add("p", container);
@ -109,13 +106,14 @@ class SetUserVariablesHandler : ICommandHandler {
private void UpdatePlayersInRoom() { private void UpdatePlayersInRoom() {
NetworkObject data = new(); NetworkObject data = new();
NetworkObject acknowledgement = new();
data.Add("r", client.Room.Id); data.Add("r", client.Room.Id);
NetworkArray user = new(); NetworkArray user = new();
user.Add(client.PlayerData.Id); user.Add(client.ClientID);
user.Add(client.PlayerData.Uid); user.Add(client.PlayerData.Uid);
user.Add((short)1); user.Add((short)1);
user.Add((short)client.PlayerData.Id); user.Add((short)client.ClientID);
NetworkArray playerData = new(); NetworkArray playerData = new();
playerData.Add(NetworkArray.DoubleParam("R1", client.PlayerData.R1)); playerData.Add(NetworkArray.DoubleParam("R1", client.PlayerData.R1));
@ -144,6 +142,14 @@ class SetUserVariablesHandler : ICommandHandler {
user.Add(playerData); user.Add(playerData);
data.Add("u", user); data.Add("u", user);
acknowledgement.Add("u", client.ClientID);
acknowledgement.Add("vl", playerData);
NetworkPacket ackPacket = NetworkObject.WrapObject(0, 12, acknowledgement).Serialize();
NetworkObject obj = ackPacket.GetObject();
ackPacket.Compress();
client.Send(ackPacket);
NetworkPacket packet = NetworkObject.WrapObject(0, 1000, data).Serialize(); NetworkPacket packet = NetworkObject.WrapObject(0, 1000, data).Serialize();
packet.Compress(); packet.Compress();
@ -158,7 +164,7 @@ class SetUserVariablesHandler : ICommandHandler {
NetworkObject obj = new(); NetworkObject obj = new();
cmd.Add("c", "SUV"); cmd.Add("c", "SUV");
obj.Add("MID", client.PlayerData.Id); 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();

View File

@ -5,10 +5,12 @@ using System.Net.Sockets;
namespace sodoffmmo.Core; namespace sodoffmmo.Core;
public class Client { public class Client {
static int id; static int id;
static object lck = new(); // For debugging purposes static object lck = new();
public int internalId; // ---
public int ClientID { get; private set; }
public PlayerData PlayerData { get; set; } = new(); public PlayerData PlayerData { get; set; } = new();
public Room Room { get; set; } public Room Room { get; set; }
public object ClientLock = new();
private readonly Socket socket; private readonly Socket socket;
private NetworkData? lastData; private NetworkData? lastData;
@ -18,7 +20,7 @@ public class Client {
public Client(Socket clientSocket) { public Client(Socket clientSocket) {
socket = clientSocket; socket = clientSocket;
lock (lck) { lock (lck) {
internalId = ++id; ClientID = ++id;
} }
} }
@ -50,11 +52,11 @@ public class Client {
public void LeaveRoom() { public void LeaveRoom() {
if (Room != null) { if (Room != null) {
Console.WriteLine($"Leave room {Room.Name} IID: {internalId}"); Console.WriteLine($"Leave room {Room.Name} IID: {ClientID}");
Room.RemoveClient(this); Room.RemoveClient(this);
NetworkObject data = new(); NetworkObject data = new();
data.Add("r", Room.Id); data.Add("r", Room.Id);
data.Add("u", PlayerData.Id); data.Add("u", ClientID);
NetworkPacket packet = NetworkObject.WrapObject(0, 1004, data).Serialize(); NetworkPacket packet = NetworkObject.WrapObject(0, 1004, data).Serialize();
foreach (var roomClient in Room.Clients) { foreach (var roomClient in Room.Clients) {

View File

@ -2,8 +2,6 @@
namespace sodoffmmo.Core; namespace sodoffmmo.Core;
public class Room { public class Room {
static int playerId = 0;
static int roomId = 0;
static Dictionary<string, Room> rooms = new(); static Dictionary<string, Room> rooms = new();
public object roomLock = new object(); public object roomLock = new object();
@ -35,13 +33,11 @@ public class Room {
} }
} }
public int NextPlayerId() => ++playerId;
public static Room Get(string name) => rooms[name]; public static Room Get(string name) => rooms[name];
public static bool Exists(string name) => rooms.ContainsKey(name); public static bool Exists(string name) => rooms.ContainsKey(name);
public static void Add(string name) { public static void Add(string name) {
rooms[name] = new Room(rooms.Count + 1, name); rooms[name] = new Room(rooms.Count + 3, name);
} }
} }

View File

@ -1,6 +1,7 @@
namespace sodoffmmo.Data; using sodoffmmo.Core;
namespace sodoffmmo.Data;
public class PlayerData { public class PlayerData {
public int Id { get; set; } = -1;
public double R { get; set; } public double R { get; set; }
public double R1 { get; set; } public double R1 { get; set; }
public double R2 { get; set; } public double R2 { get; set; }
@ -25,13 +26,14 @@ public class PlayerData {
public string Cu { get; set; } = "-1"; public string Cu { get; set; } = "-1";
public string M { get; set; } = "False"; public string M { get; set; } = "False";
public string L { get; set; } = ""; public string L { get; set; } = "";
public string UNToken { get; set; } = "";
public NetworkArray GetNetworkData() { public NetworkArray GetNetworkData(int clientID) {
NetworkArray arr = new(); NetworkArray arr = new();
arr.Add(Id); arr.Add(clientID);
arr.Add(Uid); arr.Add(Uid);
arr.Add((short)1); arr.Add((short)1);
arr.Add((short)Id); arr.Add((short)clientID);
NetworkArray paramArr = new(); NetworkArray paramArr = new();
paramArr.Add(NetworkArray.DoubleParam("R1", R1)); paramArr.Add(NetworkArray.DoubleParam("R1", R1));

View File

@ -53,7 +53,7 @@ public class Server {
try { try {
client.LeaveRoom(); client.LeaveRoom();
} catch (Exception) { } } catch (Exception) { }
Console.WriteLine("Socket disconnected IID: " + client.internalId); Console.WriteLine("Socket disconnected IID: " + client.ClientID);
} }
} }
@ -63,14 +63,14 @@ public class Server {
short commandId = obj.Get<short>("a"); short commandId = obj.Get<short>("a");
ICommandHandler handler; ICommandHandler handler;
if (commandId != 13) { if (commandId != 13) {
Console.WriteLine($"System command: {commandId} IID: {client.internalId}"); Console.WriteLine($"System command: {commandId} IID: {client.ClientID}");
handler = moduleManager.GetCommandHandler(commandId); handler = moduleManager.GetCommandHandler(commandId);
} else } else
handler = moduleManager.GetCommandHandler(obj.Get<NetworkObject>("p").Get<string>("c")); handler = moduleManager.GetCommandHandler(obj.Get<NetworkObject>("p").Get<string>("c"));
handler.Handle(client, obj.Get<NetworkObject>("p")); handler.Handle(client, obj.Get<NetworkObject>("p"));
} catch (Exception ex) { } catch (Exception ex) {
if (!ex.Message.Contains("ID 7")) // Missing command 7 flooding the log if (!ex.Message.Contains("ID 7")) // Missing command 7 flooding the log
Console.WriteLine($"Exception IID: {client.internalId} - {ex}"); Console.WriteLine($"Exception IID: {client.ClientID} - {ex}");
} }
} }
} }