Динамические Зоны (Streamer)

NozmaD

Администратор
Команда форума
Администратор
Сообщения
164
Баллы
208
Динамические зоны это как проверка на квадрат,круг или куб ( Например Система Ганг Зон в РП модах или PlayerToPoint ).
Например вам нужно создать PlayerToPoint и чтобы он каждую секунду проверял в этом радиусе каждого игрока, для этого требуется таймер,
с использованием динамических зон потребность в таймерах пропадет, они обновляются автоматически и не нагружают мод.

Есть несколько видов динамических зон:

Круг ( Проверка в радиусе от заданной координаты): Проверка на радиус задается только по координатам X и Y, работают на любой высоте
C++:
CreateDynamicCircle(Float:x, Float:y, Float:size, worldid, interiorid, playerid);

// Float:x        - Координата X
// Float:y        - Координата Y
// Float:size     - Радиус
// worldid        - ID виртуального мира  (-1 используется во всех мирах)
// interiorid     - ID интерьера  (-1 используется во всех интерьерах)
// playerid       - Можно использовать для определенного игрока (-1 используется для всех игроков)
Прямоугольная зона ( Проверка игрока в прямоугольной зоне): Нужно ввести 4 координаты например X: 5, Y:5 X -5, Y -5
C++:
CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid, interiorid, playerid);

// Float:minx     - Координата X  | точка 1
// Float:maxx     - Координата X     | точка 2
// Float:miny     - Координата Y  | точка 1
// Float:maxy     - Координата Y     | точка 2
// worldid         - ID виртуального мира (-1 используется во всех мирах)
// interiorid     - ID интерьера (-1 используется во всех интерьерах)
// playerid     - Можно использовать для определенного игрока (-1 используется для всех игроков)

Сфера ( Можно создать проверку игрока в таком себе шаре ): Указываете координаты X Y Z и Размер Шара
C++:
CreateDynamicSphere(Float:x, Float:y, Float:z, Float:size, worldid, interiorid, playerid);

// Float:x         - Координата X
// Float:y         - Координата Y
// Float:z         - Координата Z (Высота)
// Float:size     - Радиус
// worldid         - ID виртуального мира (-1 используется во всех мирах)
// interiorid     - ID интерьера (-1 используется во всех интерьерах)
// playerid     - Можно использовать для определенного игрока (-1 используется для всех игроков)

Куб ( Можно создать проверку игрока в кубе ): Указываете координаты минимальные XYZ и Обратно Максимальные этих же координат
C++:
CreateDynamicCube(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worldid, interiorid, playerid);

// Float:minx     - Координата X | точка 1
// Float:maxx     - Координата X | точка 2
// Float:miny     - Координата Y | точка 1
// Float:maxy     - Координата Y | точка 2
// Float:minz     - Координата Z | точка 1
// Float:maxz     - Координата Z | точка 2
// worldid         - Ид виртуального мира (-1 используется во всех мирах)
// interiorid     - Ид интерьера (-1 используется во всех интерьерах)
// playerid     - Можно использовать для определенного игрока (-1 используется для всех игроков)
Полигон:
Есть еще такая зона как полигон, и таким образом можно обвести любую зону но уже ломаными линиями.
Суть её изложу в скрине ниже.

C++:
CreateDynamicPolygon(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1, playerid = -1);


Просто ставит точки где вам угодно, и это будет ваша зона - полигон
Но как же эти точки вставить и создать зону а очень просто:
Есть программа которая делает все это за вас, вы просто создаете точки на карте и нажимаете Экспорт в .pwn файл:
Скачать программу:

Пожалуйста, Войдите или Зарегистрируйтесь, что бы увидеть скрытый контент.




Примеры

И на конец то мы подошли к разбору того как же это использовать в скриптинге.
Так же ниже опишу еще как прикрепить к машине или игроку такую зону.

Для начала нам нужно создать зону:

ко всем new:
C++:
new STREAMER_TAG_AREA zona1;
В OnGameModeInit:
C++:
zona1 = CreateDynamicCircle(Координата X, Координата Y, 50, 0, 0, -1); // Создали зону, проверка игрока в радиусе 50
Для проверки нахождения игрока в зоне есть два Паблика:
  • OnPlayerEnterDynamicArea(playerid, areaid) - Срабатывает когда игрок попадает в зону
  • OnPlayerLeaveDynamicArea(playerid, areaid) - Срабатывает когда игрок выходит с зоны

Пример:

C++:
public OnPlayerEnterDynamicArea(playerid, areaid)
{
   if(areaid == zona1)
   {
       SendClientMessage(playerid, -1, "Вы вошли в зону 1");
   }
   return 1;
}

public OnPlayerLeaveDynamicArea(playerid, areaid)
{
   if(areaid == zona1)
   {
       SendClientMessage(playerid, -1, "Вы покинули зону 1");
   }
   return 1;
}

Также вы можете прикрепить Зону к машине или игроку и проверить кто войдет в эту зону

Примечание: Можно использовать только зону Круг или Шар

У нас уже есть созданная выше зона давайте её прикрепим к машине и сделаем проверку

Команда (ZCMD/DC_CMD/Pawn.CMD и подобные):

C++:
CMD:vehzona(playerid,params[])
{
    new
        vID;
   
    if(sscanf(params, "d", vID))
    {
        SendClientMessage(playerid, -1, "Использование: /vehzona <ид авто>");
        return true;
    }
   
    AttachDynamicAreaToVehicle(zona1, vID);
    return true;
}
Теперь также будет показывать вы вошли или вышли с зоны


Функции для работы с данными зонами:
C++:
DestroyDynamicArea(areaid); // Удалить зону по её иду
IsValidDynamicArea(areaid); // Проверка на существование зоны по Иду
DestroyAllDynamicAreas(); // Удалить все созданные зоны
CountDynamicAreas(); // Посчитать Сколько есть всего зон
 
Автор
Alex_Lenez
Верх