И снова здравствуйте!
Есть у меня сущность, которая, по хорошему, должна быть в пространстве самого блока. Всё это было реализовано следующим образом:
И зарегистрировано так:
Работает то всё как надо, но не долго, при каждой проверке сущность дёргается, иногда вообще сдвигается в сторону. Думаю, что проблема в коллизии, хотя может кроется и глубже...
Заранее спасибо за внимание и жду предложений по решению данного вопроса
P.S. видео для лучшего понимания ситуации.
Есть у меня сущность, которая, по хорошему, должна быть в пространстве самого блока. Всё это было реализовано следующим образом:
Код:
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. видео для лучшего понимания ситуации.