forked from SoDOff-Project/sodoff-mmo
GenericMessage handler and various fixes
This commit is contained in:
parent
68e0f7a723
commit
3b93594c8b
14
src/CommandHandlers/GenericMessageHandler.cs
Normal file
14
src/CommandHandlers/GenericMessageHandler.cs
Normal 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);
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
|
@ -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,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();
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user