Как добавить свой предмет в дроп с моба? (Как перевесту RegistryObject в Item)

Версия Minecraft
1.16.4
API
Forge
40
1
0
Добрый день. Пытаюсь сделать так, чтоб при убийстве моба с определённым шансом выпадал определённый предмет из моего мода.
При запуске майнкрафт вылетает, ругаясь на эту строку:
Java:
new ItemStack(ItemsInit.SKELETON_HAND.get().getItem())
В чём проблема? Я так понял, что неправильно перевожу RegistryObject *_HAND в Item?

Класс загрузки предметов:

Java:
public class ItemsInit {
    public static final DeferredRegister<Item> ITEMS =
            DeferredRegister.create(ForgeRegistries.ITEMS, AnatomyMod.MOD_ID);

    public static final RegistryObject<Item> ZOMBIE_HAND =
            ITEMS.register("zombie_hand",
                    () -> new Item(new Item.Properties().group(ItemGroup.MATERIALS)));

    public static final RegistryObject<Item> SKELETON_HAND =
            ITEMS.register("skeleton_hand",
                    () -> new Item(new Item.Properties().group(ItemGroup.MATERIALS)));
}

Класс обработки событий:

Java:
@EventBusSubscriber(modid = AnatomyMod.MOD_ID, bus = Bus.FORGE)
public class AnatomyEvents {

    static int chance = 25;
    static ItemStack[] zombieDrops = new ItemStack[] {
            new ItemStack(ItemsInit.ZOMBIE_HAND.get().getItem())
    };
    static ItemStack[] skeletonDrops = new ItemStack[] {
            new ItemStack(ItemsInit.SKELETON_HAND.get().getItem())
    };

    @SubscribeEvent
    public static void addDropItem(final LivingDropsEvent event) {
        Entity entity = event.getEntity();
        World world = entity.getEntityWorld();
        if (!(world.getRandom().nextInt(100) < chance)) return;
        ItemStack is;
        boolean isZombie = entity instanceof ZombieEntity;
        boolean isSkeleton = entity instanceof SkeletonEntity;
        if (isZombie) {
            // Пока что там один предмет
            is = zombieDrops[world.getRandom().nextInt(zombieDrops.length)];
        }
        else if (isSkeleton) {
            // Пока что там один предмет
            is = skeletonDrops[world.getRandom().nextInt(zombieDrops.length)];
        }
        else {
            return;
        }
        double x = entity.getPosX(), y = entity.getPosY(), z = entity.getPosZ();
        event.getDrops().add(new ItemEntity(world, x, y, z, is));
    }
}
 
7,099
324
1,510
Если у тебя есть RegistryObject<A>, то чтобы получить это самое A нужно вызвать метод get.
Например:
Java:
//регистрация
public static final RegistryObject<Item> SKELETON_HAND = ...

//где-то
Item itemSkeletonHand = SKELETON_HAND.get();
 
40
1
0
Если у тебя есть RegistryObject<A>, то чтобы получить это самое A нужно вызвать метод get.
Java:
static ItemStack[] zombieDrops = new ItemStack[] {
            new ItemStack(ItemsInit.ZOMBIE_HAND.get())
    };

ItemStack принимает IItemProvider, а get() возвращает RegistryObject. Всё равно ошибка. Вот краш файл:
 

Вложения

  • crash-2021-02-15_18.15.23-fml.txt
    8.7 KB · Просмотры: 1
7,099
324
1,510
Когда тебе нужен предмет - вызывай SKELETON_HAND.get() в последний момент. Не вызывай его заранее
 
88
4
6
в своём мобе я использовал метод dropCustomDeathLoot, вот код
Java:
@Override
protected void dropCustomDeathLoot(DamageSource pDamageSource, int pLooting, boolean pRecentlyHit) {
    super.dropCustomDeathLoot(pDamageSource, pLooting, pRecentlyHit);
    ItemEntity itemEntity = this.spawnAtLocation(Registration.TINY_MATTER_SHARD.get(), 4);
    if (itemEntity != null) {
        itemEntity.setExtendedLifetime();
    }
}
но есть минус, с моба падает лишь только 1 предмет
 
Сверху