diff --git a/src/CommandHandlers/GenericMessageHandler.cs b/src/CommandHandlers/GenericMessageHandler.cs new file mode 100644 index 0000000..7257cde --- /dev/null +++ b/src/CommandHandlers/GenericMessageHandler.cs @@ -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); + } +} diff --git a/src/CommandHandlers/JoinRoomHandler.cs b/src/CommandHandlers/JoinRoomHandler.cs index 6a9bdcd..533b5f6 100644 --- a/src/CommandHandlers/JoinRoomHandler.cs +++ b/src/CommandHandlers/JoinRoomHandler.cs @@ -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()); } diff --git a/src/CommandHandlers/LoginHandler.cs b/src/CommandHandlers/LoginHandler.cs index 3927fe2..baba273 100644 --- a/src/CommandHandlers/LoginHandler.cs +++ b/src/CommandHandlers/LoginHandler.cs @@ -9,6 +9,7 @@ class LoginHandler : ICommandHandler { public void Handle(Client client, NetworkObject receivedObject) { + client.PlayerData.UNToken = receivedObject.Get("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()); diff --git a/src/CommandHandlers/SetPositionVariablesHandler.cs b/src/CommandHandlers/SetPositionVariablesHandler.cs index 17b3547..3f90672 100644 --- a/src/CommandHandlers/SetPositionVariablesHandler.cs +++ b/src/CommandHandlers/SetPositionVariablesHandler.cs @@ -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); diff --git a/src/CommandHandlers/SetUserVariablesHandler.cs b/src/CommandHandlers/SetUserVariablesHandler.cs index 39d1d9d..3a7036c 100644 --- a/src/CommandHandlers/SetUserVariablesHandler.cs +++ b/src/CommandHandlers/SetUserVariablesHandler.cs @@ -45,8 +45,7 @@ class SetUserVariablesHandler : ICommandHandler { client.PlayerData.J = suvData.Get("J"); client.PlayerData.Bu = suvData.Get("BU"); client.PlayerData.Fp = suvData.Get("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,20 +82,18 @@ 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(); cmd.Add("c", "SUV"); NetworkObject container = new(); - + 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(); diff --git a/src/Core/Client.cs b/src/Core/Client.cs index 9ebddb5..7018cf5 100644 --- a/src/Core/Client.cs +++ b/src/Core/Client.cs @@ -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) { diff --git a/src/Core/Room.cs b/src/Core/Room.cs index d0fcfa4..133bf3c 100644 --- a/src/Core/Room.cs +++ b/src/Core/Room.cs @@ -2,8 +2,6 @@ namespace sodoffmmo.Core; public class Room { - static int playerId = 0; - static int roomId = 0; static Dictionary 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); } } diff --git a/src/Data/PlayerData.cs b/src/Data/PlayerData.cs index a7a0dda..80f62e0 100644 --- a/src/Data/PlayerData.cs +++ b/src/Data/PlayerData.cs @@ -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)); diff --git a/src/Server.cs b/src/Server.cs index eefc6c9..22834f8 100644 --- a/src/Server.cs +++ b/src/Server.cs @@ -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("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("p").Get("c")); handler.Handle(client, obj.Get("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}"); } } }