Доброго времени суток, уважаемые пользователи портала Pro-Pawn.
Сегодня я хотел бы представить Вам недавно написанную мной работу - телепорт для администрации.
Но, телепорт весьма необычный.
В чём особенность системы?:
— Использование динамических зон (streamer).
— Полная автоматизация работы.
— От Вас требуется только занести новые данные в массив.
— Важно: код не рассчитан на новичков. Комментарии и объяснения в данной теме будут, но разжёвывать каждую строку кода - слишком кропотливое занятие, знаете ли.
— Принцип работы системы:
1. Создаётся динамическая прямоугольная зона (CreateDynamicRectangle)
Примечание: для получения минимальных и максимальных координат рекомендую использовать данную программу (SAMP Zone Editor): Жми меня
2. Когда игрок входит в динамическую зону (OnPlayerEnterDynamicArea) - с помощью foreach перебираются все зоны из итератора - соответственно инкрементируется переменная, которая хранит количество игроков в указанной зоне. После чего идёт проверка - имеет ли зона статус "зелёной" (anti-dm zone). Если зона такова - переменной игрока (p_green_zone_status[MAX_PLAYERS char]) присваивается значение 1 (т.е игрок находится в "зелёной" зоне).
С выходом из зоны всё аналогично.
3. Если игрок пытается стрелять в "зелёной" зоне - ему 2 раза выводится предупреждение и его замораживает, на 3-й раз игрока отключает от сервера.
4. А что касаемо самого диалогового окна: в первом отображаются разделы, во втором - зоны, которые относятся к указанному разделу. Помимо их наименований указывается расстояние до точки телепорта (x,y,z), количество игроков в данной зоне и является ли зона "зелёной" (anti-dm zone).
Надеюсь, что принцип работы я объяснил доступно.
Так же рекомендую посмотреть несколько скриншотов ниже, после чего мы перейдём непосредственно к коду.
— Перейдём непосредственно к коду.
Для начала, нам понадобится несколько констант, которые мы будем использовать в дальнейшем:
Так же рекомендую создать enum для названий диалогов, дабы не путать их. Либо же представить их как макросы:
Далее нам потребуется создать ещё один enum, который будет хранить в себе идентификатор зоны и количество игроков в ней.
Для дальнейшего использования нам понадобится ещё один enum, который будет хранить в себе перечисление типов для разделов и, собственно говоря, массив, который мы будем заполнять данной информацией (названия "разделов"):
Ну и, по сути, основная часть данного кода - enum, который будет заполняться данными о динамической зоне из массива и сам массив:
И последнее, что мы объявим в данном мануале - итератор и переменную:
— Паблики, стоки, команды...
Теперь, когда мы закончили объявлять всё, что нам нужно, - перейдём непосредственно к использованию "этого всего".
С данного момента комментариев будет гораздо меньше, так как разжёвывать каждую строку кода - достаточно нудное занятие. А если учесть, что система, скажем так, не рассчитана на "ньюфагов" (как было написано выше) - так тем более.
Для начала разберёмся с public OnGameModeInit(). В данный паблик мы поместим загрузку наших динамических зон.
(Под спойлером так же будет stock-функция, которую мы вызываем в public OnGameModeInit())
Сам stock с загрузкой динамических зон, собственно, Вы можете поместить в конец мода, либо в другое, удобное для Вас место.
Далее мы рассмотрим 2 паблика: OnPlayerEnterDynamicArea и OnPlayerLeaveDynamicArea:
Далее мы так же рассмотрим public OnPlayerWeaponShot - когда игрок стреляет из оружия:
Теперь можно перейти к самой команде, ради которой, по сути, всё это и было затеяно:
Ну и, наконец-то мы подходим к концу. Осталось лишь разобраться с самими диалогами - public OnDialogResponse:
- Примечание: в данном мануале рассматривается вариант со switch-ветвлением, а не условиями if / else.
Полный код (pastebin): https://pastebin.com/HxUvBeiN
Всех, кто уделил своё личное время и прочёл данную тему до конца - благодарю за внимание :)
Надеюсь, что я ничего не забыл и написал всё, что хотел.
P.S Это моя первая тема на данном портале и первый мануал с подобным объёмом. Так что, очень прошу не сильно ругаться/кричать, если заметите какие-либо недочёты. Так же жду комментариев, адекватной, обоснованной критики и помощи.
Ещё раз благодарю за внимание.
Так же благодарность за помощь с некоторыми участками кода выражаю: DeIMoS`уОбновление от 04.06.2017: Релиз include-версии.
Download (include): https://yadi.sk/d/fyrfBkyq3JoHUe