PDA

Просмотр полной версии : [Include] ds_markers



DeimoS
16.07.2016, 21:40
DS_Markers.inc


Описание:


Инклюд, расширяющий возможности настройки маркеров игроков, добавляющий такие возможности, как:



Изменение радиуса отображения маркеров* прямо в игре (не требует рестарта)
Изменение радиуса для всех игроков (онлайн/оффлайн)
Изменение радиуса только для игроков, находящихся на сервере
Изменение радиуса только игрокам, которые ещё не зашли на сервер
Изменение радиуса для конкретного игрока


*Маркеры игроков - это квадратные метки на карте,
которые указывают местоположение того или иного игрока остальным




Первый игрок, радиус отрисовки маркера которого установлен на 10 метров
Радиус отображения маркера у игроков:
Игрок №1 (от лица которого сделан скрин) = 10 метров
Игрок №2 = 50 метров
Первый игрок находится в радиусе 50 метров от второго и метка второго игрока отображается для первого


http://ihost.pro-pawn.ru/image.php?di=NJE1



Второй игрок, радиус отрисовки маркера которого установлен на 50 метров
Для второго же игрока первы игрок скрыт с радара, так как расстояние между ними больше 10 метров (именно стольки равен радиус отрисовки маркера первого игрока)


http://ihost.pro-pawn.ru/image.php?di=W258



Так выглядит основное меню настройки маркеров
Вызывается оно функцией

ShowDialogPlayerMarkerOptions(playerid);


http://ihost.pro-pawn.ru/image.php?di=RI4K



Выбираем пункт "Индивидуальный радиус" и видим следующее окно со списком всех игроков (до 30 игроков в одном окне)


http://ihost.pro-pawn.ru/image.php?di=Z86X



Выбираем нужного игрока (DeimoS) и указываем ему новый радиус


http://ihost.pro-pawn.ru/image.php?di=ZCH0



Чуть сдвигаемся в сторону, дабы система обновила данные, и видим, что первый игрок теперь отображается для второго


http://ihost.pro-pawn.ru/image.php?di=4RC6







Подключение:

Подключение выглядит следующим образом:

#include <ds_markers>


В инклюде имеется 8 диалоговых окон, которым требуется задать уникальный ID.

Есть несколько вариантов настройки ID:

Напрямую указать каждому диалогу желаемый ID:


// Сначала ID диалогов
#define dPlMarkMenu_Radius 666// 666 заменить на свободный ID
#define dPlMarkMenu_Radius_All 667// Так же сделать дальше
#define dPlMarkMenu_Radius_Online 668
#define dPlMarkMenu_Radius_Offline 669
#define dPlMarkMenu_Radius_Players 670
#define dPlMarkMenu_Radius_Players_ID 671
#define dPlMarkMenu_Radius_Players_Rad 672
#define dPlMarkMenu_PlayerRadius_ID 673

// После - подключение инклюда
#include <ds_markers>

Использовать макрос, который автоматически присвоит диалогам самые последние, из возможных, ID (32766, 32765, 32764, 32763, 32762, 32761, 32760, 32759)

#define AUTOMATIC_MARKER_DIALOG_ID 1
#include <ds_markers>

Внимание: Данный способ подойдёт только тем, у кого указанные выше ID свободны


Если не произвести ни одно из действий или забыть указать ID для одного из диалогов, компилятор сообщит об этом следующей ошибкой:

For the system to work properly you must specify the ID of the dialogue "имя_макроса_соответствующего_ID_диалога"

Для исправления нужно, собственно, указать ID для пропущенных диалогов


Лимиты для радиуса хранятся в двух макросах:

#define MIN_PLAYER_MARKER_RADIUS 1.0
#define MAX_PLAYER_MARKER_RADIUS 8516.0
Не советую их изменять.




Функционал:

Описание всех функций продублировано в самом инклюде.

Примечание: Здесь просто перечислены функции, которые идут вместе с инклюдом. Основная система (дальность отображения маркеров) не требует дополнительной настройки, кроме того, что написано в пункте "Подключение"



ShowDialogPlayerMarkerOptions(playerid)

- Данная функция отобразит основной диалог (http://ihost.pro-pawn.ru/image.php?di=RI4K) настроек для маркеров.

Параметры:

- playerid // ID игрока, которому будет показан диалог


cmd:radius(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF} Команда доступна только RCON-Администраторам");
ShowDialogPlayerMarkerOptions(playerid);
return 1;
}



SetMarkerDrawDistanceForPlayer(playerid, Float: radius)

- С помощью данной функции можно обновить радиус отображения маркера для конкретного игрока (обновляет лишь значение переменной).
Для того, чтоб изменения вступили в силу для игроков, находящихся онлайн, после использования требуется вызвать UpdateMarkerRadiusForPlayer или UpdateMarkerRadiusForAll

Параметры:

- playerid // ID игрока (ячейки массива), которому будет обновлён радиус
- Float: radius // Новое значение радиуса в виде вещественного числа
Пример использования:

public OnGameModeInit()
{
SetMarkerDrawDistanceForPlayer(8, 150.0);// У игрока с ID 8, при входе на сервер, радиус отображения маркера будет равен 150 метрам.
return 1;
}



SetMarkerDrawDistanceForAll(Float: radius, bool:mode = false)

- Аналог предыдущей функции, только действие распространяется на всех игроков. Имеет два режима работы.

Параметры:

- Float: radius - Новое значение для радиуса, который будет установлен всем игрокам
- bool:mode - Режим работы функции

/*Режимы работы:
false - работа функции распространяется на всех игроков (даже оффлайн) - включена по умолчанию
true - работа функции распространяется только на игроков, находящихся на сервере*/

Пример использования:

public OnGameModeInit()
{
SetMarkerDrawDistanceForAll(20.0);// Теперь у всех игроков, заходящих на сервер, радиус отображения маркера будет 20 метров.
return 1;
}



UpdateMarkerRadiusForPlayer(playerid)

- Функция для обновления динамической зоны конкретного игрока
Функция нужна для того, чтоб изменения радиуса, после использования SetMarkerDrawDistanceForPlayer/SetMarkerDrawDistanceForAll вступили в силу

Параметры:

- playerid // Игрок, динамическая зона которого будет обновлена

Пример использования:

cmd:setmarkerradius(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF} Команда доступна только RCON-Администраторам");
new giveplayerid,
Float: radius;
if(!sscanf(params, "uf", giveplayerid, radius) return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}/cmd:setmarkerradius [playerid] [radius]");
if(giveplayerid == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Данный игрок оффлайн");
if(floatcmp(radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(radius, MAX_PLAYER_MARKER_RADIUS) == 1)return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Минимальное значение радиуса - 0.1м. Максимальное - 8516.0м");
SetMarkerDrawDistanceForPlayer(giveplayerid, radius);
UpdateMarkerRadiusForPlayer(giveplayerid);
new string[18+6+1];
format(string, sizeof(string), "Новое значение - %0.1fм", radius);
SendClientMessage(playerid, -1, string);
return 1;
}



UpdateMarkerRadiusForAll()

- Аналог предыдущей функции, распространяющийся на всех игроков, находящихся на сервере

Параметры:

---

Пример использования:

cmd:setmarkerradiusforall(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF} Команда доступна только RCON-Администраторам");
new giveplayerid,
Float: radius;
if(!isnull(params) return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}/cmd:setmarkerradiusforall [radius]");
new Float: radius= floatstr(params);
if(floatcmp(radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(radius, MAX_PLAYER_MARKER_RADIUS) == 1) return SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Минимальное значение радиуса - 0.1м. Максимальное - 8516.0м");
SetMarkerDrawDistanceForAll(radius, true);// Изменим радиус только тем, кто онлайн
UpdateMarkerRadiusForAll();
new string[18+6+1];
format(string, sizeof(string), "Новое значение - %0.1fм", radius);
SendClientMessage(playerid, -1, string);
return 1;
}



TogglePlayerOnMapForPlayer(playerid, showplayerid, bool:visible)

- Функция для включения/отключения видимости на радаре одного игрока для другого (основная функция, на которой всё построено)

Параметры:

- playerid // игрок, которому скрываем/показываем игрока
- showplayerid // игрок, которого скрываем/показываем
- bool:visible // режим (true - показать/false - скрыть)

Пример использования:
- Данный инклюд :D



TogglePlayerOnMap(playerid, bool:visible)

- Аналог предыдущей функции, только игрок становится невидимым для всего сервера

Параметры:

playerid - игрок, которого скрываем/показываем игрока
- bool:visible // режим (true - показать/false - скрыть)

Пример использования:

cmd:inv(playerid, params[])
{
if((GetPlayerColor(playerid) & 0xFF) == 0x00)
{
SendClientMessage(playerid, -1, "Вы снова видимы на радаре");
TogglePlayerOnMap(playerid, true);
}
else
{
SendClientMessage(playerid, -1, "Вы теперь невидимы на радаре");
TogglePlayerOnMap(playerid, false);
}
return 1;
}











Примечание:
Для правильной работы системы требуется удостовериться, что в вашем скрипте нет функций:
- ShowPlayerMarkers
- LimitPlayerMarkerRadius
Если они есть, их следует удалить.





Автор инклюда - DeimoS
Ссылка на скачивание - Dropbox (https://www.dropbox.com/s/lfpns5g1xahzqqy/ds_markers.inc?dl=0)
Ссылка на Pastebin - Клик (http://pastebin.com/vdixRWAc)