AI, построение пути

Версия Minecraft
1.12.2
4,167
68
693
Знатоки AI отзовитесь...
Можете подсказать, как сделать, чтобы мобы обходили определённые блоки так как обходят воду или лаву?
Пытался ковыряться в EntityAIWanderAvoidWater и в EntityAITempt, но результатов это не дало, зато вывело на PathNavigate, но там как-то всё сложно...
Возможно кто-то решал подобную задачу. Нет ли удобного способа без создания собственного навигатора?
 
EntityAIWanderAvoidWater это всё же не то, и отдельные AI таски тебе тут не помогут, т.к. надо менять проверки именно в поиске пути.

PathFinder#getVerticalOffset, там внутри вызывается ещё одна функция (возможно с не деобфусцированным именем). Тебе её придется захукать и подменить на свою.
gdLjzl.jpg

Вот здесь можно сделать проверку на блок и вернуть, наверное, -2 (такое же значение используется для лавы).
Мб потребуется проверка на то что сущность уже находится в блоке, куда не надо ходить (если её туда кто-то столкнул, например), и в этом случае разрешать идти, чтобы она могла выбраться, а не застряла там навсегда. В конце этого же метода есть пример как такое проворачивается с лавой (вызов handleLavaMovement).
 
Что-то не нашёл такого в ПасФайндере, но решил проблему просто переопределив в блоке метод
Java:
@Override
public PathNodeType getAiPathNodeType(IBlockState state, IBlockAccess world, BlockPos pos) {
    return PathNodeType.WATER;
}

Однако, мне нужно выполнять данное условие не только по блоку но и просто по координате... И вот с этим всё равно не разобрался.
Создал свой WalkNodeProcessor и там в методе getPathNodeTypeRaw() прописал условие с возвратом PathNodeType.LAVA.
Вроде как мобы не спешат выполнять это условие, но только если их не приманить вкусняшкой... Хотя в лаву они не должны лезть ни при каких условиях.
 
Кек, к 1.12 таки переписали поиск пути? Тогда вряд ли сильно смогу помочь с готовым кодом, сам сижу на старых версиях.
В 1.7 ещё была такая штука в PathNavigate, как метод isSafeToStandAt, там внутри тоже есть похожие проверки на воду и лаву, мб поможет, если там тоже переопределить.
Суть в чем, в навигаторе есть метод, который оптимизирует путь для моба, и если он может пройти по прямой до какой-то точки в построенном пути - он пропускает все предыдущие точки и идет напрямую к последней возможной. Там логика с проверкой на лаву и воду должна дублироваться. Возможно именно это и ломается "приманиванием вкусняшками".

Про координаты не совсем понял, ты хочешь объявлять какие-то регионы, которых мобы должны избегать, несмотря на то какие там блоки внутри?
 
Да, что-то типа этого...
Ну, я так понял, что сейчас функцию построения пути выполняет именно NodeProcessor. Там как раз есть метод по определению безопасных точек... Хотя конкретно лава упоминается там только в методе getPathNodeTypeRaw(). Это меня и смутило...
Видимо, придётся искать, где теперь спрямление пути )
Спасибо за наводку.
 
Назад
Сверху