XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
UTF-8
using System.Security.Cryptography;

namespace XFEEliteDangerous.NativeFormat.Replication;

/// <summary>
/// Native70/71 advertises the ProvingGround/Arena mode catalogue.95A220 sets
/// compressed mode before reading its vector count.2731000 explicitly clears
/// the catalogue on zero entries;2741CB0 may request it again after its timer.
/// The minimum Solo service has no Arena modes. This is not world readiness.
/// </summary>
public static class EdServerArenaCatalogueMessageCodec
{
    public static void ReadRequest(EdServerCallEnvelope message)
    {
        ArgumentNullException.ThrowIfNull(message);
        //The Call flag is a native dispatch/forwarding flag, not request
        //authentication or direction.96DB80's remote sender writes it as0.
        //The owning server must separately validate the controller and peer.
        if (message.PayloadBits != 8)
            throw new InvalidDataException("Invalid native Arena catalogue request shape.");
        var data = message.CopyPayload();
        try
        {
            if (data[0] != 70) throw new InvalidDataException("Invalid native Arena catalogue request method.");
        }
        finally { CryptographicOperations.ZeroMemory(data); }
    }

    public static EdServerCallEnvelope CreateEmptyReply(ulong reference)
    {
        //8 method bits +5 zero exponent bits for compressed count0.
        return new(reference, false, 13, [71, 0]);
    }

    public static void ReadEmptyReply(EdServerCallEnvelope message)
    {
        ArgumentNullException.ThrowIfNull(message);
        if (message.Flag || message.PayloadBits != 13)
            throw new InvalidDataException("Invalid native empty Arena catalogue shape.");
        var data = message.CopyPayload();
        try
        {
            if (data[0] != 71 || data[1] != 0)
                throw new InvalidDataException("Expected the explicit empty Arena catalogue.");
        }
        finally { CryptographicOperations.ZeroMemory(data); }
    }
}