24package com.dreamfirestudios.dreamcore.DreamPersistentData;
26import com.dreamfirestudios.dreamcore.DreamChat.DreamChat;
27import com.dreamfirestudios.dreamcore.DreamChat.DreamMessageSettings;
28import com.dreamfirestudios.dreamcore.DreamCore;
29import org.bukkit.Bukkit;
30import org.bukkit.NamespacedKey;
31import org.bukkit.block.Block;
32import org.bukkit.block.TileState;
33import org.bukkit.persistence.PersistentDataContainer;
34import org.bukkit.persistence.PersistentDataType;
35import org.bukkit.plugin.java.JavaPlugin;
37import java.util.LinkedHashMap;
38import java.util.logging.Level;
54 return key !=
null && key.matches(
"[a-z0-9/._-]{1,256}");
65 throw new IllegalArgumentException(
"Block cannot be null.");
67 if(!(block instanceof TileState tileState)){
68 throw new IllegalArgumentException(
"Block must be instance of tile state!");
70 return tileState.getPersistentDataContainer();
84 public static LinkedHashMap<PersistentDataTypes, LinkedHashMap<String, Object>>
GetALl(Block block){
85 var data =
new LinkedHashMap<PersistentDataTypes, LinkedHashMap<String, Object>>();
86 for(var persistentDataTypeEnum :
PersistentDataTypes.values()) data.put(persistentDataTypeEnum,
GetALl(block, persistentDataTypeEnum));
97 var data =
new LinkedHashMap<String, Object>();
101 for (var namespacedKey : persistentDataContainer.getKeys()) {
102 data.put(namespacedKey.getKey(), persistentDataContainer.get(namespacedKey, persistentData));
104 }
catch (Exception e) {
105 DreamChat.SendMessageToConsole(
"Error while retrieving persistent data", DreamMessageSettings.all());
124 public static <T> T
Get(JavaPlugin javaPlugin, Block block, String key, PersistentDataType<?, T> type) {
126 DreamChat.SendMessageToConsole(
"block is null. Cannot retrieve persistent data.", DreamMessageSettings.all());
130 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
135 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
136 var namespacedKey =
new NamespacedKey(javaPlugin, key);
137 return container.has(namespacedKey, type) ? container.get(namespacedKey, type) :
null;
138 }
catch (Exception e) {
139 DreamChat.SendMessageToConsole(
"Error while retrieving persistent data for key: " + key, DreamMessageSettings.all());
152 public static boolean Has(JavaPlugin javaPlugin, Block block, PersistentDataType persistentDataType, String key) {
154 DreamChat.SendMessageToConsole(
"block is null. Cannot retrieve persistent data.", DreamMessageSettings.all());
158 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
162 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
164 var namespacedKey =
new NamespacedKey(javaPlugin, key);
165 return persistentDataContainer.has(namespacedKey, persistentDataType);
166 }
catch (Exception e) {
167 DreamChat.SendMessageToConsole(
"Error while checking persistent data for key: " + key, DreamMessageSettings.all());
187 public static <T>
boolean Add(JavaPlugin javaPlugin, Block block, PersistentDataType<?, T> type, String key, T value) {
189 DreamChat.SendMessageToConsole(
"block is null. Cannot retrieve persistent data.", DreamMessageSettings.all());
193 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
196 if(!(block instanceof TileState tileState)){
197 throw new IllegalArgumentException(
"Block must be instance of tile state!");
200 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
201 var persistentDataContainer = tileState.getPersistentDataContainer();
202 var namespacedKey =
new NamespacedKey(javaPlugin, key);
203 persistentDataContainer.set(namespacedKey, type, value);
207 }
catch (Exception e) {
208 DreamChat.SendMessageToConsole(
"Error while adding persistent data for key: " + key, DreamMessageSettings.all());
220 public static boolean Remove(JavaPlugin javaPlugin, Block block, String key) {
222 DreamChat.SendMessageToConsole(
"block is null. Cannot retrieve persistent data.", DreamMessageSettings.all());
226 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
229 if(!(block instanceof TileState tileState)){
230 throw new IllegalArgumentException(
"Block must be instance of tile state!");
233 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
234 var persistentDataContainer = tileState.getPersistentDataContainer();
235 var namespacedKey =
new NamespacedKey(javaPlugin, key);
236 persistentDataContainer.remove(namespacedKey);
240 }
catch (Exception e) {
241 DreamChat.SendMessageToConsole(
"Error while adding persistent data for key: " + key, DreamMessageSettings.all());
257 if (from ==
null || to ==
null) {
258 DreamChat.SendMessageToConsole(
"Source or target entity is null. Cannot clone data.", DreamMessageSettings.all());
262 var fromData =
GetALl(from);
263 fromData.forEach((type, values) -> {
264 values.forEach((key, value) ->
Add(
null, to, type.persistentDataType, key, value));
266 }
catch (Exception e) {
267 DreamChat.SendMessageToConsole(
"Error while cloning persistent data.", DreamMessageSettings.all());
287 public static <T>
boolean AddExpiring(JavaPlugin javaPlugin, Block block, PersistentDataType<?, T> type, String key, T value,
long expiryMillis) {
289 DreamChat.SendMessageToConsole(
"Entity is null. Cannot add expiring persistent data.", DreamMessageSettings.all());
293 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
297 Add(javaPlugin, block, type, key, value);
298 Bukkit.getScheduler().runTaskLater(javaPlugin, () ->
Remove(javaPlugin, block, key), expiryMillis / 50);
300 }
catch (Exception e) {
301 DreamChat.SendMessageToConsole(
"Error while adding expiring persistent data for key: " + key, DreamMessageSettings.all());
Utilities for working with PersistentDataContainer on Block tile entities.
static LinkedHashMap< String, Object > GetALl(Block block, PersistentDataTypes persistentDataType)
Retrieves all persistent data of a specific type from a block's container.
static boolean isValidKey(String key)
Validates whether a given key conforms to NamespacedKey requirements.
static LinkedHashMap< PersistentDataTypes, LinkedHashMap< String, Object > > GetALl(Block block)
Retrieves all persistent data stored in a block's container, grouped by data types.
static boolean Remove(JavaPlugin javaPlugin, Block block, String key)
Removes a value by key from a block's container.
static< T > boolean Add(JavaPlugin javaPlugin, Block block, PersistentDataType<?, T > type, String key, T value)
Adds or updates a typed value in a block's container.
static void CloneData(Block from, Block to)
Clones all persistent data from one block to another (key/type preserving).
static PersistentDataContainer ReturnPersistentDataContainer(Block block)
Returns the PersistentDataContainer for a tile Block.
static boolean Has(JavaPlugin javaPlugin, Block block, PersistentDataType persistentDataType, String key)
Checks if a key exists in a block's container.
static< T > T Get(JavaPlugin javaPlugin, Block block, String key, PersistentDataType<?, T > type)
Retrieves a typed value for a given key from a block's container.
static< T > boolean AddExpiring(JavaPlugin javaPlugin, Block block, PersistentDataType<?, T > type, String key, T value, long expiryMillis)
Adds a value that automatically expires after a given duration.
Event fired when a persistent data entry is added to a Block.
Event fired when a persistent data entry is removed from a Block.
Logical wrappers over Bukkit PersistentDataType constants, used for grouping and dumping containers b...
PersistentDataType persistentDataType
Backed Bukkit type.