From 2164ba76ab84996e63cafce71b9433c2984e8dae Mon Sep 17 00:00:00 2001 From: ScriptCat Date: Thu, 24 Jul 2025 18:17:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20ItemStack=20=D0=B2=20NBT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/tokarotik/giftapi/Main.java | 4 +- .../tokarotik/giftapi/dev/GiftCommand.java | 3 +- .../giftapi/savemanager/BasicNBT.java | 61 ++++++++++ .../giftapi/savemanager/NBTManager.java | 55 ++------- .../giftapi/savemanager/item/Item.java | 29 +++++ .../giftapi/savemanager/item/ItemGame.java | 9 ++ .../giftapi/savemanager/item/ItemNBTTag.java | 108 ++++++++++++++++++ 7 files changed, 222 insertions(+), 47 deletions(-) create mode 100644 src/main/java/tokarotik/giftapi/savemanager/BasicNBT.java create mode 100644 src/main/java/tokarotik/giftapi/savemanager/item/Item.java create mode 100644 src/main/java/tokarotik/giftapi/savemanager/item/ItemGame.java create mode 100644 src/main/java/tokarotik/giftapi/savemanager/item/ItemNBTTag.java diff --git a/src/main/java/tokarotik/giftapi/Main.java b/src/main/java/tokarotik/giftapi/Main.java index 5e46e86..8674f63 100644 --- a/src/main/java/tokarotik/giftapi/Main.java +++ b/src/main/java/tokarotik/giftapi/Main.java @@ -47,5 +47,7 @@ public class Main extends JavaPlugin implements Listener } // will open inventory GiftAPI - public void openGUI(Player player) {apiManager.openInventory(player);} + public void openGUI(Player player) { + apiManager.openInventory(player); + } } \ No newline at end of file diff --git a/src/main/java/tokarotik/giftapi/dev/GiftCommand.java b/src/main/java/tokarotik/giftapi/dev/GiftCommand.java index 3e43f5d..906dd5a 100644 --- a/src/main/java/tokarotik/giftapi/dev/GiftCommand.java +++ b/src/main/java/tokarotik/giftapi/dev/GiftCommand.java @@ -1,6 +1,5 @@ package tokarotik.giftapi.dev; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -25,7 +24,7 @@ public class GiftCommand implements CommandExecutor { return true; } - new NBTManager().write((Player) sender, Bukkit.getWorld("world").getWorldFolder().getAbsolutePath()); + new NBTManager().write((Player) sender); this.apiManager.openInventory((Player) sender); diff --git a/src/main/java/tokarotik/giftapi/savemanager/BasicNBT.java b/src/main/java/tokarotik/giftapi/savemanager/BasicNBT.java new file mode 100644 index 0000000..582edca --- /dev/null +++ b/src/main/java/tokarotik/giftapi/savemanager/BasicNBT.java @@ -0,0 +1,61 @@ +package tokarotik.giftapi.savemanager; + +import net.minecraft.server.v1_6_R3.EntityPlayer; +import net.minecraft.server.v1_6_R3.NBTCompressedStreamTools; +import net.minecraft.server.v1_6_R3.NBTTagCompound; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.io.File; +import java.io.FileOutputStream; + +public class BasicNBT { + + private String path; + + public boolean writePlayerNBT(NBTTagCompound compound, EntityPlayer entityPlayer) + { + try + { + entityPlayer.f(compound); + + FileOutputStream out = new FileOutputStream(this.path + '/' + entityPlayer.getName()); + NBTCompressedStreamTools.a(compound, out); + out.close(); + } + catch(Exception e) + { + Bukkit.getLogger().warning(e.toString()); + + return false; + } + return true; + } + + public NBTTagCompound readPlayerNBT(EntityPlayer entityPlayer) + { + NBTTagCompound compound = new NBTTagCompound(); + + entityPlayer.e(compound); + + return compound; + } + + public EntityPlayer getPlayer(Player player) + { + return ((CraftPlayer) player).getHandle(); + } + + public String getPath() { + try + { + return new File(".").getCanonicalFile().getAbsolutePath().toString(); + } + + catch (Exception e) + { + return null; + } + } +} diff --git a/src/main/java/tokarotik/giftapi/savemanager/NBTManager.java b/src/main/java/tokarotik/giftapi/savemanager/NBTManager.java index edbebab..da19168 100644 --- a/src/main/java/tokarotik/giftapi/savemanager/NBTManager.java +++ b/src/main/java/tokarotik/giftapi/savemanager/NBTManager.java @@ -1,59 +1,26 @@ package tokarotik.giftapi.savemanager; -import net.minecraft.server.v1_6_R3.*; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; +import net.minecraft.server.v1_6_R3.EntityPlayer; +import net.minecraft.server.v1_6_R3.NBTTagCompound; import org.bukkit.entity.Player; -import java.io.FileOutputStream; - public class NBTManager { - public boolean write(Player player, String path) + private BasicNBT basicNBT; + + public NBTManager() { - EntityPlayer entityPlayer = getPlayer(player); - - NBTTagCompound tag = readNBT(entityPlayer); - - tag.setInt("ASOME", 123); - - return writeNBT(tag, entityPlayer, path + "/players/" + player.getName() + ".dat"); - - } - - private EntityPlayer getPlayer(Player player) - { - return ((CraftPlayer) player).getHandle(); + this.basicNBT = new BasicNBT(); } - private boolean writeNBT(NBTTagCompound compound, EntityPlayer entityPlayer, String path) + public boolean write(Player player) { - entityPlayer.f(compound); + EntityPlayer entityPlayer = this.basicNBT.getPlayer(player); - try - { - FileOutputStream out = new FileOutputStream(path); - NBTCompressedStreamTools.a(compound, out); - out.close(); - } - catch(Exception e) - { - Bukkit.getLogger().warning(e.toString()); + NBTTagCompound tag = this.basicNBT.readPlayerNBT(entityPlayer); + + return this.basicNBT.writePlayerNBT(tag, entityPlayer); - return false; - } - return true; } - - private NBTTagCompound readNBT(EntityPlayer entityPlayer) - { - NBTTagCompound compound = new NBTTagCompound(); - - entityPlayer.e(compound); - - return compound; - } - - } diff --git a/src/main/java/tokarotik/giftapi/savemanager/item/Item.java b/src/main/java/tokarotik/giftapi/savemanager/item/Item.java new file mode 100644 index 0000000..51c7f37 --- /dev/null +++ b/src/main/java/tokarotik/giftapi/savemanager/item/Item.java @@ -0,0 +1,29 @@ +package tokarotik.giftapi.savemanager.item; + +import net.minecraft.server.v1_6_R3.NBTTagCompound; +import org.bukkit.inventory.ItemStack; + +public class Item +{ + private ItemStack item; + private NBTTagCompound tag; + + public Item(ItemStack item) + { + this.item = item; + } + + public Item(NBTTagCompound tag) + { + this.tag = tag; + } + + public void getTag() + { + ItemNBTTag item = new ItemNBTTag(this.item); + + this.tag = item.getTag(); + } + + +} diff --git a/src/main/java/tokarotik/giftapi/savemanager/item/ItemGame.java b/src/main/java/tokarotik/giftapi/savemanager/item/ItemGame.java new file mode 100644 index 0000000..2bda73c --- /dev/null +++ b/src/main/java/tokarotik/giftapi/savemanager/item/ItemGame.java @@ -0,0 +1,9 @@ +package tokarotik.giftapi.savemanager.item; + +public class ItemGame +{ + public ItemGame() + { + + } +} diff --git a/src/main/java/tokarotik/giftapi/savemanager/item/ItemNBTTag.java b/src/main/java/tokarotik/giftapi/savemanager/item/ItemNBTTag.java new file mode 100644 index 0000000..bbfa486 --- /dev/null +++ b/src/main/java/tokarotik/giftapi/savemanager/item/ItemNBTTag.java @@ -0,0 +1,108 @@ +package tokarotik.giftapi.savemanager.item; + +import net.minecraft.server.v1_6_R3.NBTTagCompound; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.List; +import java.util.Map; + +public class ItemNBTTag +{ + ItemStack item; + + public ItemNBTTag(ItemStack item) + { + this.item = item; + } + + public NBTTagCompound getTag() + { + if (this.item == null) {return null;} + + NBTTagCompound tag = new NBTTagCompound("giftapi"); + + setBasic(tag); + setMetaTag(tag); + + return tag; + } + + private void setBasic(NBTTagCompound tag) + { + tag.setShort("count", (short)this.item.getAmount()); + tag.setInt("id", this.item.getTypeId()); + tag.setShort("durability", this.item.getDurability()); + } + + private void setMetaTag(NBTTagCompound baseTag) + { + NBTTagCompound tag = new NBTTagCompound("meta"); + + if (this.item.hasItemMeta()) + { + ItemMeta meta = this.item.getItemMeta(); + + if (meta.hasDisplayName()) + { + tag.setString( + "name", + meta.getDisplayName() + ); + } + + if (meta.hasLore()) + { + tag.setCompound( + "lore", + stringListToNBTCompound(meta.getLore()) + ); + } + + if (meta.hasEnchants()) + { + + tag.setCompound( + "enchantments", + enchantsToNBTCompound(meta.getEnchants()) + ); + } + + baseTag.setCompound("meta", tag); + } + } + + private NBTTagCompound stringListToNBTCompound(List list) + { + NBTTagCompound NBTlist = new NBTTagCompound(); + + for (String s : list) { + NBTlist.setString( + null, //Integer.toString(i), - for fun + s + ); + } + return NBTlist; + } + + private NBTTagCompound enchantsToNBTCompound(Map enchantments) + { + NBTTagCompound NBTlist = new NBTTagCompound(); + + + enchantments.forEach((enchantment, level) -> { + NBTTagCompound enchantmentNBT = new NBTTagCompound(); + + int levelNBT = 0; + if (level != null) // type Integer can be null. To not get a null error I wrote it :) + { + levelNBT = level; + } + + enchantmentNBT.setInt("id", enchantment.getId()); + enchantmentNBT.setInt("level", levelNBT); + }); + return NBTlist; + } +}