Сотый вопрос про вызов стороны блока .

Версия Minecraft
1.7.10
Я понимаю что вас уже заколебали с вопросами про нахождение стороны блока на который нажал игрок .
Я понимаю как это работает но не знаю как реализовать в коде .

В общем нужно просто получить номер стороны с который был сломан блок .

А дальше я с использованием switch сделаю для каждый стороны свои параметры ломания ближних блоков.
Java:
    public int convertBlockDrops(List<ItemStack> aDrops, ItemStack aStack, EntityPlayer aPlayer, Block aBlock, int aX, int aY, int aZ, byte aMetaData, int aFortune, boolean aSilkTouch, BlockEvent.HarvestDropsEvent aEvent) {
        int rConversions = 0;
        
        if ((this.sIsHarvestingRightNow.get() == null) && ((aPlayer instanceof EntityPlayerMP))) {
            this.sIsHarvestingRightNow.set(this);           
            
            //Параметры ломания ближних блоков
            for (int i = -1; i < 2; i++) {
                for (int j = -1; j < 2; j++) {
                    for (int k = -1; k < 1; k++) {
                        if (aEvent.world.getBlock(aX + i, aY + j , aZ + k) == net.minecraft.init.Blocks.bedrock) {
                        } else {
                                if (((i != 0) || (j != 0) || (k != 0)) && (aStack.getItem().getDigSpeed(aStack, aPlayer.worldObj.getBlock(aX + i, aY + j, aZ + k), aPlayer.worldObj.getBlockMetadata(aX + i, aY + j, aZ + k)) > 0.0F) && (((EntityPlayerMP) aPlayer).theItemInWorldManager.tryHarvestBlock(aX + i, aY + j, aZ))) {
                                    rConversions++;
                            }
                        }
                    }
                }
            }
            this.sIsHarvestingRightNow.set(null);
        }
        return rConversions;
    }
 
Решение
Что-то типа этого:
Java:
MovingObjectPosition mop = EntityLook.block(player, 1F, 4D, true);

        if (mop != null) {
            int blockX = mop.blockX;
            int blockY = mop.blockY;
            int blockZ = mop.blockZ;
           
            switch(mop.sideHit) {
            case 0:++blockY;break;
            case 1:--blockY;break;
            case 2:++blockZ;break;
            case 3:--blockZ;break;
            case 4:++blockX;break;
            case 5:--blockX;break;
            default:break;
            }

            for (int x = blockX - 1; x <= blockX + 1; ++x) {
            for (int y = blockY - 1; y <= blockY + 1; ++y) {
            for (int z = blockZ - 1; z <= blockZ + 1; ++z) {
                if...
3,005
192
592
В onBlockActivated есть параметр side, это и есть сторона, с которой нажали.
 
1,031
19
87
1,031
19
87
Мне нужно перед параметрами разрушения блоков узнать сторону
  1. Могу сейчас нести бред
  2. Несу бред, так как сейчас нету ИСР
  3. Придумал этакое чудище:
Java:
if (КлассВанильныхСобытий.onBlockActivated.getSide()<получить мир, из него блок, из него состояние и из него координаты, сам придумаешь>) {

    event.getSide() = КлассСторон.Сторона выполнить какой-то там метод(сам придумаешь)

}
 
1,031
19
87
1,031
19
87
Ты издеваешься? Клянчить код тут не принято. Сказано же: активируешь событие разрушения блока, получаешь мир, из него блок, из него сторону с которой сломали, и для вариантов делаешь переключатели. Порядок получения может отличатся, так как я не могу проверить из-за отсутствия IDE, но принцип такой.
 
7,099
324
1,510

timaxa007

Модератор
5,831
409
672
Если я правильно понимаю, то... Чтобы знать что находиться на пути от одного вектора к другому (обычно проверяются только на блоки, но есть только Entity, а так-же на всё сразу).
Чтобы хранить информацию об: блоке (а так-же его координаты) и на какую сторону смотрит, Entity или просто воздух.
 
Последнее редактирование:

timaxa007

Модератор
5,831
409
672
Что-то типа этого:
Java:
MovingObjectPosition mop = EntityLook.block(player, 1F, 4D, true);

        if (mop != null) {
            int blockX = mop.blockX;
            int blockY = mop.blockY;
            int blockZ = mop.blockZ;
           
            switch(mop.sideHit) {
            case 0:++blockY;break;
            case 1:--blockY;break;
            case 2:++blockZ;break;
            case 3:--blockZ;break;
            case 4:++blockX;break;
            case 5:--blockX;break;
            default:break;
            }

            for (int x = blockX - 1; x <= blockX + 1; ++x) {
            for (int y = blockY - 1; y <= blockY + 1; ++y) {
            for (int z = blockZ - 1; z <= blockZ + 1; ++z) {
                if (world.isAirBlock(x, y, z)) continue;

                Block block2 = world.getBlock(x, y, z);//Берём блок по координатам
                int metadata = world.getBlockMetadata(x, y, z);//Берём метадату блока по координатам

                if (toolMaterial.getHarvestLevel() >= block2.getHarvestLevel(metadata)) {

                    //Узнаём твёрдость блока по координатам и если она равно -1F,
                    if (block2.getBlockHardness(world, x, y, z) == -1F) continue;

                    BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(x, y, z, world, block2, metadata, player);
                    MinecraftForge.EVENT_BUS.post(event);
                    //Если в эвенте будет setCanceled(true),
                    //то идёт возвращение и код дальше не будет выполняться.
                    if (event.isCanceled()) return itemStack;

                    //Выпадения опыта из блока.
                    block2.dropXpOnBlockBreak(world, x, y, z, block2.getExpDrop(world, metadata, 0));
                    //Выпадения дропа из блока от имени игрока.
                    block2.harvestBlock(world, player, x, y, z, metadata);
                    //Разрушаем блок с партиклами разрушения и со звуком разрушения,
                    //а так-же блок замениться на воздух.
                    //Аргумент false не даст выпасть (стандартный) дроп блока (он выпадает не от имени игрока).
                    world.func_147480_a(x, y, z, false);
                    itemStack.damageItem(1, player);
                }
            }
            }
            }
 
Сверху