Этот плагин потоки объектов, пикапов, контрольно-пропускные пункты, расы контрольно-пропускных пунктов, карта значки, этикетки и 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)