Доброго времени суток, уважаемые пользователи портала.
Сегодня делюсь с вами ещё одной небольшой разработкой, которая, вполне возможно, может кому-либо пригодиться.
Описание:
• Данный инклуд был написан с целью упрощения работы с зелёными (anti-dm) зонами в SA:MP.
• При входе игрока в зелёную зону, полностью аннулирует его оружие и запоминает, после чего, при выходе из зелёной зоны, происходит возврат оружия.
• Фиксирует нажатие KEY_FIRE, если игрок находится в зелёной зоне.
Плюсы реализации:
• Оптимизированный код, не содержащий в себе ненужные/неиспользуемые функции/какой-либо мусор, etc.
• Используются исключительно динамические зоны - никаких сверок расстояния и прочей лабуды.
• Возможность добавления дополнительного функционала, в дальнейшем, без нужды в переписывании/рефакторинге большей части кода.
Минусы реализации:
• Не обнаружено (на данный момент).
Зависимости:
Использование:
• Переместить файл easy_greenzone.inc в папку с инклудами игрового мода (в большинстве случаев, это: /pawno/include).
• В используемом скрипте подключить инклуд easy_greenzone.inc и указать все необходимые настройки (см. ниже).
• В используемом скрипте объявить следующие функции: OnPlayerPressFireKeyInGreenZone, OnPlayerEnterGreenZone, OnPlayerLeaveGreenZone (см.ниже).
Подключение инклуда:
PHP код:
#define EG_MAX_GREEN_ZONES 2 // Максимальное количество зелёных зон (указывайте то количество, которое вы будете использовать)
#define EG_FIRE_KEY_TRIGGER_DELAY 5 // Указанный промежуток времени (в секундах), который будет фиксировать нажатие клавиши удара/выстрела в зелёной зоне (не ставьте маленькое значение, ибо может быть флуд срабатываниями)
#include <easy_greenzone.inc> // Подключение инклуда
Объявление функций:
PHP код:
/*
OnPlayerPressFireKeyInGreenZone
Функция, срабатывающая, если игрок нажал кнопку удара/выстрела в зелёной зоне.
playerid - ID игрока, который нажал кнопку удара/выстрела в зелёной зоне.
green_zone_id - ID зелёной зоны, в которой игрок (playerid) нажал кнопку удара/выстрела.
*/
forward OnPlayerPressFireKeyInGreenZone(playerid, green_zone_id);
public OnPlayerPressFireKeyInGreenZone(playerid, green_zone_id)
{
// code...
return 1;
}
/*
OnPlayerEnterGreenZone
Функция, срабатывающая, когда игрок вошёл в зелёную зону.
playerid - ID игрока, который вошёл в зелёную зону.
green_zone_id - ID зелёной зоны, в которую вошёл игрок (playerid).
*/
forward OnPlayerEnterGreenZone(playerid, green_zone_id);
public OnPlayerEnterGreenZone(playerid, green_zone_id)
{
// code...
return 1;
}
/*
OnPlayerLeaveGreenZone
Функция, срабатывающая, когда игрок вышел из зелёной зоны.
playerid - ID игрока, который вышел из зелёной зоны.
green_zone_id - ID зелёной зоны, из которой вышел игрок (playerid).
*/
forward OnPlayerLeaveGreenZone(playerid, green_zone_id);
public OnPlayerLeaveGreenZone(playerid, green_zone_id)
{
// code...
return 1;
}
Функции инклуда:
Функция |
Описание |
Возвращает |
CreateCircleGreenZone(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1) |
Аналог функции CreateDynamicCircle, создающий зелёную зону указанного вида. |
ID созданной зелёной зоны, либо -1 (EG_INVALID_GREENZONE_ID), если зона не была создана. |
CreateCylinderGreenZone(Float:x, Float:y, Float:minz, Float:maxz, Float:size, worldid = -1, interiorid = -1) |
Аналог функции CreateDynamicCylinder, создающий зелёную зону указанного вида. |
ID созданной зелёной зоны, либо -1 (EG_INVALID_GREENZONE_ID), если зона не была создана. |
CreateSphereGreenZone(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1) |
Аналог функции CreateDynamicSphere, создающий зелёную зону указанного вида. |
ID созданной зелёной зоны, либо -1 (EG_INVALID_GREENZONE_ID), если зона не была создана. |
CreateRectangleGreenZone(Float:minx, Float:miny, Float:maxx, Float:maxy, wolrid = -1, interiorid = -1) |
Аналог функции CreateDynamicRectangle, создающий зелёную зону указанного вида. |
ID созданной зелёной зоны, либо -1 (EG_INVALID_GREENZONE_ID), если зона не была создана. |
CreateCuboidGreenZone(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worldid = -1, interiorid = -1) |
Аналог функции CreateDynamicCuboid, создающий зелёную зону указанного вида. |
ID созданной зелёной зоны, либо -1 (EG_INVALID_GREENZONE_ID), если зона не была создана. |
CreateCubeGreenZone(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worldid = -1, interiorid = -1) |
Аналог функции CreateDynamicCube, создающий зелёную зону указанного вида. |
ID созданной зелёной зоны, либо -1 (EG_INVALID_GREENZONE_ID), если зона не была создана. |
CreatePolygonGreenZone(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1) |
Аналог функции CreateDynamicPolygon, создающий зелёную зону указанного вида. |
ID созданной зелёной зоны, либо -1 (EG_INVALID_GREENZONE_ID), если зона не была создана. |
IsPlayerInAnyGreenZone(const playerid) |
Проверяет, находится ли игрок в какой-либо из созданных зелёных зон. |
true - если игрок в какой-либо зелёной зоне, false - если игрок не находится в какой-либо зелёной зоне. |
IsPlayerInGreenZone(const playerid, const green_zone_id) |
Проверяет, находится ли игрок в указанной зелёной зоне. |
true - если игрок находится в указанной зелёной зоне, false - если игрок не находится в указанной зелёной зоне. |
(#define) GetPlayerGreenZoneId(playerid) |
Возвращает идентификатор (ID) зелёной зоны, в которой находится игрок. |
ID зелёной зоны, либо -1 (EG_INVALID_GREENZONE_ID), если игрок не находится в какой-либо зелёной зоне. |
Автор: whale (a.k.a Twixxx / Twixyck)
Актуальная версия: 1.1
Исходный код: https://pastebin.com/ZNxKNnmP
Скачать: https://www.dropbox.com/s/oa41ps1p7g...nzone.inc?dl=0
История версий:
Открыть/закрыть
v1.0
Дата: 05.04.2019.
Публикация инклуда (первый релиз).
v1.1
Дата:
05.04.2019.
Описание:
• Удалён таймер проверки текущего оружия в руках, а так же использование SetPlayerArmedWeapon.
• Добавлена проверка на существование макроса PRESSED, а так же удалён макрос eg_PRESSED.
• Добавлена авто-вызываемая функция OnPlayerEnterGreenZone(playerid, green_zone_id), когда игрок входит в зелёную зону (см. описание).
• Добавлена авто-вызываемая функция OnPlayerLeaveGreenZone(playerid, green_zone_id), когда игрок выходит из зелёной зоны (см. описание).
• Теперь, при входе в зелёную зону, оружие полностью аннулируется. После чего, при выходе из зелёной зоны - возвращается игроку.
P.S Если Вы нашли ошибки в коде, либо у Вас есть какие-либо советы/замечания/предложения по поводу нового функционала, кода/оформления темы/etc. - оставьте свой комментарий.