Вместо того чтоб копать 3х3х1 копает 3х3х2

Версия Minecraft
1.16.5
API
Forge
всем привет, делаю мод на версию майна 1.16.5, forge 36.1.0

Java:
package org.psinka.lololowka_mod.item;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.IItemTier;
import net.minecraft.item.ItemStack;
import net.minecraft.item.PickaxeItem;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;


public class ModExcavatorItem extends PickaxeItem {
    private final int harvestLevel;
    private final int maxUses;
    private final float efficiency;
    private final float attackDamage;
    private final int enchantability;

    public ModExcavatorItem(IItemTier tier, int attackDamageIn, int attackSpeedIn, float efficiency, float attackDamage, Properties builder) {
        super(tier, attackDamageIn, attackSpeedIn, builder);
        this.harvestLevel = 3;
        this.efficiency = 8.0F;
        this.attackDamage = 4.0F;
        this.maxUses = 0;
        this.enchantability = 1;
    }

    @Override
    public boolean canHarvestBlock(net.minecraft.block.BlockState blockIn) {
        return true;
    }


    @Override
    public boolean onBlockDestroyed(ItemStack stack, World worldIn, BlockState state, BlockPos pos, LivingEntity entityLiving) {
        if (!worldIn.isRemote()) {
            PlayerEntity player = (PlayerEntity) entityLiving;

            if (!player.isCreative()) {
                int radius = 1; // Радиус копания 3x3

                destroyBlocksInRadius(worldIn, player, pos, radius);
            }
        }

        return super.onBlockDestroyed(stack, worldIn, state, pos, entityLiving);
    }

    private void destroyBlocksInRadius(World worldIn, PlayerEntity player, BlockPos centerPos, int radius) {
        for (int yOffset = -radius; yOffset <= radius; yOffset++) {
            for (int xOffset = -radius; xOffset <= radius; xOffset++) {
                for (int zOffset = -radius; zOffset <= radius; zOffset++) {
                    BlockPos targetPos = centerPos.add(xOffset, yOffset, zOffset);
                    BlockState targetState = worldIn.getBlockState(targetPos);
                    Block targetBlock = targetState.getBlock();

                    // Добавьте здесь блоки, которые вы хотите запретить на разрушение
                    // Пропускаем блоки, которые не должны быть разрушены
                    if (targetBlock == Blocks.BEDROCK || targetBlock == Blocks.END_PORTAL_FRAME) {
                        continue;
                    }


                    if (this.canHarvestBlock(targetState) && !worldIn.isAirBlock(targetPos)) {
                        worldIn.destroyBlock(targetPos, true, player);
                    }
                }
            }
        }
    }
}
 
Решение
всем привет, делаю мод на версию майна 1.16.5, forge 36.1.0

Java:
package org.psinka.lololowka_mod.item;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.IItemTier;
import net.minecraft.item.ItemStack;
import net.minecraft.item.PickaxeItem;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;


public class ModExcavatorItem extends PickaxeItem {
    private final int harvestLevel;
    private final int maxUses;
    private final float efficiency;
    private final float attackDamage;
    private final int enchantability;

    public...
1,383
115
244
1) Actually, оно копает не 3x3x2, а 3x3x3
2) Тебе нужны не только циклы, но и сторона света, в которую копает игрок. В зависимости от стороны света xOffset и zOffset будут иметь разные значения. То же касается и yOffset в случае копания вверх-вниз.
 
2) Тебе нужны не только циклы, но и сторона света, в которую копает игрок. В зависимости от стороны света xOffset и zOffset будут иметь разные значения. То же касается и yOffset в случае копания вверх-вниз.
Могли бы подробнее рассказать? либо дать ссылку на вики?
 
1) Actually, оно копает не 3x3x2, а 3x3x3
2) Тебе нужны не только циклы, но и сторона света, в которую копает игрок. В зависимости от стороны света xOffset и zOffset будут иметь разные значения. То же касается и yOffset в случае копания вверх-вниз.
прошу вас помогите пожалуйста.
 
всем привет, делаю мод на версию майна 1.16.5, forge 36.1.0

Java:
package org.psinka.lololowka_mod.item;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.IItemTier;
import net.minecraft.item.ItemStack;
import net.minecraft.item.PickaxeItem;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;


public class ModExcavatorItem extends PickaxeItem {
    private final int harvestLevel;
    private final int maxUses;
    private final float efficiency;
    private final float attackDamage;
    private final int enchantability;

    public ModExcavatorItem(IItemTier tier, int attackDamageIn, int attackSpeedIn, float efficiency, float attackDamage, Properties builder) {
        super(tier, attackDamageIn, attackSpeedIn, builder);
        this.harvestLevel = 3;
        this.efficiency = 8.0F;
        this.attackDamage = 4.0F;
        this.maxUses = 0;
        this.enchantability = 1;
    }

    @Override
    public boolean canHarvestBlock(net.minecraft.block.BlockState blockIn) {
        return true;
    }


    @Override
    public boolean onBlockDestroyed(ItemStack stack, World worldIn, BlockState state, BlockPos pos, LivingEntity entityLiving) {
        if (!worldIn.isRemote()) {
            PlayerEntity player = (PlayerEntity) entityLiving;

            if (!player.isCreative()) {
                int radius = 1; // Радиус копания 3x3

                destroyBlocksInRadius(worldIn, player, pos, radius);
            }
        }

        return super.onBlockDestroyed(stack, worldIn, state, pos, entityLiving);
    }

    private void destroyBlocksInRadius(World worldIn, PlayerEntity player, BlockPos centerPos, int radius) {
        for (int yOffset = -radius; yOffset <= radius; yOffset++) {
            for (int xOffset = -radius; xOffset <= radius; xOffset++) {
                for (int zOffset = -radius; zOffset <= radius; zOffset++) {
                    BlockPos targetPos = centerPos.add(xOffset, yOffset, zOffset);
                    BlockState targetState = worldIn.getBlockState(targetPos);
                    Block targetBlock = targetState.getBlock();

                    // Добавьте здесь блоки, которые вы хотите запретить на разрушение
                    // Пропускаем блоки, которые не должны быть разрушены
                    if (targetBlock == Blocks.BEDROCK || targetBlock == Blocks.END_PORTAL_FRAME) {
                        continue;
                    }


                    if (this.canHarvestBlock(targetState) && !worldIn.isAirBlock(targetPos)) {
                        worldIn.destroyBlock(targetPos, true, player);
                    }
                }
            }
        }
    }
}
Видно, что делал с помощью нейронки, но в этом не ничего плохого, просто стоит читать код, а не только копировать.

Что бы копать 3х1х3 тебе нужно узнать куда смотри игрок.
minecraft.player.getPitchYaw().x; minecraft.player.getPitchYaw().y;
(может в 1.16.5 версии по другому)
Получаешь угол взгляда
1704467819523.png
(ещё угол взгляда пишется в F3, последние два числа)
1704468089754.png
Затем, в зависимости, от углов ломаешь один из трёх вариантов

1704467907446.png

Java:
    for (int yOffset = -radius; yOffset <= radius; yOffset++) {
            for (int xOffset = -radius; xOffset <= radius; xOffset++) {
                for (int zOffset = -radius; zOffset <= radius; zOffset++) {
В своём коде ты проходишь по всем осям, то есть копаешь 3х3х3, а тебе нужен один слой.

То есть сделай проверку угла взгляда, и в зависимости от угла - выбирай нужные два цикла for
 
1,383
115
244
Что бы копать 3х1х3 тебе нужно узнать куда смотри игрок.
Только лучше брать не клиентского игрока, а серверного. Иначе на серверах крашиться будет.
И посмотри на методы игрока, там уже есть готовое решение (по крайней мере, на 1.16.5). getDirection() или как-то так.
 
Видно, что делал с помощью нейронки, но в этом не ничего плохого, просто стоит читать код, а не только копировать.

Что бы копать 3х1х3 тебе нужно узнать куда смотри игрок.
minecraft.player.getPitchYaw().x; minecraft.player.getPitchYaw().y;
(может в 1.16.5 версии по другому)
Получаешь угол взгляда
Посмотреть вложение 17187
(ещё угол взгляда пишется в F3, последние два числа)
Посмотреть вложение 17190
Затем, в зависимости, от углов ломаешь один из трёх вариантов

Посмотреть вложение 17189

Java:
    for (int yOffset = -radius; yOffset <= radius; yOffset++) {
            for (int xOffset = -radius; xOffset <= radius; xOffset++) {
                for (int zOffset = -radius; zOffset <= radius; zOffset++) {
В своём коде ты проходишь по всем осям, то есть копаешь 3х3х3, а тебе нужен один слой.

То есть сделай проверку угла взгляда, и в зависимости от угла - выбирай нужные два цикла for
Спасибо!!
стало чуточку понятнее, буду разбираться!
 
Видно, что делал с помощью нейронки, но в этом не ничего плохого, просто стоит читать код, а не только копировать.

Что бы копать 3х1х3 тебе нужно узнать куда смотри игрок.
minecraft.player.getPitchYaw().x; minecraft.player.getPitchYaw().y;
(может в 1.16.5 версии по другому)
Получаешь угол взгляда
Посмотреть вложение 17187
(ещё угол взгляда пишется в F3, последние два числа)
Посмотреть вложение 17190
Затем, в зависимости, от углов ломаешь один из трёх вариантов

Посмотреть вложение 17189

Java:
    for (int yOffset = -radius; yOffset <= radius; yOffset++) {
            for (int xOffset = -radius; xOffset <= radius; xOffset++) {
                for (int zOffset = -radius; zOffset <= radius; zOffset++) {
В своём коде ты проходишь по всем осям, то есть копаешь 3х3х3, а тебе нужен один слой.

То есть сделай проверку угла взгляда, и в зависимости от угла - выбирай нужные два цикла for
извините, задам тупой вопрос.

что-то типо такого?
if (horizontalLook.x < 0) { adjustedX = -xOffset; } if (horizontalLook.z < 0) { adjustedZ = -zOffset; }:
 
Сверху