Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 7 из 7

Тема: easy_greenzone.inc

  1. #1
    Аватар для whale
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±

    easy_greenzone.inc

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



    Описание:
    • Данный инклуд был написан с целью упрощения работы с зелёными (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(playeridgreen_zone_id);
    public 
    OnPlayerPressFireKeyInGreenZone(playeridgreen_zone_id)
    {
        
    // code...
        
    return 1;
    }

    /*
        OnPlayerEnterGreenZone
        Функция, срабатывающая, когда игрок вошёл в зелёную зону.

        playerid - ID игрока, который вошёл в зелёную зону.
        green_zone_id - ID зелёной зоны, в которую вошёл игрок (playerid).
    */
    forward OnPlayerEnterGreenZone(playeridgreen_zone_id);
    public 
    OnPlayerEnterGreenZone(playeridgreen_zone_id)
    {
        
    // code...
        
    return 1;
    }

    /*
        OnPlayerLeaveGreenZone
        Функция, срабатывающая, когда игрок вышел из зелёной зоны.

        playerid - ID игрока, который вышел из зелёной зоны.
        green_zone_id - ID зелёной зоны, из которой вышел игрок (playerid).
    */
    forward OnPlayerLeaveGreenZone(playeridgreen_zone_id);
    public 
    OnPlayerLeaveGreenZone(playeridgreen_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. - оставьте свой комментарий.
    Последний раз редактировалось whale; 06.04.2019 в 02:43.

  2. 2 пользователя(ей) сказали cпасибо:
    Kovshevoy (06.04.2019) Salik_Davince (05.06.2019)
  3. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Я бы "eg_PRESSED" переименовал в "PRESSED", так как именно такой макрос указан в официальной wiki, и сделал бы проверку на то, существует ли макрос. Просто чтоб не плодить аналогичные по функционалу макросы с разными названиями.

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

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #3
    Аватар для whale
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Я бы "eg_PRESSED" переименовал в "PRESSED", так как именно такой макрос указан в официальной wiki, и сделал бы проверку на то, существует ли макрос. Просто чтоб не плодить аналогичные по функционалу макросы с разными названиями.

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

  5. #4
    Аватар для whale
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±
    Инклуд обновлён до версии 1.1.

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

     v1.1

    Дата: 05.04.2019.

    Описание:
    Удалён таймер проверки текущего оружия в руках, а так же использование SetPlayerArmedWeapon.
    Добавлена проверка на существование макроса PRESSED, а так же удалён макрос eg_PRESSED.
    Добавлена авто-вызываемая функция OnPlayerEnterGreenZone(playerid, green_zone_id), когда игрок входит в зелёную зону (см. описание).
    Добавлена авто-вызываемая функция OnPlayerLeaveGreenZone(playerid, green_zone_id), когда игрок выходит из зелёной зоны (см. описание).
    Теперь, при входе в зелёную зону, оружие полностью аннулируется. После чего, при выходе из зелёной зоны - возвращается игроку.
    Последний раз редактировалось whale; 05.04.2019 в 23:50.

  6. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Добавь функции, через которые можно было бы просматривать и изменять сохранённое оружие (добавлять/убавлять/убирать и т.п.), чтоб при выходе из игры в зелёной зоне можно было оружие сохранить.

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

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #6
    Аватар для whale
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Добавь функции, через которые можно было бы просматривать и изменять сохранённое оружие (добавлять/убавлять/убирать и т.п.), чтоб при выходе из игры в зелёной зоне можно было оружие сохранить.

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

  8. #7
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Добавить константу отвечающую за удаление оружия в GreenZone.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •