Доброго времени суток, уважаемые пользователи портала.
Сегодня делюсь с вами ещё одной небольшой разработкой, которая, вполне возможно, может кому-либо пригодиться.
Описание:
• Данный инклуд был написан с целью упрощения работы с зелёными (anti-dm) зонами в SA:MP.• При входе игрока в зелёную зону, полностью аннулирует его оружие и запоминает, после чего, при выходе из зелёной зоны, происходит возврат оружия.• Фиксирует нажатие KEY_FIRE, если игрок находится в зелёной зоне.
Плюсы реализации:
• Оптимизированный код, не содержащий в себе ненужные/неиспользуемые функции/какой-либо мусор, etc.• Используются исключительно динамические зоны - никаких сверок расстояния и прочей лабуды.• Возможность добавления дополнительного функционала, в дальнейшем, без нужды в переписывании/рефакторинге большей части кода.
Минусы реализации:
• Не обнаружено (на данный момент).
Зависимости:
• Наличие плагина, а так же инклуда streamer (clickable)• Наличие инклуда foreach (clickable)
Использование:
• Переместить файл 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
История версий:
P.S Если Вы нашли ошибки в коде, либо у Вас есть какие-либо советы/замечания/предложения по поводу нового функционала, кода/оформления темы/etc. - оставьте свой комментарий.