1Love_Artix001
Пользователь
- Сообщения
- 40
Всем здравствуйте! Пишу свой плагин на рюкзаки.
Проблема заключается в том, что у моего рюкзака есть отдельный NBT-тег, который отвечает за его уровень (всего 3). Эти NBT-теги используются в крафте, но:
каким то образом при сохранении предметов в сам рюкзак к нему добавляется новый NBT-тег. Раньше, он не добавлялся, но проблема была точно такая же. И после добавления или перезаписи NBT-тега крафт переставал работать. Код:
- класс самих рюкзаков.
- класс с логикой крафта.
- BackPackManager
СРАЗУ СКАЖУ!! Пишу с нейронкой, ибо сейчас только изучаю Java и узнаю Bukkit API.
Пожалуйста, не пинайте. А если сильно хотите, то, пожалуйста, не больно
Проблема заключается в том, что у моего рюкзака есть отдельный 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();
}
СРАЗУ СКАЖУ!! Пишу с нейронкой, ибо сейчас только изучаю Java и узнаю Bukkit API.
Пожалуйста, не пинайте. А если сильно хотите, то, пожалуйста, не больно
Последнее редактирование: