public static void buildMouseOverData()

in Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/ObservationFromRayImplementation.java [85:199]


    public static void buildMouseOverData(JsonObject json, boolean includeNBTData)
    {
        // We could use Minecraft.getMinecraft().objectMouseOver but it's limited to the block reach distance, and
        // doesn't register floating tile items.
        float partialTicks = 0; // Ideally use Minecraft.timer.renderPartialTicks - but we don't need sub-tick resolution.
        Entity viewer = Minecraft.getMinecraft().player;
        float depth = 50;   // Hard-coded for now - in future will be parameterised via the XML.
        Vec3d eyePos = viewer.getPositionEyes(partialTicks);
        Vec3d lookVec = viewer.getLook(partialTicks);
        Vec3d searchVec = eyePos.addVector(lookVec.xCoord * depth, lookVec.yCoord * depth, lookVec.zCoord * depth);
        RayTraceResult mop = Minecraft.getMinecraft().world.rayTraceBlocks(eyePos, searchVec, false, false, false);
        RayTraceResult mopEnt = findEntity(eyePos, lookVec, depth, mop, true);
        if (mopEnt != null)
            mop = mopEnt;
        if (mop == null)
        {
            return; // Nothing under the mouse.
        }
        // Calculate ranges for player interaction:
        double hitDist = mop.hitVec.distanceTo(eyePos);
        double blockReach = Minecraft.getMinecraft().playerController.getBlockReachDistance();
        double entityReach = Minecraft.getMinecraft().playerController.extendedReach() ? 6.0 : 3.0;

        JsonObject jsonMop = new JsonObject();
        if (mop.typeOfHit == RayTraceResult.Type.BLOCK)
        {
            // We're looking at a block - send block data:
            jsonMop.addProperty("hitType", "block");
            jsonMop.addProperty("x", mop.hitVec.xCoord);
            jsonMop.addProperty("y", mop.hitVec.yCoord);
            jsonMop.addProperty("z", mop.hitVec.zCoord);
            IBlockState state = Minecraft.getMinecraft().world.getBlockState(mop.getBlockPos());
            List<IProperty> extraProperties = new ArrayList<IProperty>();
            DrawBlock db = MinecraftTypeHelper.getDrawBlockFromBlockState(state, extraProperties);
            jsonMop.addProperty("type", db.getType().value());
            if (db.getColour() != null)
                jsonMop.addProperty("colour", db.getColour().value());
            if (db.getVariant() != null)
                jsonMop.addProperty("variant", db.getVariant().getValue());
            if (db.getFace() != null)
                jsonMop.addProperty("facing",  db.getFace().value());
            if (extraProperties.size() > 0)
            {
                // Add the extra properties that aren't covered by colour/variant/facing.
                for (IProperty prop : extraProperties)
                {
                    String key = "prop_" + prop.getName();
                    if (prop.getValueClass() == Boolean.class)
                        jsonMop.addProperty(key, Boolean.valueOf(state.getValue(prop).toString()));
                    else if (prop.getValueClass() == Integer.class)
                        jsonMop.addProperty(key, Integer.valueOf(state.getValue(prop).toString()));
                    else
                        jsonMop.addProperty(key, state.getValue(prop).toString());
                }
            }
            // Add the NBTTagCompound, if this is a tile entity.
            if (includeNBTData)
            {
                TileEntity tileentity = Minecraft.getMinecraft().world.getTileEntity(mop.getBlockPos());
                if (tileentity != null)
                {
                    NBTTagCompound data = tileentity.getUpdateTag();
                    if (data != null)
                    {
                        // Turn data directly into json and add it to what we're already returning.
                        String jsonString = data.toString();
                        try
                        {
                            JsonElement jelement = new JsonParser().parse(jsonString);
                            if (jelement != null)
                                jsonMop.add("NBTTagCompound", jelement);
                        }
                        catch (JsonSyntaxException e)
                        {
                            // Duff NBTTagCompound - ignore it.
                        }
                    }
                }
            }
            jsonMop.addProperty("inRange", hitDist <= blockReach);
            jsonMop.addProperty("distance", hitDist);
        }
        else if (mop.typeOfHit == RayTraceResult.Type.ENTITY)
        {
            // Looking at an entity:
            Entity entity = mop.entityHit;
            if (entity != null)
            {
                jsonMop.addProperty("x", entity.posX);
                jsonMop.addProperty("y", entity.posY);
                jsonMop.addProperty("z", entity.posZ);
                jsonMop.addProperty("yaw",  entity.rotationYaw);
                jsonMop.addProperty("pitch",  entity.rotationPitch);
                String name = MinecraftTypeHelper.getUnlocalisedEntityName(entity);
                String hitType = "entity";
                if (entity instanceof EntityItem)
                {
                    ItemStack is = ((EntityItem)entity).getEntityItem();
                    DrawItem di = MinecraftTypeHelper.getDrawItemFromItemStack(is);
                    if (di.getColour() != null)
                        jsonMop.addProperty("colour", di.getColour().value());
                    if (di.getVariant() != null)
                        jsonMop.addProperty("variant", di.getVariant().getValue());
                    jsonMop.addProperty("stackSize", is.getCount());
                    name = di.getType();
                    hitType = "item";
                }
                jsonMop.addProperty("type", name);
                jsonMop.addProperty("hitType", hitType);
            }
            jsonMop.addProperty("inRange", hitDist <= entityReach);
            jsonMop.addProperty("distance", hitDist);
        }
        json.add("LineOfSight", jsonMop);
    }