Added ExtendedPersistentDataContainer.create

This commit is contained in:
Auxilor
2022-04-23 15:54:40 +01:00
parent 13dbd08dcc
commit a19cc7df1e
8 changed files with 57 additions and 24 deletions

View File

@@ -282,7 +282,8 @@ public interface Handler {
* @param <T> The mob type. * @param <T> The mob type.
* @return The controlled entity. * @return The controlled entity.
*/ */
@NotNull <T extends Mob> EntityController<T> createEntityController(@NotNull T mob); @NotNull
<T extends Mob> EntityController<T> createEntityController(@NotNull T mob);
/** /**
* Adapt base PDC to extended PDC. * Adapt base PDC to extended PDC.
@@ -292,4 +293,12 @@ public interface Handler {
*/ */
@NotNull @NotNull
ExtendedPersistentDataContainer adaptPdc(@NotNull PersistentDataContainer container); ExtendedPersistentDataContainer adaptPdc(@NotNull PersistentDataContainer container);
/**
* Create new PDC.
*
* @return The container.
*/
@NotNull
PersistentDataContainer newPdc();
} }

View File

@@ -43,7 +43,8 @@ public interface ExtendedPersistentDataContainer extends PersistentDataContainer
* @param <Z> The type. * @param <Z> The type.
* @return The value, or null if not found. * @return The value, or null if not found.
*/ */
@Nullable <T, Z> Z get(@NotNull String key, @NotNull PersistentDataType<T, Z> dataType); @Nullable
<T, Z> Z get(@NotNull String key, @NotNull PersistentDataType<T, Z> dataType);
/** /**
* Get a value or default if not present. * Get a value or default if not present.
@@ -55,7 +56,8 @@ public interface ExtendedPersistentDataContainer extends PersistentDataContainer
* @param <Z> The type. * @param <Z> The type.
* @return The value, or the default if not found. * @return The value, or the default if not found.
*/ */
@NotNull <T, Z> Z getOrDefault(@NotNull String key, @NotNull PersistentDataType<T, Z> dataType, @NotNull Z defaultValue); @NotNull
<T, Z> Z getOrDefault(@NotNull String key, @NotNull PersistentDataType<T, Z> dataType, @NotNull Z defaultValue);
/** /**
* Get all keys, including namespaced keys. * Get all keys, including namespaced keys.
@@ -91,4 +93,13 @@ public interface ExtendedPersistentDataContainer extends PersistentDataContainer
static ExtendedPersistentDataContainer wrap(@NotNull PersistentDataContainer base) { static ExtendedPersistentDataContainer wrap(@NotNull PersistentDataContainer base) {
return Eco.getHandler().adaptPdc(base); return Eco.getHandler().adaptPdc(base);
} }
/**
* Create a new extended container.
*
* @return The extended container.
*/
static ExtendedPersistentDataContainer create() {
return wrap(Eco.getHandler().newPdc());
}
} }

View File

@@ -2,7 +2,6 @@ package com.willfp.eco.core.items;
import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache; import com.github.benmanes.caffeine.cache.LoadingCache;
import com.willfp.eco.core.data.ExtendedPersistentDataContainer;
import com.willfp.eco.core.fast.FastItemStack; import com.willfp.eco.core.fast.FastItemStack;
import com.willfp.eco.core.items.args.LookupArgParser; import com.willfp.eco.core.items.args.LookupArgParser;
import com.willfp.eco.core.items.provider.ItemProvider; import com.willfp.eco.core.items.provider.ItemProvider;
@@ -19,7 +18,6 @@ import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -28,7 +26,6 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;

View File

@@ -9,6 +9,11 @@ import org.bukkit.persistence.PersistentDataContainer
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
class ExtendedPersistentDataContainerFactory: ExtendedPersistentDataContainerFactoryProxy { class ExtendedPersistentDataContainerFactory: ExtendedPersistentDataContainerFactoryProxy {
@Suppress("UNCHECKED_CAST")
private val registry: CraftPersistentDataTypeRegistry =
CraftPersistentDataContainer::class.java.getDeclaredField("registry")
.apply { isAccessible = true }.get(null) as CraftPersistentDataTypeRegistry
override fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer { override fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer {
return when (pdc) { return when (pdc) {
is ExtendedPersistentDataContainer -> pdc is ExtendedPersistentDataContainer -> pdc
@@ -17,7 +22,11 @@ class ExtendedPersistentDataContainerFactory: ExtendedPersistentDataContainerFac
} }
} }
class EcoPersistentDataContainer( override fun newPdc(): PersistentDataContainer {
return CraftPersistentDataContainer(registry)
}
inner class EcoPersistentDataContainer(
val handle: CraftPersistentDataContainer val handle: CraftPersistentDataContainer
) : ExtendedPersistentDataContainer, PersistentDataContainer by handle { ) : ExtendedPersistentDataContainer, PersistentDataContainer by handle {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -25,11 +34,6 @@ class ExtendedPersistentDataContainerFactory: ExtendedPersistentDataContainerFac
CraftPersistentDataContainer::class.java.getDeclaredField("customDataTags") CraftPersistentDataContainer::class.java.getDeclaredField("customDataTags")
.apply { isAccessible = true }.get(handle) as MutableMap<String, Tag> .apply { isAccessible = true }.get(handle) as MutableMap<String, Tag>
@Suppress("UNCHECKED_CAST")
private val registry: CraftPersistentDataTypeRegistry =
CraftPersistentDataContainer::class.java.getDeclaredField("registry")
.apply { isAccessible = true }.get(handle) as CraftPersistentDataTypeRegistry
override fun <T : Any, Z : Any> set(key: String, dataType: PersistentDataType<T, Z>, value: Z) { override fun <T : Any, Z : Any> set(key: String, dataType: PersistentDataType<T, Z>, value: Z) {
customDataTags[key] = registry.wrap(dataType.primitiveType, dataType.toPrimitive(value, adapterContext)) customDataTags[key] = registry.wrap(dataType.primitiveType, dataType.toPrimitive(value, adapterContext))
} }

View File

@@ -9,6 +9,11 @@ import org.bukkit.persistence.PersistentDataContainer
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFactoryProxy { class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFactoryProxy {
@Suppress("UNCHECKED_CAST")
private val registry: CraftPersistentDataTypeRegistry =
CraftPersistentDataContainer::class.java.getDeclaredField("registry")
.apply { isAccessible = true }.get(null) as CraftPersistentDataTypeRegistry
override fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer { override fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer {
return when (pdc) { return when (pdc) {
is ExtendedPersistentDataContainer -> pdc is ExtendedPersistentDataContainer -> pdc
@@ -17,7 +22,11 @@ class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFa
} }
} }
class EcoPersistentDataContainer( override fun newPdc(): PersistentDataContainer {
return CraftPersistentDataContainer(registry)
}
inner class EcoPersistentDataContainer(
val handle: CraftPersistentDataContainer val handle: CraftPersistentDataContainer
) : ExtendedPersistentDataContainer, PersistentDataContainer by handle { ) : ExtendedPersistentDataContainer, PersistentDataContainer by handle {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -25,11 +34,6 @@ class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFa
CraftPersistentDataContainer::class.java.getDeclaredField("customDataTags") CraftPersistentDataContainer::class.java.getDeclaredField("customDataTags")
.apply { isAccessible = true }.get(handle) as MutableMap<String, Tag> .apply { isAccessible = true }.get(handle) as MutableMap<String, Tag>
@Suppress("UNCHECKED_CAST")
private val registry: CraftPersistentDataTypeRegistry =
CraftPersistentDataContainer::class.java.getDeclaredField("registry")
.apply { isAccessible = true }.get(handle) as CraftPersistentDataTypeRegistry
override fun <T : Any, Z : Any> set(key: String, dataType: PersistentDataType<T, Z>, value: Z) { override fun <T : Any, Z : Any> set(key: String, dataType: PersistentDataType<T, Z>, value: Z) {
customDataTags[key] = registry.wrap(dataType.primitiveType, dataType.toPrimitive(value, adapterContext)) customDataTags[key] = registry.wrap(dataType.primitiveType, dataType.toPrimitive(value, adapterContext))
} }

View File

@@ -9,6 +9,11 @@ import org.bukkit.persistence.PersistentDataContainer
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
class ExtendedPersistentDataContainerFactory: ExtendedPersistentDataContainerFactoryProxy { class ExtendedPersistentDataContainerFactory: ExtendedPersistentDataContainerFactoryProxy {
@Suppress("UNCHECKED_CAST")
private val registry: CraftPersistentDataTypeRegistry =
CraftPersistentDataContainer::class.java.getDeclaredField("registry")
.apply { isAccessible = true }.get(null) as CraftPersistentDataTypeRegistry
override fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer { override fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer {
return when (pdc) { return when (pdc) {
is ExtendedPersistentDataContainer -> pdc is ExtendedPersistentDataContainer -> pdc
@@ -17,7 +22,11 @@ class ExtendedPersistentDataContainerFactory: ExtendedPersistentDataContainerFac
} }
} }
class EcoPersistentDataContainer( override fun newPdc(): PersistentDataContainer {
return CraftPersistentDataContainer(registry)
}
inner class EcoPersistentDataContainer(
val handle: CraftPersistentDataContainer val handle: CraftPersistentDataContainer
) : ExtendedPersistentDataContainer, PersistentDataContainer by handle { ) : ExtendedPersistentDataContainer, PersistentDataContainer by handle {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -25,11 +34,6 @@ class ExtendedPersistentDataContainerFactory: ExtendedPersistentDataContainerFac
CraftPersistentDataContainer::class.java.getDeclaredField("customDataTags") CraftPersistentDataContainer::class.java.getDeclaredField("customDataTags")
.apply { isAccessible = true }.get(handle) as MutableMap<String, Tag> .apply { isAccessible = true }.get(handle) as MutableMap<String, Tag>
@Suppress("UNCHECKED_CAST")
private val registry: CraftPersistentDataTypeRegistry =
CraftPersistentDataContainer::class.java.getDeclaredField("registry")
.apply { isAccessible = true }.get(handle) as CraftPersistentDataTypeRegistry
override fun <T : Any, Z : Any> set(key: String, dataType: PersistentDataType<T, Z>, value: Z) { override fun <T : Any, Z : Any> set(key: String, dataType: PersistentDataType<T, Z>, value: Z) {
customDataTags[key] = registry.wrap(dataType.primitiveType, dataType.toPrimitive(value, adapterContext)) customDataTags[key] = registry.wrap(dataType.primitiveType, dataType.toPrimitive(value, adapterContext))
} }

View File

@@ -156,4 +156,7 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
override fun adaptPdc(container: PersistentDataContainer): ExtendedPersistentDataContainer = override fun adaptPdc(container: PersistentDataContainer): ExtendedPersistentDataContainer =
getProxy(ExtendedPersistentDataContainerFactoryProxy::class.java).adapt(container) getProxy(ExtendedPersistentDataContainerFactoryProxy::class.java).adapt(container)
override fun newPdc(): PersistentDataContainer =
getProxy(ExtendedPersistentDataContainerFactoryProxy::class.java).newPdc()
} }

View File

@@ -5,4 +5,5 @@ import org.bukkit.persistence.PersistentDataContainer
interface ExtendedPersistentDataContainerFactoryProxy { interface ExtendedPersistentDataContainerFactoryProxy {
fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer fun adapt(pdc: PersistentDataContainer): ExtendedPersistentDataContainer
fun newPdc(): PersistentDataContainer
} }