Первый этап познания абстракции: уникальные инструменты

Версия Minecraft
1.15.2
205
12
103
Ахой. Я уже успел всем изрядно надоесть, поскольку меня тут слишком часто видно с вопросами, но всё же...

Есть у меня ряд блоков без каких-либо особых супер-сложных функций. По задумке, эти блоки можно будет добывать ТОЛЬКО этими инструментами. Допустим, есть у меня алмазный топор и железная кирка из ванили, ими я даже не смогу нанести вред или просто сломать (не то что бы добыть), и есть у меня моя собственная (из моего мода, т.е.) деревянная+ кирка, которой добывается этот блок.

Насколько я понимаю, для реализации вот такого мне нужно реализовать абстрактный класс, наследующий собой ванильный класс кирки, и добавить ему собственный материал и тип (не pickaxe, а terraPickaxe, например). И теперь напрашивается вопрос, как указать что именно конкретный спектр блоков я могу добывать этой киркой?

Цель: Реализовать механику инструментов из террарии.

И второй, "бонусный вопрос", в котором я хотел бы узнать, насколько правильно я сделал этот метод:
Java:
    @Override
    protected void onImpact(@Nonnull RayTraceResult rayTraceResult) {
        if (!world.isRemote) {
            switch (rayTraceResult.getType()) {
                case BLOCK: {
                    BlockRayTraceResult blockRayTraceResult = (BlockRayTraceResult) rayTraceResult;
                    if (world.getBlockState(blockRayTraceResult.getPos()).isSolid()) {
                        this.remove();
                        if (rand.nextInt(3) == 0) {
                            world.addEntity(new ItemEntity(this.world, this.getPosX(), this.getPosY() + 1.0F, this.getPosZ(), new ItemStack(FunctionalItems.Items.wooden_arrow)));
                        }
                        break;
                    } else {
                        return;
                    }
                }
                case ENTITY: {
                    EntityRayTraceResult entityRayTraceResult = (EntityRayTraceResult) rayTraceResult;
                    if (entityRayTraceResult.getEntity() instanceof LivingEntity && entityRayTraceResult.getEntity() != getThrower()) {
                        LivingEntity thrower = getThrower();
                        entityRayTraceResult.getEntity().attackEntityFrom(thrower != null
                                ? thrower instanceof PlayerEntity
                                ? DamageSource.causeThrownDamage(this, thrower)
                                : DamageSource.causeMobDamage(thrower)
                                : DamageSource.GENERIC, 5);
                        this.remove();
                    }
                    break;
                }
                default:
                    break;
            }
        }
    }
В нём нужно выполнять 2 вещи, пока что:
1. Если попадает в проходимый блок, снаряд не должен умирать, а должна лететь дальше. Если блок непроходимый - умирает, с шансом 1/3 снаряд выпадает в мир в виде предмета.
2. Если цель - энтить, дает ей по щам и удаляется.

P.S. - Думаю, многие, кто видел мои вопросы, уже заметили, что я совершенно не знаком с Java (ну или знаком на уровне "Я могу распарсить код и примерно понять что тут происходит, но это не точно"). Лезть своими грязными лапками в такое не имея базовых представлений - плохо, знаю.
 
205
12
103
Всё оказалось куда проще. Наследуем ToolItem, определяем в хешсете перечень блоков, которые инструмент может копать, затем оверрайдим getToolSpeed и устанавливаем, что в случае соответствия целевого добываемого блока перечню в хешсете устанавливается нужная скорость добычи, в остальном скорость добычи равна 0.
 
Сверху