Взаимодействие с сущностью

Версия Minecraft
1.7.10
929
30
66
Сделал свою сущность, спавн делаю со стороны сервера, вроде всё хорошо, но взаимодействовать с ней нельзя, в чём проблема?
Java:
public class EntityVehicle extends Entity {

    public EntityVehicle(World world) {
        super(world);
        setSize(2F, 1F);
    }
    
    @Override
    public void entityInit() {       
    }
    
    @Override
    public void onUpdate() {       
        this.onEntityUpdate();
    }
    
    @Override
    public boolean interactFirst(EntityPlayer player) {
        if(!player.worldObj.isRemote) {
            player.mountEntity(this);
            System.out.print("ok");
            player.addChatComponentMessage(new ChatComponentText("ok"));
        }
        return true;
    }
    
    @Override
    public void readEntityFromNBT(NBTTagCompound nbt) {       
    }

    @Override
    public void writeEntityToNBT(NBTTagCompound nbt) {       
    }
}
 
Решение
Java:
@Hook(returnCondition = ReturnCondition.ALWAYS)
    @SideOnly(Side.CLIENT)
    public static void getMouseOver(EntityRenderer renderer, float ticks){
        Minecraft mc = Minecraft.getMinecraft();
        if(mc.renderViewEntity != null){
            if(mc.theWorld != null){
                mc.pointedEntity = null;
                double d0 = (double)mc.playerController.getBlockReachDistance();
                mc.objectMouseOver = mc.renderViewEntity.rayTrace(d0, ticks);
                double d1 = d0;
                Vec3 vec3 = mc.renderViewEntity.getPosition(ticks);

                if(mc.playerController.extendedReach()){
                    d0 = 6.0D;
                    d1 = 6.0D;
                }else{...

tox1cozZ

aka Agravaine
8,454
598
2,890
У меня такая же фигня была, решения не нашел.
Спас костыль хуком в EntityRenderer#getMouseOver, там поиск райтрейса зависит от взгляда игрока, пришлось это выпилить и проверять вообще всех энтитей в мире. Заработало. Не знаю что за бред, но только так...
 
929
30
66
Извиняюсь за тупость.. не могу понять когда какие Аннотации в @Hook вставлять, в общем вот так?
Java:
private Entity pointedEntity;
    Minecraft mc = Minecraft.getMinecraft();

    @Hook(returnCondition = ReturnCondition.ALWAYS)
    public void getMouseOver(float p_78473_1_)
    {
        if (this.mc.renderViewEntity != null)
        {
            if (this.mc.theWorld != null)
            {
                this.mc.pointedEntity = null;
                double d0 = (double)this.mc.playerController.getBlockReachDistance();
                this.mc.objectMouseOver = this.mc.renderViewEntity.rayTrace(d0, p_78473_1_);
                double d1 = d0;
                Vec3 vec3 = this.mc.renderViewEntity.getPosition(p_78473_1_);

                if (this.mc.playerController.extendedReach())
                {
                    d0 = 6.0D;
                    d1 = 6.0D;
                }
                else
                {
                    if (d0 > 3.0D)
                    {
                        d1 = 3.0D;
                    }

                    d0 = d1;
                }

                if (this.mc.objectMouseOver != null)
                {
                    d1 = this.mc.objectMouseOver.hitVec.distanceTo(vec3);
                }

                Vec3 vec31 = this.mc.renderViewEntity.getLook(p_78473_1_);
                Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0);
                this.pointedEntity = null;
                Vec3 vec33 = null;
                float f1 = 1.0F;
                List list = this.mc.theWorld.loadedEntityList;
                this.mc.thePlayer.addChatComponentMessage(new net.minecraft.util.ChatComponentText("dfdfdf"));
                double d2 = d1;

                for (int i = 0; i < list.size(); ++i)
                {
                    Entity entity = (Entity)list.get(i);

                    if (entity.canBeCollidedWith())
                    {
                        float f2 = entity.getCollisionBorderSize();
                        AxisAlignedBB axisalignedbb = entity.boundingBox.expand((double)f2, (double)f2, (double)f2);
                        MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32);

                        if (axisalignedbb.isVecInside(vec3))
                        {
                            if (0.0D < d2 || d2 == 0.0D)
                            {
                                this.pointedEntity = entity;
                                vec33 = movingobjectposition == null ? vec3 : movingobjectposition.hitVec;
                                d2 = 0.0D;
                            }
                        }
                        else if (movingobjectposition != null)
                        {
                            double d3 = vec3.distanceTo(movingobjectposition.hitVec);

                            if (d3 < d2 || d2 == 0.0D)
                            {
                                if (entity == this.mc.renderViewEntity.ridingEntity && !entity.canRiderInteract())
                                {
                                    if (d2 == 0.0D)
                                    {
                                        this.pointedEntity = entity;
                                        vec33 = movingobjectposition.hitVec;
                                    }
                                }
                                else
                                {
                                    this.pointedEntity = entity;
                                    vec33 = movingobjectposition.hitVec;
                                    d2 = d3;
                                }
                            }
                        }
                    }
                }

                if (this.pointedEntity != null && (d2 < d1 || this.mc.objectMouseOver == null))
                {
                    this.mc.objectMouseOver = new MovingObjectPosition(this.pointedEntity, vec33);

                    if (this.pointedEntity instanceof EntityLivingBase || this.pointedEntity instanceof EntityItemFrame)
                    {
                        this.mc.pointedEntity = this.pointedEntity;
                    }
                }
            }
        }
    }
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Java:
@Hook(returnCondition = ReturnCondition.ALWAYS)
    @SideOnly(Side.CLIENT)
    public static void getMouseOver(EntityRenderer renderer, float ticks){
        Minecraft mc = Minecraft.getMinecraft();
        if(mc.renderViewEntity != null){
            if(mc.theWorld != null){
                mc.pointedEntity = null;
                double d0 = (double)mc.playerController.getBlockReachDistance();
                mc.objectMouseOver = mc.renderViewEntity.rayTrace(d0, ticks);
                double d1 = d0;
                Vec3 vec3 = mc.renderViewEntity.getPosition(ticks);

                if(mc.playerController.extendedReach()){
                    d0 = 6.0D;
                    d1 = 6.0D;
                }else{
                    if(d0 > 3.0D){
                        d1 = 3.0D;
                    }

                    d0 = d1;
                }

                if(mc.objectMouseOver != null){
                    d1 = mc.objectMouseOver.hitVec.distanceTo(vec3);
                }

                Vec3 vec31 = mc.renderViewEntity.getLook(ticks);
                Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0);
                Entity pointedEntity = null;
                Vec3 vec33 = null;
                float f1 = 1.0F;
                List list = mc.theWorld.loadedEntityList;

                double d2 = d1;

                for(int i = 0; i < list.size(); ++i){
                    Entity entity = (Entity)list.get(i);
                    if(entity == mc.renderViewEntity){
                        continue;
                    }

                    if(entity.canBeCollidedWith()){
                        float f2 = entity.getCollisionBorderSize();
                        AxisAlignedBB axisalignedbb = entity.boundingBox.expand((double)f2, (double)f2, (double)f2);
                        MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32);

                        if(axisalignedbb.isVecInside(vec3)){
                            if(0.0D < d2 || d2 == 0.0D){
                                pointedEntity = entity;
                                vec33 = movingobjectposition == null ? vec3 : movingobjectposition.hitVec;
                                d2 = 0.0D;
                            }
                        }else if(movingobjectposition != null){
                            double d3 = vec3.distanceTo(movingobjectposition.hitVec);

                            if(d3 < d2 || d2 == 0.0D){
                                if(entity == mc.renderViewEntity.ridingEntity && !entity.canRiderInteract()){
                                    if(d2 == 0.0D){
                                        pointedEntity = entity;
                                        vec33 = movingobjectposition.hitVec;
                                    }
                                }else{
                                    pointedEntity = entity;
                                    vec33 = movingobjectposition.hitVec;
                                    d2 = d3;
                                }
                            }
                        }
                    }
                }

                if(pointedEntity != null && (d2 < d1 || mc.objectMouseOver == null)){
                    mc.objectMouseOver = new MovingObjectPosition(pointedEntity, vec33);

                    if(pointedEntity instanceof EntityLivingBase || pointedEntity instanceof EntityItemFrame){
                        mc.pointedEntity = pointedEntity;
                    }
                }
            }
        }
    }
 
Сверху