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))
|
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());
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user