Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Инклюд, расширяющий возможности настройки маркеров игроков, добавляющий такие возможности, как:
- • Изменение радиуса отображения маркеров* прямо в игре (не требует рестарта)
- - Изменение радиуса для всех игроков (онлайн/оффлайн)
- - Изменение радиуса только для игроков, находящихся на сервере
- - Ииззменение радиуса только игрокам, которые ещё не зашли на сервер
- - Изменение радиуса для конкретного игрока
- *Маркеры игроков - это квадратные метки на карте, которые указывают местоположение того или иного игрока остальным
- Для правильной работы системы требуется убрать (если имеется) из OnGameModeInit следующие функции:
- - ShowPlayerMarkers
- - LimitPlayerMarkerRadius
- Автор: DeimoS
- Указание авторства при использовании инклюда/его отдельной части даёт плюс к карме.
- Кря
- */
- /*==========================================================================*/
- // В данном макросе указан радиус, который будет выдан всем по умолчанию
- #if !defined DEFAULT_PLAYER_MARKER_RADIUS
- #define DEFAULT_PLAYER_MARKER_RADIUS 100.0
- #endif
- /*==========================================================================*/
- // В данном макросе указано минимальное значение для радиуса
- #if !defined MIN_PLAYER_MARKER_RADIUS
- #define MIN_PLAYER_MARKER_RADIUS 1.0
- #endif
- /*==========================================================================*/
- // В данном макросе указано максимальное значение для радиуса
- // 8516.0 - округлённое расстояние от вернего левого угла карты дл правого нижнего
- // Думаю, такого расстояния хватит с лихвой
- #if !defined MAX_PLAYER_MARKER_RADIUS
- #define MAX_PLAYER_MARKER_RADIUS 8516.0
- #endif
- /*==========================================================================*/
- // Всё, что находится ниже, является неким подобием автоопределения ID диалогов
- /* Если, при подключении инклюда к моду, указать следующие макросы:
- --------------------------------------
- #define AUTOMATIC_MARKER_DIALOG_ID 1
- #include <ds_markers>
- --------------------------------------
- Все диалоги, присутствующие в инклюде, займут последние ID на сервере (32766, 32765, 32764, 32763 и т.п.)
- Так же можно самостоятельно указать ID каждого диалога. Для этого достаточно прописать следующие макросы:
- ----------------------------------------------------------
- #define dPlMarkMenu_Radius 666
- #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>
- ----------------------------------------------------------*/
- #if defined AUTOMATIC_MARKER_DIALOG_ID
- #if !defined DEFAULT_MARKER_DIALOG_ID
- #define DEFAULT_MARKER_DIALOG_ID 32766
- #endif
- #define dPlMarkMenu_Radius DEFAULT_MARKER_DIALOG_ID
- #define dPlMarkMenu_Radius_All DEFAULT_MARKER_DIALOG_ID-1
- #define dPlMarkMenu_Radius_Online DEFAULT_MARKER_DIALOG_ID-2
- #define dPlMarkMenu_Radius_Offline DEFAULT_MARKER_DIALOG_ID-3
- #define dPlMarkMenu_Radius_Players DEFAULT_MARKER_DIALOG_ID-4
- #define dPlMarkMenu_Radius_Players_ID DEFAULT_MARKER_DIALOG_ID-5
- #define dPlMarkMenu_Radius_Players_Rad DEFAULT_MARKER_DIALOG_ID-6
- #define dPlMarkMenu_PlayerRadius_ID DEFAULT_MARKER_DIALOG_ID-7
- #endif
- /*==========================================================================*/
- // В данном макросе указывается ID диалога: Метки на радаре [Настройки]
- #if !defined dPlMarkMenu_Radius
- #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius"
- #endif
- /*==========================================================================*/
- // В данном макросе указывается ID диалога: Глобальный радиус
- #if !defined dPlMarkMenu_Radius_All
- #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_All"
- #endif
- /*==========================================================================*/
- // В данном макросе указывается ID диалога: Глобальный радиус (онлайн)
- #if !defined dPlMarkMenu_Radius_Online
- #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Online"
- #endif
- /*==========================================================================*/
- // В данном макросе указывается ID диалога: Глобальный радиус (оффлайн)
- #if !defined dPlMarkMenu_Radius_Offline
- #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Offline"
- #endif
- /*==========================================================================*/
- // В данном макросе указывается ID диалога: Индивидуальный радиус [Список игроков]
- #if !defined dPlMarkMenu_Radius_Players
- #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Players"
- #endif
- /*==========================================================================*/
- // В данном макросе указывается ID диалога: Индивидуальный радиус [ID игрока]
- #if !defined dPlMarkMenu_Radius_Players_ID
- #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Players_ID"
- #endif
- /*==========================================================================*/
- // В данном макросе указывается ID диалога: Индивидуальный радиус [Новое значение]
- #if !defined dPlMarkMenu_Radius_Players_Rad
- #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Players_Rad"
- #endif
- /*==========================================================================*/
- // В данном макросе указывается ID диалога, который показывается при нажатии на ник в диалоге "Индивидуальный радиус"
- #if !defined dPlMarkMenu_PlayerRadius_ID
- #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_PlayerRadius_ID"
- #endif
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Перечисление, в котором хранится вся нужная информация для динамических зон, через которые работает система
- enum e_PLAYER_MARKER_INFO
- {
- mark_id,// ID динамической зоны
- Float:mark_radius,// Радиус динамической зоны
- transparent// Прозрачность ника игрока до скрытия его с радара
- }
- static pMarkInfo[MAX_PLAYERS][e_PLAYER_MARKER_INFO];
- // В данную переменную записывается радиус для тех, кто онлайн
- static Float:gGlobalMarkerRadius_Online = DEFAULT_PLAYER_MARKER_RADIUS,
- // В данную переменную записывается радиус для тех, кто оффлайн (значение для "Глобальный радиус" так же берётся отсюда)
- Float:gGlobalMarkerRadius_Offline = DEFAULT_PLAYER_MARKER_RADIUS,
- // Данная переменная подсчитывает число игроков на сервере, которое нужно для правильного составления списка игроков в меню "Индивидуальный радиус"
- pmark_PlayersOnline = 0;
- // В данном массиве записан общий для всех pVar префикс
- // pVar используются в составлении списка игроков в меню "Индивидуальный радиус"
- // И хранят ID игроков.
- static const pmark_pVar_prefix[] = "PlayerMarkers_Playerid_";
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Это перехват коллбэка OnGameModeInIt
- // В котором происходит настройка сервера для правильной работы системы (перевод маркеров в глобальный режим работы)
- // И сброс настроек самой системы
- public OnGameModeInit()
- {
- ShowPlayerMarkers(PLAYER_MARKERS_MODE_GLOBAL);
- for(new i; i < sizeof(pMarkInfo); i++)
- {
- pMarkInfo[i][mark_id] = -1;
- pMarkInfo[i][transparent] = 0xFF;
- pMarkInfo[i][mark_radius] = DEFAULT_PLAYER_MARKER_RADIUS;
- }
- #if defined pmark_OnGameModeInit
- return pmark_OnGameModeInit();
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnGameModeInit
- #undef OnGameModeInit
- #else
- #define _ALS_OnGameModeInit
- #endif
- #define OnGameModeInit pmark_OnGameModeInit
- #if defined pmark_OnGameModeInit
- forward pmark_OnGameModeInit();
- #endif
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Это перехват коллбэка OnPlayerConnect
- // В котором так же устанавливаются "настройки" по умолчанию для массивов системы
- // И производится часть подсчёта онлайна
- public OnPlayerConnect(playerid)
- {
- pMarkInfo[playerid][transparent] = 0xFF;
- pMarkInfo[playerid][mark_radius] = gGlobalMarkerRadius_Offline;
- pmark_PlayersOnline++;
- #if defined pmark_OnPlayerConnect
- return pmark_OnPlayerConnect(playerid);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerConnect
- #undef OnPlayerConnect
- #else
- #define _ALS_OnPlayerConnect
- #endif
- #define OnPlayerConnect pmark_OnPlayerConnect
- #if defined pmark_OnPlayerConnect
- forward pmark_OnPlayerConnect(playerid);
- #endif
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Это перехват коллбэка OnPlayerDisconnect
- // В котором удаляется созданная динамическая зона
- // И так же происходит подсчёт онлайна
- public OnPlayerDisconnect(playerid, reason)
- {
- if(pMarkInfo[playerid][mark_id] != -1)
- {
- DestroyDynamicArea(pMarkInfo[playerid][mark_id]);
- pMarkInfo[playerid][mark_id] = -1;
- }
- pmark_PlayersOnline--;
- #if defined pmark_OnPlayerDisconnect
- return pmark_OnPlayerDisconnect(playerid, reason);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerDisconnect
- #undef OnPlayerDisconnect
- #else
- #define _ALS_OnPlayerDisconnect
- #endif
- #define OnPlayerDisconnect pmark_OnPlayerDisconnect
- #if defined pmark_OnPlayerDisconnect
- forward pmark_OnPlayerDisconnect(playerid, reason);
- #endif
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Это перехват коллбэка OnPlayerSpawn
- // В котором происходит проверка того, создана ли динамическая зона для игрока
- // И если не создана - создаётся
- public OnPlayerSpawn(playerid)
- {
- if(pMarkInfo[playerid][mark_id] == -1)
- {
- pMarkInfo[playerid][mark_id] = CreateDynamicSphere(0.0, 0.0, 0.0, pMarkInfo[playerid][mark_radius], -1, -1, -1);
- AttachDynamicAreaToPlayer(pMarkInfo[playerid][mark_id], playerid);
- }
- #if defined pmark_OnPlayerSpawn
- return pmark_OnPlayerSpawn(playerid);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerSpawn
- #undef OnPlayerSpawn
- #else
- #define _ALS_OnPlayerSpawn
- #endif
- #define OnPlayerSpawn pmark_OnPlayerSpawn
- #if defined pmark_OnPlayerSpawn
- forward pmark_OnPlayerSpawn(playerid);
- #endif
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Это перехват коллбэка OnPlayerEnterDynamicArea
- // В котором происходит основная работа системы.
- // В случае с данным коллбэком - это показ маркера игроку другого игрока, в зону которого он зашёл
- public OnPlayerEnterDynamicArea(playerid, areaid)
- {
- #if defined foreach
- foreach(new i: Player)
- {
- #elseif defined GetPlayerPoolSize
- for(new i = GetPlayerPoolSize(); i != -1; i--)
- {
- if(!IsPlayerConnected(i)) continue;
- #endif
- if(i == playerid) continue;
- if(areaid != pMarkInfo[i][mark_id]) continue;
- TogglePlayerOnMapForPlayer(playerid, i, true);
- }
- #if defined pmark_OnPlayerEnterDynamicArea
- return pmark_OnPlayerEnterDynamicArea(playerid, areaid);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerEnterDynamicArea
- #undef OnPlayerEnterDynamicArea
- #else
- #define _ALS_OnPlayerEnterDynamicArea
- #endif
- #define OnPlayerEnterDynamicArea pmark_OnPlayerEnterDynamicArea
- #if defined pmark_OnPlayerEnterDynamicArea
- forward pmark_OnPlayerEnterDynamicArea(playerid, areaid);
- #endif
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Это перехват коллбэка OnPlayerLeaveDynamicArea
- // В котором происходит практически то же самое, только вместо показа, скрытие маркера
- public OnPlayerLeaveDynamicArea(playerid, areaid)
- {
- #if defined foreach
- foreach(new i: Player)
- {
- #elseif defined GetPlayerPoolSize
- for(new i = GetPlayerPoolSize(); i != -1; i--)
- {
- if(!IsPlayerConnected(i)) continue;
- #endif
- if(i == playerid) continue;
- if(areaid != pMarkInfo[i][mark_id]) continue;
- TogglePlayerOnMapForPlayer(playerid, i, false);
- }
- #if defined pmark_OnPlayerLeaveDynamicArea
- return pmark_OnPlayerLeaveDynamicArea(playerid, areaid);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnPlayerLeaveDynamicArea
- #undef OnPlayerLeaveDynamicArea
- #else
- #define _ALS_OnPlayerLeaveDynamicArea
- #endif
- #define OnPlayerLeaveDynamicArea pmark_OnPlayerLeaveDynamicArea
- #if defined pmark_OnPlayerLeaveDynamicArea
- forward pmark_OnPlayerLeaveDynamicArea(playerid, areaid);
- #endif
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Это перехват OnDialogResponse
- // В котором расписаны все действия для диалога с настройками и всех вложенных в него диалогов
- public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
- {
- switch(dialogid)
- {
- case dPlMarkMenu_Radius:
- {
- if(!response)
- {
- pmark_DeleteAllPVars(playerid);
- DeletePVar(playerid, "pmark_Playerid");
- DeletePVar(playerid, "PlayerMarkersRadiusList");
- return 1;
- }
- switch(listitem)
- {
- case 0:
- {
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_All, DIALOG_STYLE_INPUT, "Глобальный радиус:",
- "{FFFFFF}Глобальный радиус - это радиус, который будет примерён ко всем игрокам \n(как уже играющим, так и тем, кто толшько войдёт).*\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
- \n\n*Для изменение радиуса отображения ника только игрокам, находящимся на сервере в данный момент, вернитесь назад и выберите пункт \"• Глобальный радиус (онлайн)\"\n\
- Для изменение радиуса отображения ника для игроков, которые только зайдут на сервер (на игроков онлайн изменение не распространится), вернитесь назад и выберите пункт \"• Глобальный радиус (оффлайн)\"", "Далее", "Назад");
- }
- case 1:
- {
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Online, DIALOG_STYLE_INPUT, "Глобальный радиус (онлайн):",
- "{FFFFFF}Глобальный радиус (онлайн) - это радиус, который будет примерён ко всем игрокам, которые находятся на сервере на данный момент \n(всем игрокам, которые войдут на сервер после изменений, будет выдан текущий радиус).*\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
- \n\n*Для изменение радиуса отображения ника всем игрока (и онлайн, и тем, кто ещё не вошёл) вернитесь назад и выберите пункт \"• Глобальный радиус\"\n\
- Для изменение радиуса отображения ника для игроков, которые только зайдут на сервер (на игроков онлайн изменение не распространится), вернитесь назад и выберите пункт \"• Глобальный радиус (оффлайн)\"", "Далее", "Назад");
- }
- case 2:
- {
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Offline, DIALOG_STYLE_INPUT, "Глобальный радиус (оффлайн):",
- "{FFFFFF}Глобальный радиус (оффлайн) - это радиус, который будет примерён ко всем игрокам, которые войдут на сервер после внесения данных изменений \n(на тех, кто находится на сервере в текущий момент времени, эти изменения не распространятся).*\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
- \n\n*Для изменение радиуса отображения ника всем игрока (и онлайн, и тем, кто ещё не вошёл) вернитесь назад и выберите пункт \"• Глобальный радиус\"\n\
- Для изменение радиуса отображения ника только игрокам, находящимся на сервере в данный момент, вернитесь назад и выберите пункт \"• Глобальный радиус (онлайн)\"", "Далее", "Назад");
- }
- case 3:
- {
- ShowDialogPlayerMarkOptForPl(playerid);
- }
- }
- return 1;
- }
- case dPlMarkMenu_Radius_All:
- {
- if(!response) return ShowDialogPlayerMarkerOptions(playerid);
- new Float: pmark_radius = floatstr(inputtext)+0.000001;
- if(floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == 1)
- {
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_All, DIALOG_STYLE_INPUT, "Глобальный радиус:",
- "{FFFFFF}Глобальный радиус - это радиус, который будет примерён ко всем игрокам \n(как уже играющим, так и тем, кто толшько войдёт).*{FF0000}\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
- \n\n{FFFFFF}*Для изменение радиуса отображения ника только игрокам, находящимся на сервере в данный момент, вернитесь назад и выберите пункт \"• Глобальный радиус (онлайн)\"\n\
- Для изменение радиуса отображения ника для игроков, которые только зайдут на сервер (на игроков онлайн изменение не распространится), вернитесь назад и выберите пункт \"• Глобальный радиус (оффлайн)\"", "Далее", "Назад");
- return 1;
- }
- gGlobalMarkerRadius_Online = pmark_radius;
- gGlobalMarkerRadius_Offline = pmark_radius;
- SetMarkerDrawDistanceForAll(pmark_radius);
- UpdateMarkerRadiusForAll();
- new _pmark_string[63+6+1];
- format(_pmark_string, sizeof(_pmark_string), "[Глобальный радиус] Изменения успешно внесены. Новый радиус - %0.1fм", pmark_radius);
- SendClientMessage(playerid, -1, _pmark_string);
- return 1;
- }
- case dPlMarkMenu_Radius_Online:
- {
- if(!response) return ShowDialogPlayerMarkerOptions(playerid);
- new Float: pmark_radius = floatstr(inputtext)+0.000001;
- if(floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == 1)
- {
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Online, DIALOG_STYLE_INPUT, "Глобальный радиус (онлайн):",
- "{FFFFFF}Глобальный радиус (онлайн) - это радиус, который будет примерён ко всем игрокам, которые находятся на сервере на данный момент \n(всем игрокам, которые войдут на сервер после изменений, будет выдан текущий радиус).*{FF0000}\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
- \n\n{FFFFFF}*Для изменение радиуса отображения ника всем игрока (и онлайн, и тем, кто ещё не вошёл) вернитесь назад и выберите пункт \"• Глобальный радиус\"\n\
- Для изменение радиуса отображения ника для игроков, которые только зайдут на сервер (на игроков онлайн изменение не распространится), вернитесь назад и выберите пункт \"• Глобальный радиус (оффлайн)\"", "Далее", "Назад");
- return 1;
- }
- gGlobalMarkerRadius_Online = pmark_radius;
- SetMarkerDrawDistanceForAll(pmark_radius, true);
- UpdateMarkerRadiusForAll();
- new _pmark_string[72+6+1];
- format(_pmark_string, sizeof(_pmark_string), "[Глобальный радиус (онлайн)] Изменения успешно внесены. Новый радиус - %0.1fм", pmark_radius);
- SendClientMessage(playerid, -1, _pmark_string);
- return 1;
- }
- case dPlMarkMenu_Radius_Offline:
- {
- if(!response) return ShowDialogPlayerMarkerOptions(playerid);
- new Float: pmark_radius = floatstr(inputtext)+0.000001;
- if(floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == 1)
- {
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Offline, DIALOG_STYLE_INPUT, "Глобальный радиус (оффлайн):",
- "{FFFFFF}Глобальный радиус (оффлайн) - это радиус, который будет примерён ко всем игрокам, которые войдут на сервер после внесения данных изменений \n(на тех, кто находится на сервере в текущий момент времени, эти изменения не распространятся).*{FF0000}\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
- \n\n{FFFFFF}*Для изменение радиуса отображения ника всем игрока (и онлайн, и тем, кто ещё не вошёл) вернитесь назад и выберите пункт \"• Глобальный радиус\"\n\
- Для изменение радиуса отображения ника только игрокам, находящимся на сервере в данный момент, вернитесь назад и выберите пункт \"• Глобальный радиус (онлайн)\"", "Далее", "Назад");
- return 1;
- }
- gGlobalMarkerRadius_Offline = pmark_radius;
- new _pmark_string[73+6+1];
- format(_pmark_string, sizeof(_pmark_string), "[Глобальный радиус (оффлайн)] Изменения успешно внесены. Новый радиус - %0.1fм", pmark_radius);
- SendClientMessage(playerid, -1, _pmark_string);
- return 1;
- }
- case dPlMarkMenu_Radius_Players:
- {
- if(!response) return ShowDialogPlayerMarkerOptions(playerid);
- switch(listitem)
- {
- case 0:
- {
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_ID, DIALOG_STYLE_INPUT, "Индивидуальный радиус [ID игрока]", "Введите ID игрока, которому Вы желаете изменить радиус отображения маркера:", "Далее", "Назад");
- return pmark_DeleteAllPVars(playerid);
- }
- case 1..30:
- {
- new pmark_pVar_string[sizeof(pmark_pVar_prefix)+2];
- format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, listitem);
- new pmark_playerid = GetPVarInt(playerid, pmark_pVar_string);
- pmark_DeleteAllPVars(playerid);
- if(!strcmp(inputtext, "Назад"))
- {
- if(GetPVarInt(playerid, "PlayerMarkersRadiusList") <= 1) DeletePVar(playerid, "PlayerMarkersRadiusList");
- else SetPVarInt(playerid, "PlayerMarkersRadiusList", GetPVarInt(playerid, "PlayerMarkersRadiusList")-1);
- return ShowDialogPlayerMarkOptForPl(playerid);
- }
- SetPVarInt(playerid, "pmark_Playerid", pmark_playerid);
- new pmark_string[139+MAX_PLAYER_NAME+3+6];
- GetPlayerName(pmark_playerid, pmark_pVar_string, MAX_PLAYER_NAME);
- format(pmark_string, sizeof(pmark_string), "Радиус игрока %s [ID: %d] - %0.1fм\nВведите радиус, который Вы желаете установить данному игроку:\n\nМинимальное значение - 1.0\nМаксимальное - 8516.0", pmark_pVar_string, pmark_playerid, pMarkInfo[pmark_playerid][mark_radius]);
- return ShowPlayerDialog(playerid, dPlMarkMenu_PlayerRadius_ID, DIALOG_STYLE_INPUT, pmark_pVar_string, pmark_string, "Далее", "Назад");
- }
- case 31:
- {
- SetPVarInt(playerid, "PlayerMarkersRadiusList", GetPVarInt(playerid, "PlayerMarkersRadiusList")+1);
- return ShowDialogPlayerMarkOptForPl(playerid);
- }
- default:
- {
- if(GetPVarInt(playerid, "PlayerMarkersRadiusList") <= 1) DeletePVar(playerid, "PlayerMarkersRadiusList");
- else SetPVarInt(playerid, "PlayerMarkersRadiusList", GetPVarInt(playerid, "PlayerMarkersRadiusList")-1);
- return ShowDialogPlayerMarkOptForPl(playerid);
- }
- }
- }
- case dPlMarkMenu_PlayerRadius_ID:
- {
- if(!response) return ShowDialogPlayerMarkOptForPl(playerid);
- new pmark_playerid = GetPVarInt(playerid, "pmark_Playerid");
- DeletePVar(playerid, "pmark_Playerid");
- new pmark_string[139+MAX_PLAYER_NAME+3+6+8];
- if(!strlen(inputtext))
- {
- GetPlayerName(pmark_playerid, pmark_string, MAX_PLAYER_NAME);
- format(pmark_string, sizeof(pmark_string), "Радиус игрока %s [ID: %d] - %0.1fм\nВведите радиус, который Вы желлаете установить данному игроку:\n\n{FF0000}Минимальное значение - 1.0\nМаксимальное - 8516.0", pmark_string, pmark_playerid, pMarkInfo[pmark_playerid][mark_radius]);
- return ShowPlayerDialog(playerid, dPlMarkMenu_PlayerRadius_ID, DIALOG_STYLE_INPUT, "Ошибка:", pmark_string, "Далее", "Назад");
- }
- new Float: pmark_radius = floatstr(inputtext)+0.000001;
- if(floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == 1)
- {
- GetPlayerName(pmark_playerid, pmark_string, MAX_PLAYER_NAME);
- format(pmark_string, sizeof(pmark_string), "Радиус игрока %s [ID: %d] - %0.1fм\nВведите радиус, который Вы желлаете установить данному игроку:\n\n{FF0000}Минимальное значение - 1.0\nМаксимальное - 8516.0", pmark_string, pmark_playerid, pMarkInfo[pmark_playerid][mark_radius]);
- return ShowPlayerDialog(playerid, dPlMarkMenu_PlayerRadius_ID, DIALOG_STYLE_INPUT, "Ошибка:", pmark_string, "Далее", "Назад");
- }
- GetPlayerName(pmark_playerid, pmark_string, MAX_PLAYER_NAME);
- format(pmark_string, sizeof(pmark_string), "Радиус для игрока %s [ID: %d] успешно изменён с %0.1fм на %0.1fм", pmark_string, pmark_playerid, pMarkInfo[pmark_playerid][mark_radius], pmark_radius);
- SendClientMessage(playerid, -1, pmark_string);
- SetMarkerDrawDistanceForPlayer(pmark_playerid, pmark_radius);
- UpdateMarkerRadiusForPlayer(pmark_playerid);
- DeletePVar(playerid, "PlayerMarkersRadiusList");
- return 1;
- }
- case dPlMarkMenu_Radius_Players_ID:
- {
- if(!response) return ShowDialogPlayerMarkOptForPl(playerid);
- if(!strlen(inputtext)) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_ID, DIALOG_STYLE_INPUT, "Индивидуальный радиус [ID игрока]", "Введите ID игрока, которому Вы желаете изменить радиус отображения маркера:", "Далее", "Назад");
- new pmark_playerid = strval(inputtext);
- if(!IsPlayerConnected(pmark_playerid)) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_ID, DIALOG_STYLE_INPUT, "Индивидуальный радиус [ID игрока]", "Игрок с указанным ID не найден на сервере!\n\nВведите ID игрока, которому Вы желаете изменить радиус отображения маркера:", "Далее", "Назад");
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_Rad, DIALOG_STYLE_INPUT, "Индивидуальный радиус [Новое значение]", "Введите радиус, который Вы желлаете установить данному игроку:\n\nМинимальное значение - 1.0\nМаксимальное - 8516.0", "Далее", "Назад");
- SetPVarInt(playerid, "pmark_Playerid", pmark_playerid);
- return 1;
- }
- case dPlMarkMenu_Radius_Players_Rad:
- {
- if(!response) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_ID, DIALOG_STYLE_INPUT, "Индивидуальный радиус [Новое значение]", "Введите ID игрока, которому Вы желаете изменить радиус отображения маркера:", "Далее", "Назад"), DeletePVar(playerid, "pmark_Playerid");
- if(!strlen(inputtext)) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_Rad, DIALOG_STYLE_INPUT, "Индивидуальный радиус [Новое значение]", "Введите радиус, который Вы желлаете установить данному игроку:\n\nМинимальное значение - 1.0\nМаксимальное - 8516.0", "Далее", "Назад");
- new Float: pmark_radius = floatstr(inputtext)+0.000001;
- if(floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == 1) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_Rad, DIALOG_STYLE_INPUT, "Индивидуальный радиус [Новое значение]", "Введите радиус, который Вы желлаете установить данному игроку:\n\n{FF0000}Минимальное значение - 1.0\nМаксимальное - 8516.0", "Далее", "Назад");
- new pmark_string[139+MAX_PLAYER_NAME+3+6+8];
- GetPlayerName(GetPVarInt(playerid, "pmark_Playerid"), pmark_string, MAX_PLAYER_NAME);
- format(pmark_string, sizeof(pmark_string), "Радиус для игрока %s [ID: %d] успешно изменён с %0.1fм на %0.1fм", pmark_string, GetPVarInt(playerid, "pmark_Playerid"), pMarkInfo[GetPVarInt(playerid, "pmark_Playerid")][mark_radius], pmark_radius);
- SendClientMessage(playerid, -1, pmark_string);
- SetMarkerDrawDistanceForPlayer(GetPVarInt(playerid, "pmark_Playerid"), pmark_radius);
- UpdateMarkerRadiusForPlayer(GetPVarInt(playerid, "pmark_Playerid"));
- DeletePVar(playerid, "pmark_Playerid");
- DeletePVar(playerid, "PlayerMarkersRadiusList");
- return 1;
- }
- }
- #if defined pmark_OnDialogResponse
- return pmark_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);
- #else
- return 1;
- #endif
- }
- #if defined _ALS_OnDialogResponse
- #undef OnDialogResponse
- #else
- #define _ALS_OnDialogResponse
- #endif
- #define OnDialogResponse pmark_OnDialogResponse
- #if defined pmark_OnDialogResponse
- forward pmark_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
- #endif
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Это перехват функции SetPlayerColor
- // В котором идёт обновление данных в массиве "transparent" (который хранит прозрачность ника)
- stock pmark_SetPlayerColor(playerid, color)
- {
- pMarkInfo[playerid][transparent] = color & 0xFF;
- return SetPlayerColor(playerid, color);
- }
- #if defined _ALS_SetPlayerColor
- #undef SetPlayerColor
- #else
- #define _ALS_SetPlayerColor
- #endif
- #define SetPlayerColor pmark_SetPlayerColor
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Функция для включения/отключения видимости на радаре одного игрока для другого (основная функция, на которой всё построено)
- //
- //playerid - игрок, которому скрываем/показываем игрока
- //showplayerid - игрок, которого скрываем/показываем
- //bool:visible - режим (true - показать/false - скрыть)
- //
- //Функция работает путём изменения прозрачности цвета ника
- //Указывем "00" и игрока не видно на радаре. Любое, отличное от нуля значение, вернёт маркер игрока на радар
- stock TogglePlayerOnMapForPlayer(playerid, showplayerid, bool:visible)
- {
- new map_color = GetPlayerColor(showplayerid);// Запишем текущий цвет игрока в переменную
- if((map_color & 0xFF) != 0x00) // ?з этого цвета получим текущую прозрачность и если она не равна "00"
- pMarkInfo[showplayerid][transparent] = map_color & 0xFF;// Значит у игрока не включена невидимость => сохраняем текущее значение прозрачности
- SetPlayerMarkerForPlayer(playerid, showplayerid, (map_color | 0xFF) - (visible ? 0x00 : pMarkInfo[showplayerid][transparent]));
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Аналог предыдущей функции, только игрок становится невидимым для всего сервера
- //
- //playerid - игрок, которого скрываем/показываем игрока
- //bool:visible - режим (true - показать/false - скрыть)
- stock TogglePlayerOnMap(playerid, bool:visible)
- {
- SetPlayerColor(playerid,(GetPlayerColor(playerid) | 0xFF) - (visible ? 0x00 : 0xFF));
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Функция для изменения радиуса отрисовки собственного (!) маркера для других игроков
- //
- //playerid - игрок, которому изменяем радиус
- //Float: radius - Новое значение для радиуса
- //
- //Функция лишь меняет значение в переменной, хранящей текущий радиус игрока
- //Дабы изменения вступили в силу, следует, после вызова данной функции, вызвать
- //UpdateMarkerRadiusForPlayer или UpdateMarkerRadiusForAll
- stock SetMarkerDrawDistanceForPlayer(playerid, Float: radius)
- {
- pMarkInfo[playerid][mark_radius] = radius;
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Аналог предыдущей функции, только действие распространяется на всех игроков
- //
- //Float: radius - Новое значение для радиуса, который будет установлен всем игрокам
- /*bool:mode - Режим работы функции
- false - работа функции распространяется на всех игроков (даже оффлайн) - включена по умолчанию
- true - работа функции распространяется только на игроков, находящихся на сервере*/
- stock SetMarkerDrawDistanceForAll(Float: radius, bool:mode = false)
- {
- if(!mode)
- {
- for(new i; i < sizeof(pMarkInfo); i++)
- pMarkInfo[i][mark_radius] = radius;
- }
- else
- {
- #if defined foreach
- foreach(new i: Player)
- {
- #elseif defined GetPlayerPoolSize
- for(new i = GetPlayerPoolSize(); i != -1; i--)
- {
- if(!IsPlayerConnected(i)) continue;
- #endif
- pMarkInfo[i][mark_radius] = radius;
- }
- }
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Функция для обновления динамической зоны конкретного игрока
- //
- //playerid - игрок, динамическая зона которого будет обновлена
- //
- //Функция нужна для того, чтоб изменения радиуса, после использования SetMarkerDrawDistanceForPlayer/SetMarkerDrawDistanceForAll
- //вступили в силу
- stock UpdateMarkerRadiusForPlayer(playerid)
- {
- if(pMarkInfo[playerid][mark_id] == -1) return 0;
- DestroyDynamicArea(pMarkInfo[playerid][mark_id]);
- pMarkInfo[playerid][mark_id] = CreateDynamicSphere(0.0, 0.0, 0.0, pMarkInfo[playerid][mark_radius], -1, -1, -1);
- AttachDynamicAreaToPlayer(pMarkInfo[playerid][mark_id], playerid);
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Аналог предыдущей функции, распространяющийся не на одного игрока, а на всех (кто онлайн)
- stock UpdateMarkerRadiusForAll()
- {
- #if defined foreach
- foreach(new i: Player)
- {
- #elseif defined GetPlayerPoolSize
- for(new i = GetPlayerPoolSize(); i != -1; i--)
- {
- if(!IsPlayerConnected(i)) continue;
- #endif
- if(pMarkInfo[i][mark_id] == -1) continue;
- DestroyDynamicArea(pMarkInfo[i][mark_id]);
- pMarkInfo[i][mark_id] = CreateDynamicSphere(0.0, 0.0, 0.0, pMarkInfo[i][mark_radius], -1, -1, -1);
- AttachDynamicAreaToPlayer(pMarkInfo[i][mark_id], i);
- }
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Функция, в которой "формируется" основной диалог, хранящий все настройки
- stock ShowDialogPlayerMarkerOptions(playerid)
- {
- new _pmark_string[122+(6*3)+(8*6)+3+1];
- format(_pmark_string, sizeof(_pmark_string), "{FFFFFF}• Глобальный радиус \t\t\t[{3F9FD0}%0.1fм{FFFFFF}]\n• Глобальный радиус (онлайн)\t[{3F9FD0}%0.1fм{FFFFFF}]\n• Глобальный радиус (оффлайн) \t[{3F9FD0}%0.1fм{FFFFFF}]\n• Индивидуальный радиус", gGlobalMarkerRadius_Offline, gGlobalMarkerRadius_Online, gGlobalMarkerRadius_Offline);
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius, DIALOG_STYLE_LIST, "Метки на радаре [Настройки]", _pmark_string, "Далее", "Назад");
- pmark_DeleteAllPVars(playerid);
- DeletePVar(playerid, "pmark_Playerid");
- DeletePVar(playerid, "PlayerMarkersRadiusList");
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Функция, в которой формируется список игроков для диалога "Индивидуальный радиус"
- stock ShowDialogPlayerMarkOptForPl(playerid)
- {
- new pmark_pVar_string[sizeof(pmark_pVar_prefix)+2],
- _pmark_string[20+(17+MAX_PLAYER_NAME+3+6)*30+5] = "• Введите ID игрока\n",
- _pmark_player_name[MAX_PLAYER_NAME],
- _pmark_iter_id,
- _pmark_pVar_id,
- _max_player_id = GetPlayerPoolSize();
- #if defined foreach
- if(!GetPVarInt(playerid, "PlayerMarkersRadiusList"))
- {
- foreach(new i: Player)
- {
- if(_pmark_pVar_id < 30)
- {
- _pmark_pVar_id++;
- format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, _pmark_pVar_id);
- SetPVarInt(playerid, pmark_pVar_string, i);
- GetPlayerName(i, _pmark_player_name, MAX_PLAYER_NAME);
- format(_pmark_string, sizeof(_pmark_string), "%s%i) %s [ID %d] : [%0.1fм]\n", _pmark_string, _pmark_pVar_id, _pmark_player_name, i, pMarkInfo[i][mark_radius]);
- }
- else
- {
- if(pmark_PlayersOnline > _pmark_pVar_id) strcat(_pmark_string, "Далее");
- break;
- }
- }
- }
- else
- {
- new _pmark_foreach_limit = (GetPVarInt(playerid, "PlayerMarkersRadiusList")+1)*30;
- foreach(new i: Player)
- {
- _pmark_iter_id++;
- if(_pmark_foreach_limit-_pmark_iter_id > 29) continue;
- if(_pmark_pVar_id < 30)
- {
- _pmark_pVar_id++;
- format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, _pmark_pVar_id);
- SetPVarInt(playerid, pmark_pVar_string, i);
- GetPlayerName(i, _pmark_player_name, MAX_PLAYER_NAME);
- format(_pmark_string, sizeof(_pmark_string), "%s%i) %s [ID %d] : [%0.1fм]\n", _pmark_string, _pmark_pVar_id, _pmark_player_name, i, pMarkInfo[i][mark_radius]);
- if(_max_player_id == i) strcat(_pmark_string, "\nНазад");
- }
- else
- {
- if(pmark_PlayersOnline > _pmark_pVar_id) strcat(_pmark_string, "Далее");
- strcat(_pmark_string, "\nНазад");
- break;
- }
- }
- }
- #else
- if(!GetPVarInt(playerid, "PlayerMarkersRadiusList"))
- {
- for(new i = 0; i <= _max_player_id; i++)
- {
- if(!IsPlayerConnected(i)) continue;
- if(_pmark_pVar_id < 30)
- {
- _pmark_pVar_id++;
- format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, _pmark_pVar_id);
- SetPVarInt(playerid, pmark_pVar_string, i);
- GetPlayerName(i, _pmark_player_name, MAX_PLAYER_NAME);
- format(_pmark_string, sizeof(_pmark_string), "%s%i) %s [ID %d] : [%0.1fм]\n", _pmark_string, _pmark_pVar_id, _pmark_player_name, i, pMarkInfo[i][mark_radius]);
- }
- else
- {
- if(pmark_PlayersOnline > _pmark_pVar_id) strcat(_pmark_string, "Далее");
- break;
- }
- }
- }
- else
- {
- new _pmark_foreach_limit = (GetPVarInt(playerid, "PlayerMarkersRadiusList")+1)*30;
- for(new i = 0; i <= _max_player_id; i++)
- {
- if(!IsPlayerConnected(i)) continue;
- _pmark_iter_id++;
- if(_pmark_foreach_limit-_pmark_iter_id > 29) continue;
- if(_pmark_pVar_id < 30)
- {
- _pmark_pVar_id++;
- format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, _pmark_pVar_id);
- SetPVarInt(playerid, pmark_pVar_string, i);
- GetPlayerName(i, _pmark_player_name, MAX_PLAYER_NAME);
- format(_pmark_string, sizeof(_pmark_string), "%s%i) %s [ID %d] : [%0.1fм]\n", _pmark_string, _pmark_pVar_id, _pmark_player_name, i, pMarkInfo[i][mark_radius]);
- if(_max_player_id == i) strcat(_pmark_string, "\nНазад");
- }
- else
- {
- if(pmark_PlayersOnline > _pmark_pVar_id) strcat(_pmark_string, "Далее");
- strcat(_pmark_string, "\nНазад");
- break;
- }
- }
- }
- #endif
- ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players, DIALOG_STYLE_LIST, "Индивидуальный радиус [Список игроков]", _pmark_string, "Выбрать", "Назад");
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- //Функция для удаления всех pVar, хранящих ID игроков из предыдущей функции
- stock pmark_DeleteAllPVars(playerid)
- {
- DeletePVar(playerid, "PlayerMarkers_Playerid_1");
- DeletePVar(playerid, "PlayerMarkers_Playerid_2");
- DeletePVar(playerid, "PlayerMarkers_Playerid_3");
- DeletePVar(playerid, "PlayerMarkers_Playerid_4");
- DeletePVar(playerid, "PlayerMarkers_Playerid_5");
- DeletePVar(playerid, "PlayerMarkers_Playerid_6");
- DeletePVar(playerid, "PlayerMarkers_Playerid_7");
- DeletePVar(playerid, "PlayerMarkers_Playerid_8");
- DeletePVar(playerid, "PlayerMarkers_Playerid_9");
- DeletePVar(playerid, "PlayerMarkers_Playerid_10");
- DeletePVar(playerid, "PlayerMarkers_Playerid_11");
- DeletePVar(playerid, "PlayerMarkers_Playerid_12");
- DeletePVar(playerid, "PlayerMarkers_Playerid_13");
- DeletePVar(playerid, "PlayerMarkers_Playerid_14");
- DeletePVar(playerid, "PlayerMarkers_Playerid_15");
- DeletePVar(playerid, "PlayerMarkers_Playerid_16");
- DeletePVar(playerid, "PlayerMarkers_Playerid_17");
- DeletePVar(playerid, "PlayerMarkers_Playerid_18");
- DeletePVar(playerid, "PlayerMarkers_Playerid_19");
- DeletePVar(playerid, "PlayerMarkers_Playerid_20");
- DeletePVar(playerid, "PlayerMarkers_Playerid_21");
- DeletePVar(playerid, "PlayerMarkers_Playerid_22");
- DeletePVar(playerid, "PlayerMarkers_Playerid_23");
- DeletePVar(playerid, "PlayerMarkers_Playerid_24");
- DeletePVar(playerid, "PlayerMarkers_Playerid_25");
- DeletePVar(playerid, "PlayerMarkers_Playerid_26");
- DeletePVar(playerid, "PlayerMarkers_Playerid_27");
- DeletePVar(playerid, "PlayerMarkers_Playerid_28");
- DeletePVar(playerid, "PlayerMarkers_Playerid_29");
- DeletePVar(playerid, "PlayerMarkers_Playerid_30");
- return 1;
- }
- /*============================================================================
- ==============================================================================
- ============================================================================*/
- // Инклюд написан специально для тебя. Добра
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement