102 lines
3.8 KiB
C#
Raw Normal View History

2022-06-19 11:12:20 +08:00
using System;
using System.Collections.Generic;
using System.Text;
using Lidgren.Network;
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-07-05 11:18:26 +08:00
public CustomEvent(Func<byte,BitReader,object> onResolve = null,bool queued=false)
{
_resolve= onResolve;
2022-07-05 11:18:26 +08:00
_queued= queued;
}
2022-07-05 11:18:26 +08:00
private bool _queued;
private Func<byte, BitReader, object> _resolve { get; set; }
2022-06-19 11:12:20 +08:00
public int Hash { get; set; }
public bool IsStaged { get; set; }=false;
public object[] Args { get; set; }
2022-06-19 11:12:20 +08:00
public override void Pack(NetOutgoingMessage message)
{
Args= Args ?? new object[] { };
2022-07-05 11:18:26 +08:00
message.Write(_queued ? (byte)PacketType.CustomEventQueued: (byte)PacketType.CustomEvent);
2022-06-19 11:12:20 +08:00
List<byte> result = new List<byte>();
result.AddInt(Hash);
result.AddInt(Args.Length);
2022-06-19 11:12:20 +08:00
(byte, byte[]) tup;
foreach (var arg in Args)
{
tup=CoreUtils.GetBytesFromObject(arg);
2022-06-23 09:46:38 +08:00
if (tup.Item1==0||tup.Item2==null)
2022-06-19 11:12:20 +08:00
{
throw new ArgumentException($"Object of type {arg.GetType()} is not supported");
}
result.Add(tup.Item1);
result.AddRange(tup.Item2);
}
message.Write(result.Count);
message.Write(result.ToArray());
}
public override void Unpack(byte[] array)
{
BitReader reader = new BitReader(array);
Hash = reader.ReadInt();
var len=reader.ReadInt();
Args=new object[len];
2022-06-19 11:12:20 +08:00
for (int i = 0; i < len; i++)
{
2022-06-23 09:46:38 +08:00
byte type = reader.ReadByte();
switch (type)
2022-06-19 11:12:20 +08:00
{
case 0x01:
Args[i]=reader.ReadByte(); break;
2022-06-19 11:12:20 +08:00
case 0x02:
Args[i]=reader.ReadShort(); break;
2022-06-19 11:12:20 +08:00
case 0x03:
Args[i]=reader.ReadUShort(); break;
2022-06-19 11:12:20 +08:00
case 0x04:
Args[i]=reader.ReadInt(); break;
2022-06-19 11:12:20 +08:00
case 0x05:
Args[i]=reader.ReadUInt(); break;
2022-06-19 11:12:20 +08:00
case 0x06:
Args[i]=reader.ReadLong(); break;
2022-06-19 11:12:20 +08:00
case 0x07:
Args[i]=reader.ReadULong(); break;
2022-06-19 11:12:20 +08:00
case 0x08:
Args[i]=reader.ReadFloat(); break;
2022-06-19 11:12:20 +08:00
case 0x09:
Args[i]=reader.ReadBool(); break;
2022-06-19 11:12:20 +08:00
case 0x10:
Args[i]=reader.ReadString(); break;
2022-07-02 17:14:56 +08:00
case 0x11:
Args[i]=reader.ReadVector3(); break;
2022-07-02 17:14:56 +08:00
case 0x12:
Args[i]=reader.ReadQuaternion(); break;
2022-07-02 17:14:56 +08:00
case 0x13:
Args[i]=(GTA.Model)reader.ReadInt(); break;
2022-07-03 15:28:28 +08:00
case 0x14:
Args[i]=reader.ReadVector2(); break;
2022-06-23 09:46:38 +08:00
default:
if (_resolve==null)
{
throw new InvalidOperationException($"Unexpected type:{type}\r\n{array.Dump()}");
}
else
{
Args[i]=_resolve(type, reader); break;
}
2022-06-19 11:12:20 +08:00
}
}
}
}
}
}