Сущность в блоке дёргается: отключить коллизию (EntityHanging)

Версия Minecraft
1.12+
И снова здравствуйте!
Есть у меня сущность, которая, по хорошему, должна быть в пространстве самого блока. Всё это было реализовано следующим образом:

Код:
package rcdev.rcroads.entities;

import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityHanging;
import net.minecraft.init.SoundEvents;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.*;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import javax.annotation.Nullable;

public class Test extends EntityHanging implements IEntityAdditionalSpawnData {


    public Test(World worldIn)
    {
        super(worldIn);
    }

    public Test(World worldIn, BlockPos pos, EnumFacing facing)
    {
        super(worldIn, pos);
        this.updateFacingWithBoundingBox(facing);
        this.noClip = true;
        //this.entityCollisionReduction = 100;
    }

    @Override
    public void writeEntityToNBT(NBTTagCompound compound)
    {
        super.writeEntityToNBT(compound);
    }

    @Override
    public void readEntityFromNBT(NBTTagCompound compound)
    {
        super.readEntityFromNBT(compound);
    }

    public int getWidthPixels()
    {
        return 16;
    }

    public int getHeightPixels()
    {
        return 16;
    }

    @Override
    public boolean attackEntityFrom(DamageSource source, float amount)
    {
        if(!this.getEntityWorld().isRemote) this.setDead();
        return true;
    }

    @Override
    public void onBroken(@Nullable Entity brokenEntity)
    {
        return;
    }

    public void playPlaceSound()
    {
        this.playSound(SoundEvents.ENTITY_PAINTING_PLACE, 1.0F, 1.0F);
    }

    public void setLocationAndAngles(double x, double y, double z, float yaw, float pitch)
    {
        this.setPosition(x, y, z);
    }

    @SideOnly(Side.CLIENT)
    public void setPositionAndRotationDirect(double x, double y, double z, float yaw, float pitch, int posRotationIncrements, boolean teleport)
    {
        BlockPos blockpos = this.hangingPosition.add(x - this.posX, y - this.posY, z - this.posZ);
        this.setPosition((double)blockpos.getX(), (double)blockpos.getY(), (double)blockpos.getZ());
    }

    @Override
    public void onUpdate() {
        if (this.facingDirection != null)
        {
            double d0 = (double)this.hangingPosition.getX() + 0.5D;
            double d1 = (double)this.hangingPosition.getY() + 0.5D;
            double d2 = (double)this.hangingPosition.getZ() + 0.5D;
            double d4 = this.offs(this.getWidthPixels());
            double d5 = this.offs(this.getHeightPixels());
            d0 = d0 - (double)this.facingDirection.getFrontOffsetX() * 0.46875D;
            d2 = d2 - (double)this.facingDirection.getFrontOffsetZ() * 0.46875D;
            d1 = d1 + d5;
            EnumFacing enumfacing = this.facingDirection.rotateYCCW();
            d0 = d0 + d4 * (double)enumfacing.getFrontOffsetX();
            d2 = d2 + d4 * (double)enumfacing.getFrontOffsetZ();
            double d6 = (double)this.getWidthPixels();
            double d7 = (double)this.getHeightPixels();
            double d8 = (double)this.getWidthPixels();
            if (this.facingDirection.getAxis() == EnumFacing.Axis.Z)
            {
                if (this.getHorizontalFacing() == EnumFacing.SOUTH) { d2 = d2 - 0.42D; }
                else { d2 = d2 + 0.42D; }
                d8 = 2.0D;
            }
            else
            {
                if (this.getHorizontalFacing() == EnumFacing.EAST) { d0 = d0 - 0.42D; }
                else { d0 = d0 + 0.42D; }
                d6 = 2.0D;
            }
            this.posX = d0;
            this.posY = d1;
            this.posZ = d2;
            d6 = d6 / 32.0D;
            d7 = d7 / 32.0D;
            d8 = d8 / 32.0D;
            this.setEntityBoundingBox(new AxisAlignedBB(d0 - d6, d1 - d7, d2 - d8, d0 + d6, d1 + d7, d2 + d8));
        }
    }

    private double offs(int val)
    {
        return val % 32 == 0 ? 0.5D : 0.0D;
    }

    @Override
    public void writeSpawnData(ByteBuf buffer) {
        PacketBuffer pack = new PacketBuffer(buffer);
        pack.writeBlockPos(getHangingPosition());
        pack.writeEnumValue(this.getHorizontalFacing());
    }

    @Override
    public void readSpawnData(ByteBuf buffer) {
        PacketBuffer pack = new PacketBuffer(buffer);
        hangingPosition = pack.readBlockPos();
        updateFacingWithBoundingBox(pack.readEnumValue(EnumFacing.class));
    }
}
И зарегистрировано так: EntityRegistry.registerModEntity(new ResourceLocation(rcroads.MODID, "etest"), Test.class, rcroads.MODID + ":test", 1, rcroads.INSTANCE, 128, 20, false);
Работает то всё как надо, но не долго, при каждой проверке сущность дёргается, иногда вообще сдвигается в сторону. Думаю, что проблема в коллизии, хотя может кроется и глубже...
Заранее спасибо за внимание и жду предложений по решению данного вопроса :)
P.S. видео для лучшего понимания ситуации.
 
Решение
Вот так зарегай и не будет дергаться:
EntityRegistry.registerModEntity(new ResourceLocation(rcroads.MODID, "etest"), Test.class, rcroads.MODID + ":test", 1, rcroads.INSTANCE, 160, Integer.MAX_VALUE, false);
Integer.MAX_VALUE - это кулдаун отсылки пакетов о положении энтити на клиент. Мы тут ставим огромное значение, то бишь пакеты отсылаться не будут вообще(зачем они нам, если у нас энтити никогда не будет двигаться?).
7,099
324
1,510
Как я знаю, этот параметр отвечает за передачу пакетов с информацией о перемещении/ускорении сущности, специально его отключал в надежде на то, что если пакеты отправляться не будут, то и не будет попытки переместить сущность. Я, конечно, ради эксперимента попробовал заменить на true, но результата это не дало.
Так что вопрос всё ещё открыт.
 
Не совсем, я прикрепил видео, если не сложно - посмотри, это, по идее, будет дорожный знак. Висеть на столбе будет, который потом добавлю. За замечание по коду спасибо, услышал.
 

timaxa007

Модератор
5,831
409
672
Так что вопрос всё ещё открыт.
В блоке сделать пустое пространство достаточно для нахождения Entity. Пример создания пустого пространства можно взять из котла и ещё добавить типа крышки, чтобы блок со всех сторон был закрыт.
Entity пытается выталкиваться из заполнено пространства.
И типа посмотри пример в Entity рамок.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Вот так зарегай и не будет дергаться:
EntityRegistry.registerModEntity(new ResourceLocation(rcroads.MODID, "etest"), Test.class, rcroads.MODID + ":test", 1, rcroads.INSTANCE, 160, Integer.MAX_VALUE, false);
Integer.MAX_VALUE - это кулдаун отсылки пакетов о положении энтити на клиент. Мы тут ставим огромное значение, то бишь пакеты отсылаться не будут вообще(зачем они нам, если у нас энтити никогда не будет двигаться?).
 
Entity пытается выталкиваться из заполнено пространства.
Да, я так и понял, я с рамок и срисовывал свою сущность. Я и пытаюсь тут узнать, можно ли как то сделать, чтобы энтити не выталкивалась, потому что хочу универсальности. Пробовал через noClip, не помогло. Вот, надеюсь, кто то подскажет.
 
Вот так зарегай и не будет дергаться:
EntityRegistry.registerModEntity(new ResourceLocation(rcroads.MODID, "etest"), Test.class, rcroads.MODID + ":test", 1, rcroads.INSTANCE, 160, Integer.MAX_VALUE, false);
Спасибо, помогло. Ничего страшного, что сущность, по сути, не обновляется? Других ошибок не будет?
 
Сверху