Advertisement
-DeimoS-

Управление маркерами игроков на радаре [SA-MP]

Jul 14th, 2016
895
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 49.94 KB | None | 0 0
  1. /*
  2.     Инклюд, расширяющий возможности настройки маркеров игроков, добавляющий такие возможности, как:
  3.         • Изменение радиуса отображения маркеров* прямо в игре (не требует рестарта)
  4.             - Изменение радиуса для всех игроков (онлайн/оффлайн)
  5.             - Изменение радиуса только для игроков, находящихся на сервере
  6.             - Ииззменение радиуса только игрокам, которые ещё не зашли на сервер
  7.             - Изменение радиуса для конкретного игрока
  8.    
  9.     *Маркеры игроков - это квадратные метки на карте, которые указывают местоположение того или иного игрока остальным
  10.    
  11.  
  12.     Для правильной работы системы требуется убрать (если имеется) из OnGameModeInit следующие функции:
  13.     - ShowPlayerMarkers
  14.     - LimitPlayerMarkerRadius
  15.  
  16.     Автор: DeimoS
  17.     Указание авторства при использовании инклюда/его отдельной части даёт плюс к карме.
  18.     Кря
  19. */
  20. /*==========================================================================*/
  21. // В данном макросе указан радиус, который будет выдан всем по умолчанию
  22. #if !defined DEFAULT_PLAYER_MARKER_RADIUS
  23.     #define DEFAULT_PLAYER_MARKER_RADIUS 100.0
  24. #endif
  25. /*==========================================================================*/
  26. // В данном макросе указано минимальное значение для радиуса
  27. #if !defined MIN_PLAYER_MARKER_RADIUS
  28.     #define MIN_PLAYER_MARKER_RADIUS 1.0
  29. #endif 
  30. /*==========================================================================*/
  31. // В данном макросе указано максимальное значение для радиуса
  32. // 8516.0 - округлённое расстояние от вернего левого угла карты дл правого нижнего
  33. // Думаю, такого расстояния хватит с лихвой
  34. #if !defined MAX_PLAYER_MARKER_RADIUS
  35.     #define MAX_PLAYER_MARKER_RADIUS 8516.0
  36. #endif
  37. /*==========================================================================*/ 
  38. // Всё, что находится ниже, является неким подобием автоопределения ID диалогов
  39.  
  40. /* Если, при подключении инклюда к моду, указать следующие макросы:
  41. --------------------------------------
  42. #define     AUTOMATIC_MARKER_DIALOG_ID      1
  43. #include <ds_markers>
  44. --------------------------------------
  45. Все диалоги, присутствующие в инклюде, займут последние ID на сервере (32766, 32765, 32764, 32763 и т.п.)
  46.  
  47. Так же можно самостоятельно указать ID каждого диалога. Для этого достаточно прописать следующие макросы:
  48. ----------------------------------------------------------
  49. #define     dPlMarkMenu_Radius                  666
  50. #define     dPlMarkMenu_Radius_All              667
  51. #define     dPlMarkMenu_Radius_Online           668
  52. #define     dPlMarkMenu_Radius_Offline          669
  53. #define     dPlMarkMenu_Radius_Players          670
  54. #define     dPlMarkMenu_Radius_Players_ID       671
  55. #define     dPlMarkMenu_Radius_Players_Rad      672
  56. #define     dPlMarkMenu_PlayerRadius_ID         673
  57.  
  58. #include <ds_markers>  
  59. ----------------------------------------------------------*/   
  60. #if defined AUTOMATIC_MARKER_DIALOG_ID 
  61.  
  62.     #if !defined DEFAULT_MARKER_DIALOG_ID
  63.         #define     DEFAULT_MARKER_DIALOG_ID    32766  
  64.     #endif
  65.  
  66.     #define     dPlMarkMenu_Radius                  DEFAULT_MARKER_DIALOG_ID
  67.     #define     dPlMarkMenu_Radius_All              DEFAULT_MARKER_DIALOG_ID-1
  68.     #define     dPlMarkMenu_Radius_Online           DEFAULT_MARKER_DIALOG_ID-2
  69.     #define     dPlMarkMenu_Radius_Offline          DEFAULT_MARKER_DIALOG_ID-3
  70.     #define     dPlMarkMenu_Radius_Players          DEFAULT_MARKER_DIALOG_ID-4
  71.     #define     dPlMarkMenu_Radius_Players_ID       DEFAULT_MARKER_DIALOG_ID-5
  72.     #define     dPlMarkMenu_Radius_Players_Rad      DEFAULT_MARKER_DIALOG_ID-6
  73.     #define     dPlMarkMenu_PlayerRadius_ID         DEFAULT_MARKER_DIALOG_ID-7
  74. #endif     
  75. /*==========================================================================*/ 
  76. // В данном макросе указывается ID диалога: Метки на радаре [Настройки]
  77. #if !defined dPlMarkMenu_Radius
  78.     #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius"
  79. #endif
  80. /*==========================================================================*/
  81. // В данном макросе указывается ID диалога: Глобальный радиус
  82. #if !defined dPlMarkMenu_Radius_All
  83.     #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_All"
  84. #endif
  85. /*==========================================================================*/
  86. // В данном макросе указывается ID диалога: Глобальный радиус (онлайн)
  87. #if !defined dPlMarkMenu_Radius_Online
  88.     #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Online"
  89. #endif
  90. /*==========================================================================*/
  91. // В данном макросе указывается ID диалога: Глобальный радиус (оффлайн)
  92. #if !defined dPlMarkMenu_Radius_Offline
  93.     #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Offline"
  94. #endif
  95. /*==========================================================================*/
  96. // В данном макросе указывается ID диалога: Индивидуальный радиус [Список игроков]
  97. #if !defined dPlMarkMenu_Radius_Players
  98.     #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Players"
  99. #endif
  100. /*==========================================================================*/
  101. // В данном макросе указывается ID диалога: Индивидуальный радиус [ID игрока]
  102. #if !defined dPlMarkMenu_Radius_Players_ID
  103.     #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Players_ID"
  104. #endif
  105. /*==========================================================================*/
  106. // В данном макросе указывается ID диалога: Индивидуальный радиус [Новое значение]
  107. #if !defined dPlMarkMenu_Radius_Players_Rad
  108.     #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_Radius_Players_Rad"
  109. #endif
  110. /*==========================================================================*/
  111. // В данном макросе указывается ID диалога, который показывается при нажатии на ник в диалоге "Индивидуальный радиус"
  112. #if !defined dPlMarkMenu_PlayerRadius_ID
  113.     #error For the system to work properly you must specify the ID of the dialogue "dPlMarkMenu_PlayerRadius_ID"
  114. #endif
  115. /*============================================================================
  116. ==============================================================================
  117. ============================================================================*/
  118. // Перечисление, в котором хранится вся нужная информация для динамических зон, через которые работает система
  119. enum e_PLAYER_MARKER_INFO
  120. {
  121.     mark_id,// ID динамической зоны
  122.     Float:mark_radius,// Радиус динамической зоны
  123.     transparent// Прозрачность ника игрока до скрытия его с радара
  124. }
  125. static pMarkInfo[MAX_PLAYERS][e_PLAYER_MARKER_INFO];
  126.  
  127. // В данную переменную записывается радиус для тех, кто онлайн
  128. static  Float:gGlobalMarkerRadius_Online = DEFAULT_PLAYER_MARKER_RADIUS,
  129. // В данную переменную записывается радиус для тех, кто оффлайн (значение для "Глобальный радиус" так же берётся отсюда)
  130.         Float:gGlobalMarkerRadius_Offline = DEFAULT_PLAYER_MARKER_RADIUS,
  131. // Данная переменная подсчитывает число игроков на сервере, которое нужно для правильного составления списка игроков в меню "Индивидуальный радиус"    
  132.         pmark_PlayersOnline = 0;
  133.  
  134. // В данном массиве записан общий для всех pVar префикс
  135. // pVar используются в составлении списка игроков в меню "Индивидуальный радиус"
  136. // И хранят ID игроков.
  137. static const pmark_pVar_prefix[] = "PlayerMarkers_Playerid_";      
  138. /*============================================================================
  139. ==============================================================================
  140. ============================================================================*/
  141. // Это перехват коллбэка OnGameModeInIt
  142. // В котором происходит настройка сервера для правильной работы системы (перевод маркеров в глобальный режим работы)
  143. // И сброс настроек самой системы
  144. public OnGameModeInit()
  145. {
  146.     ShowPlayerMarkers(PLAYER_MARKERS_MODE_GLOBAL);  
  147.     for(new i; i < sizeof(pMarkInfo); i++)
  148.     {
  149.         pMarkInfo[i][mark_id] = -1;
  150.         pMarkInfo[i][transparent] = 0xFF;
  151.         pMarkInfo[i][mark_radius] = DEFAULT_PLAYER_MARKER_RADIUS;
  152.     }      
  153.     #if defined pmark_OnGameModeInit
  154.         return pmark_OnGameModeInit();
  155.     #else
  156.         return 1;
  157.     #endif
  158. }
  159. #if defined _ALS_OnGameModeInit
  160.     #undef OnGameModeInit
  161. #else
  162.     #define _ALS_OnGameModeInit
  163. #endif
  164.  
  165. #define OnGameModeInit pmark_OnGameModeInit
  166. #if defined pmark_OnGameModeInit
  167.     forward pmark_OnGameModeInit();
  168. #endif
  169. /*============================================================================
  170. ==============================================================================
  171. ============================================================================*/
  172. // Это перехват коллбэка OnPlayerConnect
  173. // В котором так же устанавливаются "настройки" по умолчанию для массивов системы
  174. // И производится часть подсчёта онлайна
  175. public OnPlayerConnect(playerid)
  176. {
  177.     pMarkInfo[playerid][transparent] = 0xFF;
  178.     pMarkInfo[playerid][mark_radius] = gGlobalMarkerRadius_Offline;
  179.     pmark_PlayersOnline++;
  180.     #if defined pmark_OnPlayerConnect
  181.         return pmark_OnPlayerConnect(playerid);
  182.     #else
  183.         return 1;
  184.     #endif
  185. }
  186. #if defined _ALS_OnPlayerConnect
  187.     #undef OnPlayerConnect
  188. #else
  189.     #define _ALS_OnPlayerConnect
  190. #endif
  191.  
  192. #define OnPlayerConnect pmark_OnPlayerConnect
  193. #if defined pmark_OnPlayerConnect
  194.     forward pmark_OnPlayerConnect(playerid);
  195. #endif
  196. /*============================================================================
  197. ==============================================================================
  198. ============================================================================*/
  199. // Это перехват коллбэка OnPlayerDisconnect
  200. // В котором удаляется созданная динамическая зона
  201. // И так же происходит подсчёт онлайна
  202. public OnPlayerDisconnect(playerid, reason)
  203. {
  204.     if(pMarkInfo[playerid][mark_id] != -1)
  205.     {
  206.         DestroyDynamicArea(pMarkInfo[playerid][mark_id]);
  207.         pMarkInfo[playerid][mark_id] = -1;
  208.     }
  209.     pmark_PlayersOnline--;
  210.     #if defined pmark_OnPlayerDisconnect
  211.         return pmark_OnPlayerDisconnect(playerid, reason);
  212.     #else
  213.         return 1;
  214.     #endif
  215. }
  216. #if defined _ALS_OnPlayerDisconnect
  217.     #undef OnPlayerDisconnect
  218. #else
  219.     #define _ALS_OnPlayerDisconnect
  220. #endif
  221.  
  222. #define OnPlayerDisconnect pmark_OnPlayerDisconnect
  223. #if defined pmark_OnPlayerDisconnect
  224.     forward pmark_OnPlayerDisconnect(playerid, reason);
  225. #endif 
  226. /*============================================================================
  227. ==============================================================================
  228. ============================================================================*/
  229. // Это перехват коллбэка OnPlayerSpawn
  230. // В котором происходит проверка того, создана ли динамическая зона для игрока
  231. // И если не создана - создаётся
  232. public OnPlayerSpawn(playerid)
  233. {
  234.     if(pMarkInfo[playerid][mark_id] == -1)
  235.     {
  236.         pMarkInfo[playerid][mark_id] = CreateDynamicSphere(0.0, 0.0, 0.0, pMarkInfo[playerid][mark_radius], -1, -1, -1);
  237.         AttachDynamicAreaToPlayer(pMarkInfo[playerid][mark_id], playerid);
  238.     }
  239.  
  240.    
  241.     #if defined pmark_OnPlayerSpawn
  242.         return pmark_OnPlayerSpawn(playerid);
  243.     #else
  244.         return 1;
  245.     #endif
  246. }
  247. #if defined _ALS_OnPlayerSpawn
  248.     #undef OnPlayerSpawn
  249. #else
  250.     #define _ALS_OnPlayerSpawn
  251. #endif
  252.  
  253. #define OnPlayerSpawn pmark_OnPlayerSpawn
  254. #if defined pmark_OnPlayerSpawn
  255.     forward pmark_OnPlayerSpawn(playerid);
  256. #endif
  257. /*============================================================================
  258. ==============================================================================
  259. ============================================================================*/
  260. // Это перехват коллбэка OnPlayerEnterDynamicArea
  261. // В котором происходит основная работа системы.
  262. // В случае с данным коллбэком - это показ маркера игроку другого игрока, в зону которого он зашёл
  263. public OnPlayerEnterDynamicArea(playerid, areaid)
  264. {
  265. #if defined foreach
  266.     foreach(new i: Player)
  267.     {
  268. #elseif defined GetPlayerPoolSize
  269.     for(new i = GetPlayerPoolSize(); i != -1; i--)
  270.     {
  271.         if(!IsPlayerConnected(i)) continue;
  272. #endif 
  273.         if(i == playerid) continue;
  274.         if(areaid != pMarkInfo[i][mark_id]) continue;
  275.         TogglePlayerOnMapForPlayer(playerid, i, true);
  276.  
  277.     }
  278.     #if defined pmark_OnPlayerEnterDynamicArea
  279.         return pmark_OnPlayerEnterDynamicArea(playerid, areaid);
  280.     #else
  281.         return 1;
  282.     #endif
  283. }
  284. #if defined _ALS_OnPlayerEnterDynamicArea
  285.     #undef OnPlayerEnterDynamicArea
  286. #else
  287.     #define _ALS_OnPlayerEnterDynamicArea
  288. #endif
  289.  
  290. #define OnPlayerEnterDynamicArea pmark_OnPlayerEnterDynamicArea
  291. #if defined pmark_OnPlayerEnterDynamicArea
  292.     forward pmark_OnPlayerEnterDynamicArea(playerid, areaid);
  293. #endif
  294. /*============================================================================
  295. ==============================================================================
  296. ============================================================================*/
  297. // Это перехват коллбэка OnPlayerLeaveDynamicArea
  298. // В котором происходит практически то же самое, только вместо показа, скрытие маркера
  299. public OnPlayerLeaveDynamicArea(playerid, areaid)
  300. {
  301. #if defined foreach
  302.     foreach(new i: Player)
  303.     {
  304. #elseif defined GetPlayerPoolSize
  305.     for(new i = GetPlayerPoolSize(); i != -1; i--)
  306.     {
  307.         if(!IsPlayerConnected(i)) continue;
  308. #endif 
  309.         if(i == playerid) continue;
  310.         if(areaid != pMarkInfo[i][mark_id]) continue;
  311.         TogglePlayerOnMapForPlayer(playerid, i, false);
  312.     }
  313.     #if defined pmark_OnPlayerLeaveDynamicArea
  314.         return pmark_OnPlayerLeaveDynamicArea(playerid, areaid);
  315.     #else
  316.         return 1;
  317.     #endif
  318. }
  319. #if defined _ALS_OnPlayerLeaveDynamicArea
  320.     #undef OnPlayerLeaveDynamicArea
  321. #else
  322.     #define _ALS_OnPlayerLeaveDynamicArea
  323. #endif
  324.  
  325. #define OnPlayerLeaveDynamicArea pmark_OnPlayerLeaveDynamicArea
  326. #if defined pmark_OnPlayerLeaveDynamicArea
  327.     forward pmark_OnPlayerLeaveDynamicArea(playerid, areaid);
  328. #endif
  329. /*============================================================================
  330. ==============================================================================
  331. ============================================================================*/
  332. // Это перехват OnDialogResponse
  333. // В котором расписаны все действия для диалога с настройками и всех вложенных в него диалогов
  334. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  335. {
  336.     switch(dialogid)
  337.     {
  338.         case dPlMarkMenu_Radius:
  339.         {
  340.             if(!response)
  341.             {
  342.                 pmark_DeleteAllPVars(playerid);
  343.                 DeletePVar(playerid, "pmark_Playerid");
  344.                 DeletePVar(playerid, "PlayerMarkersRadiusList");
  345.                 return 1;
  346.             }
  347.             switch(listitem)
  348.             {
  349.                 case 0:
  350.                 {
  351.                     ShowPlayerDialog(playerid, dPlMarkMenu_Radius_All, DIALOG_STYLE_INPUT, "Глобальный радиус:",
  352.                         "{FFFFFF}Глобальный радиус - это радиус, который будет примерён ко всем игрокам \n(как уже играющим, так и тем, кто толшько войдёт).*\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
  353.                         \n\n*Для изменение радиуса отображения ника только игрокам, находящимся на сервере в данный момент, вернитесь назад и выберите пункт \"• Глобальный радиус (онлайн)\"\n\
  354.                         Для изменение радиуса отображения ника для игроков, которые только зайдут на сервер (на игроков онлайн изменение не распространится), вернитесь назад и выберите пункт \"• Глобальный радиус (оффлайн)\"", "Далее", "Назад");
  355.                 }
  356.                 case 1:
  357.                 {
  358.                     ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Online, DIALOG_STYLE_INPUT, "Глобальный радиус (онлайн):",
  359.                         "{FFFFFF}Глобальный радиус (онлайн) - это радиус, который будет примерён ко всем игрокам, которые находятся на сервере на данный момент \n(всем игрокам, которые войдут на сервер после изменений, будет выдан текущий радиус).*\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
  360.                         \n\n*Для изменение радиуса отображения ника всем игрока (и онлайн, и тем, кто ещё не вошёл) вернитесь назад и выберите пункт \"• Глобальный радиус\"\n\
  361.                         Для изменение радиуса отображения ника для игроков, которые только зайдут на сервер (на игроков онлайн изменение не распространится), вернитесь назад и выберите пункт \"• Глобальный радиус (оффлайн)\"", "Далее", "Назад");
  362.                 }
  363.                 case 2:
  364.                 {
  365.                     ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Offline, DIALOG_STYLE_INPUT, "Глобальный радиус (оффлайн):",
  366.                         "{FFFFFF}Глобальный радиус (оффлайн) - это радиус, который будет примерён ко всем игрокам, которые войдут на сервер после внесения данных изменений \n(на тех, кто находится на сервере в текущий момент времени, эти изменения не распространятся).*\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
  367.                         \n\n*Для изменение радиуса отображения ника всем игрока (и онлайн, и тем, кто ещё не вошёл) вернитесь назад и выберите пункт \"• Глобальный радиус\"\n\
  368.                         Для изменение радиуса отображения ника только игрокам, находящимся на сервере в данный момент, вернитесь назад и выберите пункт \"• Глобальный радиус (онлайн)\"", "Далее", "Назад");
  369.                 }
  370.                 case 3:
  371.                 {
  372.                     ShowDialogPlayerMarkOptForPl(playerid);
  373.                 }
  374.             }
  375.             return 1;
  376.         }
  377.         case dPlMarkMenu_Radius_All:
  378.         {
  379.             if(!response) return ShowDialogPlayerMarkerOptions(playerid);
  380.             new Float: pmark_radius = floatstr(inputtext)+0.000001;
  381.             if(floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == 1)
  382.             {
  383.                 ShowPlayerDialog(playerid, dPlMarkMenu_Radius_All, DIALOG_STYLE_INPUT, "Глобальный радиус:",
  384.                     "{FFFFFF}Глобальный радиус - это радиус, который будет примерён ко всем игрокам \n(как уже играющим, так и тем, кто толшько войдёт).*{FF0000}\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
  385.                     \n\n{FFFFFF}*Для изменение радиуса отображения ника только игрокам, находящимся на сервере в данный момент, вернитесь назад и выберите пункт \"• Глобальный радиус (онлайн)\"\n\
  386.                     Для изменение радиуса отображения ника для игроков, которые только зайдут на сервер (на игроков онлайн изменение не распространится), вернитесь назад и выберите пункт \"• Глобальный радиус (оффлайн)\"", "Далее", "Назад");
  387.                 return 1;
  388.             }
  389.             gGlobalMarkerRadius_Online = pmark_radius;
  390.             gGlobalMarkerRadius_Offline = pmark_radius;
  391.             SetMarkerDrawDistanceForAll(pmark_radius);
  392.             UpdateMarkerRadiusForAll();
  393.             new _pmark_string[63+6+1];
  394.             format(_pmark_string, sizeof(_pmark_string), "[Глобальный радиус] Изменения успешно внесены. Новый радиус - %0.1fм", pmark_radius);
  395.             SendClientMessage(playerid, -1, _pmark_string);
  396.             return 1;
  397.         }
  398.         case dPlMarkMenu_Radius_Online:
  399.         {
  400.             if(!response) return ShowDialogPlayerMarkerOptions(playerid);
  401.             new Float: pmark_radius = floatstr(inputtext)+0.000001;
  402.             if(floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == 1)
  403.             {
  404.                 ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Online, DIALOG_STYLE_INPUT, "Глобальный радиус (онлайн):",
  405.                     "{FFFFFF}Глобальный радиус (онлайн) - это радиус, который будет примерён ко всем игрокам, которые находятся на сервере на данный момент \n(всем игрокам, которые войдут на сервер после изменений, будет выдан текущий радиус).*{FF0000}\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
  406.                     \n\n{FFFFFF}*Для изменение радиуса отображения ника всем игрока (и онлайн, и тем, кто ещё не вошёл) вернитесь назад и выберите пункт \"• Глобальный радиус\"\n\
  407.                     Для изменение радиуса отображения ника для игроков, которые только зайдут на сервер (на игроков онлайн изменение не распространится), вернитесь назад и выберите пункт \"• Глобальный радиус (оффлайн)\"", "Далее", "Назад");
  408.                 return 1;
  409.             }
  410.             gGlobalMarkerRadius_Online = pmark_radius;
  411.             SetMarkerDrawDistanceForAll(pmark_radius, true);
  412.             UpdateMarkerRadiusForAll();
  413.             new _pmark_string[72+6+1];
  414.             format(_pmark_string, sizeof(_pmark_string), "[Глобальный радиус (онлайн)] Изменения успешно внесены. Новый радиус - %0.1fм", pmark_radius);
  415.             SendClientMessage(playerid, -1, _pmark_string);
  416.             return 1;
  417.         }
  418.         case dPlMarkMenu_Radius_Offline:
  419.         {
  420.             if(!response) return ShowDialogPlayerMarkerOptions(playerid);
  421.             new Float: pmark_radius = floatstr(inputtext)+0.000001;
  422.             if(floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == 1)
  423.             {
  424.                 ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Offline, DIALOG_STYLE_INPUT, "Глобальный радиус (оффлайн):",
  425.                     "{FFFFFF}Глобальный радиус (оффлайн) - это радиус, который будет примерён ко всем игрокам, которые войдут на сервер после внесения данных изменений \n(на тех, кто находится на сервере в текущий момент времени, эти изменения не распространятся).*{FF0000}\nМинимальное значение - \"1.0\"\nМаксимальное - \"8516.0\"\
  426.                     \n\n{FFFFFF}*Для изменение радиуса отображения ника всем игрока (и онлайн, и тем, кто ещё не вошёл) вернитесь назад и выберите пункт \"• Глобальный радиус\"\n\
  427.                     Для изменение радиуса отображения ника только игрокам, находящимся на сервере в данный момент, вернитесь назад и выберите пункт \"• Глобальный радиус (онлайн)\"", "Далее", "Назад");
  428.                 return 1;
  429.             }
  430.             gGlobalMarkerRadius_Offline = pmark_radius;
  431.             new _pmark_string[73+6+1];
  432.             format(_pmark_string, sizeof(_pmark_string), "[Глобальный радиус (оффлайн)] Изменения успешно внесены. Новый радиус - %0.1fм", pmark_radius);
  433.             SendClientMessage(playerid, -1, _pmark_string);
  434.             return 1;
  435.         }
  436.         case dPlMarkMenu_Radius_Players:
  437.         {
  438.             if(!response) return ShowDialogPlayerMarkerOptions(playerid);
  439.             switch(listitem)
  440.             {
  441.                 case 0:
  442.                 {
  443.                     ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_ID, DIALOG_STYLE_INPUT, "Индивидуальный радиус [ID игрока]", "Введите ID игрока, которому Вы желаете изменить радиус отображения маркера:", "Далее", "Назад");
  444.                     return pmark_DeleteAllPVars(playerid);
  445.                 }
  446.                 case 1..30:
  447.                 {
  448.                     new pmark_pVar_string[sizeof(pmark_pVar_prefix)+2];
  449.                     format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, listitem);
  450.                     new pmark_playerid = GetPVarInt(playerid, pmark_pVar_string);
  451.                     pmark_DeleteAllPVars(playerid);
  452.                     if(!strcmp(inputtext, "Назад"))
  453.                     {
  454.                         if(GetPVarInt(playerid, "PlayerMarkersRadiusList") <= 1) DeletePVar(playerid, "PlayerMarkersRadiusList");
  455.                         else SetPVarInt(playerid, "PlayerMarkersRadiusList", GetPVarInt(playerid, "PlayerMarkersRadiusList")-1);
  456.                         return ShowDialogPlayerMarkOptForPl(playerid);
  457.                     }
  458.                     SetPVarInt(playerid, "pmark_Playerid", pmark_playerid);
  459.  
  460.                     new pmark_string[139+MAX_PLAYER_NAME+3+6];
  461.                     GetPlayerName(pmark_playerid, pmark_pVar_string, MAX_PLAYER_NAME);
  462.                     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]);
  463.                     return ShowPlayerDialog(playerid, dPlMarkMenu_PlayerRadius_ID, DIALOG_STYLE_INPUT, pmark_pVar_string, pmark_string, "Далее", "Назад");
  464.                 }
  465.                 case 31:
  466.                 {
  467.                     SetPVarInt(playerid, "PlayerMarkersRadiusList", GetPVarInt(playerid, "PlayerMarkersRadiusList")+1);
  468.                     return ShowDialogPlayerMarkOptForPl(playerid);
  469.                 }
  470.                 default:
  471.                 {
  472.                     if(GetPVarInt(playerid, "PlayerMarkersRadiusList") <= 1) DeletePVar(playerid, "PlayerMarkersRadiusList");
  473.                     else SetPVarInt(playerid, "PlayerMarkersRadiusList", GetPVarInt(playerid, "PlayerMarkersRadiusList")-1);
  474.                     return ShowDialogPlayerMarkOptForPl(playerid);
  475.                 }
  476.             }
  477.         }
  478.         case dPlMarkMenu_PlayerRadius_ID:
  479.         {
  480.             if(!response) return ShowDialogPlayerMarkOptForPl(playerid);
  481.             new pmark_playerid = GetPVarInt(playerid, "pmark_Playerid");   
  482.             DeletePVar(playerid, "pmark_Playerid");
  483.             new pmark_string[139+MAX_PLAYER_NAME+3+6+8];
  484.  
  485.             if(!strlen(inputtext))
  486.             {
  487.                 GetPlayerName(pmark_playerid, pmark_string, MAX_PLAYER_NAME);
  488.                 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]);
  489.                 return ShowPlayerDialog(playerid, dPlMarkMenu_PlayerRadius_ID, DIALOG_STYLE_INPUT, "Ошибка:", pmark_string, "Далее", "Назад");
  490.             }
  491.  
  492.             new Float: pmark_radius = floatstr(inputtext)+0.000001;
  493.             if(floatcmp(pmark_radius, MIN_PLAYER_MARKER_RADIUS) == -1 || floatcmp(pmark_radius, MAX_PLAYER_MARKER_RADIUS) == 1)
  494.             {
  495.                 GetPlayerName(pmark_playerid, pmark_string, MAX_PLAYER_NAME);
  496.                 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]);
  497.                 return ShowPlayerDialog(playerid, dPlMarkMenu_PlayerRadius_ID, DIALOG_STYLE_INPUT, "Ошибка:", pmark_string, "Далее", "Назад");
  498.             }
  499.            
  500.             GetPlayerName(pmark_playerid, pmark_string, MAX_PLAYER_NAME);
  501.             format(pmark_string, sizeof(pmark_string), "Радиус для игрока %s [ID: %d] успешно изменён с %0.1fм на %0.1fм", pmark_string, pmark_playerid, pMarkInfo[pmark_playerid][mark_radius], pmark_radius);      
  502.             SendClientMessage(playerid, -1, pmark_string);
  503.  
  504.             SetMarkerDrawDistanceForPlayer(pmark_playerid, pmark_radius);
  505.             UpdateMarkerRadiusForPlayer(pmark_playerid);
  506.             DeletePVar(playerid, "PlayerMarkersRadiusList");
  507.             return 1;
  508.         }
  509.         case dPlMarkMenu_Radius_Players_ID:
  510.         {
  511.             if(!response) return ShowDialogPlayerMarkOptForPl(playerid);
  512.             if(!strlen(inputtext)) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_ID, DIALOG_STYLE_INPUT, "Индивидуальный радиус [ID игрока]", "Введите ID игрока, которому Вы желаете изменить радиус отображения маркера:", "Далее", "Назад");
  513.             new pmark_playerid = strval(inputtext);
  514.             if(!IsPlayerConnected(pmark_playerid)) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_ID, DIALOG_STYLE_INPUT, "Индивидуальный радиус [ID игрока]", "Игрок с указанным ID не найден на сервере!\n\nВведите ID игрока, которому Вы желаете изменить радиус отображения маркера:", "Далее", "Назад");
  515.             ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_Rad, DIALOG_STYLE_INPUT, "Индивидуальный радиус [Новое значение]", "Введите радиус, который Вы желлаете установить данному игроку:\n\nМинимальное значение - 1.0\nМаксимальное - 8516.0", "Далее", "Назад");
  516.             SetPVarInt(playerid, "pmark_Playerid", pmark_playerid);
  517.             return 1;
  518.         }
  519.         case dPlMarkMenu_Radius_Players_Rad:
  520.         {
  521.             if(!response) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_ID, DIALOG_STYLE_INPUT, "Индивидуальный радиус [Новое значение]", "Введите ID игрока, которому Вы желаете изменить радиус отображения маркера:", "Далее", "Назад"), DeletePVar(playerid, "pmark_Playerid");
  522.             if(!strlen(inputtext)) return ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players_Rad, DIALOG_STYLE_INPUT, "Индивидуальный радиус [Новое значение]", "Введите радиус, который Вы желлаете установить данному игроку:\n\nМинимальное значение - 1.0\nМаксимальное - 8516.0", "Далее", "Назад");
  523.             new Float: pmark_radius = floatstr(inputtext)+0.000001;
  524.             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", "Далее", "Назад");   
  525.            
  526.             new pmark_string[139+MAX_PLAYER_NAME+3+6+8];
  527.             GetPlayerName(GetPVarInt(playerid, "pmark_Playerid"), pmark_string, MAX_PLAYER_NAME);
  528.             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);      
  529.             SendClientMessage(playerid, -1, pmark_string);
  530.  
  531.             SetMarkerDrawDistanceForPlayer(GetPVarInt(playerid, "pmark_Playerid"), pmark_radius);
  532.             UpdateMarkerRadiusForPlayer(GetPVarInt(playerid, "pmark_Playerid"));
  533.             DeletePVar(playerid, "pmark_Playerid");
  534.             DeletePVar(playerid, "PlayerMarkersRadiusList");
  535.             return 1;
  536.         }
  537.     }
  538.  
  539.     #if defined pmark_OnDialogResponse
  540.         return pmark_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);
  541.     #else
  542.         return 1;
  543.     #endif
  544. }
  545. #if defined _ALS_OnDialogResponse
  546.     #undef OnDialogResponse
  547. #else
  548.     #define _ALS_OnDialogResponse
  549. #endif
  550.  
  551. #define OnDialogResponse pmark_OnDialogResponse
  552. #if defined pmark_OnDialogResponse
  553.     forward pmark_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
  554. #endif
  555. /*============================================================================
  556. ==============================================================================
  557. ============================================================================*/
  558. // Это перехват функции SetPlayerColor
  559. // В котором идёт обновление данных в массиве "transparent" (который хранит прозрачность ника)
  560. stock pmark_SetPlayerColor(playerid, color)
  561. {
  562.     pMarkInfo[playerid][transparent] = color & 0xFF;
  563.     return SetPlayerColor(playerid, color);
  564. }
  565. #if defined _ALS_SetPlayerColor
  566.     #undef SetPlayerColor
  567. #else
  568.     #define _ALS_SetPlayerColor
  569. #endif
  570.  
  571. #define SetPlayerColor pmark_SetPlayerColor
  572. /*============================================================================
  573. ==============================================================================
  574. ============================================================================*/
  575. //Функция для включения/отключения видимости на радаре одного игрока для другого (основная функция, на которой всё построено)
  576. //
  577. //playerid - игрок, которому скрываем/показываем игрока
  578. //showplayerid - игрок, которого скрываем/показываем
  579. //bool:visible - режим (true - показать/false - скрыть)
  580. //
  581. //Функция работает путём изменения прозрачности цвета ника
  582. //Указывем "00" и игрока не видно на радаре. Любое, отличное от нуля значение, вернёт маркер игрока на радар
  583. stock TogglePlayerOnMapForPlayer(playerid, showplayerid, bool:visible)
  584. {
  585.     new map_color = GetPlayerColor(showplayerid);// Запишем текущий цвет игрока в переменную
  586.     if((map_color & 0xFF) != 0x00) // ?з этого цвета получим текущую прозрачность и если она не равна "00"
  587.         pMarkInfo[showplayerid][transparent] = map_color & 0xFF;// Значит у игрока не включена невидимость => сохраняем текущее значение прозрачности
  588.     SetPlayerMarkerForPlayer(playerid, showplayerid, (map_color | 0xFF) - (visible ? 0x00 : pMarkInfo[showplayerid][transparent]));
  589.     return 1;
  590. }
  591. /*============================================================================
  592. ==============================================================================
  593. ============================================================================*/
  594. //Аналог предыдущей функции, только игрок становится невидимым для всего сервера
  595. //
  596. //playerid - игрок, которого скрываем/показываем игрока
  597. //bool:visible - режим (true - показать/false - скрыть)
  598. stock TogglePlayerOnMap(playerid, bool:visible)
  599. {
  600.     SetPlayerColor(playerid,(GetPlayerColor(playerid) | 0xFF) - (visible ? 0x00 : 0xFF));
  601.     return 1;
  602. }  
  603. /*============================================================================
  604. ==============================================================================
  605. ============================================================================*/
  606. //Функция для изменения радиуса отрисовки собственного (!) маркера для других игроков
  607. //
  608. //playerid - игрок, которому изменяем радиус
  609. //Float: radius - Новое значение для радиуса
  610. //
  611. //Функция лишь меняет значение в переменной, хранящей текущий радиус игрока
  612. //Дабы изменения вступили в силу, следует, после вызова данной функции, вызвать
  613. //UpdateMarkerRadiusForPlayer или UpdateMarkerRadiusForAll
  614. stock SetMarkerDrawDistanceForPlayer(playerid, Float: radius)
  615. {
  616.     pMarkInfo[playerid][mark_radius] = radius;
  617.     return 1;
  618. }  
  619. /*============================================================================
  620. ==============================================================================
  621. ============================================================================*/
  622. //Аналог предыдущей функции, только действие распространяется на всех игроков
  623. //
  624. //Float: radius - Новое значение для радиуса, который будет установлен всем игрокам
  625. /*bool:mode - Режим работы функции
  626. false - работа функции распространяется на всех игроков (даже оффлайн) - включена по умолчанию
  627. true - работа функции распространяется только на игроков, находящихся на сервере*/
  628. stock SetMarkerDrawDistanceForAll(Float: radius, bool:mode = false)
  629. {
  630.     if(!mode)
  631.     {
  632.         for(new i; i < sizeof(pMarkInfo); i++)
  633.             pMarkInfo[i][mark_radius] = radius;
  634.     }
  635.     else
  636.     {
  637. #if defined foreach
  638.         foreach(new i: Player)
  639.         {
  640. #elseif defined GetPlayerPoolSize
  641.         for(new i = GetPlayerPoolSize(); i != -1; i--)
  642.         {
  643.             if(!IsPlayerConnected(i)) continue;
  644. #endif 
  645.             pMarkInfo[i][mark_radius] = radius;
  646.         }  
  647.     }
  648.     return 1;
  649. }
  650. /*============================================================================
  651. ==============================================================================
  652. ============================================================================*/
  653. //Функция для обновления динамической зоны конкретного игрока
  654. //
  655. //playerid - игрок, динамическая зона которого будет обновлена
  656. //
  657. //Функция нужна для того, чтоб изменения радиуса, после использования SetMarkerDrawDistanceForPlayer/SetMarkerDrawDistanceForAll
  658. //вступили в силу
  659. stock UpdateMarkerRadiusForPlayer(playerid)
  660. {
  661.     if(pMarkInfo[playerid][mark_id] == -1) return 0;
  662.     DestroyDynamicArea(pMarkInfo[playerid][mark_id]);
  663.     pMarkInfo[playerid][mark_id] = CreateDynamicSphere(0.0, 0.0, 0.0, pMarkInfo[playerid][mark_radius], -1, -1, -1);
  664.     AttachDynamicAreaToPlayer(pMarkInfo[playerid][mark_id], playerid);
  665.     return 1;
  666. }
  667. /*============================================================================
  668. ==============================================================================
  669. ============================================================================*/
  670. //Аналог предыдущей функции, распространяющийся не на одного игрока, а на всех (кто онлайн)
  671. stock UpdateMarkerRadiusForAll()
  672. {
  673. #if defined foreach
  674.     foreach(new i: Player)
  675.     {
  676. #elseif defined GetPlayerPoolSize
  677.     for(new i = GetPlayerPoolSize(); i != -1; i--)
  678.     {
  679.         if(!IsPlayerConnected(i)) continue;
  680. #endif 
  681.         if(pMarkInfo[i][mark_id] == -1) continue;
  682.         DestroyDynamicArea(pMarkInfo[i][mark_id]);
  683.         pMarkInfo[i][mark_id] = CreateDynamicSphere(0.0, 0.0, 0.0, pMarkInfo[i][mark_radius], -1, -1, -1);
  684.         AttachDynamicAreaToPlayer(pMarkInfo[i][mark_id], i);
  685.     }  
  686.     return 1;
  687. }
  688. /*============================================================================
  689. ==============================================================================
  690. ============================================================================*/
  691. //Функция, в которой "формируется" основной диалог, хранящий все настройки
  692. stock ShowDialogPlayerMarkerOptions(playerid)
  693. {
  694.     new _pmark_string[122+(6*3)+(8*6)+3+1];
  695.     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);
  696.     ShowPlayerDialog(playerid, dPlMarkMenu_Radius, DIALOG_STYLE_LIST, "Метки на радаре [Настройки]", _pmark_string, "Далее", "Назад");
  697.     pmark_DeleteAllPVars(playerid);
  698.     DeletePVar(playerid, "pmark_Playerid");
  699.     DeletePVar(playerid, "PlayerMarkersRadiusList");
  700.     return 1;
  701. }
  702. /*============================================================================
  703. ==============================================================================
  704. ============================================================================*/
  705. //Функция, в которой формируется список игроков для диалога "Индивидуальный радиус"
  706. stock ShowDialogPlayerMarkOptForPl(playerid)
  707. {
  708.     new pmark_pVar_string[sizeof(pmark_pVar_prefix)+2],
  709.         _pmark_string[20+(17+MAX_PLAYER_NAME+3+6)*30+5] = "• Введите ID игрока\n",
  710.         _pmark_player_name[MAX_PLAYER_NAME],
  711.         _pmark_iter_id,
  712.         _pmark_pVar_id,
  713.         _max_player_id = GetPlayerPoolSize();
  714. #if defined foreach
  715.     if(!GetPVarInt(playerid, "PlayerMarkersRadiusList"))
  716.     {
  717.         foreach(new i: Player)
  718.         {
  719.             if(_pmark_pVar_id < 30)
  720.             {  
  721.                 _pmark_pVar_id++;
  722.                 format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, _pmark_pVar_id);
  723.                 SetPVarInt(playerid, pmark_pVar_string, i);
  724.  
  725.                 GetPlayerName(i, _pmark_player_name, MAX_PLAYER_NAME);
  726.                 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]);
  727.             }
  728.             else
  729.             {
  730.                 if(pmark_PlayersOnline > _pmark_pVar_id) strcat(_pmark_string, "Далее");
  731.                 break;
  732.             }
  733.         }  
  734.     }  
  735.     else
  736.     {
  737.         new _pmark_foreach_limit = (GetPVarInt(playerid, "PlayerMarkersRadiusList")+1)*30;
  738.         foreach(new i: Player)
  739.         {
  740.             _pmark_iter_id++;
  741.             if(_pmark_foreach_limit-_pmark_iter_id > 29) continue;
  742.             if(_pmark_pVar_id < 30)
  743.             {  
  744.                 _pmark_pVar_id++;
  745.                 format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, _pmark_pVar_id);
  746.                 SetPVarInt(playerid, pmark_pVar_string, i);
  747.  
  748.                 GetPlayerName(i, _pmark_player_name, MAX_PLAYER_NAME);
  749.                 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]);
  750.                 if(_max_player_id == i) strcat(_pmark_string, "\nНазад");
  751.             }
  752.             else
  753.             {
  754.                 if(pmark_PlayersOnline > _pmark_pVar_id) strcat(_pmark_string, "Далее");
  755.                 strcat(_pmark_string, "\nНазад");
  756.                 break;
  757.             }
  758.         }      
  759.     }      
  760. #else
  761.     if(!GetPVarInt(playerid, "PlayerMarkersRadiusList"))
  762.     {
  763.         for(new i = 0; i <= _max_player_id; i++)
  764.         {
  765.             if(!IsPlayerConnected(i)) continue;
  766.             if(_pmark_pVar_id < 30)
  767.             {  
  768.                 _pmark_pVar_id++;
  769.                 format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, _pmark_pVar_id);
  770.                 SetPVarInt(playerid, pmark_pVar_string, i);
  771.  
  772.                 GetPlayerName(i, _pmark_player_name, MAX_PLAYER_NAME);
  773.                 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]);
  774.             }
  775.             else
  776.             {
  777.                 if(pmark_PlayersOnline > _pmark_pVar_id) strcat(_pmark_string, "Далее");
  778.                 break;
  779.             }
  780.         }  
  781.     }  
  782.     else
  783.     {
  784.         new _pmark_foreach_limit = (GetPVarInt(playerid, "PlayerMarkersRadiusList")+1)*30;
  785.  
  786.         for(new i = 0; i <= _max_player_id; i++)
  787.         {
  788.             if(!IsPlayerConnected(i)) continue;
  789.             _pmark_iter_id++;
  790.             if(_pmark_foreach_limit-_pmark_iter_id > 29) continue;
  791.  
  792.             if(_pmark_pVar_id < 30)
  793.             {  
  794.                 _pmark_pVar_id++;
  795.                 format(pmark_pVar_string, sizeof(pmark_pVar_string), "%s%d", pmark_pVar_prefix, _pmark_pVar_id);
  796.                 SetPVarInt(playerid, pmark_pVar_string, i);
  797.  
  798.                 GetPlayerName(i, _pmark_player_name, MAX_PLAYER_NAME);
  799.                 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]);
  800.                 if(_max_player_id == i) strcat(_pmark_string, "\nНазад");
  801.             }
  802.             else
  803.             {
  804.                 if(pmark_PlayersOnline > _pmark_pVar_id) strcat(_pmark_string, "Далее");
  805.                 strcat(_pmark_string, "\nНазад");
  806.                 break;
  807.             }
  808.         }      
  809.     }          
  810. #endif 
  811.     ShowPlayerDialog(playerid, dPlMarkMenu_Radius_Players, DIALOG_STYLE_LIST, "Индивидуальный радиус [Список игроков]", _pmark_string, "Выбрать", "Назад");
  812.     return 1;
  813. }
  814. /*============================================================================
  815. ==============================================================================
  816. ============================================================================*/
  817. //Функция для удаления всех pVar, хранящих ID игроков из предыдущей функции
  818. stock pmark_DeleteAllPVars(playerid)
  819. {
  820.     DeletePVar(playerid, "PlayerMarkers_Playerid_1");
  821.     DeletePVar(playerid, "PlayerMarkers_Playerid_2");
  822.     DeletePVar(playerid, "PlayerMarkers_Playerid_3");
  823.     DeletePVar(playerid, "PlayerMarkers_Playerid_4");
  824.     DeletePVar(playerid, "PlayerMarkers_Playerid_5");
  825.     DeletePVar(playerid, "PlayerMarkers_Playerid_6");
  826.     DeletePVar(playerid, "PlayerMarkers_Playerid_7");
  827.     DeletePVar(playerid, "PlayerMarkers_Playerid_8");
  828.     DeletePVar(playerid, "PlayerMarkers_Playerid_9");
  829.     DeletePVar(playerid, "PlayerMarkers_Playerid_10");
  830.     DeletePVar(playerid, "PlayerMarkers_Playerid_11");
  831.     DeletePVar(playerid, "PlayerMarkers_Playerid_12");
  832.     DeletePVar(playerid, "PlayerMarkers_Playerid_13");
  833.     DeletePVar(playerid, "PlayerMarkers_Playerid_14");
  834.     DeletePVar(playerid, "PlayerMarkers_Playerid_15");
  835.     DeletePVar(playerid, "PlayerMarkers_Playerid_16");
  836.     DeletePVar(playerid, "PlayerMarkers_Playerid_17");
  837.     DeletePVar(playerid, "PlayerMarkers_Playerid_18");
  838.     DeletePVar(playerid, "PlayerMarkers_Playerid_19");
  839.     DeletePVar(playerid, "PlayerMarkers_Playerid_20");
  840.     DeletePVar(playerid, "PlayerMarkers_Playerid_21");
  841.     DeletePVar(playerid, "PlayerMarkers_Playerid_22");
  842.     DeletePVar(playerid, "PlayerMarkers_Playerid_23");
  843.     DeletePVar(playerid, "PlayerMarkers_Playerid_24");
  844.     DeletePVar(playerid, "PlayerMarkers_Playerid_25");
  845.     DeletePVar(playerid, "PlayerMarkers_Playerid_26");
  846.     DeletePVar(playerid, "PlayerMarkers_Playerid_27");
  847.     DeletePVar(playerid, "PlayerMarkers_Playerid_28");
  848.     DeletePVar(playerid, "PlayerMarkers_Playerid_29");
  849.     DeletePVar(playerid, "PlayerMarkers_Playerid_30");
  850.     return 1;
  851. }
  852. /*============================================================================
  853. ==============================================================================
  854. ============================================================================*/
  855. // Инклюд написан специально для тебя. Добра
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement