Вопрос Проблема с крафтом кастомных предметов

Версия Minecraft
1.16.X

1Love_Artix001

Пользователь
Сообщения
40
Всем здравствуйте! Пишу свой плагин на рюкзаки.
Проблема заключается в том, что у моего рюкзака есть отдельный NBT-тег, который отвечает за его уровень (всего 3). Эти NBT-теги используются в крафте, но:
каким то образом при сохранении предметов в сам рюкзак к нему добавляется новый NBT-тег. Раньше, он не добавлялся, но проблема была точно такая же. И после добавления или перезаписи NBT-тега крафт переставал работать. Код:
Java:
static final String BACKPACK_LEVEL_KEY = "backpackLevel";
private static final String BACKPACK_CONTENT_KEY = "backpackContent";


public static boolean isBackpack(ItemStack item) {
    if (item == null || !item.getType().name().endsWith("_SHULKER_BOX")) return false;
    NBTItem nbtItem = new NBTItem(item);
    return nbtItem.hasKey(BACKPACK_LEVEL_KEY);
}


public static boolean isBackpack(ItemStack item, int level) {
    if (item == null || !item.getType().name().endsWith("_SHULKER_BOX")) return false;
    NBTItem nbtItem = new NBTItem(item);
    return nbtItem.hasKey(BACKPACK_LEVEL_KEY) && nbtItem.getInteger(BACKPACK_LEVEL_KEY) == level;
}


static int getBackpackLevel(ItemStack item) {
    NBTItem nbtItem = new NBTItem(item);
    return nbtItem.getInteger(BACKPACK_LEVEL_KEY);
}


static void loadItemsFromShulker(ItemStack shulker, Inventory inventory, Player player) {
    NBTItem nbtItem = new NBTItem(shulker);
    if (nbtItem.hasKey(BACKPACK_CONTENT_KEY)) {
        String encodedInventory = nbtItem.getString(BACKPACK_CONTENT_KEY);
        // Декодирование и загрузка инвентаря
    }
}


public static void saveItemsToShulker(ItemStack shulker, Inventory inventory) {
    if (inventory == null) {
        return;
    }


    NBTItem nbtItem = new NBTItem(shulker);
    String newContent = encodeInventory(inventory);
    nbtItem.setString(BACKPACK_CONTENT_KEY, newContent);
    shulker.setItemMeta(nbtItem.getItem().getItemMeta());
}
- класс самих рюкзаков.
Java:
import de.tr7zw.changeme.nbtapi.NBTItem;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.RecipeChoice;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.ArrayList;
import java.util.List;

public class CraftingManager {

private final ShulkerPacks plugin;
private final BackpackManager backpackManager;

public CraftingManager(ShulkerPacks plugin, BackpackManager backpackManager) {
this.plugin = plugin;
this.backpackManager = backpackManager;
        registerRecipes();
    }

private void registerRecipes() {
        registerLevel1Recipe();
        registerLevel2Recipe();
        registerLevel3Recipe();
    }

private void registerLevel1Recipe() {
ItemStack backpack = backpackManager.createBackpack(1);
ShapedRecipe recipe = new ShapedRecipe(new NamespacedKey(plugin, "backpack_level_1"), backpack);
recipe.shape("ABA", "BCB", "ABA");
recipe.setIngredient('A', Material.NETHERITE_INGOT);
recipe.setIngredient('B', Material.NETHERITE_SCRAP);
recipe.setIngredient('C', Material.SHULKER_BOX);
 plugin.getServer().addRecipe(recipe);
    }

private void registerLevel2Recipe() {
ItemStack backpack = backpackManager.createBackpack(2);
ShapedRecipe recipe = new ShapedRecipe(new NamespacedKey(plugin, "backpack_level_2"), backpack);
recipe.shape("AAA", "ABA", "AAA");
recipe.setIngredient('A', Material.NETHERITE_INGOT);
recipe.setIngredient('B', new RecipeChoice.ExactChoice(getBackpackItems(1))); // Используем рюкзак 1 уровня
        plugin.getServer().addRecipe(recipe);
    }

private void registerLevel3Recipe() {
ItemStack backpack = backpackManager.createBackpack(3);
ShapedRecipe recipe = new ShapedRecipe(new NamespacedKey(plugin, "backpack_level_3"), backpack);
recipe.shape("ABA", "CFC", "ABA");
recipe.setIngredient('A', Material.NETHERITE_INGOT);
recipe.setIngredient('B', Material.NETHERITE_SCRAP);
recipe.setIngredient('C', Material.NETHERITE_BLOCK);
recipe.setIngredient('F', new RecipeChoice.ExactChoice(getBackpackItems(2))); // Используем рюкзак 2 уровня
        plugin.getServer().addRecipe(recipe);
    }

private List<ItemStack> getBackpackItems(int level) {
List<ItemStack> backpacks = new ArrayList<>();
for (Material material : Material.values()) {
if (material.name().endsWith("_SHULKER_BOX")) {
ItemStack shulkerBox = new ItemStack(material);
NBTItem nbtItem = new NBTItem(shulkerBox);
nbtItem.setInteger(BackPackInventory.BACKPACK_LEVEL_KEY, level);
                shulkerBox.setItemMeta(nbtItem.getItem().getItemMeta());
                backpacks.add(shulkerBox);
            }
        }
 return backpacks;
    }
}
}
- класс с логикой крафта.
Java:
public ItemStack createBackpack(int level) {
    ItemStack backpack = new ItemStack(Material.valueOf(color.name() + "_SHULKER_BOX"));
    ItemMeta meta = backpack.getItemMeta();
    backpack.setItemMeta(meta);


    NBTItem nbtItem = new NBTItem(backpack);
    nbtItem.setInteger(BackPackInventory.BACKPACK_LEVEL_KEY, level);
    return nbtItem.getItem();
}
- BackPackManager

СРАЗУ СКАЖУ!! Пишу с нейронкой, ибо сейчас только изучаю Java и узнаю Bukkit API.
Пожалуйста, не пинайте. А если сильно хотите, то, пожалуйста, не больно :)
 
Последнее редактирование:
Пожалуйста, не пинайте. А если сильно хотите, то, пожалуйста, не больно
offtop
Отпинать нужно тех медийных личностей, которые на полном серьезе втирают, что без квалифицированного разработчика, с помощью нейросетей можно написать нормальный рабочий продукт

Вот выблевала языковая модель какой-то код и первым же делом ты побежал спрашивать где ошибка у квалифицированного разработчика ...

Тебя пинать уже не зачем - ты итак сам себе оба колена прострелил, полагаясь на советы упомянутых личностей выше, и бонусом сел в лужу
 
Последнее редактирование:
Если плагин на версию 1.16+, то не ломай себе мозги с NBT, а лучше почитай про Persistent Data Container.

offtop Нейронка от Claude намного лучше понимает, как писать код под ведро апи, если уж и решил стрелять в колено, то делай это красиво.
 
Назад
Сверху Снизу