Плагин Streamer для Pawn: работа с большим количеством объектов

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Streamer позволяет создавать тысячи объектов без лагов. Разберем использование.

Установка
1. Скачайте streamer.dll
2. Поместите в папку plugins
3. Добавьте в server.cfg: plugins streamer

Подключение
Код:
#include <streamer>

Создание объектов
Код:
// Стандартный способ (ограничение 1000 объектов)
CreateObject(modelid, x, y, z, rx, ry, rz);

// Streamer способ (тысячи объектов)
CreateDynamicObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_OBJECT_SD, Float:drawdistance = STREAMER_OBJECT_DD);

Параметры:
- worldid - виртуальный мир (-1 для всех)
- interiorid - интерьер (-1 для всех)
- playerid - игрок (-1 для всех)
- streamdistance - дистанция стрима
- drawdistance - дистанция прорисовки

Пример создания объектов
Код:
public OnGameModeInit()
{
    // Создание множества объектов
    for(new i = 0; i < 5000; i++)
    {
        CreateDynamicObject(19379, 
            floatrandom(-2000.0, 2000.0),
            floatrandom(-2000.0, 2000.0),
            floatrandom(0.0, 50.0),
            0.0, 0.0, 0.0,
            -1, -1, -1,
            300.0, 300.0);
    }
    return 1;
}

Управление объектами
Код:
// Перемещение
MoveDynamicObject(objectid, Float:x, Float:y, Float:z, Float:speed);

// Поворот
RotateDynamicObject(objectid, Float:rx, Float:ry, Float:rz, Float:speed);

// Установка позиции
SetDynamicObjectPos(objectid, Float:x, Float:y, Float:z);

// Установка поворота
SetDynamicObjectRot(objectid, Float:rx, Float:ry, Float:rz);

// Удаление
DestroyDynamicObject(objectid);

Колбэки
Код:
public OnDynamicObjectMoved(STREAMER_TAG_OBJECT:objectid)
{
    // Объект завершил движение
    return 1;
}

public OnPlayerEditDynamicObject(playerid, STREAMER_TAG_OBJECT:objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
    // Игрок отредактировал объект
    return 1;
}

public OnPlayerSelectDynamicObject(playerid, STREAMER_TAG_OBJECT:objectid, modelid, Float:x, Float:y, Float:z)
{
    // Игрок выбрал объект
    return 1;
}

3D Text Labels
Код:
CreateDynamic3DTextLabel(text[], color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_3D_TEXT_LABEL_SD);

// Пример
new Text3D:label = CreateDynamic3DTextLabel("Текст", 0xFFFFFFFF, 0.0, 0.0, 3.0, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 100.0);

// Обновление
UpdateDynamic3DTextLabelText(STREAMER_TAG_3D_TEXT_LABEL:id, color, text[]);

// Удаление
DestroyDynamic3DTextLabel(STREAMER_TAG_3D_TEXT_LABEL:id);

Пикапы
Код:
CreateDynamicPickup(modelid, type, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_PICKUP_SD);

// Пример
new pickupid = CreateDynamicPickup(1274, 1, 0.0, 0.0, 3.0, -1, -1, -1, 200.0);

// Колбэк
public OnPlayerPickUpDynamicPickup(playerid, pickupid)
{
    // Обработка подбора
    return 1;
}

// Удаление
DestroyDynamicPickup(pickupid);

Checkpoints
Код:
CreateDynamicCP(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_CP_SD);

// Колбэки
public OnPlayerEnterDynamicCP(playerid, checkpointid)
{
    // Игрок вошел в чекпоинт
    return 1;
}

public OnPlayerLeaveDynamicCP(playerid, checkpointid)
{
    // Игрок вышел из чекпоинта
    return 1;
}

Race Checkpoints
Код:
CreateDynamicRaceCP(type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_RACE_CP_SD);

// Колбэки
public OnPlayerEnterDynamicRaceCP(playerid, checkpointid)
{
    // Игрок проехал чекпоинт
    return 1;
}

public OnPlayerLeaveDynamicRaceCP(playerid, checkpointid)
{
    // Игрок покинул чекпоинт
    return 1;
}

Настройка стриминга
Код:
// Установка дистанции стрима для всех объектов
Streamer_SetVisibleItems(STREAMER_TYPE_OBJECT, 500);

// Обновление стрима для игрока
Streamer_Update(playerid);

// Обновление стрима для всех
Streamer_UpdateEx(playerid, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1);

Важные моменты:
- Используйте правильные дистанции стрима
- Обновляйте стрим при телепортации
- Оптимизируйте количество объектов
- Используйте виртуальные миры для изоляции

Streamer позволяет создавать масштабные проекты!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху