PDA

Просмотр полной версии : [Include] easy_greenzone.inc



whale
05.04.2019, 18:20
Доброго времени суток, уважаемые пользователи портала.
Сегодня делюсь с вами ещё одной небольшой разработкой, которая, вполне возможно, может кому-либо пригодиться.



Описание:

• Данный инклуд был написан с целью упрощения работы с зелёными (anti-dm) зонами в SA:MP.

• При входе игрока в зелёную зону, полностью аннулирует его оружие и запоминает, после чего, при выходе из зелёной зоны, происходит возврат оружия.

• Фиксирует нажатие KEY_FIRE, если игрок находится в зелёной зоне.


Плюсы реализации:

• Оптимизированный код, не содержащий в себе ненужные/неиспользуемые функции/какой-либо мусор, etc.

• Используются исключительно динамические зоны - никаких сверок расстояния и прочей лабуды.

• Возможность добавления дополнительного функционала, в дальнейшем, без нужды в переписывании/рефакторинге большей части кода.


Минусы реализации:

• Не обнаружено (на данный момент).


Зависимости:

• Наличие плагина, а так же инклуда streamer (clickable) (https://github.com/samp-incognito/samp-streamer-plugin/releases)

• Наличие инклуда foreach (clickable) (https://github.com/Open-GTO/foreach)


Использование:

• Переместить файл easy_greenzone.inc в папку с инклудами игрового мода (в большинстве случаев, это: /pawno/include).

• В используемом скрипте подключить инклуд easy_greenzone.inc и указать все необходимые настройки (см. ниже).

• В используемом скрипте объявить следующие функции: OnPlayerPressFireKeyInGreenZone, OnPlayerEnterGreenZone, OnPlayerLeaveGreenZone (см.ниже).

Подключение инклуда:


#define EG_MAX_GREEN_ZONES 2 // Максимальное количество зелёных зон (указывайте то количество, которое вы будете использовать)
#define EG_FIRE_KEY_TRIGGER_DELAY 5 // Указанный промежуток времени (в секундах), который будет фиксировать нажатие клавиши удара/выстрела в зелёной зоне (не ставьте маленькое значение, ибо может быть флуд срабатываниями)
#include <easy_greenzone.inc> // Подключение инклуда


Объявление функций:


/*
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/oa41ps1p7ge5rbw/easy_greenzone.inc?dl=0

История версий:


Дата: 05.04.2019.
Публикация инклуда (первый релиз).


Дата: 05.04.2019.

Описание:

• Удалён таймер проверки текущего оружия в руках, а так же использование SetPlayerArmedWeapon.

• Добавлена проверка на существование макроса PRESSED, а так же удалён макрос eg_PRESSED.

• Добавлена авто-вызываемая функция OnPlayerEnterGreenZone(playerid, green_zone_id), когда игрок входит в зелёную зону (см. описание).

• Добавлена авто-вызываемая функция OnPlayerLeaveGreenZone(playerid, green_zone_id), когда игрок выходит из зелёной зоны (см. описание).

• Теперь, при входе в зелёную зону, оружие полностью аннулируется. После чего, при выходе из зелёной зоны - возвращается игроку.




P.S Если Вы нашли ошибки в коде, либо у Вас есть какие-либо советы/замечания/предложения по поводу нового функционала, кода/оформления темы/etc. - оставьте свой комментарий.

DeimoS
05.04.2019, 21:12
Я бы "eg_PRESSED" переименовал в "PRESSED", так как именно такой макрос указан в официальной wiki, и сделал бы проверку на то, существует ли макрос. Просто чтоб не плодить аналогичные по функционалу макросы с разными названиями.

Ну и в твоей системе не учтен транспорт, при помощи которого можно устроить стрельбу в ЗЗ.
Имхо, разумнее при входе в ЗЗ забирать всё оружие, запоминая его, а при выходе из ЗЗ обратно его выдавать. Тогда и таймер не будет нужен, и из игры система будет смотреться "опрятнее".

whale
05.04.2019, 21:28
Я бы "eg_PRESSED" переименовал в "PRESSED", так как именно такой макрос указан в официальной wiki, и сделал бы проверку на то, существует ли макрос. Просто чтоб не плодить аналогичные по функционалу макросы с разными названиями.

Ну и в твоей системе не учтен транспорт, при помощи которого можно устроить стрельбу в ЗЗ.
Имхо, разумнее при входе в ЗЗ забирать всё оружие, запоминая его, а при выходе из ЗЗ обратно его выдавать. Тогда и таймер не будет нужен, и из игры система будет смотреться "опрятнее".

Спасибо за совет.
В скором времени реализую.

whale
05.04.2019, 23:45
Инклуд обновлён до версии 1.1.

Ссылки на исходный код, скачку инклуда - так же обновлены.
Описание изменений доступно под спойлером в "история изменений", а так же ниже.


Дата: 05.04.2019.

Описание:

• Удалён таймер проверки текущего оружия в руках, а так же использование SetPlayerArmedWeapon.

• Добавлена проверка на существование макроса PRESSED, а так же удалён макрос eg_PRESSED.

• Добавлена авто-вызываемая функция OnPlayerEnterGreenZone(playerid, green_zone_id), когда игрок входит в зелёную зону (см. описание).

• Добавлена авто-вызываемая функция OnPlayerLeaveGreenZone(playerid, green_zone_id), когда игрок выходит из зелёной зоны (см. описание).

• Теперь, при входе в зелёную зону, оружие полностью аннулируется. После чего, при выходе из зелёной зоны - возвращается игроку.

DeimoS
06.04.2019, 10:08
Добавь функции, через которые можно было бы просматривать и изменять сохранённое оружие (добавлять/убавлять/убирать и т.п.), чтоб при выходе из игры в зелёной зоне можно было оружие сохранить.

Ну и я бы добавил возможность включать/отключать зелёные зоны для конкретных игроков. На тех же РП серверах часто делают ЗЗ в районе спавна фракций, но разрешают самим фракциям, при этом, использовать оружие.
В идеале, вообще сделать возможность разрешать не только конкретным игрокам использование оружия, но и разрешать конкретное оружие (например, чтоб охранники в мэрии могли использовать дубинки и т.п.)

whale
06.04.2019, 15:15
Добавь функции, через которые можно было бы просматривать и изменять сохранённое оружие (добавлять/убавлять/убирать и т.п.), чтоб при выходе из игры в зелёной зоне можно было оружие сохранить.

Ну и я бы добавил возможность включать/отключать зелёные зоны для конкретных игроков. На тех же РП серверах часто делают ЗЗ в районе спавна фракций, но разрешают самим фракциям, при этом, использовать оружие.
В идеале, вообще сделать возможность разрешать не только конкретным игрокам использование оружия, но и разрешать конкретное оружие (например, чтоб охранники в мэрии могли использовать дубинки и т.п.)

Благодарю за ещё один совет :)
Постараюсь реализовать в ближайшее время.

Salik_Davince
05.06.2019, 14:11
Добавить константу отвечающую за удаление оружия в GreenZone.