Получение entity, на которое смотрит игрок

Версия Minecraft
1.11.2
1,015
9
102
Оказывается player.rayTrace врезается только в блоки, но не в монстров. Как получить EntityLivingBase, на которое смотрит игрок?
 
Ищи на форуме, была тема
 
Для клиента:
http://forum.mcmodding.ru/%D0%A2%D0%B5%D0%BC%D0%B0-%D0%9D%D0%B0-%D1%87%D1%82%D0%BE-%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82-%D0%B8%D0%B3%D1%80%D0%BE%D0%BA
 
Dahaka написал(а):
Minebot написал(а):
Ну, если как-то возможно записать entity в ByteBuf, то да, для клиента
Дак я не понял, для клиента или для сервера? Зачем энтити записывать в буфер?

Можно получить на клиенте и передать на сервер. Но да, лучше сразу на сервере. Так как на сервере это сделать?
 
Dahaka написал(а):
Minebot написал(а):
Можно получить на клиенте и передать на сервер.
id сущности на сервер передавай.

Мне надо передать не класс entity, а его экземпляр. Разве этот ID привязано к миру, а не к регистру?
 
Dahaka написал(а):
hohserg написал(а):
UUID - уникальное для каждой сущности
Я про обычный id. getEntityID

По-моему обычный для регистра, а UUID для мира. Если нет, иначе какая разница?


UUID не робит, а с getEntityID всё норм. Ток проблема. Мне надо получать entity, на которое наведен игрок не только вблизи, а вообще
 
Minebot написал(а):
По-моему обычный для регистра, а UUID для мира. Если нет, иначе какая разница?
UUID для игроков только (но это не точно). А для регистрации id не нужен. Там мапится нелокализованное имя с классом (в две стороны) и еще что-то делается. Не помню уже.


Посмотри, как высчитывается Minecraft.getMinecraft().objectMouseOver и сделай аналогично, но с увеличенным расстоянием.
 
Переписал стандартный метод. Вот, если кому нужно будет
Код:
    @SideOnly(Side.CLIENT)
    public static Entity getMouseOver(float partialTicks, float dist, boolean canBeCollided)
    {
        Minecraft mc = Minecraft.getMinecraft();
        Entity entity = mc.getRenderViewEntity();
        Entity pointedEntity = null;

        if (entity != null)
        {
            if (mc.world != null)
            {
                mc.pointedEntity = null;
                double d0 = dist;
                Vec3d vec3d = entity.getPositionEyes(partialTicks);
                boolean flag = false;
                double d1 = d0;

                if (mc.playerController.extendedReach())
                {
                    d1 = dist;
                    d0 = d1;
                }
                else
                {
                    if (d0 > dist)
                    {
                        flag = true;
                    }
                }

                Vec3d vec3d1 = entity.getLook(1.0F);
                Vec3d vec3d2 = vec3d.addVector(vec3d1.xCoord * d0, vec3d1.yCoord * d0, vec3d1.zCoord * d0);
                Vec3d vec3d3 = null;
                float f = 1.0F;
                List<Entity> list = mc.world.getEntitiesInAABBexcluding(entity, entity.getEntityBoundingBox().addCoord(vec3d1.xCoord * d0, vec3d1.yCoord * d0, vec3d1.zCoord * d0).expand(1.0D, 1.0D, 1.0D), Predicates.and(EntitySelectors.NOT_SPECTATING, new Predicate<Entity>()
                {
                    public boolean apply(@Nullable Entity p_apply_1_)
                    {
                        return p_apply_1_ != null && (!canBeCollided || p_apply_1_.canBeCollidedWith());
                    }
                }));
                double d2 = d1;

                for (int j = 0; j < list.size(); ++j)
                {
                    Entity entity1 = (Entity)list.get(j);
                    AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().expandXyz((double)entity1.getCollisionBorderSize());
                    RayTraceResult raytraceresult = axisalignedbb.calculateIntercept(vec3d, vec3d2);

                    if (axisalignedbb.isVecInside(vec3d))
                    {
                        if (d2 >= 0.0D)
                        {
                            pointedEntity = entity1;
                            vec3d3 = raytraceresult == null ? vec3d : raytraceresult.hitVec;
                            d2 = 0.0D;
                        }
                    }
                    else if (raytraceresult != null)
                    {
                        double d3 = vec3d.distanceTo(raytraceresult.hitVec);

                        if (d3 < d2 || d2 == 0.0D)
                        {
                            if (entity1.getLowestRidingEntity() == entity.getLowestRidingEntity() && !entity1.canRiderInteract())
                            {
                                if (d2 == 0.0D)
                                {
                                    pointedEntity = entity1;
                                    vec3d3 = raytraceresult.hitVec;
                                }
                            }
                            else
                            {
                                pointedEntity = entity1;
                                vec3d3 = raytraceresult.hitVec;
                                d2 = d3;
                            }
                        }
                    }
                }

                if (pointedEntity != null && flag && vec3d.distanceTo(vec3d3) > dist)
                {
                    return null;
                }

                if (pointedEntity != null && d2 < d1)
                {
                    RayTraceResult ray = mc.player.rayTrace(dist, partialTicks);
                    if (ray == null)
                        return pointedEntity;
                    else if (ray.hitVec.distanceTo(mc.player.getPositionVector())+0.5f >= pointedEntity.getPositionVector().distanceTo(mc.player.getPositionVector()))
                        return pointedEntity;
                }
            }
        }
        return null;
    }
 
Вообще то говоря в рейтрейсе есть и блок, и энтити
 
Назад
Сверху