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))
Room.Add(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;
RespondJoinRoom();
@ -43,7 +43,7 @@ class JoinRoomHandler : ICommandHandler
NetworkArray userList = new();
foreach (Client player in room.Clients) {
userList.Add(player.PlayerData.GetNetworkData());
userList.Add(player.PlayerData.GetNetworkData(player.ClientID));
}
obj.Add("r", roomInfo);
@ -97,7 +97,7 @@ class JoinRoomHandler : ICommandHandler
NetworkObject cmd = new();
NetworkObject obj = new();
cmd.Add("c", "SUV");
obj.Add("MID", c.PlayerData.Id);
obj.Add("MID", c.ClientID);
cmd.Add("p", obj);
client.Send(NetworkObject.WrapObject(1, 13, cmd).Serialize());
}

View File

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

View File

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

View File

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

View File

@ -2,8 +2,6 @@
namespace sodoffmmo.Core;
public class Room {
static int playerId = 0;
static int roomId = 0;
static Dictionary<string, Room> rooms = new();
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 bool Exists(string name) => rooms.ContainsKey(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 int Id { get; set; } = -1;
public double R { get; set; }
public double R1 { get; set; }
public double R2 { get; set; }
@ -25,13 +26,14 @@ public class PlayerData {
public string Cu { get; set; } = "-1";
public string M { get; set; } = "False";
public string L { get; set; } = "";
public string UNToken { get; set; } = "";
public NetworkArray GetNetworkData() {
public NetworkArray GetNetworkData(int clientID) {
NetworkArray arr = new();
arr.Add(Id);
arr.Add(clientID);
arr.Add(Uid);
arr.Add((short)1);
arr.Add((short)Id);
arr.Add((short)clientID);
NetworkArray paramArr = new();
paramArr.Add(NetworkArray.DoubleParam("R1", R1));

View File

@ -53,7 +53,7 @@ public class Server {
try {
client.LeaveRoom();
} 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");
ICommandHandler handler;
if (commandId != 13) {
Console.WriteLine($"System command: {commandId} IID: {client.internalId}");
Console.WriteLine($"System command: {commandId} IID: {client.ClientID}");
handler = moduleManager.GetCommandHandler(commandId);
} else
handler = moduleManager.GetCommandHandler(obj.Get<NetworkObject>("p").Get<string>("c"));
handler.Handle(client, obj.Get<NetworkObject>("p"));
} catch (Exception ex) {
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}");
}
}
}