Eims
Компетентный
Четыре дня назад некий PawnoNoob задал один вопрос по поводу настроек маркеров игроков. Этот вопрос навёл меня на идею создания инклюда, часть кода которого я уже кидал в той теме. Инклюд я этот написал (хоть и реализовал не всё, что планирую), но на его название воображения уже не хватило...
Данный инклюд добавляет возможность контролировать дистанцию отображения маркеров игроков на карте прямо во время игры.
Можно сказать, что инклюд расширяет функционал стандартной функции
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
, добавляя такие возможности, как:- Собственно, менять радиус отображения прямо в игре (не уверен, но стандартная функция этого, вроде, не умеет. Только в OnGameModeInit)
- Менять радиус только игрокам онлайн (всем, кто зайдёт после, радиус будет установлен тот, который указан в отдельной опции)
- Менять радиус только игрокам оффлайн (практически то же самое, только им наоборот будет установлен новый радиус, а онлайн игроки останутся со старым)
- (Не реализовано) Менять радиус конкретного игрока (можно сделать так, чтоб определённый игрок отображался на большем/меньшем расстоянии, нежели остальные)
- (Не реализовано) Отключать/включать маркеры определённых игроков (что-то типа режима невидимости на карте)
Почему я создал тему в данном разделе, а не в разделе с инклюдами?
Во-первых, я не могу придумать адекватное название этому детищу.
Во-вторых, у меня возникли трудности с адекватной реализацией последних двух возможностей из списка выше. А если точнее, то нужно реализовать алгоритм составления списка всех игроков онлайн (в одной "пачке" по 30 игроков), адекватного переключения между списками и, собственно, адекватного нахождения выбранного игрока для дальнейших действий над ним.
У меня уже есть некоторые наработки, но они являются нереальным костылём (как по мне) и не совсем работают. Основная трудность в том, что хочется сделать совместимость с несколькими типами циклов (foreach/for с GetPlayerPollSize/for) и я пытался сделать универсальный алгоритм. Но чем дальше я "уходил", пытаясь обойтись "малой кровью" в плане мозговой деятельности, тем больше понимал, что алгоритм выходит слишком кривым. Эти самые наработки я оставил в инклюде (в самом конце) и если кто не против помочь, можете глянуть и подкинуть хотя бы идею для реализации задуманного.
Сам код находится тут -
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Код не обкатанный, так что на названия особо не смотрите (хотя любым подсказкам буду рад).
А вот пример команды для вызова основного диалога:
PHP:
cmd:radius(playerid, params[])
{
ShowDialogPlayerMarkerOptions(playerid);
return 1;
}
И да, подкиньте идей по поводу названия сего инклюда. Ну и по поводу дополнительного функционала.
Спасибо за внимание
UPDATE: Предсказывая вопросы по поводу макросов:
Значение MAX_PLAYER_MARKER_RADIUS - это расстояние между двумя противоположными углами карты. Думаю, такого расстояния хватит на все нужды.
ID диалогов ведут свой отсчёт с самого последнего. Это, собственно, с тестирования осталось. В релизе будут только проверки на резервированный ID и присвоение макросу "-1" заменю на ошибку "#error".
