Приветствую пользователей портала, на некоторых проектах видел такую систему: если вы отбегаете слишком далеко от места своей работы - вас автоматически увольняет. Такая штука сделана для работ для новичков. В некоторых модах видел очень нерациональный вариант реализации системы на таймерах. На самом деле всё проще
Использовать будем плагин streamer.
В начале мода
new workzone; //создаём глобальную переменную, которая будет хранить номер зоны стримера (areaid)
//В дальнейшем поймёте для чего она нужна
Затем в OnGameModeInit создаём так называемую dynamic area
//В данном случае мы будем использовать функцию CreateDynamicCircle, она как мне кажется является самой удобной, давайте разберём её аргументы
/*CreateDynamicCircle(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1, playerid = -1);
Float:x, Float:y - координаты середины круга (зоны) по осям X и Y
Float:size - диаметр круга (этой динамической зоны)
Прошу обратить внимание, что мы указываем именно диаметр, а не радиус. Это значит от наших координат до края круга будет половина указанной величины
worldid - ид виртуального мира, в котором будет находится данная зона
interiorid - ид интерьера, в котором будет находится данная зона
playerid - id игрока (если мы хотим создать зону для какого-либо конкретного игрока)*/
//Теперь создадим саму зону. Мы приравниваем созданную нами ранее переменную к функции создания зоны (в переменной теперь будет храниться areaid)
workzone = CreateDynamicCircle(координата x, координата y, Диаметр, ид вирт. мира, ид интерьера, прикреплённый ид);
//Готовый код выглядит так:
workzone = CreateDynamicCircle(10.0, 20.0, 100.0, 0, 0, -1);
/*Данный код означает, что на координатах x: 10.0 ; y: 20.0 мы создали зону (Area), диаметр которой равен 100.0
Зона будет создана в 0 виртуальном мире (дефолт) и 0 ид интерьера (дефолт) для всех игроков (playerid = -1)*/
Затем в моде ищем OnPlayerLeaveDynamicArea, если такого паблика нет, то создаём его. (готовый код ниже)
public OnPlayerLeaveDynamicArea(playerid, areaid) //паблик, срабатывающий при выходе из динамических зон (Area)
{
if(areaid == workzone) //проверяем, если areaid является заранее созданной нами зоной, то выполняем код
{
if(/*проверка на то, работаем ли мы на данный момент*/)
{
//увольняем игрока
}
}
}
Таким образом без использования ежесекундных таймеров и других несуразных вещей мы реализовали данную систему.
Кстати, эти самые динамические зоны можно использовать повсеместно, к тому же есть огромное разнообразие вариантов формы зоны на карте (круг, цилиндр, куб и т.д.)
Использовать будем плагин streamer.
В начале мода
new workzone; //создаём глобальную переменную, которая будет хранить номер зоны стримера (areaid)
//В дальнейшем поймёте для чего она нужна
Затем в OnGameModeInit создаём так называемую dynamic area
//В данном случае мы будем использовать функцию CreateDynamicCircle, она как мне кажется является самой удобной, давайте разберём её аргументы
/*CreateDynamicCircle(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1, playerid = -1);
Float:x, Float:y - координаты середины круга (зоны) по осям X и Y
Float:size - диаметр круга (этой динамической зоны)
Прошу обратить внимание, что мы указываем именно диаметр, а не радиус. Это значит от наших координат до края круга будет половина указанной величины
worldid - ид виртуального мира, в котором будет находится данная зона
interiorid - ид интерьера, в котором будет находится данная зона
playerid - id игрока (если мы хотим создать зону для какого-либо конкретного игрока)*/
//Теперь создадим саму зону. Мы приравниваем созданную нами ранее переменную к функции создания зоны (в переменной теперь будет храниться areaid)
workzone = CreateDynamicCircle(координата x, координата y, Диаметр, ид вирт. мира, ид интерьера, прикреплённый ид);
//Готовый код выглядит так:
workzone = CreateDynamicCircle(10.0, 20.0, 100.0, 0, 0, -1);
/*Данный код означает, что на координатах x: 10.0 ; y: 20.0 мы создали зону (Area), диаметр которой равен 100.0
Зона будет создана в 0 виртуальном мире (дефолт) и 0 ид интерьера (дефолт) для всех игроков (playerid = -1)*/
Затем в моде ищем OnPlayerLeaveDynamicArea, если такого паблика нет, то создаём его. (готовый код ниже)
public OnPlayerLeaveDynamicArea(playerid, areaid) //паблик, срабатывающий при выходе из динамических зон (Area)
{
if(areaid == workzone) //проверяем, если areaid является заранее созданной нами зоной, то выполняем код
{
if(/*проверка на то, работаем ли мы на данный момент*/)
{
//увольняем игрока
}
}
}
Таким образом без использования ежесекундных таймеров и других несуразных вещей мы реализовали данную систему.
Кстати, эти самые динамические зоны можно использовать повсеместно, к тому же есть огромное разнообразие вариантов формы зоны на карте (круг, цилиндр, куб и т.д.)
Последнее редактирование модератором: