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)
|
lock (_scriptEngines)
|
||||||
{
|
{
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user