[Forge 1.7.10]Куда смотрит игрок?

67
1
3
Как можно получить координаты блока, на который смотрит игрок?
 
67
1
3
Это не совсем то. Мне нужно рассчитать блок на любой дистанции.
[merge_posts_bbcode]Добавлено: 17.11.2015 20:40:52[/merge_posts_bbcode]

А все, нашел, спасибо.
double max = 100;
MovingObjectPosition objPos = Minecraft.getMinecraft().renderViewEntity.rayTrace(max, 1.0F);

double X = objPos.blockX;
double Y = objPos.blockY;
double Z = objPos.blockZ;
 

timaxa007

Модератор
5,831
409
672
Есть метод куда проще "rayTrace" в классе EntityLivingBase:
Код:
player.rayTrace(5.0D, 1.0F);
Но он тоже работает на клиентской стороне.
Немного поэкспериментировав у меня вышло это:
Код:
public static MovingObjectPosition block(EntityLivingBase entity_base, float fasc, double dist, boolean interact) {
    Vec3 vec3 = Vec3.createVectorHelper(entity_base.posX, entity_base.posY + entity_base.getEyeHeight(), entity_base.posZ);
    Vec3 vec31 = entity_base.getLook(fasc);
    Vec3 vec32 = vec3.addVector(vec31.xCoord * dist, vec31.yCoord * dist, vec31.zCoord * dist);
    MovingObjectPosition mop = entity_base.worldObj.rayTraceBlocks(vec3, vec32, interact);
    return mop;
}
Пример использования в предмете:
Код:
@Override
public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
    MovingObjectPosition mop = block(player, 1.0F, 5.0D, true);
    if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
        int x = mop.blockX;
        int y = mop.blockY;
        int z = mop.blockZ;
    }
    return super.onItemRightClick(is, world, player);
}
"block(player, 1.0F, 5.0D, true)"
player - аргумент должен быть объект с родительским классом EntityLivingBase, т.е. можно двавать: игрока и других живых существ (к примеру: овца, зомби и т.д.).
1.0F - данный аргумент передаётся другим методам в которых я не полностью понимаю что они делают, так-что ставлю 1.0F.
5.0D - дистанция в double типе.
true - будет-ли взаимодействовать с блоками которые не выделяются (стандартно), т.е. это вода, лава и т.п. блоки.
Можно сделать подобия ведра:
Код:
@Override
public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
    MovingObjectPosition mop = block(player, 1.0F, 5.0D, true);
    if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
        int x = mop.blockX;
        int y = mop.blockY;
        int z = mop.blockZ;
        if (world.getBlock(x, y, z) == Blocks.water) {
            player.inventory.addItemStackToInventory(new ItemStack(Items.water_bucket));
            world.setBlockToAir(x, y, z);
            --is.stackSize;
            return is;
        }

        if (world.getBlock(x, y, z) == Blocks.lava) {
            player.inventory.addItemStackToInventory(new ItemStack(Items.lava_bucket));
            world.setBlockToAir(x, y, z);
            --is.stackSize;
            return is;
        }

    }
    return super.onItemRightClick(is, world, player);
}
---
Так-же "block(entity_base, 1.0F, 5.0D, true)", можно использовать в каких нибудь эвентах. Типа проверять смотрит-ли entity или player на этот блок, если да, то давать какой-либо эффект. Типа негативного эффекта на слепоту. Или-же смотря на какие-либо двери, калитку, люк и т.п. и оно открывалось (или закрывалось).
 
Сверху