Files
RAGECOOP-V/RageCoop.Core/Packets/CustomEvent.cs

90 lines
3.3 KiB
C#
Raw Permalink Normal View History

2022-09-08 12:41:56 -07:00
using Lidgren.Network;
using System;
2022-06-19 11:12:20 +08:00
namespace RageCoop.Core
{
2022-07-01 14:39:43 +08:00
internal partial class Packets
2022-06-19 11:12:20 +08:00
{
2022-07-01 14:39:43 +08:00
internal class CustomEvent : Packet
2022-06-19 11:12:20 +08:00
{
2022-09-08 12:41:56 -07:00
public override PacketType Type => (_queued ? PacketType.CustomEventQueued : PacketType.CustomEvent);
public CustomEvent(Func<byte, NetIncomingMessage, object> onResolve = null, bool queued = false)
{
2022-09-08 12:41:56 -07:00
_resolve = onResolve;
_queued = queued;
}
2022-09-08 12:41:56 -07:00
private readonly bool _queued;
private Func<byte, NetIncomingMessage, object> _resolve { get; set; }
2022-06-19 11:12:20 +08:00
public int Hash { get; set; }
public object[] Args { get; set; }
2022-06-19 11:12:20 +08:00
protected override void Serialize(NetOutgoingMessage m)
2022-06-19 11:12:20 +08:00
{
2022-09-08 12:41:56 -07:00
Args = Args ?? new object[] { };
2022-06-19 11:12:20 +08:00
m.Write(Hash);
m.Write(Args.Length);
2022-06-19 11:12:20 +08:00
foreach (var arg in Args)
{
2022-09-08 12:41:56 -07:00
CoreUtils.GetBytesFromObject(arg, m);
2022-06-19 11:12:20 +08:00
}
}
public override void Deserialize(NetIncomingMessage m)
2022-06-19 11:12:20 +08:00
{
Hash = m.ReadInt32();
2022-09-08 12:41:56 -07:00
var len = m.ReadInt32();
Args = new object[len];
2022-06-19 11:12:20 +08:00
for (int i = 0; i < len; i++)
{
byte type = m.ReadByte();
2022-06-23 09:46:38 +08:00
switch (type)
2022-06-19 11:12:20 +08:00
{
case 0x01:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadByte(); break;
2022-06-19 11:12:20 +08:00
case 0x02:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadInt32(); break;
2022-06-19 11:12:20 +08:00
case 0x03:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadUInt16(); break;
2022-06-19 11:12:20 +08:00
case 0x04:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadInt32(); break;
2022-06-19 11:12:20 +08:00
case 0x05:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadUInt32(); break;
2022-06-19 11:12:20 +08:00
case 0x06:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadInt64(); break;
2022-06-19 11:12:20 +08:00
case 0x07:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadUInt64(); break;
2022-06-19 11:12:20 +08:00
case 0x08:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadFloat(); break;
2022-06-19 11:12:20 +08:00
case 0x09:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadBoolean(); break;
2022-06-19 11:12:20 +08:00
case 0x10:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadString(); break;
case 0x11:
Args[i] = m.ReadVector3(); break;
2022-07-02 17:14:56 +08:00
case 0x12:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadQuaternion(); break;
2022-07-02 17:14:56 +08:00
case 0x13:
2022-09-08 12:41:56 -07:00
Args[i] = (GTA.Model)m.ReadInt32(); break;
2022-07-03 15:28:28 +08:00
case 0x14:
2022-09-08 12:41:56 -07:00
Args[i] = m.ReadVector2(); break;
case 0x15:
Args[i] = m.ReadByteArray(); break;
2022-06-23 09:46:38 +08:00
default:
2022-09-08 12:41:56 -07:00
if (_resolve == null)
{
throw new InvalidOperationException($"Unexpected type: {type}");
}
else
{
2022-09-08 12:41:56 -07:00
Args[i] = _resolve(type, m); break;
}
2022-06-19 11:12:20 +08:00
}
}
}
}
}
}