Added ServerClientEvent (not ready yet)

This commit is contained in:
EntenKoeniq
2022-04-12 05:05:27 +02:00
parent 71b57dec80
commit e27d42dad6
7 changed files with 284 additions and 5 deletions

View File

@ -136,7 +136,7 @@ namespace CoopClient
} }
} }
internal static void InvokeServerEvent(string eventName, params object[] args) internal static void InvokeServerEvent(string eventName, object[] args)
{ {
lock (_scriptEngines) lock (_scriptEngines)
{ {

View File

@ -511,6 +511,27 @@ namespace CoopClient
} }
} }
break; break;
case (byte)PacketTypes.ServerClientEvent:
{
try
{
int len = message.ReadInt32();
byte[] data = message.ReadBytes(len);
Packets.ServerClientEvent packet = new Packets.ServerClientEvent();
packet.NetIncomingMessageToPacket(data);
JavascriptHook.InvokeServerEvent(packet.EventName, packet.Args.ToArray());
}
catch (Exception ex)
{
GTA.UI.Notification.Show("~r~~h~Packet Error");
Logger.Write($"[{packetType}] {ex.Message}", Logger.LogLevel.Server);
Logger.Write($"[{packetType}] {ex.InnerException}", Logger.LogLevel.Server);
Logger.Write($"[{packetType}] {ex.StackTrace}", Logger.LogLevel.Server);
Client.Disconnect($"Packet Error [{packetType}]");
}
}
break;
} }
break; break;
case NetIncomingMessageType.ConnectionLatencyUpdated: case NetIncomingMessageType.ConnectionLatencyUpdated:

View File

@ -116,7 +116,8 @@ namespace CoopClient
CleanUpWorld, CleanUpWorld,
FileTransferTick, FileTransferTick,
FileTransferRequest, FileTransferRequest,
FileTransferComplete FileTransferComplete,
ServerClientEvent
} }
internal enum ConnectionChannel internal enum ConnectionChannel
@ -129,7 +130,8 @@ namespace CoopClient
Chat = 5, Chat = 5,
Native = 6, Native = 6,
Mod = 7, Mod = 7,
File = 8 File = 8,
Event = 9
} }
internal enum PedDataFlags internal enum PedDataFlags
@ -307,6 +309,99 @@ namespace CoopClient
} }
} }
public class ServerClientEvent : Packet
{
public string EventName { get; set; }
public List<object> Args { get; set; }
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
#region PacketToNetOutGoingMessage
message.Write((byte)PacketTypes.ServerClientEvent);
List<byte> byteArray = new List<byte>();
byte[] eventNameBytes = Encoding.UTF8.GetBytes(EventName);
// Write event name
byteArray.AddRange(BitConverter.GetBytes(eventNameBytes.Length));
byteArray.AddRange(eventNameBytes);
// Write args
byteArray.AddRange(BitConverter.GetBytes(Args.Count));
foreach (object arg in Args)
{
var test = Util.GetBytesFromObject(arg);
if (test.Item1 == 0x0)
{
Logger.Write("Can't get type of an object!", Logger.LogLevel.Server);
byteArray.Add(0x0);
}
else
{
byteArray.Add(test.Item1);
byteArray.AddRange(test.Item2);
}
}
byte[] result = byteArray.ToArray();
message.Write(result.Length);
message.Write(result);
#endregion
}
public override void NetIncomingMessageToPacket(byte[] array)
{
#region NetIncomingMessageToPacket
BitReader reader = new BitReader(array);
// Read event name
int eventNameBytes = reader.ReadInt();
EventName = reader.ReadString(eventNameBytes);
// Read args
Args = new List<object>();
int argsCount = reader.ReadInt();
for (int i = 0; i < argsCount; i++)
{
byte argType = reader.ReadByte();
switch (argType)
{
case 0x01:
Args.Add(reader.ReadByte());
break;
case 0x02:
Args.Add(reader.ReadShort());
break;
case 0x03:
Args.Add(reader.ReadUShort());
break;
case 0x04:
Args.Add(reader.ReadInt());
break;
case 0x05:
Args.Add(reader.ReadUInt());
break;
case 0x06:
Args.Add(reader.ReadLong());
break;
case 0x07:
Args.Add(reader.ReadULong());
break;
case 0x08:
Args.Add(reader.ReadFloat());
break;
case 0x09:
Args.Add(reader.ReadBool());
break;
}
}
#endregion
}
}
#region ===== NATIVECALL ===== #region ===== NATIVECALL =====
public class NativeCall : Packet public class NativeCall : Packet
{ {

View File

@ -52,6 +52,33 @@ namespace CoopClient
} }
#endregion #endregion
public static (byte, byte[]) GetBytesFromObject(object obj)
{
switch (obj)
{
case byte _:
return (0x01, BitConverter.GetBytes((byte)obj));
case short _:
return (0x02, BitConverter.GetBytes((short)obj));
case ushort _:
return (0x03, BitConverter.GetBytes((ushort)obj));
case int _:
return (0x04, BitConverter.GetBytes((int)obj));
case uint _:
return (0x05, BitConverter.GetBytes((uint)obj));
case long _:
return (0x06, BitConverter.GetBytes((long)obj));
case ulong _:
return (0x07, BitConverter.GetBytes((ulong)obj));
case float _:
return (0x08, BitConverter.GetBytes((float)obj));
case bool _:
return (0x09, BitConverter.GetBytes((bool)obj));
default:
return (0x0, null);
}
}
public static Model ModelRequest(this int hash) public static Model ModelRequest(this int hash)
{ {
Model model = new Model(hash); Model model = new Model(hash);

View File

@ -226,6 +226,31 @@ namespace CoopServer
Logging.Error($">> {e.Message} <<>> {e.Source ?? string.Empty} <<>> {e.StackTrace ?? string.Empty} <<"); Logging.Error($">> {e.Message} <<>> {e.Source ?? string.Empty} <<>> {e.StackTrace ?? string.Empty} <<");
} }
} }
public void TriggerServerEvent(string eventName, params object[] args)
{
try
{
NetConnection userConnection = Server.MainNetServer.Connections.Find(x => x.RemoteUniqueIdentifier == NetHandle);
if (userConnection == null)
{
return;
}
NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage();
new Packets.ServerClientEvent()
{
EventName = eventName,
Args = new List<object>(args)
}.PacketToNetOutGoingMessage(outgoingMessage);
Server.MainNetServer.SendMessage(outgoingMessage, userConnection, NetDeliveryMethod.ReliableOrdered, (byte)ConnectionChannel.Event);
Server.MainNetServer.FlushSendQueue();
}
catch (Exception e)
{
Logging.Error($">> {e.Message} <<>> {e.Source ?? string.Empty} <<>> {e.StackTrace ?? string.Empty} <<");
}
}
#endregion #endregion
} }
} }

View File

@ -102,7 +102,8 @@ namespace CoopServer
CleanUpWorld, CleanUpWorld,
FileTransferTick, FileTransferTick,
FileTransferRequest, FileTransferRequest,
FileTransferComplete FileTransferComplete,
ServerClientEvent
} }
internal enum ConnectionChannel internal enum ConnectionChannel
@ -115,7 +116,8 @@ namespace CoopServer
Chat = 5, Chat = 5,
Native = 6, Native = 6,
Mod = 7, Mod = 7,
File = 8 File = 8,
Event = 9
} }
[Flags] [Flags]
@ -295,6 +297,98 @@ namespace CoopServer
} }
} }
public class ServerClientEvent : Packet
{
public string EventName { get; set; }
public List<object> Args { get; set; }
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
#region PacketToNetOutGoingMessage
message.Write((byte)PacketTypes.ServerClientEvent);
List<byte> byteArray = new List<byte>();
byte[] eventNameBytes = Encoding.UTF8.GetBytes(EventName);
// Write event name
byteArray.AddRange(BitConverter.GetBytes(eventNameBytes.Length));
byteArray.AddRange(eventNameBytes);
// Write args
byteArray.AddRange(BitConverter.GetBytes(Args.Count));
foreach (object arg in Args)
{
var test = Util.GetBytesFromObject(arg);
if (test.Item1 == 0x0)
{
Logging.Warning("Can't get type of an object!");
byteArray.Add(0x0);
}
else
{
byteArray.Add(test.Item1);
byteArray.AddRange(test.Item2);
}
}
byte[] result = byteArray.ToArray();
message.Write(result.Length);
message.Write(result);
#endregion
}
public override void NetIncomingMessageToPacket(byte[] array)
{
#region NetIncomingMessageToPacket
BitReader reader = new BitReader(array);
// Read event name
int eventNameBytes = reader.ReadInt();
EventName = reader.ReadString(eventNameBytes);
// Read args
int argsCount = reader.ReadInt();
for (int i = 0; i < argsCount; i++)
{
byte argType = reader.ReadByte();
switch (argType)
{
case 0x01:
Args.Add(reader.ReadByte());
break;
case 0x02:
Args.Add(reader.ReadShort());
break;
case 0x03:
Args.Add(reader.ReadUShort());
break;
case 0x04:
Args.Add(reader.ReadInt());
break;
case 0x05:
Args.Add(reader.ReadUInt());
break;
case 0x06:
Args.Add(reader.ReadLong());
break;
case 0x07:
Args.Add(reader.ReadULong());
break;
case 0x08:
Args.Add(reader.ReadFloat());
break;
case 0x09:
Args.Add(reader.ReadBool());
break;
}
}
#endregion
}
}
#region ===== NATIVECALL ===== #region ===== NATIVECALL =====
public class NativeCall : Packet public class NativeCall : Packet
{ {

View File

@ -11,6 +11,23 @@ namespace CoopServer
{ {
internal class Util internal class Util
{ {
public static (byte, byte[]) GetBytesFromObject(object obj)
{
return obj switch
{
byte _ => (0x01, BitConverter.GetBytes((byte)obj)),
short _ => (0x02, BitConverter.GetBytes((short)obj)),
ushort _ => (0x03, BitConverter.GetBytes((ushort)obj)),
int _ => (0x04, BitConverter.GetBytes((int)obj)),
uint _ => (0x05, BitConverter.GetBytes((uint)obj)),
long _ => (0x06, BitConverter.GetBytes((long)obj)),
ulong _ => (0x07, BitConverter.GetBytes((ulong)obj)),
float _ => (0x08, BitConverter.GetBytes((float)obj)),
bool _ => (0x09, BitConverter.GetBytes((bool)obj)),
_ => (0x0, null),
};
}
public static Client GetClientByNetHandle(long netHandle) public static Client GetClientByNetHandle(long netHandle)
{ {
Client result = Server.Clients.Find(x => x.NetHandle == netHandle); Client result = Server.Clients.Find(x => x.NetHandle == netHandle);