From 30f7a281b073d81e8dd7e556ada6b70628431267 Mon Sep 17 00:00:00 2001 From: Sardelka Date: Tue, 21 Jun 2022 18:13:30 +0800 Subject: [PATCH] Resource system --- RageCoop.Client/Networking/Receive.cs | 51 +++++---- RageCoop.Client/Networking/Send.cs | 4 +- RageCoop.Client/Scripting/API.cs | 48 +++++++- RageCoop.Client/Sync/Entities/SyncedPed.cs | 2 - .../Sync/Entities/SyncedVehicle.cs | 2 +- RageCoop.Client/Util/VehicleExtensions.cs | 9 -- RageCoop.Core/CoreUtils.cs | 11 +- RageCoop.Core/Packets/PedPackets.cs | 8 +- RageCoop.Core/Packets/VehiclePackets.cs | 8 +- RageCoop.Core/RageCoop.Core.csproj | 1 + RageCoop.Server/Client.cs | 21 +++- RageCoop.Server/Program.cs | 3 +- RageCoop.Server/Scripting/API.cs | 107 ++++++++++++------ .../Scripting/EventArgs/EventArgs.cs | 16 +++ RageCoop.Server/Scripting/Resources.cs | 4 +- RageCoop.Server/Server.cs | 77 +++++++------ RageCoop.Server/Util.cs | 2 +- 17 files changed, 245 insertions(+), 129 deletions(-) diff --git a/RageCoop.Client/Networking/Receive.cs b/RageCoop.Client/Networking/Receive.cs index a9f77fd..0c81ade 100644 --- a/RageCoop.Client/Networking/Receive.cs +++ b/RageCoop.Client/Networking/Receive.cs @@ -206,6 +206,13 @@ namespace RageCoop.Client } break; + case PacketTypes.CustomEvent: + { + Packets.CustomEvent packet = new Packets.CustomEvent(); + packet.Unpack(data); + Scripting.API.Events.InvokeCustomEventReceived(packet.Hash, packet.Args); + } + break; case PacketTypes.FileTransferChunk: { Packets.FileTransferChunk packet = new Packets.FileTransferChunk(); @@ -234,12 +241,6 @@ namespace RageCoop.Client } break; - case PacketTypes.CustomEvent: - { - Packets.CustomEvent packet = new Packets.CustomEvent(); - packet.Unpack(data); - } - break; default: if (packetType.IsSyncEvent()) { @@ -293,17 +294,17 @@ namespace RageCoop.Client c.Velocity = packet.Velocity; c.Speed = packet.Speed; c.CurrentWeaponHash = packet.CurrentWeaponHash; - c.IsAiming = flags.HasFlag(PedDataFlags.IsAiming); - c.IsReloading = flags.HasFlag(PedDataFlags.IsReloading); - c.IsJumping = flags.HasFlag(PedDataFlags.IsJumping); - c.IsRagdoll = flags.HasFlag(PedDataFlags.IsRagdoll); - c.IsOnFire = flags.HasFlag(PedDataFlags.IsOnFire); - c.IsInParachuteFreeFall = flags.HasFlag(PedDataFlags.IsInParachuteFreeFall); - c.IsParachuteOpen = flags.HasFlag(PedDataFlags.IsParachuteOpen); - c.IsOnLadder = flags.HasFlag(PedDataFlags.IsOnLadder); - c.IsVaulting = flags.HasFlag(PedDataFlags.IsVaulting); - c.IsInCover = flags.HasFlag(PedDataFlags.IsInCover); - c.IsInStealthMode = flags.HasFlag(PedDataFlags.IsInStealthMode); + c.IsAiming = flags.HasPedFlag(PedDataFlags.IsAiming); + c.IsReloading = flags.HasPedFlag(PedDataFlags.IsReloading); + c.IsJumping = flags.HasPedFlag(PedDataFlags.IsJumping); + c.IsRagdoll = flags.HasPedFlag(PedDataFlags.IsRagdoll); + c.IsOnFire = flags.HasPedFlag(PedDataFlags.IsOnFire); + c.IsInParachuteFreeFall = flags.HasPedFlag(PedDataFlags.IsInParachuteFreeFall); + c.IsParachuteOpen = flags.HasPedFlag(PedDataFlags.IsParachuteOpen); + c.IsOnLadder = flags.HasPedFlag(PedDataFlags.IsOnLadder); + c.IsVaulting = flags.HasPedFlag(PedDataFlags.IsVaulting); + c.IsInCover = flags.HasPedFlag(PedDataFlags.IsInCover); + c.IsInStealthMode = flags.HasPedFlag(PedDataFlags.IsInStealthMode); c.Heading=packet.Heading; c.LastSynced = Main.Ticked; if (c.IsAiming) @@ -360,14 +361,14 @@ namespace RageCoop.Client v.Colors=packet.Colors; v.LandingGear=packet.LandingGear; v.RoofState=(VehicleRoofState)packet.RoofState; - v.EngineRunning = packet.Flag.HasFlag(VehicleDataFlags.IsEngineRunning); - v.LightsOn = packet.Flag.HasFlag(VehicleDataFlags.AreLightsOn); - v.BrakeLightsOn = packet.Flag.HasFlag(VehicleDataFlags.AreBrakeLightsOn); - v.HighBeamsOn = packet.Flag.HasFlag(VehicleDataFlags.AreHighBeamsOn); - v.SireneActive = packet.Flag.HasFlag(VehicleDataFlags.IsSirenActive); - v.IsDead = packet.Flag.HasFlag(VehicleDataFlags.IsDead); - v.HornActive = packet.Flag.HasFlag(VehicleDataFlags.IsHornActive); - v.Transformed = packet.Flag.HasFlag(VehicleDataFlags.IsTransformed); + v.EngineRunning = packet.Flag.HasVehFlag(VehicleDataFlags.IsEngineRunning); + v.LightsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreLightsOn); + v.BrakeLightsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreBrakeLightsOn); + v.HighBeamsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreHighBeamsOn); + v.SireneActive = packet.Flag.HasVehFlag(VehicleDataFlags.IsSirenActive); + v.IsDead = packet.Flag.HasVehFlag(VehicleDataFlags.IsDead); + v.HornActive = packet.Flag.HasVehFlag(VehicleDataFlags.IsHornActive); + v.Transformed = packet.Flag.HasVehFlag(VehicleDataFlags.IsTransformed); v.Passengers=new Dictionary(); v.LockStatus=packet.LockStatus; v.RadioStation=packet.RadioStation; diff --git a/RageCoop.Client/Networking/Send.cs b/RageCoop.Client/Networking/Send.cs index 7e93993..ae4feab 100644 --- a/RageCoop.Client/Networking/Send.cs +++ b/RageCoop.Client/Networking/Send.cs @@ -44,11 +44,11 @@ namespace RageCoop.Client Flag = p.GetPedFlags(), Heading=p.Heading, }; - if (packet.Flag.HasFlag(PedDataFlags.IsAiming)) + if (packet.Flag.HasPedFlag(PedDataFlags.IsAiming)) { packet.AimCoords = p.GetAimCoord(); } - if (packet.Flag.HasFlag(PedDataFlags.IsRagdoll)) + if (packet.Flag.HasPedFlag(PedDataFlags.IsRagdoll)) { packet.RotationVelocity=p.RotationVelocity; } diff --git a/RageCoop.Client/Scripting/API.cs b/RageCoop.Client/Scripting/API.cs index 38a3ac0..3dd7275 100644 --- a/RageCoop.Client/Scripting/API.cs +++ b/RageCoop.Client/Scripting/API.cs @@ -41,11 +41,10 @@ namespace RageCoop.Client.Scripting /// public static class Events { - /// - /// Empty delegate - /// + #region DELEGATES public delegate void EmptyEvent(); - + public delegate void CustomEvent(int hash, List args); + #endregion /// /// The local player is dead /// @@ -75,15 +74,38 @@ namespace RageCoop.Client.Scripting /// This is equivalent of . /// public static event EmptyEvent OnTick; + + /// + /// This will be invoked when a CustomEvent is received from the server. + /// + public static event CustomEvent OnCustomEventReceived; + #region INVOKE - internal static void InvokeVehicleSpawned(SyncedVehicle v) { OnVehicleSpawned?.Invoke(null,v); } + internal static void InvokeVehicleSpawned(SyncedVehicle v) { OnVehicleSpawned?.Invoke(null, v); } internal static void InvokeVehicleDeleted(SyncedVehicle v) { OnVehicleDeleted?.Invoke(null, v); } internal static void InvokePedSpawned(SyncedPed p) { OnPedSpawned?.Invoke(null, p); } internal static void InvokePedDeleted(SyncedPed p) { OnPedDeleted?.Invoke(null, p); } internal static void InvokePlayerDied() { OnPlayerDied?.Invoke(); } internal static void InvokeTick() { OnTick?.Invoke(); } + + internal static void InvokeCustomEventReceived(int hash, List args) + { + OnCustomEventReceived?.Invoke(hash, args); + } #endregion + internal static void ClearHandlers() + { + OnPlayerDied=null; + OnTick=null; + OnPedDeleted=null; + OnPedSpawned=null; + OnVehicleDeleted=null; + OnVehicleSpawned=null; + OnCustomEventReceived=null; + } } + + #region FUNCTIONS /// /// Send a local chat message to this player /// @@ -166,6 +188,22 @@ namespace RageCoop.Client.Scripting { get { return Main.CurrentVersion; } } + /// + /// Send an event and data to the specified clients. + /// + /// An unique identifier of the event + /// The objects conataing your data, supported types: + /// byte, short, ushort, int, uint, long, ulong, float, bool, string. + public static void SendCustomEvent(int eventHash, List args) + { + var p = new Packets.CustomEvent() + { + Args=args, + Hash=eventHash + }; + Networking.Send(p, ConnectionChannel.Event, Lidgren.Network.NetDeliveryMethod.ReliableOrdered); + } + #endregion } } diff --git a/RageCoop.Client/Sync/Entities/SyncedPed.cs b/RageCoop.Client/Sync/Entities/SyncedPed.cs index 3df1534..90ab746 100644 --- a/RageCoop.Client/Sync/Entities/SyncedPed.cs +++ b/RageCoop.Client/Sync/Entities/SyncedPed.cs @@ -468,8 +468,6 @@ namespace RageCoop.Client } _lastIsJumping = false; - Function.Call(Hash.SET_PED_STEALTH_MOVEMENT, MainPed, IsInStealthMode, 0); - if (IsRagdoll || Health==0) { if (!MainPed.IsRagdoll) diff --git a/RageCoop.Client/Sync/Entities/SyncedVehicle.cs b/RageCoop.Client/Sync/Entities/SyncedVehicle.cs index 051b625..489a1a9 100644 --- a/RageCoop.Client/Sync/Entities/SyncedVehicle.cs +++ b/RageCoop.Client/Sync/Entities/SyncedVehicle.cs @@ -316,7 +316,7 @@ namespace RageCoop.Client } MainVehicle.LockStatus=LockStatus; - if (Flags.HasFlag(VehicleDataFlags.IsDeluxoHovering)) + if (Flags.HasVehFlag(VehicleDataFlags.IsDeluxoHovering)) { if (!MainVehicle.IsDeluxoHovering()) { diff --git a/RageCoop.Client/Util/VehicleExtensions.cs b/RageCoop.Client/Util/VehicleExtensions.cs index 4b9429d..7b10915 100644 --- a/RageCoop.Client/Util/VehicleExtensions.cs +++ b/RageCoop.Client/Util/VehicleExtensions.cs @@ -80,15 +80,6 @@ namespace RageCoop.Client return flags; } - public static bool HasFlag(this PedDataFlags flagToCheck, PedDataFlags flag) - { - return (flagToCheck & flag)!=0; - } - - public static bool HasFlag(this VehicleDataFlags flagToCheck, VehicleDataFlags flag) - { - return (flagToCheck & flag)!=0; - } public static Dictionary GetWeaponComponents(this Weapon weapon) diff --git a/RageCoop.Core/CoreUtils.cs b/RageCoop.Core/CoreUtils.cs index c9bc69d..4e20574 100644 --- a/RageCoop.Core/CoreUtils.cs +++ b/RageCoop.Core/CoreUtils.cs @@ -105,7 +105,16 @@ namespace RageCoop.Core { return Encoding.UTF8.GetString(data); } - + + public static bool HasPedFlag(this PedDataFlags flagToCheck, PedDataFlags flag) + { + return (flagToCheck & flag)!=0; + } + + public static bool HasVehFlag(this VehicleDataFlags flagToCheck, VehicleDataFlags flag) + { + return (flagToCheck & flag)!=0; + } } } diff --git a/RageCoop.Core/Packets/PedPackets.cs b/RageCoop.Core/Packets/PedPackets.cs index d7a551f..4a5659a 100644 --- a/RageCoop.Core/Packets/PedPackets.cs +++ b/RageCoop.Core/Packets/PedPackets.cs @@ -152,7 +152,7 @@ namespace RageCoop.Core // Write ped velocity byteArray.AddVector3(Velocity); - if (Flag.HasFlag(PedDataFlags.IsRagdoll)) + if (Flag.HasPedFlag(PedDataFlags.IsRagdoll)) { byteArray.AddVector3(RotationVelocity); } @@ -163,7 +163,7 @@ namespace RageCoop.Core // Write ped weapon hash byteArray.AddRange(BitConverter.GetBytes(CurrentWeaponHash)); - if (Flag.HasFlag(PedDataFlags.IsAiming)) + if (Flag.HasPedFlag(PedDataFlags.IsAiming)) { // Write ped aim coords byteArray.AddVector3(AimCoords); @@ -202,7 +202,7 @@ namespace RageCoop.Core Velocity = reader.ReadVector3(); // Read rotation velocity if in ragdoll - if (Flag.HasFlag(PedDataFlags.IsRagdoll)) + if (Flag.HasPedFlag(PedDataFlags.IsRagdoll)) { RotationVelocity=reader.ReadVector3(); } @@ -214,7 +214,7 @@ namespace RageCoop.Core CurrentWeaponHash = reader.ReadUInt(); // Try to read aim coords - if (Flag.HasFlag(PedDataFlags.IsAiming)) + if (Flag.HasPedFlag(PedDataFlags.IsAiming)) { // Read player aim coords AimCoords = reader.ReadVector3(); diff --git a/RageCoop.Core/Packets/VehiclePackets.cs b/RageCoop.Core/Packets/VehiclePackets.cs index 9fa646d..f296ab4 100644 --- a/RageCoop.Core/Packets/VehiclePackets.cs +++ b/RageCoop.Core/Packets/VehiclePackets.cs @@ -66,12 +66,12 @@ namespace RageCoop.Core byteArray.AddRange(BitConverter.GetBytes(EngineHealth)); // Check - if (Flag.HasFlag(VehicleDataFlags.IsAircraft)) + if (Flag.HasVehFlag(VehicleDataFlags.IsAircraft)) { // Write the vehicle landing gear byteArray.Add(LandingGear); } - if (Flag.HasFlag(VehicleDataFlags.HasRoof)) + if (Flag.HasVehFlag(VehicleDataFlags.HasRoof)) { byteArray.Add(RoofState); } @@ -166,12 +166,12 @@ namespace RageCoop.Core // Check - if (Flag.HasFlag(VehicleDataFlags.IsAircraft)) + if (Flag.HasVehFlag(VehicleDataFlags.IsAircraft)) { // Read vehicle landing gear LandingGear = reader.ReadByte(); } - if (Flag.HasFlag(VehicleDataFlags.HasRoof)) + if (Flag.HasVehFlag(VehicleDataFlags.HasRoof)) { RoofState=reader.ReadByte(); } diff --git a/RageCoop.Core/RageCoop.Core.csproj b/RageCoop.Core/RageCoop.Core.csproj index f485cc4..59c8ee1 100644 --- a/RageCoop.Core/RageCoop.Core.csproj +++ b/RageCoop.Core/RageCoop.Core.csproj @@ -7,6 +7,7 @@ 0.1 0.1 embedded + True diff --git a/RageCoop.Server/Client.cs b/RageCoop.Server/Client.cs index 28a1edb..681ad56 100644 --- a/RageCoop.Server/Client.cs +++ b/RageCoop.Server/Client.cs @@ -7,15 +7,28 @@ using RageCoop.Core.Scripting; namespace RageCoop.Server { + public class Player + { + /// + /// The ID of player's last vehicle. + /// + public int VehicleID { get; internal set; } + public Vector3 Position { get; internal set; } + + public int Health { get; internal set; } + } public class Client { - public long NetID = 0; - internal NetConnection Connection { get; set; } - public PlayerData Player; + internal long NetID = 0; + public NetConnection Connection { get;internal set; } + public Player Player { get; internal set; } + public float Latency { get; internal set; } + public int ID { get; internal set; } private readonly Dictionary _customData = new(); private long _callbacksCount = 0; public readonly Dictionary> Callbacks = new(); public bool IsReady { get; internal set; }=false; + public string Username { get;internal set; } = "N/A"; #region CUSTOMDATA FUNCTIONS public void SetData(string name, T data) { @@ -190,7 +203,7 @@ namespace RageCoop.Server { if (!IsReady) { - Program.Logger.Warning($"Player \"{Player.Username}\" is not ready!"); + Program.Logger.Warning($"Player \"{Username}\" is not ready!"); return; } diff --git a/RageCoop.Server/Program.cs b/RageCoop.Server/Program.cs index 38925fb..e7d62a8 100644 --- a/RageCoop.Server/Program.cs +++ b/RageCoop.Server/Program.cs @@ -46,7 +46,8 @@ namespace RageCoop.Server } catch (Exception e) { - Logger.Error($"Fatal error occurred, server shutting down:{e}"); + Logger.Error(e); + Logger.Error($"Fatal error occurred, server shutting down."); } } diff --git a/RageCoop.Server/Scripting/API.cs b/RageCoop.Server/Scripting/API.cs index 3757ce2..c2ee433 100644 --- a/RageCoop.Server/Scripting/API.cs +++ b/RageCoop.Server/Scripting/API.cs @@ -12,10 +12,7 @@ namespace RageCoop.Server.Scripting public static class API { #region INTERNAL - internal static void InvokeCustomEvent(int hash,List args) - { - - } + internal static Dictionary>>> CustomEventHandlers = new(); #endregion public static class Events { @@ -29,30 +26,26 @@ namespace RageCoop.Server.Scripting public static event EventHandler OnPlayerHandshake; public static event PlayerConnect OnPlayerConnected; public static event PlayerDisconnect OnPlayerDisconnected; - public static void ClearHandlers() + public static event EventHandler OnCommandReceived; + + /// + /// This will be invoked when a CustomEvent is received from one client. + /// + public static event EventHandler OnCustomEventReceived; + internal static void ClearHandlers() { - foreach (Delegate d in OnChatMessage.GetInvocationList()) - { - OnChatMessage -= (EventHandler)d; - } - foreach (Delegate d in OnPlayerHandshake.GetInvocationList()) - { - OnPlayerHandshake -= (EventHandler)d; - } - foreach (Delegate d in OnPlayerConnected.GetInvocationList()) - { - OnPlayerConnected -= (PlayerConnect)d; - } - foreach (Delegate d in OnPlayerDisconnected.GetInvocationList()) - { - OnPlayerDisconnected -= (PlayerDisconnect)d; - } + OnChatMessage=null; + OnPlayerHandshake=null; + OnPlayerConnected=null; + OnPlayerDisconnected=null; + OnCustomEventReceived=null; + OnCommandReceived=null; } #region INVOKE - internal static void InvokeOnChatMessage(Packets.ChatMessage p,NetConnection con) + internal static void InvokeOnChatMessage(Packets.ChatMessage p,Client sender) { OnChatMessage?.Invoke(null,new ChatEventArgs() { - Sender=Util.GetClientByNetID(con.RemoteUniqueIdentifier), + Sender=sender, Message=p.Message }); } @@ -62,6 +55,22 @@ namespace RageCoop.Server.Scripting { OnPlayerDisconnected?.Invoke(client); } internal static void InvokePlayerHandshake(HandshakeEventArgs args) { OnPlayerHandshake?.Invoke(null, args); } + + internal static void InvokeCustomEventReceived(Packets.CustomEvent p,Client sender) + { + OnCustomEventReceived?.Invoke(null, new CustomEventReceivedArgs() { Hash=p.Hash, Args=p.Args,Sender=sender }); + } + internal static bool InvokeOnCommandReceived(string cname,string[] cargs,Client sender) + { + var args = new OnCommandEventArgs() + { + Name=cname, + Args=cargs, + Sender=sender + }; + OnCommandReceived?.Invoke(null,args); + return args.Cancel; + } #endregion } @@ -119,7 +128,7 @@ namespace RageCoop.Server.Scripting /// The Client from this user or null public static Client GetClientByUsername(string username) { - return Server.Clients.Values.FirstOrDefault(x => x.Player.Username.ToLower() == username.ToLower()); + return Server.Clients.Values.FirstOrDefault(x => x.Username.ToLower() == username.ToLower()); } /// @@ -127,8 +136,7 @@ namespace RageCoop.Server.Scripting /// /// The chat message /// The username which send this message (default = "Server") - /// The list of connections (players) who received this chat message - public static void SendChatMessageToAll(string message, string username = "Server", List netHandleList = null) + public static void SendChatMessage(string message, List targets = null, string username = "Server") { try { @@ -136,12 +144,22 @@ namespace RageCoop.Server.Scripting { return; } - - List connections = netHandleList == null - ? Server.MainNetServer.Connections - : Server.MainNetServer.Connections.FindAll(c => netHandleList.Contains(c.RemoteUniqueIdentifier)); - - Server.SendChatMessage(username, message, connections); + targets ??= new(Server.Clients.Values); + foreach(Client client in targets) + { + Server.SendChatMessage(username, message, client.Connection); + } + } + catch (Exception e) + { + Program.Logger.Error($">> {e.Message} <<>> {e.Source ?? string.Empty} <<>> {e.StackTrace ?? string.Empty} <<"); + } + } + public static void SendChatMessage(string message, Client target, string username = "Server") + { + try + { + Server.SendChatMessage(username, message, target.Connection); } catch (Exception e) { @@ -198,8 +216,13 @@ namespace RageCoop.Server.Scripting Server.RegisterCommands(); } - - public static void TriggerCustomEvent(int eventHash,List args,List targets=null) + /// + /// Send an event and data to the specified clients. + /// + /// An unique identifier of the event + /// The objects conataing your data, supported types: byte, short, ushort, int, uint, long, ulong, float, bool, string. + /// The target clients to send. + public static void SendCustomEvent(int eventHash,List args,List targets=null) { targets ??= new(Server.Clients.Values); var p = new Packets.CustomEvent() @@ -212,6 +235,22 @@ namespace RageCoop.Server.Scripting Server.Send(p,c,ConnectionChannel.Event,NetDeliveryMethod.ReliableOrdered); } } + public static void RegisterCustomEventHandler(int hash,Action> handler) + { + List>> handlers; + lock (CustomEventHandlers) + { + if (!CustomEventHandlers.TryGetValue(hash,out handlers)) + { + CustomEventHandlers.Add(hash, handlers = new List>>()); + } + handlers.Add(handler); + } + } + public static Core.Logging.Logger GetLogger() + { + return Program.Logger; + } #endregion } } diff --git a/RageCoop.Server/Scripting/EventArgs/EventArgs.cs b/RageCoop.Server/Scripting/EventArgs/EventArgs.cs index 6a0b3c1..5209994 100644 --- a/RageCoop.Server/Scripting/EventArgs/EventArgs.cs +++ b/RageCoop.Server/Scripting/EventArgs/EventArgs.cs @@ -12,6 +12,22 @@ namespace RageCoop.Server.Scripting public Client Sender { get; set; } public string Message { get; set; } } + public class CustomEventReceivedArgs : EventArgs + { + public Client Sender { get; set; } + public int Hash { get; set; } + public List Args { get; set; } + } + public class OnCommandEventArgs : EventArgs + { + public Client Sender { get; set; } + public string Name { get; set; } + public string[] Args { get; set; } + /// + /// If this value was set to true, corresponding handler registered with will not be invoked. + /// + public bool Cancel { get; set; } = false; + } public class HandshakeEventArgs : EventArgs { public int ID { get; set; } diff --git a/RageCoop.Server/Scripting/Resources.cs b/RageCoop.Server/Scripting/Resources.cs index bb00876..5bf0ec2 100644 --- a/RageCoop.Server/Scripting/Resources.cs +++ b/RageCoop.Server/Scripting/Resources.cs @@ -92,9 +92,9 @@ namespace RageCoop.Server.Scripting { Task.Run(() => { - Logger.Info($"Sending resources to client:{client.Player.Username}"); + Logger.Info($"Sending resources to client:{client.Username}"); Server.SendFile(path, "Resources.zip", client); - Logger.Info($"Resources sent to:{client.Player.Username}"); + Logger.Info($"Resources sent to:{client.Username}"); }); } diff --git a/RageCoop.Server/Server.cs b/RageCoop.Server/Server.cs index f1f2848..796bd63 100644 --- a/RageCoop.Server/Server.cs +++ b/RageCoop.Server/Server.cs @@ -178,6 +178,7 @@ namespace RageCoop.Server Program.Logger.Dispose(); } + Client sender; private void ProcessMessage(NetIncomingMessage message) { if(message == null) { return; } @@ -230,16 +231,20 @@ namespace RageCoop.Server break; } case NetIncomingMessageType.Data: - { // Get packet type byte btype = message.ReadByte(); var type = (PacketTypes)btype; int len = message.ReadInt32(); byte[] data = message.ReadBytes(len); + try { - + // Get sender client + if (!Clients.TryGetValue(message.SenderConnection.RemoteUniqueIdentifier, out sender)) + { + throw new UnauthorizedAccessException("No client data found:"+message.SenderEndPoint); + } switch (type) { @@ -296,19 +301,19 @@ namespace RageCoop.Server case PacketTypes.ChatMessage: { - try - { - Packets.ChatMessage packet = new(); - packet.Unpack(data); + Packets.ChatMessage packet = new(); + packet.Unpack(data); - API.Events.InvokeOnChatMessage(packet, message.SenderConnection); - SendChatMessage(packet); - } - catch (Exception e) - { - DisconnectAndLog(message.SenderConnection, type, e); - } + API.Events.InvokeOnChatMessage(packet, sender); + SendChatMessage(packet,sender); + } + break; + case PacketTypes.CustomEvent: + { + Packets.CustomEvent packet = new Packets.CustomEvent(); + packet.Unpack(data); + API.Events.InvokeCustomEventReceived(packet, sender); } break; @@ -384,7 +389,7 @@ namespace RageCoop.Server Client client = Util.GetClientByNetID(message.SenderConnection.RemoteUniqueIdentifier); if (client != null) { - client.Player.Latency = message.ReadFloat(); + client.Latency = message.ReadFloat(); } } break; @@ -415,9 +420,9 @@ namespace RageCoop.Server NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage(); new Packets.PlayerInfoUpdate() { - PedID=c.Player.PedID, - Username=c.Player.Username, - Latency=c.Player.Latency, + PedID=c.ID, + Username=c.Username, + Latency=c.Latency, }.Pack(outgoingMessage); MainNetServer.SendMessage(outgoingMessage, x, NetDeliveryMethod.ReliableSequenced, (byte)ConnectionChannel.Default); }); @@ -454,7 +459,7 @@ namespace RageCoop.Server connection.Deny("Username contains special chars!"); return; } - if (Clients.Values.Any(x => x.Player.Username.ToLower() == packet.Username.ToLower())) + if (Clients.Values.Any(x => x.Username.ToLower() == packet.Username.ToLower())) { connection.Deny("Username is already taken!"); return; @@ -485,10 +490,9 @@ namespace RageCoop.Server { NetID = connection.RemoteUniqueIdentifier, Connection=connection, + Username=packet.Username, Player = new() { - Username = packet.Username, - PedID=packet.PedID, } } );; @@ -535,8 +539,8 @@ namespace RageCoop.Server new Packets.PlayerConnect() { // NetHandle = targetNetHandle, - Username = targetClient.Player.Username, - PedID=targetClient.Player.PedID, + Username = targetClient.Username, + PedID=targetClient.ID, }.Pack(outgoingMessage); MainNetServer.SendMessage(outgoingMessage, local, NetDeliveryMethod.ReliableOrdered, 0); @@ -547,8 +551,8 @@ namespace RageCoop.Server NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage(); new Packets.PlayerConnect() { - PedID=localClient.Player.PedID, - Username = localClient.Player.Username + PedID=localClient.ID, + Username = localClient.Username }.Pack(outgoingMessage); if(clients.Count > 0) { @@ -557,11 +561,11 @@ namespace RageCoop.Server } API.Events.InvokePlayerConnected(localClient); - Program.Logger.Info($"Player {localClient.Player.Username} connected!"); + Program.Logger.Info($"Player {localClient.Username} connected!"); if (!string.IsNullOrEmpty(MainSettings.WelcomeMessage)) { - SendChatMessage(new Packets.ChatMessage() { Username = "Server", Message = MainSettings.WelcomeMessage }, new List() { local }); + SendChatMessage(new Packets.ChatMessage() { Username = "Server", Message = MainSettings.WelcomeMessage }, null,new List() { local }); } } @@ -569,7 +573,7 @@ namespace RageCoop.Server private static void SendPlayerDisconnectPacket(long nethandle) { List clients = MainNetServer.Connections.FindAll(x => x.RemoteUniqueIdentifier != nethandle); - int playerPedID = Clients[nethandle].Player.PedID; + int playerPedID = Clients[nethandle].ID; if (clients.Count > 0) { NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage(); @@ -590,7 +594,7 @@ namespace RageCoop.Server Clients.Remove(localClient.NetID); API.Events.InvokePlayerDisconnected(localClient); - Program.Logger.Info($"Player {localClient.Player.Username} disconnected! ID:{playerPedID}"); + Program.Logger.Info($"Player {localClient.Username} disconnected! ID:{playerPedID}"); } @@ -624,7 +628,7 @@ namespace RageCoop.Server } // Save the new data - if (packet.Passengers.ContainsValue(client.Player.PedID)) + if (packet.Passengers.ContainsValue(client.ID)) { client.Player.VehicleID = packet.ID; } @@ -644,7 +648,7 @@ namespace RageCoop.Server { return; } - bool isPlayer = packet.ID==client.Player.PedID; + bool isPlayer = packet.ID==client.ID; if (isPlayer) { client.Player.Position=packet.Position; } foreach (var c in Clients.Values) @@ -719,22 +723,27 @@ namespace RageCoop.Server #endregion // Send a message to targets or all players - private static void SendChatMessage(Packets.ChatMessage packet, List targets = null) + private static void SendChatMessage(Packets.ChatMessage packet,Client sender=null, List targets = null) { if (packet.Message.StartsWith('/')) { string[] cmdArgs = packet.Message.Split(" "); - string cmdName = cmdArgs[0].Remove(0, 1); + string cmdName = cmdArgs[0].Remove(0, 1); + + if (API.Events.InvokeOnCommandReceived(cmdName, cmdArgs, sender)) + { + return; + } if (Commands.Any(x => x.Key.Name == cmdName)) { string[] argsWithoutCmd = cmdArgs.Skip(1).ToArray(); CommandContext ctx = new() { - Client = Clients.Values.Where(x => x.Player.Username == packet.Username).FirstOrDefault(), + Client = Clients.Values.Where(x => x.Username == packet.Username).FirstOrDefault(), Args = argsWithoutCmd }; - + KeyValuePair> command = Commands.First(x => x.Key.Name == cmdName); if (command.Key.Usage != null && command.Key.ArgsLength != argsWithoutCmd.Length) diff --git a/RageCoop.Server/Util.cs b/RageCoop.Server/Util.cs index 3d77460..c2bd1fd 100644 --- a/RageCoop.Server/Util.cs +++ b/RageCoop.Server/Util.cs @@ -67,7 +67,7 @@ namespace RageCoop.Server public static NetConnection GetConnectionByUsername(string username) { - Client client = Server.Clients.Values.ToList().Find(x => x.Player.Username.ToLower() == username.ToLower()); + Client client = Server.Clients.Values.ToList().Find(x => x.Username.ToLower() == username.ToLower()); if (client == null) { return null;