Этот плагин потоки объектов, пикапов, контрольно-пропускные пункты, расы контрольно-пропускных пунктов, карта значки, этикетки и 3D текст в определяемых пользователем клещей сервера. Основные области обнаружения также включен. Потому что он полностью написан на C + +, большая часть накладных расходов из пешки избежать. Это ленты, как результат, достаточно немного быстрее, чем любой другой реализации имеющихся в настоящее время в залоге.

Изменений

v2.5.1:
- Сделано границы ячейки смежные
- Улучшена скорость пространственных запросов
- Исправлена видимость элементов с большими расстояниями потокового
- Добавлена туземцев для крепления области для игроков и транспортных средств
- Реализован механизм для добавления и удаления нескольких виртуальных миров, интерьеры, и игроков в и из пунктов
- Обновление: Исправлена ошибка с проверкой границ массива и сделал прилагается областях и 3D текстовых меток потока, когда их позиции не могут быть восстановлены

См. readme.txt в серверный пакет для полного изменений.

Настройки:

Code
native Streamer_TickRate(rate);
native Streamer_MaxItems(type, items);
native Streamer_VisibleItems(type, items);
native Streamer_CellDistance(Float:distance);
native Streamer_CellSize(Float:size);

Обновления:

Code
native Streamer_Update(playerid);
native Streamer_UpdateEx(playerid, Float:x, Float:y, Float:z);

Манипулирование данными:

Code
native Streamer_GetFloatData(type, {Text3D,_}:id, data, &Float:result);
native Streamer_SetFloatData(type, {Text3D,_}:id, data, Float:value);
native Streamer_GetIntData(type, {Text3D,_}:id, data);
native Streamer_SetIntData(type, {Text3D,_}:id, data, value);
native Streamer_IsInArrayData(type, {Text3D,_}:id, data, value);
native Streamer_AppendArrayData(type, {Text3D,_}:id, data, value);
native Streamer_RemoveArrayData(type, {Text3D,_}:id, data, value);
native Streamer_GetUpperBound(type);

Разное:

Code
native Streamer_IsItemVisible(playerid, type, {Text3D,_}:id);
native Streamer_DestroyAllVisibleItems(playerid, type);
native Streamer_CountVisibleItems(playerid, type);

Объекты:

Code
native CreateDynamicObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, worldid = -1, interiorid = -1, playerid = -1, Float:distance = 200.0);
native DestroyDynamicObject(objectid);
native IsValidDynamicObject(objectid);
native SetDynamicObjectPos(objectid, Float:x, Float:y, Float:z);
native GetDynamicObjectPos(objectid, &Float:x, &Float:y, &Float:z);
native SetDynamicObjectRot(objectid, Float:rx, Float:ry, Float:rz);
native GetDynamicObjectRot(objectid, &Float:rx, &Float:ry, &Float:rz);
native MoveDynamicObject(objectid, Float:x, Float:y, Float:z, Float:speed);
native StopDynamicObject(objectid);
native DestroyAllDynamicObjects();
native CountDynamicObjects();

Пикапы:

Code
native CreateDynamicPickup(modelid, type, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1, playerid = -1, Float:distance = 100.0);
native DestroyDynamicPickup(pickupid);
native IsValidDynamicPickup(pickupid);
native DestroyAllDynamicPickups();
native CountDynamicPickups();

Чекпоинты:

Code
native CreateDynamicCP(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1, Float:distance = 100.0);
native DestroyDynamicCP(checkpointid);
native IsValidDynamicCP(checkpointid);
native TogglePlayerDynamicCP(playerid, checkpointid, toggle);
native TogglePlayerAllDynamicCPs(playerid, toggle);
native IsPlayerInDynamicCP(playerid, checkpointid);
native DestroyAllDynamicCPs();
native CountDynamicCPs();

Гоночные чекпоинты:

Code
native CreateDynamicRaceCP(type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size, worldid = -1, interiorid = -1, playerid = -1, Float:distance = 100.0);
native DestroyDynamicRaceCP(checkpointid);
native IsValidDynamicRaceCP(checkpointid);
native TogglePlayerDynamicRaceCP(playerid, checkpointid, toggle);
native TogglePlayerAllDynamicRaceCPs(playerid, toggle);
native IsPlayerInDynamicRaceCP(playerid, checkpointid);
native DestroyAllDynamicRaceCPs();
native CountDynamicRaceCPs();

Иконки на карте:

Code
native CreateDynamicMapIcon(Float:x, Float:y, Float:z, type, color, worldid = -1, interiorid = -1, playerid = -1, Float:distance = 100.0);
native DestroyDynamicMapIcon(iconid);
native IsValidDynamicMapIcon(iconid);
native DestroyAllDynamicMapIcons();
native CountDynamicMapIcons();

3D тексты:

Code
native Text3D:CreateDynamic3DTextLabel(const 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:distance = 100.0);
native DestroyDynamic3DTextLabel(Text3D:id);
native IsValidDynamic3DTextLabel(Text3D:id);
native UpdateDynamic3DTextLabelText(Text3D:id, color, const text[]);
native DestroyAllDynamic3DTextLabels();
native CountDynamic3DTextLabels();

Области:

Code
native CreateDynamicCircle(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1, playerid = -1);
native CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid = -1, interiorid = -1, playerid = -1);
native CreateDynamicSphere(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1);
native CreateDynamicCube(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worldid = -1, interiorid = -1, playerid = -1);
native DestroyDynamicArea(areaid);
native IsValidDynamicArea(areaid);
native TogglePlayerDynamicArea(playerid, areaid, toggle);
native TogglePlayerAllDynamicAreas(playerid, toggle);
native IsPlayerInDynamicArea(playerid, areaid);
native AttachDynamicAreaToPlayer(areaid, playerid);
native AttachDynamicAreaToVehicle(areaid, vehicleid);
native DestroyAllDynamicAreas();
native CountDynamicAreas();

Обратные вызовы

Code
forward OnDynamicObjectMoved(objectid);
forward OnPlayerPickUpDynamicPickup(playerid, pickupid);
forward OnPlayerEnterDynamicCP(playerid, checkpointid);
forward OnPlayerLeaveDynamicCP(playerid, checkpointid);
forward OnPlayerEnterDynamicRaceCP(playerid, checkpointid);
forward OnPlayerLeaveDynamicRaceCP(playerid, checkpointid);
forward OnPlayerEnterDynamicArea(playerid, areaid);
forward OnPlayerLeaveDynamicArea(playerid, areaid);

Определения

Code
#define STREAMER_TYPE_OBJECT (0)
#define STREAMER_TYPE_PICKUP (1)
#define STREAMER_TYPE_CP (2)
#define STREAMER_TYPE_RACE_CP (3)
#define STREAMER_TYPE_MAP_ICON (4)
#define STREAMER_TYPE_3D_TEXT_LABEL (5)
#define STREAMER_TYPE_AREA (6)

Счетчик

Code
enum
{
               E_STREAMER_ATTACHED_PLAYER,
               E_STREAMER_ATTACHED_VEHICLE,
               E_STREAMER_COLOR,
               E _STR EAME R_DI STAN CE,
               E  _STRE AMER_DRAW_DISTANCE,
               E_STREAMER_EXTRA_ID,
               E_STREAMER_INTERIOR_ID,
               E_STREAMER_MAX_X,
               E _STR EAME R_MA X_Y,       
               E _ST REAME R_MAX_Z,
               E_STREAMER_MIN_X,
               E_STREAMER_MIN_Y,
               E_STREAMER_MIN_Z,
               E_STREAMER_MODEL_ID,
               E    _STRE AMER_MOVE_ SPEED ,
               E _STREAMER_MOVE_X,
               E_STREAMER_MOVE_Y,
               E_STREAMER_MOVE_Z,
               E_STREAMER_NEXT_X,
               E_STREAME R_NE XT_Y ,
               E  _STRE AMER_ NEXT_ Z,
               E_STREAMER_PLAYER_ID,
               E_STREAMER_R_X,
               E_STREAMER_R_Y,
               E_STREAMER_R_Z,
               E _ STREA MER_S IZE,
               E _ STREAM ER_TES T_LOS,
               E_STREAMER_TYPE,
               E_STREAMER_WORLD_ID,
               E_STREAMER_X,
               E_STREAMER_Y,
               E _ STREA MER_Z     
}

Инструкция

Во-первых, создать папку с именем плагинов на сервере каталог, если он еще не существует. Место streamer.dll в ней, если вы используете Windows, или streamer.so если вы используете Linux.

Добавьте следующую строку в server.cfg так что плагин будет загружать следующем запуске сервера:

Windows:
Code
plugins streamer

Linux:
Code
plugins streamer.so

Далее, сделать это в любой фильтрскрипт или режима игры (это может быть хорошей идеей, чтобы положить его в режим игры любом случае, поскольку filterscripts иногда противоречат друг другу):

Code
#include <streamer>

Вот и все. Теперь просто добавить плагина туземцев и обратные вызовы к вашему сценарию. Будьте очень осторожны, и посмотреть на список выше, чтобы убедиться, что вы используете их правильно-не просто переименовать все в сценарии!

Общие замечания

- По умолчанию частота тиков: 50
- Предметы по умолчанию максимальное: нет (без ограничений)
- По умолчанию видимых элементов: 399 (объектов); 2048 (пикапы); 1024 (3D наклейки текст)
- Если -1 указан для любого из дополнительных параметров (worldid, interiorid, и PlayerID), пунктов будет транслироваться для всех виртуальных миров, интерьеры, и / или игроков.
- Частоты тиков не представляют каких-либо конкретных измерений времени и изменяется в зависимости от вычислительной мощности сервера. Если элементы потока слишком медленно, снижение частоты тиков, если загрузка процессора становится слишком высокой, повышение частоты тиков.
- Если некоторые элементы не отображаются, может быть слишком много в одной области. Предельные расстояния потокового редактирования последнего параметра на каждом родной.
- Не все типы элементов должны быть потоковым. Если плагин используется только для потока объекты, например, то любой другой родной может быть проигнорировано.
- Будьте осторожны при использовании потоковых элементов с не-потоковые элементы. Конфликты могут иногда возникать.
- Убедитесь, что все сценарии компилируются с последними включать файл. Если сервер выводит "Ошибка выполнения 19:" Файл или функция не найдена "," затем режим игры, скорее всего, скомпилированные с включают версию файла, который не совпадает с версией плагина.
- Потому что Есть не за-плеер пикапов, пикап, который потоковом для одного игрока будет виден для всех остальных игроков, а также при условии, что те игроки, все в том же виртуальном мире. Кроме того, из-за виртуального параметра мире по умолчанию CreatePickup родной, это только возможно, чтобы присвоить один виртуальный мир в потоковом пикап.
- Максимум 500 игроков идентификаторы (0-499) и 20 интерьера идентификаторы (0-19) могут быть назначены за единицу.

Родные заметки

- Использование Streamer_UpdateEx для предварительной загрузки элементов перед установкой позицию игрока или поток пунктов под OnPlayerRequestClass.
- Использование данных манипуляций туземцев, как это (обратите внимание на использование определяет и перечисление выше):

Code
Streamer_SetIntData(STREAMER_TYPE_OBJECT, gObject, E_STREAMER_MODEL_ID, 1225);

- Для настройки обратить объекта расстояние (добавлено в SA-MP 0.3b), использование Streamer_SetFloatData с E_STREAMER_DRAW_DISTANCE. Максимальное расстояние ничья 300,0. умолчанию привлечь каждого объекта расстояние 0,0.
- Использование Streamer_AppendArrayData и Streamer_RemoveArrayData добавлять и удалять виртуальные миры, интерьеры, и игроков в и из пунктов. Вот пример:

Code
Streamer_AppendArrayData(STREAMER_TYPE_OBJECT, gObject, E_STREAMER_PLAYER_ID, playerid);

- Только кругов и сферы могут быть использованы с AttachDynamicAreaToPlayer и AttachDynamicAreaToVehicle.
- Использование Streamer_CellDistance настроить область вокруг которого плагин проверяет близлежащие клетки. Используйте Streamer_CellSize регулировать размер каждой ячейки (эти туземцы восстановить сетки, так что используйте их только при необходимости).
- Оптимальное расстояние ячейки автоматически рассчитывается всякий раз, когда Streamer_CellSize используется. Формула для ячейки расстояние просто в 1,5 раза размера ячейки. Если вы хотите задать свой собственный расстояние ячейки, использовать Streamer_CellDistance сразу же после этого.
- По умолчанию размер ячейки 300,0, и расстояние по умолчанию ячейки 450,0. (Обратите внимание, что ячейки расстояние рассчитывается по той же формуле выше.)
- Существует глобальная ячейку, которая содержит все элементы с потоковыми расстояния больше, чем текущее расстояние ячейки. Это делается для того, чтобы пункты, которые должны быть видимы из любой точки на карте (карта значки, например) не привязаны к любой ячейке, что находится слишком далеко от игрока. Рекомендуется, однако, чтобы ограничить количество элементов в глобальной ячейки, потому что они не пользуются пространственной индексации. Больше деталей в этой ячейке, менее эффективные потокового процесса станет, так что только положить пунктов здесь, которые должны быть видны очень далеко. (Например, контрольно-пропускной пункт с потоковым расстоянии 1000,0 в то время как текущее расстояние ячейки 450,0 будет введен в глобальную ячейку.)

Скачать

Server Plugin(Windows and Linux)(Mirror)

Server Code(Cross-Compatible)(Mirror)