Как создать Грандиозных мобов чтобы они что то делали ? Как в tektopia или Minecolonies

Версия Minecraft
1.12.2
API
Forge
Не подскажите как написать код на действия Npc моба ?

  1. К примеру такие действия - Рыбак идёт к сундуку рыбака преодолевая препятствия (двери,ворота, блоки высотой от 2 штук), подойдя к сундуку рыбака открывает его и берёт удочку. Взяв удочку, идёт к блоку после которого находится блок воды. Бросает удочку в воду, ловит предметы с %ной вероятности поимки. Половив в водоёме идёт к складскому сундуку, открывает его и кладёт туда наловленное. Потом идёт к сундуку рыбака и кладёт туда удочку.
  2. Дальше переодевается в гражданскую одежду и идёт блуждать по поселку. Как начинается ночь идёт к своей кровати и ложится спать.

Я вообще даже не имею понятия как писать код на ориентацию моба на маршруты по блокам.
 
429
41
108
Это делается в EntityAI. Расширь класс EntityAIBase, и примени его к нужному мобу.
Реализацию маршрута передвижения моба видел где-то среди наследников EntityAIBase
В этом примере, я меняю AI моба в зависимости от некоторого абстрактного условия.

для удобства:
public interface IEntityApplicator {
    void apply(AbcMob mob);
}
в классе моба, который наследует живую сущность:
    public static IEntityApplicator MODEL //= new ТвойПрименительМоделиИИ()
    @Override
    protected void initEntityAI() {
        MODEL.apply(this); //применяю модель AI при инициализации
    }
реализация модели AI:
public class AiLogicalModel implements IEntityApplicator {
    private final LogicalExpression<AbcMob> exp;
    private final IEntityApplicator model;

    public AiLogicalModel(IEntityApplicator model, LogicalExpression<AbcMob> exp) {
        this.model = model;
        this.exp = exp;
    }

    @Override
    public void apply(AbcMob mob) {
        //добавляю задачи для AI, в ванильных мобах это находится в initEntityAI
        //я вынес это в классы, подобные этому, чтобы избежать огромного дублирования кода
        //у существ с похожим поведением (п.с у меня там далеко не 1 строчка, уж поверь)
        mob.tasks.addTask(0, new EntityAIEditModel(mob, exp, model));
    }
}
реализация net.minecraft.entity.ai.EntityAIBase:
public class EntityAIEditModel extends EntityAIBase{
    private final AbcMob mob;
    private final LogicalExpression<AbcMob> expression;
    private final IEntityApplicator model;

    public EntityAIEditModel(
            AbcMob mob, LogicalExpression<AbcMob> expression, IEntityApplicator model) {
        this.mob = mob;
        this.expression = expression;
        this.model = model;
    }

    @Override
    public boolean shouldExecute() {
        if(expression.check(mob)){
            mob.tasks.removeTask(this); //удаляю текущую задачу из AI
            model.apply(mob); //применяю новую модель поведения
        }
        return false;
    }
}
 
Последнее редактирование:
Сверху