Саморазвивающиеся и самовоспроизводящиеся жители(обсуждение)

608
5
15
есть же готовый бот игрока, на ютуб можно найти тесты таких, а рас пилить, то начинать наверно надо с гуи, ибо перепахивать значения при обработки не раз надо буит, так что с этого можно и 1ному прям щас начать, и как минимум создать конфиг с массивом, изменения в котором и будет обучением, хотя до этого ещё далеко :)

а главное, лучше вместо обновления чанков с жителями, лучше их не погружать, а когда вернёшься юзать таймер того, сколько их не прогружало и отображать изменения, которые могли произойти (конечно без развития, а к примеру рост, ...)
Да можно и ускоренную симуляцию роста, посетать домики где нужно и т.п.
 
5,018
47
783
Даже знаю как ставить блоки - это уже есть готовая AI у овец

Java:
public class EntityAIEatGrass extends EntityAIBase
{
    private static final Predicate<IBlockState> IS_TALL_GRASS = BlockStateMatcher.forBlock(Blocks.TALLGRASS).where(BlockTallGrass.TYPE, Predicates.equalTo(BlockTallGrass.EnumType.GRASS));
    /** The entity owner of this AITask */
    private final EntityLiving grassEaterEntity;
    /** The world the grass eater entity is eating from */
    private final World entityWorld;
    /** Number of ticks since the entity started to eat grass */
    int eatingGrassTimer;

    public EntityAIEatGrass(EntityLiving grassEaterEntityIn)
    {
        this.grassEaterEntity = grassEaterEntityIn;
        this.entityWorld = grassEaterEntityIn.world;
        this.setMutexBits(7);
    }

    /**
     * Returns whether the EntityAIBase should begin execution.
     */
    public boolean shouldExecute()
    {
        if (this.grassEaterEntity.getRNG().nextInt(this.grassEaterEntity.isChild() ? 50 : 1000) != 0)
        {
            return false;
        }
        else
        {
            BlockPos blockpos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ);

            if (IS_TALL_GRASS.apply(this.entityWorld.getBlockState(blockpos)))
            {
                return true;
            }
            else
            {
                return this.entityWorld.getBlockState(blockpos.down()).getBlock() == Blocks.GRASS;
            }
        }
    }

    /**
     * Execute a one shot task or start executing a continuous task
     */
    public void startExecuting()
    {
        this.eatingGrassTimer = 40;
        this.entityWorld.setEntityState(this.grassEaterEntity, (byte)10);
        this.grassEaterEntity.getNavigator().clearPathEntity();
    }

    /**
     * Reset the task's internal state. Called when this task is interrupted by another one
     */
    public void resetTask()
    {
        this.eatingGrassTimer = 0;
    }

    /**
     * Returns whether an in-progress EntityAIBase should continue executing
     */
    public boolean shouldContinueExecuting()
    {
        return this.eatingGrassTimer > 0;
    }

    /**
     * Number of ticks since the entity started to eat grass
     */
    public int getEatingGrassTimer()
    {
        return this.eatingGrassTimer;
    }

    /**
     * Keep ticking a continuous task that has already been started
     */
    public void updateTask()
    {
        this.eatingGrassTimer = Math.max(0, this.eatingGrassTimer - 1);

        if (this.eatingGrassTimer == 4)
        {
            BlockPos blockpos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ);

            if (IS_TALL_GRASS.apply(this.entityWorld.getBlockState(blockpos)))
            {
                if (this.entityWorld.getGameRules().getBoolean("mobGriefing"))
                {
                    this.entityWorld.destroyBlock(blockpos, false);
                }

                this.grassEaterEntity.eatGrassBonus();
            }
            else
            {
                BlockPos blockpos1 = blockpos.down();

                if (this.entityWorld.getBlockState(blockpos1).getBlock() == Blocks.GRASS)
                {
                    if (this.entityWorld.getGameRules().getBoolean("mobGriefing"))
                    {
                        this.entityWorld.playEvent(2001, blockpos1, Block.getIdFromBlock(Blocks.GRASS));
                        this.entityWorld.setBlockState(blockpos1, Blocks.DIRT.getDefaultState(), 2);
                    }

                    this.grassEaterEntity.eatGrassBonus();
                }
            }
        }
    }
}
Ну и... ничего сложного, кстати.
Вот механику "залезть в сундук" и оттуда что то взять уже придется самому делать
 
Может создать общий проект где-нибудь на битбакките, чтобы потом вместе код писать?
 
5,018
47
783
Последнее редактирование:
5,018
47
783
Сень вечером покопаюсь немного в коде
какую нибудь аишку запилю
 
2,932
44
598
Хехе) Вот и закончился Майнкон 2018 который обещает реализовать систему умных жителей в 1.14
Вот статья об этом: Everything we announced at Minecon Earth 2018
 
Последнее редактирование:
1,159
38
544
Идея класс! Наконец-то в майнкрафт не нужно будет играть, т.к. это сделают за тебя жители!
 
7,099
324
1,510
Может, они могут стать своеобразными экономическими противниками игрока?
 
Вряд ли. Скорее всего им просто новые профессии и поход из одного дома в другой добавят.
 
2,932
44
598
Там короче ещё разбойников (мародёров) добавят которые будут нападать на этих жителей, а вы их будите охранять :/ Так что экономические противники игрока они так себе будут...
 
7,099
324
1,510
Настанет эпоха великих китайских стен вокруг деревень)
 
2,932
44
598
a9644d4667f7a3aebb415ab39725ef48.png

(Это я играю на сборке Divine Journey)
 
Сверху