raytrace

Версия Minecraft
1.7.10
API
Forge
есть код:
code:
MovingObjectPosition mop = player.rayTrace(maxDist, MyMod.ticks);
// MyMod.ticks задаётся в эвенте RenderGameOverlayEvent
if(mop.typeOfHit == MovingObjectType.ENTITY) {
    System.out.println("type=entity"); // для дебага
    // some code
} else if(mop.typeOfHit == MovingObjectType.BLOCK) {
    System.out.println("type=block"); // для дебага
} else {
    System.out.println("type=miss"); // для дебага
}
вызывается на лкм.
спамлю кликами по мобу - пишет блок, в небо - пишет мисс, в блок - пишет блок. не знаю в чём проблема.
 
не особо понимаю как, но попытался переделать:
кодик:
import java.util.ArrayList;

import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
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 Vec3Modded {
    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 toReturn = 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)) {
                            toReturn = targettedEntity;
                            closest = precheck;
                        }
                    }
                }
            }
            if (toReturn != null) {
                return toReturn;
            }
        } catch (Throwable localThrowable) {}
        return null;
    }
    public static Entity getEntity(double parDistance, float tick) {
        try {
            EntityLivingBase viewEntity = Minecraft.getMinecraft().renderViewEntity;
            parDistance = Vec3Moded(viewEntity, tick, parDistance);
            Entity toReturn = 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<Entity> a = new ArrayList(worldObj.getEntitiesWithinAABB(EntityItem.class, viewEntity.boundingBox.copy().addCoord(dirVec.xCoord * parDistance, dirVec.yCoord * parDistance, dirVec.zCoord * parDistance)));
                for (Entity targettedEntity : a) {
                    if (targettedEntity != null) {
                        double precheck = viewEntity.getDistanceToEntity(targettedEntity);
                        MovingObjectPosition mopElIntercept = targettedEntity.boundingBox.calculateIntercept(playerPosition, lookFarCoord);
                        if ((mopElIntercept != null) && (precheck < closest)) {
                            toReturn = targettedEntity;
                            closest = precheck;
                        }
                    }
                }
            }
            if (toReturn != null) {
                return toReturn;
            }
        } catch (Throwable localThrowable) {}
        return null;
    }
}
с entityitem ворк, с entity нулл возвращает. подскажите пж как можно переделать чтоб работало?
 
129
6
18
ArrayList<Entity> a = new ArrayList(worldObj.getEntitiesWithinAABB(EntityItem.class,
вот тут ещё класс переименуй EntityItem.class на Entity.class и можешь попробовать. Сейчас нет просто возможности посмотреть, как я делал для entity.
 
Сверху