Advertisement
Guest User

Admin Teleport System by Twixxx (Twixyck)

a guest
Jun 3rd, 2017
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 11.43 KB | None | 0 0
  1. const
  2.     MAX_ADMIN_TELEPORTS = 2, // Максимальное количество телепортов. При добавлении нового телепорта инкрементируйте данное значение (добавляйте +1 к значению).
  3.     MAX_ADMIN_TELEPORT_NAME = 17, // Максимальное количество символов в названии телепорта
  4.     MAX_AT_SECTIONS_NAME = 28; // Максимальное количество символов в названии раздела телепортов
  5.  
  6. enum e_DIALOG_IDS
  7. {
  8.     dAdmin_TpMenu_Main,
  9.     dAdmin_TpMenu_PopularPlaces
  10. };
  11.  
  12. enum e_ADMIN_TELEPORT_INFO
  13. {
  14.     atDynamicArea, // Идентификатор динамической зоны
  15.     atNumberOfPlayers // Количество игроков в динамической зоне
  16. };
  17. new atInfo[MAX_ADMIN_TELEPORTS][e_ADMIN_TELEPORT_INFO];
  18.  
  19. enum _:e_AT_SECTIONS_INFO
  20. {
  21.     POPULAR_PLACES
  22. };
  23.  
  24. new atSectionsInfo[e_AT_SECTIONS_INFO][MAX_AT_SECTIONS_NAME] =
  25. {
  26.     // В данный массив, при добавлении разделов, записывайте их названия
  27.     {"Часто посещаемые места"}
  28. };
  29.  
  30. enum e_ADMIN_TELEPORT_AREAS_INFO
  31. {
  32.     atType, // Тип телепорта (зоны). Пример: POPULAR_PLACES
  33.     atName[MAX_ADMIN_TELEPORT_NAME], // Название зоны, которые будет указано в диалоговом окне
  34.     atSecondName[MAX_ADMIN_TELEPORT_NAME], // Название зоны, которое будет указано при входе в зону
  35.  
  36.     Float:atTelepPosX, // Координата X для телепорта
  37.     Float:atTelepPosY, // Координата Y для телепорта
  38.     Float:atTelepPosZ, // Координата Z для телепорта
  39.     Float:atTelepPosA, // Угол поворота для телепорта
  40.  
  41.     Float:atMinPosX, // Минимальная координата X
  42.     Float:atMinPosY, // Минимальная координата Y
  43.     Float:atMaxPosX, // Максимальная координата X
  44.     Float:atMaxPosY, // Максимальная координата Y
  45.  
  46.     atTelepVirtualWorld, // Виртуальный мир, который распостранится на динамическую зону
  47.     atTelepInterior, // Интерьер динамической зоны
  48.  
  49.     atGreenZone // "Зелёная" (anti-dm) зона. Значения: 0 и 1. 0 - зона не является "зелёной". 1 - зона является "зелёной".
  50. };
  51.  
  52. new atData[MAX_ADMIN_TELEPORTS][e_ADMIN_TELEPORT_AREAS_INFO] =
  53. // Желательно придерживаться табличного вида, дабы самим потом было проще ориентироваться в массиве (на форуме этот код, скорее всего, превратится в кашу, но суть в том, чтоб все данные разделить по своим колонкам)
  54. {
  55.     // atType               atName          atSecondName    tpX             tpY                 tpZ             tpA             min_posX        min_posY            max_posX        max_posY        VW      Int     GZ
  56.     {POPULAR_PLACES,        "Мэрия LS",    "Мэрии LS",    1480.9125,      -1723.8544,         13.5469,        179.5673,       1433.0,         -1599.0,            1529.0,         -1759.0,        0,      0,      1},
  57.     {POPULAR_PLACES,        "ЖДЛС",         "ЖДЛС",         1581.7778,      -1618.1624,         13.3828,        192.1007,       1810.7983,      -1881.51780,        1759.7397,      -1942.9968,     0,      0,      1}
  58. };
  59.  
  60. new
  61.     Iterator:AdminTeleportAreas<MAX_ADMIN_TELEPORTS>, // Итератор, в котором хранятся созданые динамические зоны
  62.     p_green_zone_status[MAX_PLAYERS char];
  63.    
  64. // =============================================================================
  65. public OnGameModeInit()
  66. {
  67.     LoadAdminTeleports(); // Загружаем динамические зоны при запуске сервера
  68.     return 1;
  69. }
  70. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  71. {
  72.     if(p_green_zone_status{playerid} == 1) // Если игрок находится в "зелёной зоне"
  73.     {
  74.         if(GetPVarInt(playerid, "damage_in_green_zone") < 2) // Если попыток нанести урон игрокам меньше 2 (0 или 1)
  75.         {
  76.             SendClientMessage(playerid, -1, !"SERVER: На данной территории запрещено использовать оружие!"); // Выводим игроку предупреждение
  77.             TogglePlayerControllable(playerid, false); // Отключаем игркоу управление персонажем
  78.  
  79.             SetTimerEx("UnFreezePlayer", 3500, false, "d", playerid); // Запускаем таймер для "разморозки" игрока на 3500мс (3.5 секунд)
  80.             SetPVarInt(playerid, "damage_in_green_zone", GetPVarInt(playerid, "damage_in_green_zone")+1); // Инкрементируем количество попыток нанести урон
  81.         }
  82.         else // Если же количество попыток нанести урон == 2 (тоесть это уже будет 3 попытка)
  83.         {
  84.             SendClientMessage(playerid, -1, !"Вы были кикнуты. Причина: многократное использование оружия в зелёных зонах!"); // Выводим игроку предупреждение о том, что он был кикнут
  85.             Kick(playerid); // Кикаем игрока
  86.         }
  87.     }
  88.     return 1;
  89. }
  90.  
  91. forward UnFreezePlayer(playerid);
  92. public UnFreezePlayer(playerid) // Паблик "разморозки" игрока
  93.     return TogglePlayerControllable(playerid, true);
  94.    
  95. public OnPlayerEnterDynamicArea(playerid, areaid) // Когда игрок входит в динамическую зону
  96. {
  97.     foreach(new i: AdminTeleportAreas) // Перебираем все созданные нами зоны
  98.     {
  99.         if(areaid == atInfo[i][atDynamicArea]) // Если идентификатор динамической зоны совпадает с одним из идентификатором наших зон - идём дальше
  100.         {
  101.             atInfo[i][atNumberOfPlayers]++; // Инкрементируем количество игроков в указанной динамической зоне
  102.  
  103.             if(atData[i][atGreenZone] == 1) // Если зона, в которую вошёл игрок, является "зелёной" (anti-dm)
  104.             {
  105.                 p_green_zone_status{playerid} = 1; // Устанавливаем игроку статус "находится в зелёной зоне"
  106.                 SetPVarInt(playerid, "damage_in_green_zone", 0); // Устанавливаем игроку количество попыток нанести урон в "зелёной зоне" на 0
  107.             }
  108.             return 1;
  109.         }
  110.     }
  111.     return 1;
  112. }
  113. public OnPlayerLeaveDynamicArea(playerid, areaid) // Когда игрок покидает динамическую зону
  114. {
  115.     foreach(new i: AdminTeleportAreas) // Перебираем все созданные нами зоны
  116.     {
  117.         if(areaid == atInfo[i][atDynamicArea]) // Если идентификатор динамической зоны совпадает с одним из идентификатором наших зон - идём дальше
  118.         {
  119.             atInfo[i][atNumberOfPlayers]--; // Декрементируем количество игроков в указанной динамической зоне
  120.  
  121.             if(atData[i][atGreenZone] == 1) // Если зона, из которой вышел игрок, является "зелёной" (anti-dm)
  122.             {
  123.                 p_green_zone_status{playerid} = 0; // Устанавливаем игроку статус "не находится в зелёной зоне"
  124.                 DeletePVar(playerid, "damage_in_green_zone"); // Удаляем PVar с информацией о количестве попыток нанести урон в "зелёной зоне"
  125.             }
  126.             return 1;
  127.         }
  128.     }
  129.     return 1;
  130. }
  131. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  132. {
  133.     switch(dialogid)
  134.     {
  135.         case dAdmin_TpMenu_Main:
  136.         {
  137.             if(!response)
  138.                 return 1;
  139.  
  140.             SetPVarInt(playerid, "atSectionID", listitem);
  141.  
  142.             static
  143.                 dialog_string[(63+MAX_ADMIN_TELEPORT_NAME+(11+3)+3)*MAX_ADMIN_TELEPORTS+1],
  144.                 header_string[30+sizeof(atSectionsInfo[])+1];
  145.  
  146.             dialog_string = "Наименование\tРасстояние до точки\tИгроков\tЗелёная зона\n";//44
  147.             for(new i; i < MAX_ADMIN_TELEPORTS; i++)
  148.             {
  149.                 if(atData[i][atType] != listitem)
  150.                     continue;
  151.  
  152.                 format(dialog_string, sizeof(dialog_string), "%s%s\t%.2fм\t%d\t%s\n",
  153.                     dialog_string,
  154.                     atData[i][atName],
  155.                     GetPlayerDistanceFromPoint(playerid, atData[i][atTelepPosX], atData[i][atTelepPosY], atData[i][atTelepPosZ]),
  156.                     atInfo[i][atNumberOfPlayers], (atData[i][atGreenZone] ? "Да" : "Нет"));
  157.             }
  158.             header_string = "Телепорт администрации: ";
  159.             strcat(header_string, atSectionsInfo[listitem]);
  160.             ShowPlayerDialog(playerid, dAdmin_TpMenu_PopularPlaces, DIALOG_STYLE_TABLIST_HEADERS, header_string, dialog_string, "Выбрать", "Назад");
  161.             return 1;
  162.         }
  163.         case dAdmin_TpMenu_PopularPlaces:
  164.         {
  165.             if(!response)
  166.                 return ShowAdminTeleportDialog(playerid);
  167.                
  168.             for(new i, num; i < MAX_ADMIN_TELEPORTS; i++)
  169.             {
  170.                 if(atData[i][atType] != GetPVarInt(playerid, "atSectionID"))
  171.                     continue;
  172.                    
  173.                 if(num++ == listitem)
  174.                 {
  175.                     SetPlayerPosEx(playerid, atData[i][atTelepPosX], atData[i][atTelepPosY], atData[i][atTelepPosZ]);
  176.                     if(floatcmp(atData[i][atTelepPosA], 0.0) == 1)
  177.                     {
  178.                         SetPlayerFacingAngle(playerid, atData[i][atTelepPosA]);
  179.                     }
  180.                     SetCameraBehindPlayer(playerid);
  181.                     break;
  182.                 }
  183.             }
  184.             return 1;
  185.         }
  186.     }
  187.     return 1;
  188. }
  189. // =============================================================================
  190. CMD:teleport(playerid, params[])
  191. {
  192.     ShowAdminTeleportDialog(playerid);
  193.     return 1;
  194. }
  195. // =============================================================================
  196. stock ShowAdminTeleportDialog(playerid)
  197. {
  198.     DeletePVar(playerid, "atSectionID");
  199.    
  200.     new
  201.         dialog_string[(3+sizeof(atSectionsInfo[]))*sizeof(atSectionsInfo)+1];
  202.  
  203.     for(new i; i < sizeof(atSectionsInfo); i++)
  204.     {
  205.         format(dialog_string, sizeof(dialog_string), "%s— %s\n", dialog_string, atSectionsInfo[i]);
  206.     }
  207.     ShowPlayerDialog(playerid, dAdmin_TpMenu_Main, DIALOG_STYLE_LIST, "Телепорт администрации", dialog_string, "Выбрать", "Отмена");
  208.     return 1;
  209. }
  210. stock LoadAdminTeleports()
  211. {
  212.     for(new i; i < MAX_ADMIN_TELEPORTS; i++)
  213.     {
  214.         Iter_Add(AdminTeleportAreas, i);
  215.  
  216.         atInfo[i][atDynamicArea] = CreateDynamicRectangle(atData[i][atMinPosX], atData[i][atMinPosY], atData[i][atMaxPosX], atData[i][atMaxPosY], 0, 0, -1);
  217.     }
  218.     printf("TOTAL_ADMIN_AREAS_LOADED: %d\n", Iter_Count(AdminTeleportAreas));
  219.     return 1;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement