Как получить смотрит ли игрок на выброшенный предмет?

Версия Minecraft
1.7.10
129
6
18
Ну в заголовке в принципе описана сама проблема. Так вот как это сделать так?
Пробовал сделать через MovingObjectPosition но он не как не реагирует на EntityItem.
Были идеи работать с Vec3 но после раздумий понял что это слишком геморно и возможно появится лишняя нагрузка.
Заранее спасибо за ответ.
 
5,018
47
783
Могу написать за него. Получаете RayTraceResult и из него берете и чекаете TYPE.Entity или как то так, не помню уж.
 
129
6
18
Ну вот полноценный класс для получения предмета на ктр смотрите. Расписывать не буду где что и как работает(думаю сами додумаете, да расписывать самому лень). Правда часть кода не моя.
Java:
import java.util.ArrayList;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;

public class Vec3Modedd {

        public static double Vec3Moded(EntityLivingBase viewEntity, float tick, double traceDistance)
        {
            return Vec3Moded(viewEntity, viewEntity.getPosition(tick), tick, traceDistance, 0, 0.0D);
        }

        private static double Vec3Moded(EntityLivingBase viewEntity, Vec3 startPosition, float tick, double traceDistance, int count, double offset)
        {
            if ((count++ <= 20) && (traceDistance - offset > 0.0D))
            {
                Vec3 vec31 = viewEntity.getLook(tick);
                Vec3 vec32 = startPosition.addVector(vec31.xCoord * (traceDistance - offset), vec31.yCoord * (traceDistance - offset), vec31.zCoord * (traceDistance - offset));
                MovingObjectPosition objectMouseOver = viewEntity.worldObj.rayTraceBlocks(startPosition, vec32);
                if (objectMouseOver != null)
                {
                    Block block = viewEntity.worldObj.getBlock(objectMouseOver.blockX, objectMouseOver.blockY, objectMouseOver.blockZ);
                    if (block != null)
                    {
                        if (block.getClass().getName().contains("BlockFrame")) {
                            return objectMouseOver.hitVec.distanceTo(viewEntity.getPosition(tick));
                        }
                        if (!block.getMaterial().isOpaque()) {
                            return Vec3Moded(viewEntity, objectMouseOver.hitVec.addVector(vec31.xCoord, vec31.yCoord, vec31.zCoord), tick, traceDistance, count, objectMouseOver.hitVec.distanceTo(startPosition));
                        }
                        return objectMouseOver.hitVec.distanceTo(viewEntity.getPosition(tick));
                    }
                }
                return traceDistance;
            }
            return traceDistance;
        }

        public static EntityItem getEntityItem(double parDistance, float tick)
        {
            try
            {
                EntityLivingBase viewEntity = Minecraft.getMinecraft().renderViewEntity;
                parDistance = Vec3Moded(viewEntity, tick, parDistance);
                EntityItem Return = null;
                double closest = parDistance;
                Vec3 playerPosition;
                Vec3 lookFarCoord;
                if (viewEntity != null)
                {
                    World worldObj = viewEntity.worldObj;
                    MovingObjectPosition objectMouseOver = viewEntity.rayTrace(parDistance, 0.5F);
                    playerPosition = viewEntity.getPosition(1.0F);
                    if (objectMouseOver != null) {
                        parDistance = Vec3Moded(viewEntity, tick, parDistance);
                    }
                    Vec3 dirVec = viewEntity.getLookVec();
                    lookFarCoord = playerPosition.addVector(dirVec.xCoord * parDistance, dirVec.yCoord * parDistance, dirVec.zCoord * parDistance);
                    ArrayList<EntityItem> a = new  ArrayList(worldObj.getEntitiesWithinAABB(EntityItem.class, viewEntity.boundingBox.copy().addCoord(dirVec.xCoord * parDistance, dirVec.yCoord * parDistance, dirVec.zCoord * parDistance)));
                    for (EntityItem targettedEntity : a) {
                        if (targettedEntity != null)
                        {
                            double precheck = viewEntity.getDistanceToEntity(targettedEntity);
                            MovingObjectPosition mopElIntercept = targettedEntity.boundingBox.calculateIntercept(playerPosition, lookFarCoord);
                            if ((mopElIntercept != null) && (precheck < closest))
                            {
                                Return = targettedEntity;
                                closest = precheck;
                            }
                        }
                    }
                }
                if (Return != null) {
                    return Return;
                }
            }
            catch (Throwable localThrowable) {}
            return null;
        }

}
Ну а это как с ней "правильней" взаимодействовать + более корректные цифры для метода(при больших значениях у меня крашило).
Java:
if (Vec3Modedd.getEntityItem(3.0D, 0.375F) instanceof EntityItem && player.getDistanceSqToEntity(Vec3Modedd.getEntityItem(3.0D, 0.375F)) <= 3.0D){

}
С вас лайкосик))
 
Последнее редактирование:
Сверху