@fromgate, я уже говорил про радиусы когда-то. Но сейчас хочу опять поднять эту тему и усовершенствовать. Предлагаю создать гибрид FLAG_SET и нового формата описания сущностей.
Итак... нужно сделать флаг, который бы проверял наличие игрока\моба\локации в радиусе от игрока\моба\локации. Синтаксис я представляю себе такой:
Код:
FLAG_RADIUS=<r:N-блоков> <spot:{player:{amount_spot_players:N [<max_rad_spot_player | max_rad_spot_mob>:N-блоков] players_spot_flags<1-N>:{FLAG1:{ARG1} FLAG2:{ARG2}}} | mob:{amount_spot_mob:N mob_spot_flags<1-N>:{FLAG1:{ARG1} FLAG2:{ARG2}}} | loc}> <PLAYER_rad | MOB_rad>:{<amount_rad_players | amount_rad_mobs>:N [<max_rad_rad_player | max_rad_rad_mob>:N-блоков] <FLAGS_rad_player<1-N> | FLAGS_rad_mob<1-N>>:{FLAG1:{ARG1} FLAG2:{ARG2}}}
В такой громадной конструкции постарался уместить все нюансы. Разберём по частям:
<r:N-блоков> - соответственно, радиус относительно мобов\игроков.
Код:
<spot:{player:{amount_spot_players:N [<max_rad_spot_player | max_rad_spot_mob>:N-блоков] players_spot_flags<1-N>:{FLAG1:{ARG1} FLAG2:{ARG2}}} | mob:{amount_spot_mob:N mob_spot_flags<1-N>:{FLAG1:{ARG1} FLAG2:{ARG2}}} | loc}>
spot - относительно чего задаётся радиус.
<player:{...} | mob:{...} | loc> - задать радиус относительно игрока\моба\локации.
--- --- ---
Код:
player:{amount_spot_players:N players_spot_flags:{FLAG1:{ARG1} FLAG2:{ARG2}}}
amount_spot_players - необходимое количество игроков в группе, относительно которых задаётся радиус.
<max_rad_spot_player | max_rad_spot_mob>:N-блоков - максимальный радиус, когда игрок\моб становится членом группы.
players_spot_flags - то, чему должны соответсвовать игрок(и), относительно которых задаётся радиус.
mob:{amount_spot_mob:N mob_spot_flags:{FLAG1:{ARG1} FLAG2:{ARG2}}}
amount_spot_mob - необходимое количество мобов в группе, относительно которых задаётся радиус.
mob_spot_flags - то, чему должны соответсвовать моб(ы), относительно которых задаётся радиус.
=== === ===
Код:
<PLAYER_rad | MOB_rad:{<amount_rad_players | amount_rad_mobs>:N [<max_rad_rad_player | max_rad_rad_mob>:N-блоков] [FLAGS_rad_player<1-N> | FLAGS_rad_mob<1-N>:{mob_type:<...> hp:<...> effect:<...> equip:{...}}]}
<PLAYER_rad | MOB_rad> - кого проверяем в радиусе: игроков или мобов?
<amount_rad_players | amount_rad_mobs>:N - количество игроков\мобов, которых проверяем в данном радиусе.
[<max_rad_rad_player | max_rad_rad_mob>:N-блоков] - максимальный радиус, когда игрок\моб становится членом группы. (Н-да, небольшой каламбур вышел в аргументе...)
--- --- ---
Код:
[FLAGS_rad_player<1-N> | FLAGS_rad_mob<1-N>:{ [mob_type:<...> hp:<...> effect:<...> equip:{...}] FLAG1:{ARG1} FLAG2:{ARG2}}]
[FLAGS_rad_player<1-N> | FLAGS_rad_mob<1-N> - то, чему должны соответствовать проверяемые мобы\игроки.
[mob_type:<...> hp:<...> effect:<...> equip:{...}] - флаги для мобов в радиусе.
FLAG1:{ARG1} FLAG2:{ARG2} - флаги для игроков в радиусе.
=== === ===
<1-N> - здесь я хотел сказать, что можно было бы указывать параметры отдельно для каждого члена группы. Например, нужно собрать группу из пяти типов: атакующий маг, копатель, танк, копейщик, лечащий маг. Используя формат FLAGS_rad_playerN:{...} можно было бы легко описать всех.
Насчёт групп игроков\мобов: в них нужно определить геометрический центр формации и относительно него проверять, есть ли игроки\мобы в радиусе. Однако, если радиус проверки захватывает группу игроков\мобов, то под проверку группа подпадает только в случае, когда хотя бы один её член задевает радиус.
Сами же "группы" предлагаю "составлять" так: берём одну особь и проверяем, нет ли в радиусе от неё другой особи. Если есть, то продолжаем проверку уже относительно второй особи в том же радиусе.
Но нужно установить лимит. Например, максимальный геометрический радиус группы от центра не может быть больше 20 блоков. Это аргумент я уже описывал выше.
Фууухх... Вроде, ничего не забыл. Так вот, поддаётся ли такое реализации?