Added ServerClientEvent (not ready yet)
This commit is contained in:
@ -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)
|
||||
{
|
||||
|
@ -511,6 +511,27 @@ namespace CoopClient
|
||||
}
|
||||
}
|
||||
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;
|
||||
case NetIncomingMessageType.ConnectionLatencyUpdated:
|
||||
|
@ -116,7 +116,8 @@ namespace CoopClient
|
||||
CleanUpWorld,
|
||||
FileTransferTick,
|
||||
FileTransferRequest,
|
||||
FileTransferComplete
|
||||
FileTransferComplete,
|
||||
ServerClientEvent
|
||||
}
|
||||
|
||||
internal enum ConnectionChannel
|
||||
@ -129,7 +130,8 @@ namespace CoopClient
|
||||
Chat = 5,
|
||||
Native = 6,
|
||||
Mod = 7,
|
||||
File = 8
|
||||
File = 8,
|
||||
Event = 9
|
||||
}
|
||||
|
||||
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 =====
|
||||
public class NativeCall : Packet
|
||||
{
|
||||
|
@ -52,6 +52,33 @@ namespace CoopClient
|
||||
}
|
||||
#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)
|
||||
{
|
||||
Model model = new Model(hash);
|
||||
|
@ -226,6 +226,31 @@ namespace CoopServer
|
||||
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
|
||||
}
|
||||
}
|
||||
|
@ -102,7 +102,8 @@ namespace CoopServer
|
||||
CleanUpWorld,
|
||||
FileTransferTick,
|
||||
FileTransferRequest,
|
||||
FileTransferComplete
|
||||
FileTransferComplete,
|
||||
ServerClientEvent
|
||||
}
|
||||
|
||||
internal enum ConnectionChannel
|
||||
@ -115,7 +116,8 @@ namespace CoopServer
|
||||
Chat = 5,
|
||||
Native = 6,
|
||||
Mod = 7,
|
||||
File = 8
|
||||
File = 8,
|
||||
Event = 9
|
||||
}
|
||||
|
||||
[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 =====
|
||||
public class NativeCall : Packet
|
||||
{
|
||||
|
@ -11,6 +11,23 @@ namespace CoopServer
|
||||
{
|
||||
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)
|
||||
{
|
||||
Client result = Server.Clients.Find(x => x.NetHandle == netHandle);
|
||||
|
Reference in New Issue
Block a user