From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: tr7zw <tr7zw@live.de>
Date: Sat, 1 Aug 2020 15:55:15 -0500
Subject: [PATCH] Add NBT API as a first-class lib


diff --git a/pom.xml b/pom.xml
index ce3676f8f8db8cff686d4cdf47b496d51e0af7df..4689aa0788afb7fe5b7c8d1a906373bef2744e91 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,11 @@
             <id>mojang</id>
             <url>https://libraries.minecraft.net/</url>
         </repository>
+        <!-- CodeMC -->
+        <repository>
+            <id>codemc-repo</id>
+            <url>https://repo.codemc.io/repository/maven-public/</url>
+        </repository>
     </repositories>
 
     <!-- Paper start -->
@@ -185,6 +190,11 @@
             <artifactId>asm-commons</artifactId>
             <version>9.1</version>
         </dependency>
+        <dependency>
+            <groupId>de.tr7zw</groupId>
+            <artifactId>item-nbt-api</artifactId>
+            <version>2.7.1</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -259,6 +269,12 @@
                     <dependencyReducedPomLocation>${project.build.directory}/dependency-reduced-pom.xml</dependencyReducedPomLocation>
                     <!-- when downloading via Maven we can pull depends individually -->
                     <shadedArtifactAttached>true</shadedArtifactAttached>
+                    <relocations>
+                        <relocation>
+                            <pattern>de.tr7zw.changeme.nbtapi</pattern>
+                            <shadedPattern>de.tr7zw.nbtapi</shadedPattern>
+                        </relocation>
+                    </relocations>
                 </configuration>
             </plugin>
             <plugin>
diff --git a/src/main/java/org/bukkit/Chunk.java b/src/main/java/org/bukkit/Chunk.java
index 98263d896f316983609432c45b85401a2692432d..afaa459d2c351f99b598ec9054a6838ffb0098e8 100644
--- a/src/main/java/org/bukkit/Chunk.java
+++ b/src/main/java/org/bukkit/Chunk.java
@@ -275,4 +275,16 @@ public interface Chunk extends PersistentDataHolder {
      * @return if the block is contained within
      */
     boolean contains(@NotNull BlockData block);
+
+    // Yatopia start
+    /**
+    * Returns a custom tag container of this chunk.
+    *
+    * @return custom NBT tags container
+    */
+    @NotNull
+    default de.tr7zw.changeme.nbtapi.NBTCompound getNBTC() {
+        return new de.tr7zw.changeme.nbtapi.NBTChunk(this).getPersistentDataContainer();
+    }
+    // Yatopia end
 }
diff --git a/src/main/java/org/bukkit/block/TileState.java b/src/main/java/org/bukkit/block/TileState.java
index 3b10fcc13893403b29f0260b8605144679e89b82..1e9a96d8b08cc396acf73dc42083009354e89d8a 100644
--- a/src/main/java/org/bukkit/block/TileState.java
+++ b/src/main/java/org/bukkit/block/TileState.java
@@ -36,4 +36,26 @@ public interface TileState extends BlockState, PersistentDataHolder {
     @NotNull
     @Override
     PersistentDataContainer getPersistentDataContainer();
+
+    // Yatopia start
+    /**
+     * Returns NBT representation of this tile entity.
+     *
+     * @return vanilla NBT tags container
+     */
+    @NotNull
+    default de.tr7zw.changeme.nbtapi.NBTTileEntity getNBT() {
+        return new de.tr7zw.changeme.nbtapi.NBTTileEntity(this);
+    }
+
+    /**
+     * Returns a custom tag container of this tile entity.
+     *
+     * @return custom NBT tags container
+     */
+    @NotNull
+    default de.tr7zw.changeme.nbtapi.NBTCompound getNBTC() {
+        return getNBT().getPersistentDataContainer();
+    }
+    // Yatopia end
 }
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
index 1e25f387e053b648477a3e9dace1a6c95e7f8cba..02c5967dcc8591d4324d1218eb8c2ff0cb961647 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
@@ -771,4 +771,26 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
      */
     boolean spawnAt(@NotNull Location location, @NotNull org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason);
     // Purpur end
+
+    // Yatopia start
+    /**
+     * Returns NBT representation of this entity.
+     *
+     * @return vanilla NBT tags container
+     */
+    @NotNull
+    default de.tr7zw.changeme.nbtapi.NBTEntity getNBT() {
+        return new de.tr7zw.changeme.nbtapi.NBTEntity(this);
+    }
+
+    /**
+     * Returns a custom tag container of this entity.
+     *
+     * @return custom NBT tags container
+     */
+    @NotNull
+    default de.tr7zw.changeme.nbtapi.NBTCompound getNBTC() {
+        return getNBT().getPersistentDataContainer();
+    }
+    // Yatopia end
 }
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index 314658c7dac1b1fbb440ec85133e6670e52ba684..714070dcb1fc35ba4aa42a3ecece810599777c22 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -1478,4 +1478,42 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
     }
 
     // Purpur end
+
+    // Yatopia start
+    /**
+     * Returns NBT representation of this item. The ItemStack will be cloned!
+     *
+     * @return item's NBT tags container
+     */
+    @NotNull
+    public de.tr7zw.changeme.nbtapi.NBTItem getNBT() {
+        return getNBT(false);
+    }
+
+    /**
+     * Returns NBT representation of this item. If directApply is true,
+     * all changes will be mapped to the original item. Changes to the NBTItem will
+     * overwrite changes done to the original item in that case.
+     *
+     * @param directApply if true, changes to NBTItem will affect this ItemStack
+     * @return item's NBT tags container
+     */
+    @NotNull
+    public de.tr7zw.changeme.nbtapi.NBTItem getNBT(boolean directApply) {
+        return new de.tr7zw.changeme.nbtapi.NBTItem(this, directApply);
+    }
+
+    /**
+     * Applies NBT data from the provided NBT item.
+     *
+     * @param nbt ItemStack's NBT container
+     */
+    public void setNBT(@NotNull de.tr7zw.changeme.nbtapi.NBTItem nbt) {
+        ItemStack nbtItem = nbt.getItem();
+        setType(nbtItem.getType());
+        setAmount(nbtItem.getAmount());
+        setData(nbtItem.getData());
+        setItemMeta(nbtItem.getItemMeta());
+    }
+    // Yatopia end
 }
