diff --git a/paper-api/src/main/java/org/bukkit/Bukkit.java b/paper-api/src/main/java/org/bukkit/Bukkit.java index 2e558ebebc..c19f89f7d6 100644 --- a/paper-api/src/main/java/org/bukkit/Bukkit.java +++ b/paper-api/src/main/java/org/bukkit/Bukkit.java @@ -27,6 +27,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityFactory; +import org.bukkit.entity.EntitySnapshot; import org.bukkit.entity.Player; import org.bukkit.entity.SpawnCategory; import org.bukkit.event.inventory.InventoryType; @@ -1723,6 +1725,17 @@ public final class Bukkit { return server.getItemFactory(); } + /** + * Gets the instance of the entity factory (for {@link EntitySnapshot}). + * + * @return the entity factory + * @see EntityFactory + */ + @NotNull + public static EntityFactory getEntityFactory() { + return server.getEntityFactory(); + } + /** * Gets the instance of the scoreboard manager. *
diff --git a/paper-api/src/main/java/org/bukkit/Server.java b/paper-api/src/main/java/org/bukkit/Server.java index 3b8832ee40..bea7a3ccb8 100644 --- a/paper-api/src/main/java/org/bukkit/Server.java +++ b/paper-api/src/main/java/org/bukkit/Server.java @@ -27,6 +27,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityFactory; +import org.bukkit.entity.EntitySnapshot; import org.bukkit.entity.Player; import org.bukkit.entity.SpawnCategory; import org.bukkit.event.inventory.InventoryType; @@ -1461,6 +1463,15 @@ public interface Server extends PluginMessageRecipient { @NotNull ItemFactory getItemFactory(); + /** + * Gets the instance of the entity factory (for {@link EntitySnapshot}). + * + * @return the entity factory + * @see EntityFactory + */ + @NotNull + EntityFactory getEntityFactory(); + /** * Gets the instance of the scoreboard manager. *
diff --git a/paper-api/src/main/java/org/bukkit/entity/Entity.java b/paper-api/src/main/java/org/bukkit/entity/Entity.java index dcd2b5097f..dee99ac294 100644 --- a/paper-api/src/main/java/org/bukkit/entity/Entity.java +++ b/paper-api/src/main/java/org/bukkit/entity/Entity.java @@ -726,6 +726,17 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent */ boolean isInWorld(); + /** + * Get this entity as an NBT string. + *
+ * This string should not be relied upon as a serializable value.
+ *
+ * @return the NBT string or null if one cannot be made
+ */
+ @Nullable
+ @ApiStatus.Experimental
+ String getAsString();
+
/**
* Crates an {@link EntitySnapshot} representing the current state of this entity.
*
diff --git a/paper-api/src/main/java/org/bukkit/entity/EntityFactory.java b/paper-api/src/main/java/org/bukkit/entity/EntityFactory.java
new file mode 100644
index 0000000000..44cce12613
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/entity/EntityFactory.java
@@ -0,0 +1,19 @@
+package org.bukkit.entity;
+
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+@ApiStatus.Experimental
+public interface EntityFactory {
+
+ /**
+ * Create a new EntitySnapshot with the supplied input.
+ * Accepts strings in the format output by {@link EntitySnapshot#getAsString()}.
+ *
+ * @param input the input string
+ * @return the created EntitySnapshot
+ * @throws IllegalArgumentException if the input string was provided in an invalid or unsupported format
+ */
+ @NotNull
+ EntitySnapshot createEntitySnapshot(@NotNull String input) throws IllegalArgumentException;
+}
diff --git a/paper-api/src/main/java/org/bukkit/entity/EntitySnapshot.java b/paper-api/src/main/java/org/bukkit/entity/EntitySnapshot.java
index 6f34486ab1..737e38f237 100644
--- a/paper-api/src/main/java/org/bukkit/entity/EntitySnapshot.java
+++ b/paper-api/src/main/java/org/bukkit/entity/EntitySnapshot.java
@@ -2,6 +2,7 @@ package org.bukkit.entity;
import org.bukkit.Location;
import org.bukkit.World;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
/**
@@ -36,4 +37,15 @@ public interface EntitySnapshot {
*/
@NotNull
EntityType getEntityType();
+
+ /**
+ * Get this EntitySnapshot as an NBT string.
+ *
+ * This string should not be relied upon as a serializable value. + * + * @return the NBT string + */ + @NotNull + @ApiStatus.Experimental + String getAsString(); }