Слежка моба за игроком.

Версия Minecraft
1.7.10
Доброго времени суток, может кто подскажет, как сделать, чтоб моб следил(головой) за игроком постоянно, как житель, а то я сделал и он поворачивает голову раз в несколько тиков.
 
1,200
37
237
!Не проверял в среде, а только посмотрел исходиники!

Смотри класс net.minecraft.entity.ai.EntityAIWatchClosest. Тебе всего лишь нужно сделать такой же, но без таймера lookTime и оставить только логику где watchedClass является игроком (в таком случае моб будет смотреть только на близжайшего игрока, либо на свою цель атаки, если оставишь код с ней).

Если же окажется, что нужно сделать так, чтобы моб смотрел на всех игроков (у каждого клиента моб должен смотреть именно на своего игрока), то, скорее всего, придется переделывать модель так, чтобы голова всегда смотрела на игрока из класса Minecraft.
 
Убрал lookTime, перестал за мной следить -_-
Java:
public class EntityWatch extends EntityAIBase{
    private static final String __OBFID = "CL_00001590";
    private EntityLiving theWatcher;
    /** Ближайшая сущность, за которой наблюдает этот человек. */
    protected Entity closestEntity;
    /** Это максимальное расстояние, на котором ИИ будет искать объект */
    private float maxDistanceForPlayer;
    private float field_75331_e;
    private Class watchedClass;

    public EntityWatch(EntityLiving p_i1631_1_, Class p_i1631_2_, float p_i1631_3_){
        this.theWatcher = p_i1631_1_;
        this.watchedClass = p_i1631_2_;
        this.maxDistanceForPlayer = p_i1631_3_;
        this.field_75331_e = 0.02F;
        this.setMutexBits(3);
    }

    public EntityWatch(EntityLiving p_i1632_1_, Class p_i1632_2_, float p_i1632_3_, float p_i1632_4_){
        this.theWatcher = p_i1632_1_;
        this.watchedClass = p_i1632_2_;
        this.maxDistanceForPlayer = p_i1632_3_;
        this.field_75331_e = p_i1632_4_;
        this.setMutexBits(3);
    }

    /**
     * Возвращает, должна ли EntityAIBase начать выполнение.
     */
    public boolean shouldExecute(){
        if (this.theWatcher.getRNG().nextFloat() >= this.field_75331_e)
        {
            return false;
        }
        else
        {
            if (this.theWatcher.getAttackTarget() != null)
            {
                this.closestEntity = this.theWatcher.getAttackTarget();
            }

            if (this.watchedClass == EntityPlayer.class)
            {
                this.closestEntity = this.theWatcher.worldObj.getClosestPlayerToEntity(this.theWatcher, (double)this.maxDistanceForPlayer);
            }
            else
            {
                this.closestEntity = this.theWatcher.worldObj.findNearestEntityWithinAABB(this.watchedClass, this.theWatcher.boundingBox.expand((double)this.maxDistanceForPlayer, 3.0D, (double)this.maxDistanceForPlayer), this.theWatcher);
            }

            return this.closestEntity != null;
        }
    }

    /**
     * Возвращает, следует ли продолжать выполнение текущей EntityAIBase
     */
    public boolean continueExecuting(){
        return !this.closestEntity.isEntityAlive() ? false : (this.theWatcher.getDistanceSqToEntity(this.closestEntity) > (double)(this.maxDistanceForPlayer * this.maxDistanceForPlayer));
    }

    /**
     * Выполнить одно задание снято или начала выполнения непрерывной задачи
     */
    public void startExecuting(){
    //    this.lookTime = 60 + this.theWatcher.getRNG().nextInt(60);
    }

    /**
     * Сброс задания
     */
    public void resetTask(){
        this.closestEntity = null;
    }

    /**
     * Обновления задания
     */
    public void updateTask(){
        this.theWatcher.getLookHelper().setLookPosition(this.closestEntity.posX, this.closestEntity.posY + (double)this.closestEntity.getEyeHeight(), this.closestEntity.posZ, 0.0F, (float)this.theWatcher.getVerticalFaceSpeed());
    //    --this.lookTime;
    }
}
 
Последнее редактирование:
Сверху