Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MorePersistentDataTypes & Collections, Maps and Arrays for PDC!

SpigotMC ThreadJavadocsDiscordDonate

Maven

MorePersistentDataTypes is a tiny library that provides a ton of new PersistentDataTypes to use in conjunction with Bukkit's PersistentDataContainer. It also allows you to use any kind of Collection, Map or Array to store your data.

Features

  • Adds new PersistentDataTypes for ItemStacks, YamlConfigurations, UUIDs, Locations, and much more!
  • Allows to use any kind of Collection, Map or Array as PersistentDataType!
    • Of course also supports unlimited levels of nested Collections like LinkedHashMap<String,List<ItemStack>>
    • See below for more information

It is also possible to easily create your own PersistentDataTypes for your custom objects. When they already implement ConfigurationSerializable, it's only one line of code!

It also has the default data types built in, so you can access everything from one class. See at the bottom for a list of all new data types.

Related SpigotMC thread

Example

You want to save an ItemStack inside a PersistentDataContainer - normally you would have to serialize the ItemStack to a byte array first, or worse, to a base64 String. With MorePersistentDataTypes, you can simply do this:

pdc.set(someNamespacedKey, DataType.ITEM_STACK,myItemStack);

Furthermore, you can store EVERYTHING that implements ConfigurationSerializable using DataType.CONFIGURATION_SERIALIZABLE.

Using Collections, Arrays or Maps

Using collections, arrays or maps is easy. There are predefined methods for certain collection and map types:

Map<String, ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

If you want to use a special collection or map class that's not already included, simply pass a Supplier that returns an empty instance of your desired collection or map type. More information can be found in the Javadocs (see button at the top of this page).

TreeSet<Location> set = pdc.get(someKey, DataType.asGenericCollection(TreeSet::new, DataType.LOCATION));

For arrays, you should use the builtin default array DataType if one exists, for example DataType.STRING_ARRAY. If there is no already existing array DataType, like for UUIDs, you can use the DataType.asArray method:

PersistentDataType<?, UUID[]> uuidArrayDataType = DataType.asArray(newUUID[0], DataType.UUID);

Maven

Repository

The artifact is available on Maven Central. You don't need to add a repository to your pom.xml.

Dependency

<dependency>
<groupId>com.jeff-media</groupId>
<artifactId>MorePersistentDataTypes</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

Relocating and shading

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.jeff_media.morepersistentdatatypes</pattern>
<shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

Gradle

Repository

repositories {
mavenCentral()
}

Dependency

dependencies {
implementation 'com.jeff-media:MorePersistentDataTypes:2.4.0'
}

Relocating and shading

Plugins:

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.1"
}

ShadowJar:

shadowJar {
relocate 'com.jeff_media.morepersistentdatatypes', 'YOUR.PACKAGE.morepersistentdatatypes'
}

List of all data types

In addition to the default data types

NameSaved asClass
BOOLEANbytejava.lang.Boolean
BOOLEAN_ARRAYbyte[]java.lang.Boolean[]
CHARACTERintjava.lang.Character
CHARACTER_ARRAYint[]java.lang.Character[]
DOUBLE_ARRAYbyte[]java.lang.Double
FLOAT_ARRAYbyte[]java.lang.Float
SHORT_ARRAYbyte[]java.lang.Short
STRING_ARRAYbyte[]java.lang.String[]

Custom data types

NameSaved asNoteClass
ATTRIBUTE_MODIFIERbyte[]org.bukkit.attribute.AttributeModifier
ATTRIBUTE_MODIFIER_ARRAYbyte[]org.bukkit.attribute.AttributeModifier[]
BLOCK_DATAStringorg.bukkit.block.data.BlockData
BLOCK_VECTORbyte[]org.bukkit.util.BlockVector
BLOCK_VECTOR_ARRAYbyte[]org.bukkit.util.BlockVector[]
BOUNDING_BOXbyte[]org.bukkit.util.BoundingBox
BOUNDING_BOX_ARRAYbyte[]org.bukkit.util.BoundingBox[]
COLORbyte[]org.bukkit.Color
COLOR_ARRAYbyte[]org.bukkit.Color[]
CONFIGURATION_SERIALIZABLEbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable
CONFIGURATION_SERIALIZABLE_ARRAYbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable[]
DATElongjava.util.Date
FILE_CONFIGURATIONStringorg.bukkit.configuration.file.FileConfiguration
FIREWORK_EFFECTbyte[]org.bukkit.FireworkEffect
FIREWORK_EFFECT_ARRAYbyte[]org.bukkit.FireworkEffect[]
ITEM_METAbyte[]org.bukkit.inventory.meta.ItemMeta
ITEM_META_ARRAYbyte[]org.bukkit.inventory.meta.ItemMeta[]
ITEM_STACKbyte[]org.bukkit.inventory.ItemStack
ITEM_STACK_ARRAYbyte[]org.bukkit.inventory.ItemStack[]
LOCATIONbyte[]org.bukkit.Location
LOCATION_ARRAYbyte[]org.bukkit.Location[]
OFFLINE_PLAYERbyte[]org.bukkit.OfflinePlayer
OFFLINE_PLAYER_ARRAYbyte[]org.bukkit.OfflinePlayer[]
PATTERNbyte[]org.bukkit.block.banner.Pattern
PATTERN_ARRAYbyte[]org.bukkit.block.banner.Pattern[]
PLAYERbyte[]org.bukkit.entity.Player
PLAYER_ARRAYbyte[]org.bukkit.entity.Player[]
PLAYER_PROFILEbyte[]1.18.1+org.bukkit.profile.PlayerProfile
PLAYER_PROFILE_ARRAYbyte[]1.18.1+org.bukkit.profile.PlayerProfile[]
POTION_EFFECTbyte[]org.bukkit.potion.PotionEffect
POTION_EFFECT_ARRAYbyte[]org.bukkit.potion.PotionEffect[]
UUIDbyte[]java.util.UUID
VECTORbyte[]org.bukkit.util.Vector
VECTOR_ARRAYbyte[]org.bukkit.util.Vector[]

Creating your own PersistentDataTypes

Using ConfigurationSeriazableDataType

When your custom Object already implements ConfigurationSerializable, it's even easier. Just look at the SerializablePerson.java in the examples/ folder.

To make it storable in a PersistentDataContainer, this is all you need:

PersistentDataType<byte[],SerializablePerson> personType = newConfigurationSerializableDataType<>(SerializablePerson.class);

You can also directly store arrays of your own ConfigurationSerializable objects:

PersistentDataType<byte[],SerializablePerson[]> personArrayType = newConfigurationSerializableArrayDataType<>(SerializablePerson.class,SerializablePerson[].class);

Using GenericDataType

You can also easily create own generic PersistentDataTypes by creating a new GenericDataType instance. It expects 4 parameters:

  1. The primitive type that's used to store the object
  2. The complex type / the class of which you want to store an instance of
  3. A method that converts your object into the primitive type
  4. A method that converts the primitive type into your object again

For example, this returns a PersistentDataType<Long,Date> that can save java.util.Date objects inside a PersistentDataContainer:

PersistentDataType<Long, Date> dateType = newGenericDataType<>(Long.class,Date.class,Date::new,Date::getTime);

Building

Building this requires Java 17.0.0 or higher. It can still be used by Java 8 or higher, though.

Javadocs

You can find the Javadocs here: https://hub.jeff-media.com/javadocs/morepersistentdatatypes/

Other libraries by me

MorePersistentDataTypes goes perfectly well together with my CustomBlockData library, that provides a PersistentDataContainer for every block in your world - without any external storage needed!

Powerful UpdateChecker for your plugins, with only one line of code.

Discord

If you need help, feel free to join my Discord server and head to #programming-help:

Donate

If you are using this project in your paid plugins, or if you just want to buy me a coffee, I would be happy over a small donation :)

Donate with PayPal

About

Adds a ton of new PersistentDataTypes, including support for all collections, maps and arrays to the Bukkit API!

Topics

Resources

Stars

96 stars

Watchers

3 watching

Forks

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MorePersistentDataTypes & Collections, Maps and Arrays for PDC!

SpigotMC ThreadJavadocsDiscordDonate

Maven

MorePersistentDataTypes is a tiny library that provides a ton of new PersistentDataTypes to use in conjunction with Bukkit's PersistentDataContainer. It also allows you to use any kind of Collection, Map or Array to store your data.

Features

  • Adds new PersistentDataTypes for ItemStacks, YamlConfigurations, UUIDs, Locations, and much more!
  • Allows to use any kind of Collection, Map or Array as PersistentDataType!
    • Of course also supports unlimited levels of nested Collections like LinkedHashMap<String,List<ItemStack>>
    • See below for more information

It is also possible to easily create your own PersistentDataTypes for your custom objects. When they already implement ConfigurationSerializable, it's only one line of code!

It also has the default data types built in, so you can access everything from one class. See at the bottom for a list of all new data types.

Related SpigotMC thread

Example

You want to save an ItemStack inside a PersistentDataContainer - normally you would have to serialize the ItemStack to a byte array first, or worse, to a base64 String. With MorePersistentDataTypes, you can simply do this:

pdc.set(someNamespacedKey, DataType.ITEM_STACK,myItemStack);

Furthermore, you can store EVERYTHING that implements ConfigurationSerializable using DataType.CONFIGURATION_SERIALIZABLE.

Using Collections, Arrays or Maps

Using collections, arrays or maps is easy. There are predefined methods for certain collection and map types:

Map<String, ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

If you want to use a special collection or map class that's not already included, simply pass a Supplier that returns an empty instance of your desired collection or map type. More information can be found in the Javadocs (see button at the top of this page).

TreeSet<Location> set = pdc.get(someKey, DataType.asGenericCollection(TreeSet::new, DataType.LOCATION));

For arrays, you should use the builtin default array DataType if one exists, for example DataType.STRING_ARRAY. If there is no already existing array DataType, like for UUIDs, you can use the DataType.asArray method:

PersistentDataType<?, UUID[]> uuidArrayDataType = DataType.asArray(newUUID[0], DataType.UUID);

Maven

Repository

The artifact is available on Maven Central. You don't need to add a repository to your pom.xml.

Dependency

<dependency>
<groupId>com.jeff-media</groupId>
<artifactId>MorePersistentDataTypes</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

Relocating and shading

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.jeff_media.morepersistentdatatypes</pattern>
<shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

Gradle

Repository

repositories {
mavenCentral()
}

Dependency

dependencies {
implementation 'com.jeff-media:MorePersistentDataTypes:2.4.0'
}

Relocating and shading

Plugins:

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.1"
}

ShadowJar:

shadowJar {
relocate 'com.jeff_media.morepersistentdatatypes', 'YOUR.PACKAGE.morepersistentdatatypes'
}

List of all data types

In addition to the default data types

NameSaved asClass
BOOLEANbytejava.lang.Boolean
BOOLEAN_ARRAYbyte[]java.lang.Boolean[]
CHARACTERintjava.lang.Character
CHARACTER_ARRAYint[]java.lang.Character[]
DOUBLE_ARRAYbyte[]java.lang.Double
FLOAT_ARRAYbyte[]java.lang.Float
SHORT_ARRAYbyte[]java.lang.Short
STRING_ARRAYbyte[]java.lang.String[]

Custom data types

NameSaved asNoteClass
ATTRIBUTE_MODIFIERbyte[]org.bukkit.attribute.AttributeModifier
ATTRIBUTE_MODIFIER_ARRAYbyte[]org.bukkit.attribute.AttributeModifier[]
BLOCK_DATAStringorg.bukkit.block.data.BlockData
BLOCK_VECTORbyte[]org.bukkit.util.BlockVector
BLOCK_VECTOR_ARRAYbyte[]org.bukkit.util.BlockVector[]
BOUNDING_BOXbyte[]org.bukkit.util.BoundingBox
BOUNDING_BOX_ARRAYbyte[]org.bukkit.util.BoundingBox[]
COLORbyte[]org.bukkit.Color
COLOR_ARRAYbyte[]org.bukkit.Color[]
CONFIGURATION_SERIALIZABLEbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable
CONFIGURATION_SERIALIZABLE_ARRAYbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable[]
DATElongjava.util.Date
FILE_CONFIGURATIONStringorg.bukkit.configuration.file.FileConfiguration
FIREWORK_EFFECTbyte[]org.bukkit.FireworkEffect
FIREWORK_EFFECT_ARRAYbyte[]org.bukkit.FireworkEffect[]
ITEM_METAbyte[]org.bukkit.inventory.meta.ItemMeta
ITEM_META_ARRAYbyte[]org.bukkit.inventory.meta.ItemMeta[]
ITEM_STACKbyte[]org.bukkit.inventory.ItemStack
ITEM_STACK_ARRAYbyte[]org.bukkit.inventory.ItemStack[]
LOCATIONbyte[]org.bukkit.Location
LOCATION_ARRAYbyte[]org.bukkit.Location[]
OFFLINE_PLAYERbyte[]org.bukkit.OfflinePlayer
OFFLINE_PLAYER_ARRAYbyte[]org.bukkit.OfflinePlayer[]
PATTERNbyte[]org.bukkit.block.banner.Pattern
PATTERN_ARRAYbyte[]org.bukkit.block.banner.Pattern[]
PLAYERbyte[]org.bukkit.entity.Player
PLAYER_ARRAYbyte[]org.bukkit.entity.Player[]
PLAYER_PROFILEbyte[]1.18.1+org.bukkit.profile.PlayerProfile
PLAYER_PROFILE_ARRAYbyte[]1.18.1+org.bukkit.profile.PlayerProfile[]
POTION_EFFECTbyte[]org.bukkit.potion.PotionEffect
POTION_EFFECT_ARRAYbyte[]org.bukkit.potion.PotionEffect[]
UUIDbyte[]java.util.UUID
VECTORbyte[]org.bukkit.util.Vector
VECTOR_ARRAYbyte[]org.bukkit.util.Vector[]

Creating your own PersistentDataTypes

Using ConfigurationSeriazableDataType

When your custom Object already implements ConfigurationSerializable, it's even easier. Just look at the SerializablePerson.java in the examples/ folder.

To make it storable in a PersistentDataContainer, this is all you need:

PersistentDataType<byte[],SerializablePerson> personType = newConfigurationSerializableDataType<>(SerializablePerson.class);

You can also directly store arrays of your own ConfigurationSerializable objects:

PersistentDataType<byte[],SerializablePerson[]> personArrayType = newConfigurationSerializableArrayDataType<>(SerializablePerson.class,SerializablePerson[].class);

Using GenericDataType

You can also easily create own generic PersistentDataTypes by creating a new GenericDataType instance. It expects 4 parameters:

  1. The primitive type that's used to store the object
  2. The complex type / the class of which you want to store an instance of
  3. A method that converts your object into the primitive type
  4. A method that converts the primitive type into your object again

For example, this returns a PersistentDataType<Long,Date> that can save java.util.Date objects inside a PersistentDataContainer:

PersistentDataType<Long, Date> dateType = newGenericDataType<>(Long.class,Date.class,Date::new,Date::getTime);

Building

Building this requires Java 17.0.0 or higher. It can still be used by Java 8 or higher, though.

Javadocs

You can find the Javadocs here: https://hub.jeff-media.com/javadocs/morepersistentdatatypes/

Other libraries by me

MorePersistentDataTypes goes perfectly well together with my CustomBlockData library, that provides a PersistentDataContainer for every block in your world - without any external storage needed!

Powerful UpdateChecker for your plugins, with only one line of code.

Discord

If you need help, feel free to join my Discord server and head to #programming-help:

Donate

If you are using this project in your paid plugins, or if you just want to buy me a coffee, I would be happy over a small donation :)

Donate with PayPal

About

Adds a ton of new PersistentDataTypes, including support for all collections, maps and arrays to the Bukkit API!

Topics

Resources

Stars

96 stars

Watchers

3 watching

Forks

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MorePersistentDataTypes & Collections, Maps and Arrays for PDC!

SpigotMC ThreadJavadocsDiscordDonate

Maven

MorePersistentDataTypes is a tiny library that provides a ton of new PersistentDataTypes to use in conjunction with Bukkit's PersistentDataContainer. It also allows you to use any kind of Collection, Map or Array to store your data.

Features

  • Adds new PersistentDataTypes for ItemStacks, YamlConfigurations, UUIDs, Locations, and much more!
  • Allows to use any kind of Collection, Map or Array as PersistentDataType!
    • Of course also supports unlimited levels of nested Collections like LinkedHashMap<String,List<ItemStack>>
    • See below for more information

It is also possible to easily create your own PersistentDataTypes for your custom objects. When they already implement ConfigurationSerializable, it's only one line of code!

It also has the default data types built in, so you can access everything from one class. See at the bottom for a list of all new data types.

Related SpigotMC thread

Example

You want to save an ItemStack inside a PersistentDataContainer - normally you would have to serialize the ItemStack to a byte array first, or worse, to a base64 String. With MorePersistentDataTypes, you can simply do this:

pdc.set(someNamespacedKey, DataType.ITEM_STACK,myItemStack);

Furthermore, you can store EVERYTHING that implements ConfigurationSerializable using DataType.CONFIGURATION_SERIALIZABLE.

Using Collections, Arrays or Maps

Using collections, arrays or maps is easy. There are predefined methods for certain collection and map types:

Map<String, ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

If you want to use a special collection or map class that's not already included, simply pass a Supplier that returns an empty instance of your desired collection or map type. More information can be found in the Javadocs (see button at the top of this page).

TreeSet<Location> set = pdc.get(someKey, DataType.asGenericCollection(TreeSet::new, DataType.LOCATION));

For arrays, you should use the builtin default array DataType if one exists, for example DataType.STRING_ARRAY. If there is no already existing array DataType, like for UUIDs, you can use the DataType.asArray method:

PersistentDataType<?, UUID[]> uuidArrayDataType = DataType.asArray(newUUID[0], DataType.UUID);

Maven

Repository

The artifact is available on Maven Central. You don't need to add a repository to your pom.xml.

Dependency

<dependency>
<groupId>com.jeff-media</groupId>
<artifactId>MorePersistentDataTypes</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

Relocating and shading

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.jeff_media.morepersistentdatatypes</pattern>
<shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

Gradle

Repository

repositories {
mavenCentral()
}

Dependency

dependencies {
implementation 'com.jeff-media:MorePersistentDataTypes:2.4.0'
}

Relocating and shading

Plugins:

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.1"
}

ShadowJar:

shadowJar {
relocate 'com.jeff_media.morepersistentdatatypes', 'YOUR.PACKAGE.morepersistentdatatypes'
}

List of all data types

In addition to the default data types

NameSaved asClass
BOOLEANbytejava.lang.Boolean
BOOLEAN_ARRAYbyte[]java.lang.Boolean[]
CHARACTERintjava.lang.Character
CHARACTER_ARRAYint[]java.lang.Character[]
DOUBLE_ARRAYbyte[]java.lang.Double
FLOAT_ARRAYbyte[]java.lang.Float
SHORT_ARRAYbyte[]java.lang.Short
STRING_ARRAYbyte[]java.lang.String[]

Custom data types

NameSaved asNoteClass
ATTRIBUTE_MODIFIERbyte[]org.bukkit.attribute.AttributeModifier
ATTRIBUTE_MODIFIER_ARRAYbyte[]org.bukkit.attribute.AttributeModifier[]
BLOCK_DATAStringorg.bukkit.block.data.BlockData
BLOCK_VECTORbyte[]org.bukkit.util.BlockVector
BLOCK_VECTOR_ARRAYbyte[]org.bukkit.util.BlockVector[]
BOUNDING_BOXbyte[]org.bukkit.util.BoundingBox
BOUNDING_BOX_ARRAYbyte[]org.bukkit.util.BoundingBox[]
COLORbyte[]org.bukkit.Color
COLOR_ARRAYbyte[]org.bukkit.Color[]
CONFIGURATION_SERIALIZABLEbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable
CONFIGURATION_SERIALIZABLE_ARRAYbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable[]
DATElongjava.util.Date
FILE_CONFIGURATIONStringorg.bukkit.configuration.file.FileConfiguration
FIREWORK_EFFECTbyte[]org.bukkit.FireworkEffect
FIREWORK_EFFECT_ARRAYbyte[]org.bukkit.FireworkEffect[]
ITEM_METAbyte[]org.bukkit.inventory.meta.ItemMeta
ITEM_META_ARRAYbyte[]org.bukkit.inventory.meta.ItemMeta[]
ITEM_STACKbyte[]org.bukkit.inventory.ItemStack
ITEM_STACK_ARRAYbyte[]org.bukkit.inventory.ItemStack[]
LOCATIONbyte[]org.bukkit.Location
LOCATION_ARRAYbyte[]org.bukkit.Location[]
OFFLINE_PLAYERbyte[]org.bukkit.OfflinePlayer
OFFLINE_PLAYER_ARRAYbyte[]org.bukkit.OfflinePlayer[]
PATTERNbyte[]org.bukkit.block.banner.Pattern
PATTERN_ARRAYbyte[]org.bukkit.block.banner.Pattern[]
PLAYERbyte[]org.bukkit.entity.Player
PLAYER_ARRAYbyte[]org.bukkit.entity.Player[]
PLAYER_PROFILEbyte[]1.18.1+org.bukkit.profile.PlayerProfile
PLAYER_PROFILE_ARRAYbyte[]1.18.1+org.bukkit.profile.PlayerProfile[]
POTION_EFFECTbyte[]org.bukkit.potion.PotionEffect
POTION_EFFECT_ARRAYbyte[]org.bukkit.potion.PotionEffect[]
UUIDbyte[]java.util.UUID
VECTORbyte[]org.bukkit.util.Vector
VECTOR_ARRAYbyte[]org.bukkit.util.Vector[]

Creating your own PersistentDataTypes

Using ConfigurationSeriazableDataType

When your custom Object already implements ConfigurationSerializable, it's even easier. Just look at the SerializablePerson.java in the examples/ folder.

To make it storable in a PersistentDataContainer, this is all you need:

PersistentDataType<byte[],SerializablePerson> personType = newConfigurationSerializableDataType<>(SerializablePerson.class);

You can also directly store arrays of your own ConfigurationSerializable objects:

PersistentDataType<byte[],SerializablePerson[]> personArrayType = newConfigurationSerializableArrayDataType<>(SerializablePerson.class,SerializablePerson[].class);

Using GenericDataType

You can also easily create own generic PersistentDataTypes by creating a new GenericDataType instance. It expects 4 parameters:

  1. The primitive type that's used to store the object
  2. The complex type / the class of which you want to store an instance of
  3. A method that converts your object into the primitive type
  4. A method that converts the primitive type into your object again

For example, this returns a PersistentDataType<Long,Date> that can save java.util.Date objects inside a PersistentDataContainer:

PersistentDataType<Long, Date> dateType = newGenericDataType<>(Long.class,Date.class,Date::new,Date::getTime);

Building

Building this requires Java 17.0.0 or higher. It can still be used by Java 8 or higher, though.

Javadocs

You can find the Javadocs here: https://hub.jeff-media.com/javadocs/morepersistentdatatypes/

Other libraries by me

MorePersistentDataTypes goes perfectly well together with my CustomBlockData library, that provides a PersistentDataContainer for every block in your world - without any external storage needed!

Powerful UpdateChecker for your plugins, with only one line of code.

Discord

If you need help, feel free to join my Discord server and head to #programming-help:

Donate

If you are using this project in your paid plugins, or if you just want to buy me a coffee, I would be happy over a small donation :)

Donate with PayPal

About

Adds a ton of new PersistentDataTypes, including support for all collections, maps and arrays to the Bukkit API!

Topics

Resources

Stars

96 stars

Watchers

3 watching

Forks

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MorePersistentDataTypes & Collections, Maps and Arrays for PDC!

SpigotMC ThreadJavadocsDiscordDonate

Maven

MorePersistentDataTypes is a tiny library that provides a ton of new PersistentDataTypes to use in conjunction with Bukkit's PersistentDataContainer. It also allows you to use any kind of Collection, Map or Array to store your data.

Features

  • Adds new PersistentDataTypes for ItemStacks, YamlConfigurations, UUIDs, Locations, and much more!
  • Allows to use any kind of Collection, Map or Array as PersistentDataType!
    • Of course also supports unlimited levels of nested Collections like LinkedHashMap<String,List<ItemStack>>
    • See below for more information

It is also possible to easily create your own PersistentDataTypes for your custom objects. When they already implement ConfigurationSerializable, it's only one line of code!

It also has the default data types built in, so you can access everything from one class. See at the bottom for a list of all new data types.

Related SpigotMC thread

Example

You want to save an ItemStack inside a PersistentDataContainer - normally you would have to serialize the ItemStack to a byte array first, or worse, to a base64 String. With MorePersistentDataTypes, you can simply do this:

pdc.set(someNamespacedKey, DataType.ITEM_STACK,myItemStack);

Furthermore, you can store EVERYTHING that implements ConfigurationSerializable using DataType.CONFIGURATION_SERIALIZABLE.

Using Collections, Arrays or Maps

Using collections, arrays or maps is easy. There are predefined methods for certain collection and map types:

Map<String, ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

If you want to use a special collection or map class that's not already included, simply pass a Supplier that returns an empty instance of your desired collection or map type. More information can be found in the Javadocs (see button at the top of this page).

TreeSet<Location> set = pdc.get(someKey, DataType.asGenericCollection(TreeSet::new, DataType.LOCATION));

For arrays, you should use the builtin default array DataType if one exists, for example DataType.STRING_ARRAY. If there is no already existing array DataType, like for UUIDs, you can use the DataType.asArray method:

PersistentDataType<?, UUID[]> uuidArrayDataType = DataType.asArray(newUUID[0], DataType.UUID);

Maven

Repository

The artifact is available on Maven Central. You don't need to add a repository to your pom.xml.

Dependency

<dependency>
<groupId>com.jeff-media</groupId>
<artifactId>MorePersistentDataTypes</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

Relocating and shading

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.jeff_media.morepersistentdatatypes</pattern>
<shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

Gradle

Repository

repositories {
mavenCentral()
}

Dependency

dependencies {
implementation 'com.jeff-media:MorePersistentDataTypes:2.4.0'
}

Relocating and shading

Plugins:

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.1"
}

ShadowJar:

shadowJar {
relocate 'com.jeff_media.morepersistentdatatypes', 'YOUR.PACKAGE.morepersistentdatatypes'
}

List of all data types

In addition to the default data types

NameSaved asClass
BOOLEANbytejava.lang.Boolean
BOOLEAN_ARRAYbyte[]java.lang.Boolean[]
CHARACTERintjava.lang.Character
CHARACTER_ARRAYint[]java.lang.Character[]
DOUBLE_ARRAYbyte[]java.lang.Double
FLOAT_ARRAYbyte[]java.lang.Float
SHORT_ARRAYbyte[]java.lang.Short
STRING_ARRAYbyte[]java.lang.String[]

Custom data types

NameSaved asNoteClass
ATTRIBUTE_MODIFIERbyte[]org.bukkit.attribute.AttributeModifier
ATTRIBUTE_MODIFIER_ARRAYbyte[]org.bukkit.attribute.AttributeModifier[]
BLOCK_DATAStringorg.bukkit.block.data.BlockData
BLOCK_VECTORbyte[]org.bukkit.util.BlockVector
BLOCK_VECTOR_ARRAYbyte[]org.bukkit.util.BlockVector[]
BOUNDING_BOXbyte[]org.bukkit.util.BoundingBox
BOUNDING_BOX_ARRAYbyte[]org.bukkit.util.BoundingBox[]
COLORbyte[]org.bukkit.Color
COLOR_ARRAYbyte[]org.bukkit.Color[]
CONFIGURATION_SERIALIZABLEbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable
CONFIGURATION_SERIALIZABLE_ARRAYbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable[]
DATElongjava.util.Date
FILE_CONFIGURATIONStringorg.bukkit.configuration.file.FileConfiguration
FIREWORK_EFFECTbyte[]org.bukkit.FireworkEffect
FIREWORK_EFFECT_ARRAYbyte[]org.bukkit.FireworkEffect[]
ITEM_METAbyte[]org.bukkit.inventory.meta.ItemMeta
ITEM_META_ARRAYbyte[]org.bukkit.inventory.meta.ItemMeta[]
ITEM_STACKbyte[]org.bukkit.inventory.ItemStack
ITEM_STACK_ARRAYbyte[]org.bukkit.inventory.ItemStack[]
LOCATIONbyte[]org.bukkit.Location
LOCATION_ARRAYbyte[]org.bukkit.Location[]
OFFLINE_PLAYERbyte[]org.bukkit.OfflinePlayer
OFFLINE_PLAYER_ARRAYbyte[]org.bukkit.OfflinePlayer[]
PATTERNbyte[]org.bukkit.block.banner.Pattern
PATTERN_ARRAYbyte[]org.bukkit.block.banner.Pattern[]
PLAYERbyte[]org.bukkit.entity.Player
PLAYER_ARRAYbyte[]org.bukkit.entity.Player[]
PLAYER_PROFILEbyte[]1.18.1+org.bukkit.profile.PlayerProfile
PLAYER_PROFILE_ARRAYbyte[]1.18.1+org.bukkit.profile.PlayerProfile[]
POTION_EFFECTbyte[]org.bukkit.potion.PotionEffect
POTION_EFFECT_ARRAYbyte[]org.bukkit.potion.PotionEffect[]
UUIDbyte[]java.util.UUID
VECTORbyte[]org.bukkit.util.Vector
VECTOR_ARRAYbyte[]org.bukkit.util.Vector[]

Creating your own PersistentDataTypes

Using ConfigurationSeriazableDataType

When your custom Object already implements ConfigurationSerializable, it's even easier. Just look at the SerializablePerson.java in the examples/ folder.

To make it storable in a PersistentDataContainer, this is all you need:

PersistentDataType<byte[],SerializablePerson> personType = newConfigurationSerializableDataType<>(SerializablePerson.class);

You can also directly store arrays of your own ConfigurationSerializable objects:

PersistentDataType<byte[],SerializablePerson[]> personArrayType = newConfigurationSerializableArrayDataType<>(SerializablePerson.class,SerializablePerson[].class);

Using GenericDataType

You can also easily create own generic PersistentDataTypes by creating a new GenericDataType instance. It expects 4 parameters:

  1. The primitive type that's used to store the object
  2. The complex type / the class of which you want to store an instance of
  3. A method that converts your object into the primitive type
  4. A method that converts the primitive type into your object again

For example, this returns a PersistentDataType<Long,Date> that can save java.util.Date objects inside a PersistentDataContainer:

PersistentDataType<Long, Date> dateType = newGenericDataType<>(Long.class,Date.class,Date::new,Date::getTime);

Building

Building this requires Java 17.0.0 or higher. It can still be used by Java 8 or higher, though.

Javadocs

You can find the Javadocs here: https://hub.jeff-media.com/javadocs/morepersistentdatatypes/

Other libraries by me

MorePersistentDataTypes goes perfectly well together with my CustomBlockData library, that provides a PersistentDataContainer for every block in your world - without any external storage needed!

Powerful UpdateChecker for your plugins, with only one line of code.

Discord

If you need help, feel free to join my Discord server and head to #programming-help:

Donate

If you are using this project in your paid plugins, or if you just want to buy me a coffee, I would be happy over a small donation :)

Donate with PayPal

About

Adds a ton of new PersistentDataTypes, including support for all collections, maps and arrays to the Bukkit API!

Topics

Resources

Stars

96 stars

Watchers

3 watching

Forks

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MorePersistentDataTypes & Collections, Maps and Arrays for PDC!

SpigotMC ThreadJavadocsDiscordDonate

Maven

MorePersistentDataTypes is a tiny library that provides a ton of new PersistentDataTypes to use in conjunction with Bukkit's PersistentDataContainer. It also allows you to use any kind of Collection, Map or Array to store your data.

Features

  • Adds new PersistentDataTypes for ItemStacks, YamlConfigurations, UUIDs, Locations, and much more!
  • Allows to use any kind of Collection, Map or Array as PersistentDataType!
    • Of course also supports unlimited levels of nested Collections like LinkedHashMap<String,List<ItemStack>>
    • See below for more information

It is also possible to easily create your own PersistentDataTypes for your custom objects. When they already implement ConfigurationSerializable, it's only one line of code!

It also has the default data types built in, so you can access everything from one class. See at the bottom for a list of all new data types.

Related SpigotMC thread

Example

You want to save an ItemStack inside a PersistentDataContainer - normally you would have to serialize the ItemStack to a byte array first, or worse, to a base64 String. With MorePersistentDataTypes, you can simply do this:

pdc.set(someNamespacedKey, DataType.ITEM_STACK,myItemStack);

Furthermore, you can store EVERYTHING that implements ConfigurationSerializable using DataType.CONFIGURATION_SERIALIZABLE.

Using Collections, Arrays or Maps

Using collections, arrays or maps is easy. There are predefined methods for certain collection and map types:

Map<String, ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

If you want to use a special collection or map class that's not already included, simply pass a Supplier that returns an empty instance of your desired collection or map type. More information can be found in the Javadocs (see button at the top of this page).

TreeSet<Location> set = pdc.get(someKey, DataType.asGenericCollection(TreeSet::new, DataType.LOCATION));

For arrays, you should use the builtin default array DataType if one exists, for example DataType.STRING_ARRAY. If there is no already existing array DataType, like for UUIDs, you can use the DataType.asArray method:

PersistentDataType<?, UUID[]> uuidArrayDataType = DataType.asArray(newUUID[0], DataType.UUID);

Maven

Repository

The artifact is available on Maven Central. You don't need to add a repository to your pom.xml.

Dependency

<dependency>
<groupId>com.jeff-media</groupId>
<artifactId>MorePersistentDataTypes</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

Relocating and shading

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.jeff_media.morepersistentdatatypes</pattern>
<shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

Gradle

Repository

repositories {
mavenCentral()
}

Dependency

dependencies {
implementation 'com.jeff-media:MorePersistentDataTypes:2.4.0'
}

Relocating and shading

Plugins:

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.1"
}

ShadowJar:

shadowJar {
relocate 'com.jeff_media.morepersistentdatatypes', 'YOUR.PACKAGE.morepersistentdatatypes'
}

List of all data types

In addition to the default data types

NameSaved asClass
BOOLEANbytejava.lang.Boolean
BOOLEAN_ARRAYbyte[]java.lang.Boolean[]
CHARACTERintjava.lang.Character
CHARACTER_ARRAYint[]java.lang.Character[]
DOUBLE_ARRAYbyte[]java.lang.Double
FLOAT_ARRAYbyte[]java.lang.Float
SHORT_ARRAYbyte[]java.lang.Short
STRING_ARRAYbyte[]java.lang.String[]

Custom data types

NameSaved asNoteClass
ATTRIBUTE_MODIFIERbyte[]org.bukkit.attribute.AttributeModifier
ATTRIBUTE_MODIFIER_ARRAYbyte[]org.bukkit.attribute.AttributeModifier[]
BLOCK_DATAStringorg.bukkit.block.data.BlockData
BLOCK_VECTORbyte[]org.bukkit.util.BlockVector
BLOCK_VECTOR_ARRAYbyte[]org.bukkit.util.BlockVector[]
BOUNDING_BOXbyte[]org.bukkit.util.BoundingBox
BOUNDING_BOX_ARRAYbyte[]org.bukkit.util.BoundingBox[]
COLORbyte[]org.bukkit.Color
COLOR_ARRAYbyte[]org.bukkit.Color[]
CONFIGURATION_SERIALIZABLEbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable
CONFIGURATION_SERIALIZABLE_ARRAYbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable[]
DATElongjava.util.Date
FILE_CONFIGURATIONStringorg.bukkit.configuration.file.FileConfiguration
FIREWORK_EFFECTbyte[]org.bukkit.FireworkEffect
FIREWORK_EFFECT_ARRAYbyte[]org.bukkit.FireworkEffect[]
ITEM_METAbyte[]org.bukkit.inventory.meta.ItemMeta
ITEM_META_ARRAYbyte[]org.bukkit.inventory.meta.ItemMeta[]
ITEM_STACKbyte[]org.bukkit.inventory.ItemStack
ITEM_STACK_ARRAYbyte[]org.bukkit.inventory.ItemStack[]
LOCATIONbyte[]org.bukkit.Location
LOCATION_ARRAYbyte[]org.bukkit.Location[]
OFFLINE_PLAYERbyte[]org.bukkit.OfflinePlayer
OFFLINE_PLAYER_ARRAYbyte[]org.bukkit.OfflinePlayer[]
PATTERNbyte[]org.bukkit.block.banner.Pattern
PATTERN_ARRAYbyte[]org.bukkit.block.banner.Pattern[]
PLAYERbyte[]org.bukkit.entity.Player
PLAYER_ARRAYbyte[]org.bukkit.entity.Player[]
PLAYER_PROFILEbyte[]1.18.1+org.bukkit.profile.PlayerProfile
PLAYER_PROFILE_ARRAYbyte[]1.18.1+org.bukkit.profile.PlayerProfile[]
POTION_EFFECTbyte[]org.bukkit.potion.PotionEffect
POTION_EFFECT_ARRAYbyte[]org.bukkit.potion.PotionEffect[]
UUIDbyte[]java.util.UUID
VECTORbyte[]org.bukkit.util.Vector
VECTOR_ARRAYbyte[]org.bukkit.util.Vector[]

Creating your own PersistentDataTypes

Using ConfigurationSeriazableDataType

When your custom Object already implements ConfigurationSerializable, it's even easier. Just look at the SerializablePerson.java in the examples/ folder.

To make it storable in a PersistentDataContainer, this is all you need:

PersistentDataType<byte[],SerializablePerson> personType = newConfigurationSerializableDataType<>(SerializablePerson.class);

You can also directly store arrays of your own ConfigurationSerializable objects:

PersistentDataType<byte[],SerializablePerson[]> personArrayType = newConfigurationSerializableArrayDataType<>(SerializablePerson.class,SerializablePerson[].class);

Using GenericDataType

You can also easily create own generic PersistentDataTypes by creating a new GenericDataType instance. It expects 4 parameters:

  1. The primitive type that's used to store the object
  2. The complex type / the class of which you want to store an instance of
  3. A method that converts your object into the primitive type
  4. A method that converts the primitive type into your object again

For example, this returns a PersistentDataType<Long,Date> that can save java.util.Date objects inside a PersistentDataContainer:

PersistentDataType<Long, Date> dateType = newGenericDataType<>(Long.class,Date.class,Date::new,Date::getTime);

Building

Building this requires Java 17.0.0 or higher. It can still be used by Java 8 or higher, though.

Javadocs

You can find the Javadocs here: https://hub.jeff-media.com/javadocs/morepersistentdatatypes/

Other libraries by me

MorePersistentDataTypes goes perfectly well together with my CustomBlockData library, that provides a PersistentDataContainer for every block in your world - without any external storage needed!

Powerful UpdateChecker for your plugins, with only one line of code.

Discord

If you need help, feel free to join my Discord server and head to #programming-help:

Donate

If you are using this project in your paid plugins, or if you just want to buy me a coffee, I would be happy over a small donation :)

Donate with PayPal

About

Adds a ton of new PersistentDataTypes, including support for all collections, maps and arrays to the Bukkit API!

Topics

Resources

Stars

96 stars

Watchers

3 watching

Forks

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MorePersistentDataTypes & Collections, Maps and Arrays for PDC!

SpigotMC ThreadJavadocsDiscordDonate

Maven

MorePersistentDataTypes is a tiny library that provides a ton of new PersistentDataTypes to use in conjunction with Bukkit's PersistentDataContainer. It also allows you to use any kind of Collection, Map or Array to store your data.

Features

  • Adds new PersistentDataTypes for ItemStacks, YamlConfigurations, UUIDs, Locations, and much more!
  • Allows to use any kind of Collection, Map or Array as PersistentDataType!
    • Of course also supports unlimited levels of nested Collections like LinkedHashMap<String,List<ItemStack>>
    • See below for more information

It is also possible to easily create your own PersistentDataTypes for your custom objects. When they already implement ConfigurationSerializable, it's only one line of code!

It also has the default data types built in, so you can access everything from one class. See at the bottom for a list of all new data types.

Related SpigotMC thread

Example

You want to save an ItemStack inside a PersistentDataContainer - normally you would have to serialize the ItemStack to a byte array first, or worse, to a base64 String. With MorePersistentDataTypes, you can simply do this:

pdc.set(someNamespacedKey, DataType.ITEM_STACK,myItemStack);

Furthermore, you can store EVERYTHING that implements ConfigurationSerializable using DataType.CONFIGURATION_SERIALIZABLE.

Using Collections, Arrays or Maps

Using collections, arrays or maps is easy. There are predefined methods for certain collection and map types:

Map<String, ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

If you want to use a special collection or map class that's not already included, simply pass a Supplier that returns an empty instance of your desired collection or map type. More information can be found in the Javadocs (see button at the top of this page).

TreeSet<Location> set = pdc.get(someKey, DataType.asGenericCollection(TreeSet::new, DataType.LOCATION));

For arrays, you should use the builtin default array DataType if one exists, for example DataType.STRING_ARRAY. If there is no already existing array DataType, like for UUIDs, you can use the DataType.asArray method:

PersistentDataType<?, UUID[]> uuidArrayDataType = DataType.asArray(newUUID[0], DataType.UUID);

Maven

Repository

The artifact is available on Maven Central. You don't need to add a repository to your pom.xml.

Dependency

<dependency>
<groupId>com.jeff-media</groupId>
<artifactId>MorePersistentDataTypes</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

Relocating and shading

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.jeff_media.morepersistentdatatypes</pattern>
<shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

Gradle

Repository

repositories {
mavenCentral()
}

Dependency

dependencies {
implementation 'com.jeff-media:MorePersistentDataTypes:2.4.0'
}

Relocating and shading

Plugins:

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.1"
}

ShadowJar:

shadowJar {
relocate 'com.jeff_media.morepersistentdatatypes', 'YOUR.PACKAGE.morepersistentdatatypes'
}

List of all data types

In addition to the default data types

NameSaved asClass
BOOLEANbytejava.lang.Boolean
BOOLEAN_ARRAYbyte[]java.lang.Boolean[]
CHARACTERintjava.lang.Character
CHARACTER_ARRAYint[]java.lang.Character[]
DOUBLE_ARRAYbyte[]java.lang.Double
FLOAT_ARRAYbyte[]java.lang.Float
SHORT_ARRAYbyte[]java.lang.Short
STRING_ARRAYbyte[]java.lang.String[]

Custom data types

NameSaved asNoteClass
ATTRIBUTE_MODIFIERbyte[]org.bukkit.attribute.AttributeModifier
ATTRIBUTE_MODIFIER_ARRAYbyte[]org.bukkit.attribute.AttributeModifier[]
BLOCK_DATAStringorg.bukkit.block.data.BlockData
BLOCK_VECTORbyte[]org.bukkit.util.BlockVector
BLOCK_VECTOR_ARRAYbyte[]org.bukkit.util.BlockVector[]
BOUNDING_BOXbyte[]org.bukkit.util.BoundingBox
BOUNDING_BOX_ARRAYbyte[]org.bukkit.util.BoundingBox[]
COLORbyte[]org.bukkit.Color
COLOR_ARRAYbyte[]org.bukkit.Color[]
CONFIGURATION_SERIALIZABLEbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable
CONFIGURATION_SERIALIZABLE_ARRAYbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable[]
DATElongjava.util.Date
FILE_CONFIGURATIONStringorg.bukkit.configuration.file.FileConfiguration
FIREWORK_EFFECTbyte[]org.bukkit.FireworkEffect
FIREWORK_EFFECT_ARRAYbyte[]org.bukkit.FireworkEffect[]
ITEM_METAbyte[]org.bukkit.inventory.meta.ItemMeta
ITEM_META_ARRAYbyte[]org.bukkit.inventory.meta.ItemMeta[]
ITEM_STACKbyte[]org.bukkit.inventory.ItemStack
ITEM_STACK_ARRAYbyte[]org.bukkit.inventory.ItemStack[]
LOCATIONbyte[]org.bukkit.Location
LOCATION_ARRAYbyte[]org.bukkit.Location[]
OFFLINE_PLAYERbyte[]org.bukkit.OfflinePlayer
OFFLINE_PLAYER_ARRAYbyte[]org.bukkit.OfflinePlayer[]
PATTERNbyte[]org.bukkit.block.banner.Pattern
PATTERN_ARRAYbyte[]org.bukkit.block.banner.Pattern[]
PLAYERbyte[]org.bukkit.entity.Player
PLAYER_ARRAYbyte[]org.bukkit.entity.Player[]
PLAYER_PROFILEbyte[]1.18.1+org.bukkit.profile.PlayerProfile
PLAYER_PROFILE_ARRAYbyte[]1.18.1+org.bukkit.profile.PlayerProfile[]
POTION_EFFECTbyte[]org.bukkit.potion.PotionEffect
POTION_EFFECT_ARRAYbyte[]org.bukkit.potion.PotionEffect[]
UUIDbyte[]java.util.UUID
VECTORbyte[]org.bukkit.util.Vector
VECTOR_ARRAYbyte[]org.bukkit.util.Vector[]

Creating your own PersistentDataTypes

Using ConfigurationSeriazableDataType

When your custom Object already implements ConfigurationSerializable, it's even easier. Just look at the SerializablePerson.java in the examples/ folder.

To make it storable in a PersistentDataContainer, this is all you need:

PersistentDataType<byte[],SerializablePerson> personType = newConfigurationSerializableDataType<>(SerializablePerson.class);

You can also directly store arrays of your own ConfigurationSerializable objects:

PersistentDataType<byte[],SerializablePerson[]> personArrayType = newConfigurationSerializableArrayDataType<>(SerializablePerson.class,SerializablePerson[].class);

Using GenericDataType

You can also easily create own generic PersistentDataTypes by creating a new GenericDataType instance. It expects 4 parameters:

  1. The primitive type that's used to store the object
  2. The complex type / the class of which you want to store an instance of
  3. A method that converts your object into the primitive type
  4. A method that converts the primitive type into your object again

For example, this returns a PersistentDataType<Long,Date> that can save java.util.Date objects inside a PersistentDataContainer:

PersistentDataType<Long, Date> dateType = newGenericDataType<>(Long.class,Date.class,Date::new,Date::getTime);

Building

Building this requires Java 17.0.0 or higher. It can still be used by Java 8 or higher, though.

Javadocs

You can find the Javadocs here: https://hub.jeff-media.com/javadocs/morepersistentdatatypes/

Other libraries by me

MorePersistentDataTypes goes perfectly well together with my CustomBlockData library, that provides a PersistentDataContainer for every block in your world - without any external storage needed!

Powerful UpdateChecker for your plugins, with only one line of code.

Discord

If you need help, feel free to join my Discord server and head to #programming-help:

Donate

If you are using this project in your paid plugins, or if you just want to buy me a coffee, I would be happy over a small donation :)

Donate with PayPal

About

Adds a ton of new PersistentDataTypes, including support for all collections, maps and arrays to the Bukkit API!

Topics

Resources

Stars

96 stars

Watchers

3 watching

Forks

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MorePersistentDataTypes & Collections, Maps and Arrays for PDC!

SpigotMC ThreadJavadocsDiscordDonate

Maven

MorePersistentDataTypes is a tiny library that provides a ton of new PersistentDataTypes to use in conjunction with Bukkit's PersistentDataContainer. It also allows you to use any kind of Collection, Map or Array to store your data.

Features

  • Adds new PersistentDataTypes for ItemStacks, YamlConfigurations, UUIDs, Locations, and much more!
  • Allows to use any kind of Collection, Map or Array as PersistentDataType!
    • Of course also supports unlimited levels of nested Collections like LinkedHashMap<String,List<ItemStack>>
    • See below for more information

It is also possible to easily create your own PersistentDataTypes for your custom objects. When they already implement ConfigurationSerializable, it's only one line of code!

It also has the default data types built in, so you can access everything from one class. See at the bottom for a list of all new data types.

Related SpigotMC thread

Example

You want to save an ItemStack inside a PersistentDataContainer - normally you would have to serialize the ItemStack to a byte array first, or worse, to a base64 String. With MorePersistentDataTypes, you can simply do this:

pdc.set(someNamespacedKey, DataType.ITEM_STACK,myItemStack);

Furthermore, you can store EVERYTHING that implements ConfigurationSerializable using DataType.CONFIGURATION_SERIALIZABLE.

Using Collections, Arrays or Maps

Using collections, arrays or maps is easy. There are predefined methods for certain collection and map types:

Map<String, ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

If you want to use a special collection or map class that's not already included, simply pass a Supplier that returns an empty instance of your desired collection or map type. More information can be found in the Javadocs (see button at the top of this page).

TreeSet<Location> set = pdc.get(someKey, DataType.asGenericCollection(TreeSet::new, DataType.LOCATION));

For arrays, you should use the builtin default array DataType if one exists, for example DataType.STRING_ARRAY. If there is no already existing array DataType, like for UUIDs, you can use the DataType.asArray method:

PersistentDataType<?, UUID[]> uuidArrayDataType = DataType.asArray(newUUID[0], DataType.UUID);

Maven

Repository

The artifact is available on Maven Central. You don't need to add a repository to your pom.xml.

Dependency

<dependency>
<groupId>com.jeff-media</groupId>
<artifactId>MorePersistentDataTypes</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

Relocating and shading

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.jeff_media.morepersistentdatatypes</pattern>
<shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

Gradle

Repository

repositories {
mavenCentral()
}

Dependency

dependencies {
implementation 'com.jeff-media:MorePersistentDataTypes:2.4.0'
}

Relocating and shading

Plugins:

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.1"
}

ShadowJar:

shadowJar {
relocate 'com.jeff_media.morepersistentdatatypes', 'YOUR.PACKAGE.morepersistentdatatypes'
}

List of all data types

In addition to the default data types

NameSaved asClass
BOOLEANbytejava.lang.Boolean
BOOLEAN_ARRAYbyte[]java.lang.Boolean[]
CHARACTERintjava.lang.Character
CHARACTER_ARRAYint[]java.lang.Character[]
DOUBLE_ARRAYbyte[]java.lang.Double
FLOAT_ARRAYbyte[]java.lang.Float
SHORT_ARRAYbyte[]java.lang.Short
STRING_ARRAYbyte[]java.lang.String[]

Custom data types

NameSaved asNoteClass
ATTRIBUTE_MODIFIERbyte[]org.bukkit.attribute.AttributeModifier
ATTRIBUTE_MODIFIER_ARRAYbyte[]org.bukkit.attribute.AttributeModifier[]
BLOCK_DATAStringorg.bukkit.block.data.BlockData
BLOCK_VECTORbyte[]org.bukkit.util.BlockVector
BLOCK_VECTOR_ARRAYbyte[]org.bukkit.util.BlockVector[]
BOUNDING_BOXbyte[]org.bukkit.util.BoundingBox
BOUNDING_BOX_ARRAYbyte[]org.bukkit.util.BoundingBox[]
COLORbyte[]org.bukkit.Color
COLOR_ARRAYbyte[]org.bukkit.Color[]
CONFIGURATION_SERIALIZABLEbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable
CONFIGURATION_SERIALIZABLE_ARRAYbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable[]
DATElongjava.util.Date
FILE_CONFIGURATIONStringorg.bukkit.configuration.file.FileConfiguration
FIREWORK_EFFECTbyte[]org.bukkit.FireworkEffect
FIREWORK_EFFECT_ARRAYbyte[]org.bukkit.FireworkEffect[]
ITEM_METAbyte[]org.bukkit.inventory.meta.ItemMeta
ITEM_META_ARRAYbyte[]org.bukkit.inventory.meta.ItemMeta[]
ITEM_STACKbyte[]org.bukkit.inventory.ItemStack
ITEM_STACK_ARRAYbyte[]org.bukkit.inventory.ItemStack[]
LOCATIONbyte[]org.bukkit.Location
LOCATION_ARRAYbyte[]org.bukkit.Location[]
OFFLINE_PLAYERbyte[]org.bukkit.OfflinePlayer
OFFLINE_PLAYER_ARRAYbyte[]org.bukkit.OfflinePlayer[]
PATTERNbyte[]org.bukkit.block.banner.Pattern
PATTERN_ARRAYbyte[]org.bukkit.block.banner.Pattern[]
PLAYERbyte[]org.bukkit.entity.Player
PLAYER_ARRAYbyte[]org.bukkit.entity.Player[]
PLAYER_PROFILEbyte[]1.18.1+org.bukkit.profile.PlayerProfile
PLAYER_PROFILE_ARRAYbyte[]1.18.1+org.bukkit.profile.PlayerProfile[]
POTION_EFFECTbyte[]org.bukkit.potion.PotionEffect
POTION_EFFECT_ARRAYbyte[]org.bukkit.potion.PotionEffect[]
UUIDbyte[]java.util.UUID
VECTORbyte[]org.bukkit.util.Vector
VECTOR_ARRAYbyte[]org.bukkit.util.Vector[]

Creating your own PersistentDataTypes

Using ConfigurationSeriazableDataType

When your custom Object already implements ConfigurationSerializable, it's even easier. Just look at the SerializablePerson.java in the examples/ folder.

To make it storable in a PersistentDataContainer, this is all you need:

PersistentDataType<byte[],SerializablePerson> personType = newConfigurationSerializableDataType<>(SerializablePerson.class);

You can also directly store arrays of your own ConfigurationSerializable objects:

PersistentDataType<byte[],SerializablePerson[]> personArrayType = newConfigurationSerializableArrayDataType<>(SerializablePerson.class,SerializablePerson[].class);

Using GenericDataType

You can also easily create own generic PersistentDataTypes by creating a new GenericDataType instance. It expects 4 parameters:

  1. The primitive type that's used to store the object
  2. The complex type / the class of which you want to store an instance of
  3. A method that converts your object into the primitive type
  4. A method that converts the primitive type into your object again

For example, this returns a PersistentDataType<Long,Date> that can save java.util.Date objects inside a PersistentDataContainer:

PersistentDataType<Long, Date> dateType = newGenericDataType<>(Long.class,Date.class,Date::new,Date::getTime);

Building

Building this requires Java 17.0.0 or higher. It can still be used by Java 8 or higher, though.

Javadocs

You can find the Javadocs here: https://hub.jeff-media.com/javadocs/morepersistentdatatypes/

Other libraries by me

MorePersistentDataTypes goes perfectly well together with my CustomBlockData library, that provides a PersistentDataContainer for every block in your world - without any external storage needed!

Powerful UpdateChecker for your plugins, with only one line of code.

Discord

If you need help, feel free to join my Discord server and head to #programming-help:

Donate

If you are using this project in your paid plugins, or if you just want to buy me a coffee, I would be happy over a small donation :)

Donate with PayPal

About

Adds a ton of new PersistentDataTypes, including support for all collections, maps and arrays to the Bukkit API!

Topics

Resources

Stars

96 stars

Watchers

3 watching

Forks

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MorePersistentDataTypes & Collections, Maps and Arrays for PDC!

SpigotMC ThreadJavadocsDiscordDonate

Maven

MorePersistentDataTypes is a tiny library that provides a ton of new PersistentDataTypes to use in conjunction with Bukkit's PersistentDataContainer. It also allows you to use any kind of Collection, Map or Array to store your data.

Features

  • Adds new PersistentDataTypes for ItemStacks, YamlConfigurations, UUIDs, Locations, and much more!
  • Allows to use any kind of Collection, Map or Array as PersistentDataType!
    • Of course also supports unlimited levels of nested Collections like LinkedHashMap<String,List<ItemStack>>
    • See below for more information

It is also possible to easily create your own PersistentDataTypes for your custom objects. When they already implement ConfigurationSerializable, it's only one line of code!

It also has the default data types built in, so you can access everything from one class. See at the bottom for a list of all new data types.

Related SpigotMC thread

Example

You want to save an ItemStack inside a PersistentDataContainer - normally you would have to serialize the ItemStack to a byte array first, or worse, to a base64 String. With MorePersistentDataTypes, you can simply do this:

pdc.set(someNamespacedKey, DataType.ITEM_STACK,myItemStack);

Furthermore, you can store EVERYTHING that implements ConfigurationSerializable using DataType.CONFIGURATION_SERIALIZABLE.

Using Collections, Arrays or Maps

Using collections, arrays or maps is easy. There are predefined methods for certain collection and map types:

Map<String, ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

If you want to use a special collection or map class that's not already included, simply pass a Supplier that returns an empty instance of your desired collection or map type. More information can be found in the Javadocs (see button at the top of this page).

TreeSet<Location> set = pdc.get(someKey, DataType.asGenericCollection(TreeSet::new, DataType.LOCATION));

For arrays, you should use the builtin default array DataType if one exists, for example DataType.STRING_ARRAY. If there is no already existing array DataType, like for UUIDs, you can use the DataType.asArray method:

PersistentDataType<?, UUID[]> uuidArrayDataType = DataType.asArray(newUUID[0], DataType.UUID);

Maven

Repository

The artifact is available on Maven Central. You don't need to add a repository to your pom.xml.

Dependency

<dependency>
<groupId>com.jeff-media</groupId>
<artifactId>MorePersistentDataTypes</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>

Relocating and shading

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>com.jeff_media.morepersistentdatatypes</pattern>
<shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>

Gradle

Repository

repositories {
mavenCentral()
}

Dependency

dependencies {
implementation 'com.jeff-media:MorePersistentDataTypes:2.4.0'
}

Relocating and shading

Plugins:

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "7.1.1"
}

ShadowJar:

shadowJar {
relocate 'com.jeff_media.morepersistentdatatypes', 'YOUR.PACKAGE.morepersistentdatatypes'
}

List of all data types

In addition to the default data types

NameSaved asClass
BOOLEANbytejava.lang.Boolean
BOOLEAN_ARRAYbyte[]java.lang.Boolean[]
CHARACTERintjava.lang.Character
CHARACTER_ARRAYint[]java.lang.Character[]
DOUBLE_ARRAYbyte[]java.lang.Double
FLOAT_ARRAYbyte[]java.lang.Float
SHORT_ARRAYbyte[]java.lang.Short
STRING_ARRAYbyte[]java.lang.String[]

Custom data types

NameSaved asNoteClass
ATTRIBUTE_MODIFIERbyte[]org.bukkit.attribute.AttributeModifier
ATTRIBUTE_MODIFIER_ARRAYbyte[]org.bukkit.attribute.AttributeModifier[]
BLOCK_DATAStringorg.bukkit.block.data.BlockData
BLOCK_VECTORbyte[]org.bukkit.util.BlockVector
BLOCK_VECTOR_ARRAYbyte[]org.bukkit.util.BlockVector[]
BOUNDING_BOXbyte[]org.bukkit.util.BoundingBox
BOUNDING_BOX_ARRAYbyte[]org.bukkit.util.BoundingBox[]
COLORbyte[]org.bukkit.Color
COLOR_ARRAYbyte[]org.bukkit.Color[]
CONFIGURATION_SERIALIZABLEbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable
CONFIGURATION_SERIALIZABLE_ARRAYbyte[]org.bukkit.configuration.serialization.ConfigurationSerializable[]
DATElongjava.util.Date
FILE_CONFIGURATIONStringorg.bukkit.configuration.file.FileConfiguration
FIREWORK_EFFECTbyte[]org.bukkit.FireworkEffect
FIREWORK_EFFECT_ARRAYbyte[]org.bukkit.FireworkEffect[]
ITEM_METAbyte[]org.bukkit.inventory.meta.ItemMeta
ITEM_META_ARRAYbyte[]org.bukkit.inventory.meta.ItemMeta[]
ITEM_STACKbyte[]org.bukkit.inventory.ItemStack
ITEM_STACK_ARRAYbyte[]org.bukkit.inventory.ItemStack[]
LOCATIONbyte[]org.bukkit.Location
LOCATION_ARRAYbyte[]org.bukkit.Location[]
OFFLINE_PLAYERbyte[]org.bukkit.OfflinePlayer
OFFLINE_PLAYER_ARRAYbyte[]org.bukkit.OfflinePlayer[]
PATTERNbyte[]org.bukkit.block.banner.Pattern
PATTERN_ARRAYbyte[]org.bukkit.block.banner.Pattern[]
PLAYERbyte[]org.bukkit.entity.Player
PLAYER_ARRAYbyte[]org.bukkit.entity.Player[]
PLAYER_PROFILEbyte[]1.18.1+org.bukkit.profile.PlayerProfile
PLAYER_PROFILE_ARRAYbyte[]1.18.1+org.bukkit.profile.PlayerProfile[]
POTION_EFFECTbyte[]org.bukkit.potion.PotionEffect
POTION_EFFECT_ARRAYbyte[]org.bukkit.potion.PotionEffect[]
UUIDbyte[]java.util.UUID
VECTORbyte[]org.bukkit.util.Vector
VECTOR_ARRAYbyte[]org.bukkit.util.Vector[]

Creating your own PersistentDataTypes

Using ConfigurationSeriazableDataType

When your custom Object already implements ConfigurationSerializable, it's even easier. Just look at the SerializablePerson.java in the examples/ folder.

To make it storable in a PersistentDataContainer, this is all you need:

PersistentDataType<byte[],SerializablePerson> personType = newConfigurationSerializableDataType<>(SerializablePerson.class);

You can also directly store arrays of your own ConfigurationSerializable objects:

PersistentDataType<byte[],SerializablePerson[]> personArrayType = newConfigurationSerializableArrayDataType<>(SerializablePerson.class,SerializablePerson[].class);

Using GenericDataType

You can also easily create own generic PersistentDataTypes by creating a new GenericDataType instance. It expects 4 parameters:

  1. The primitive type that's used to store the object
  2. The complex type / the class of which you want to store an instance of
  3. A method that converts your object into the primitive type
  4. A method that converts the primitive type into your object again

For example, this returns a PersistentDataType<Long,Date> that can save java.util.Date objects inside a PersistentDataContainer:

PersistentDataType<Long, Date> dateType = newGenericDataType<>(Long.class,Date.class,Date::new,Date::getTime);

Building

Building this requires Java 17.0.0 or higher. It can still be used by Java 8 or higher, though.

Javadocs

You can find the Javadocs here: https://hub.jeff-media.com/javadocs/morepersistentdatatypes/

Other libraries by me

MorePersistentDataTypes goes perfectly well together with my CustomBlockData library, that provides a PersistentDataContainer for every block in your world - without any external storage needed!

Powerful UpdateChecker for your plugins, with only one line of code.

Discord

If you need help, feel free to join my Discord server and head to #programming-help:

Donate

If you are using this project in your paid plugins, or if you just want to buy me a coffee, I would be happy over a small donation :)

Donate with PayPal

About

Adds a ton of new PersistentDataTypes, including support for all collections, maps and arrays to the Bukkit API!

Topics

Resources

Stars

96 stars

Watchers

3 watching

Forks

Sponsor this project

Used by

Contributors

Languages