Вопрос Нестакабильные предметы

MrH1tech

Пользователь
Сообщения
34
Как сделать свои предметы (ItemStack) нестакабильными?

На просторах интернета нашел данный вариант, но он работает для стандартных предметов (по типу яблок), а мне нужно сделать это именно для моего предмета с моим названием и т.п.
Java:
public void setMaxStackSize(Item item, int i){
    try {
        Field field = Item.class.getDeclaredField("maxStackSize");
        field.setAccessible(true);
        field.setInt(item, i);
    } catch (Exception e) {}
}
 
Решение
Если конкретно изменить переменную макс стак сайз, то можно как-то так
Java:
private void giveItem(Player player, ItemStack stack, int stackSize) {
    stack = setMaxStackSize(stack, stackSize);
    if (stack == null) return;
    player.getInventory().addItem(stack);
}

private ItemStack setMaxStackSize(ItemStack stack, int size) {
    try {
        var nmsStack = CraftItemStack.asNMSCopy(stack);
        var item = nmsStack.getItem();
        var stackField = item.getClass().getDeclaredField("c");
        stackField.setAccessible(true);
        FieldHelper.makeNonFinal(stackField);
        stackField.set(item, size);
        return CraftItemStack.asBukkitCopy(nmsStack);
    } catch (IllegalAccessException | NoSuchFieldException e) {...
Если конкретно изменить переменную макс стак сайз, то можно как-то так
Java:
private void giveItem(Player player, ItemStack stack, int stackSize) {
    stack = setMaxStackSize(stack, stackSize);
    if (stack == null) return;
    player.getInventory().addItem(stack);
}

private ItemStack setMaxStackSize(ItemStack stack, int size) {
    try {
        var nmsStack = CraftItemStack.asNMSCopy(stack);
        var item = nmsStack.getItem();
        var stackField = item.getClass().getDeclaredField("c");
        stackField.setAccessible(true);
        FieldHelper.makeNonFinal(stackField);
        stackField.set(item, size);
        return CraftItemStack.asBukkitCopy(nmsStack);
    } catch (IllegalAccessException | NoSuchFieldException e) {
        e.printStackTrace();
    }
    return null;
}

private static class FieldHelper {

    private static final VarHandle MODIFIERS;

    static {
        try {
            var lookup = MethodHandles.privateLookupIn(Field.class, MethodHandles.lookup());
            MODIFIERS = lookup.findVarHandle(Field.class, "modifiers", int.class);
        } catch (IllegalAccessException | NoSuchFieldException ex) {
            throw new RuntimeException(ex);
        }
    }

    public static void makeNonFinal(Field field) {
        int mods = field.getModifiers();
        if (Modifier.isFinal(mods)) {
            MODIFIERS.set(field, mods & ~Modifier.FINAL);
        }
    }

}

Т.к. ты не указал версию - сделал на 1.17 (16 java )
Объединено

Кстати, можешь еще повесить NamespacedKey на стак, либо нбт тег напрямую через нмс
Пример с NamespacedKey -
 
Последнее редактирование:
Назад
Сверху Снизу