Перейти к содержанию

Взаимодействие с сетью

В Terraria пакеты делятся на два типа: обычный пакет (далее raw), модули (далее net-module).

Amethyst предоставляет возможность изменять поведение пакетов: входящие/исходящие raw-пакеты, входящие net-module.

Входящие raw-пакеты

Для обработки используется NetworkManager.Binding.AddInPacket(...), пример использования:

NetworkManager.Binding.AddInPacket(PacketTypes.ItemOwner, OnItemOwner);

// или

NetworkManager.Binding.AddInPacket(22, OnItemOwner);

void OnItemOwner(in IncomingPacket packet, PacketHandleResult result)
{   
    int start = packet.Start; // позиция начала пакета
    int length = packet.Length; // длина пакета
    byte senderIndex = packet.Sender; // индекс отправителя
    NetPlayer player = packet.Player; // экземпляр NetPlayer отправителя (тоже самое что и packet.Sender)

    BinaryReader reader = packet.GetReader();

    // структура пакета 'ItemOwner':
    short itemIndex = reader.ReadInt16(); // индекс предмета
    byte targetPlayerIndex = reader.ReadByte(); // новый владелец предмета

    // ... какой то очень важный код 

    // игнорирование пакета
    // причина игнорирования пакета например: использование читов, неверные значения
    result.Ignore("<ignore reason>");
}

Входящие net-module-пакеты

Для обработки используется NetworkManager.Binding.AddInModule(...), пример использования:

NetworkManager.Binding.AddInModule(ModuleTypes.MapPing, OnMapPing);

// или

NetworkManager.Binding.AddInModule(2, OnMapPing);

void OnMapPing(in IncomingModule packet, PacketHandleResult result)
{
    BinaryReader reader = packet.GetReader();

    // структура модуля `MapPing`:
    // так же можно использовать так:
    // Vector2 position = reader.ReadVector2();
    float x = reader.ReadSingle();
    float y = reader.ReadSingle();

    // ... какой то очень важный код 

    // игнорирование пакета
    // причина игнорирования пакета например: использование читов, неверные значения
    result.Ignore("<ignore reason>");
}

Исходящие raw-пакеты

Для обработки используется NetworkManager.Binding.AddOutPacket(...), пример использования:

Рекомендуем декомпилировать исходный код класса Terraria.NetMessage из deps/TerrariaAPI.dll, для полного понимания картины.

NetworkManager.Binding.AddOutPacket(PacketTypes.ItemOwner, OnItemOwner);

// или

NetworkManager.Binding.AddOutPacket(22, OnItemOwner);

void OnItemOwner(in OutcomingModule packet, PacketHandleResult result)
{
    // не поддерживает BinaryReader и прочее, так как оно не читает пакет.

    int remoteClient = packet.RemoteClient;
    int ignoreClient = packet.IgnoreClient;
    NetworkText? text = packet.Text;
    int num1 = packet.Number1;
    float num2 = packet.Number2;
    float num3 = packet.Number3;
    float num4 = packet.Number4;
    int num5 = packet.Number5;
    int num6 = packet.Number6;
    int num7 = packet.Number7;

    // игнорирование пакета
    // причина игнорирования пакета например: ненужная отправка данных
    result.Ignore("<ignore reason>");
}