Convert object to handle at client side

This commit is contained in:
Sardelka
2022-07-02 17:53:35 +08:00
parent d8ac486984
commit 8401d616e0
3 changed files with 73 additions and 4 deletions

View File

@ -248,7 +248,20 @@ namespace RageCoop.Client
break; break;
case PacketType.CustomEvent: case PacketType.CustomEvent:
{ {
Packets.CustomEvent packet = new Packets.CustomEvent(); Packets.CustomEvent packet = new Packets.CustomEvent((t, reader) =>
{
switch (t)
{
case 50:
return EntityPool.ServerProps[reader.ReadInt()].MainProp?.Handle;
case 51:
return EntityPool.GetPedByID(reader.ReadInt())?.MainPed?.Handle;
case 52:
return EntityPool.GetVehicleByID(reader.ReadInt())?.MainVehicle?.Handle;
default:
throw new ArgumentException("Cannot resolve server side argument: "+t);
}
});
packet.Unpack(data); packet.Unpack(data);
Scripting.API.Events.InvokeCustomEventReceived(packet); Scripting.API.Events.InvokeCustomEventReceived(packet);
} }

View File

@ -9,6 +9,11 @@ namespace RageCoop.Core
internal class CustomEvent : Packet internal class CustomEvent : Packet
{ {
public CustomEvent(Func<byte,BitReader,object> onResolve = null)
{
_resolve= onResolve;
}
private Func<byte, BitReader, object> _resolve { get; set; }
public int Hash { get; set; } public int Hash { get; set; }
public List<object> Args { get; set; } public List<object> Args { get; set; }
@ -75,8 +80,14 @@ namespace RageCoop.Core
case 0x13: case 0x13:
Args.Add((GTA.Model)reader.ReadInt()); break; Args.Add((GTA.Model)reader.ReadInt()); break;
default: default:
throw new InvalidOperationException($"Unexpected type:{type}\r\n{array.Dump()}"); if (_resolve==null)
{
throw new InvalidOperationException($"Unexpected type:{type}\r\n{array.Dump()}");
}
else
{
Args.Add(_resolve(type, reader)); break;
}
} }
} }
} }

View File

@ -22,6 +22,18 @@ namespace RageCoop.Server
Server= server; Server= server;
} }
/// <summary>
/// Pass the value as an argument in <see cref="Scripting.API.SendCustomEvent(int, List{object}, List{Client})"/> or <see cref="Client.SendCustomEvent(int, object[])"/> to convert this object to handle at client side.
/// </summary>
public Tuple<byte,byte[]> Handle
{
get
{
return new(50, BitConverter.GetBytes(ID));
}
}
/// <summary> /// <summary>
/// Delete this prop /// Delete this prop
/// </summary> /// </summary>
@ -65,6 +77,23 @@ namespace RageCoop.Server
/// </summary> /// </summary>
public class ServerPed public class ServerPed
{ {
internal ServerPed()
{
}
/// <summary>
/// Pass the value as an argument in <see cref="Scripting.API.SendCustomEvent(int, List{object}, List{Client})"/> or <see cref="Client.SendCustomEvent(int, object[])"/> to convert this object to handle at client side.
/// </summary>
/// <returns></returns>
public Tuple<byte, byte[]> Handle
{
get
{
return new(51, BitConverter.GetBytes(ID));
}
}
/// <summary> /// <summary>
/// The <see cref="Client"/> that is responsible synchronizing for this ped. /// The <see cref="Client"/> that is responsible synchronizing for this ped.
/// </summary> /// </summary>
@ -106,6 +135,22 @@ namespace RageCoop.Server
/// </summary> /// </summary>
public class ServerVehicle public class ServerVehicle
{ {
internal ServerVehicle()
{
}
/// <summary>
/// Pass the value as an argument in <see cref="Scripting.API.SendCustomEvent(int, List{object}, List{Client})"/> or <see cref="Client.SendCustomEvent(int, object[])"/> to convert this object to handle at client side.
/// </summary>
/// <returns></returns>
public Tuple<byte, byte[]> Handle
{
get{
return new(52, BitConverter.GetBytes(ID));
}
}
/// <summary> /// <summary>
/// The <see cref="Client"/> that is responsible synchronizing for this vehicle. /// The <see cref="Client"/> that is responsible synchronizing for this vehicle.
/// </summary> /// </summary>
@ -234,7 +279,7 @@ namespace RageCoop.Server
/// Get all static objects owned by server /// Get all static objects owned by server
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public ServerProp[] GetAllObjects() public ServerProp[] GetAllProps()
{ {
return ServerProps.Values.ToArray(); return ServerProps.Values.ToArray();
} }