diff --git a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt index 965b11bd4..9d6505d4d 100644 --- a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt +++ b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt @@ -44,6 +44,18 @@ interface PylonEntityHolderBlock { fun addEntity(name: String, entity: PylonEntity<*>) = addEntity(name, entity.entity) + fun tryRemoveEntity(name: String) { + val uuid = heldEntities[name] ?: return + Bukkit.getEntity(uuid)?.remove() + } + + fun tryRemoveAllEntities() { + val list = heldEntities.values.toList() + list.forEach { + Bukkit.getEntity(it)?.let { if (it.isValid) it.remove() } + } + } + @ApiStatus.NonExtendable fun getHeldEntityUuid(name: String) = heldEntities[name] @@ -142,9 +154,7 @@ interface PylonEntityHolderBlock { val block = event.pylonBlock if (block is PylonEntityHolderBlock) { // Best-effort removal; unlikely to cause issues - block.heldEntities.values.forEach { - Bukkit.getEntity(it)?.let { if (it.isValid) it.remove() } - } + block.tryRemoveAllEntities() holders.remove(block) } else if (block is PhantomBlock) { block.pdc.get(entityKey, entityType)?.values?.forEach { diff --git a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/datatypes/PylonSerializers.kt b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/datatypes/PylonSerializers.kt index b57cc5345..d3b519245 100644 --- a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/datatypes/PylonSerializers.kt +++ b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/datatypes/PylonSerializers.kt @@ -102,6 +102,9 @@ object PylonSerializers { @JvmField val INVENTORY = InventoryPersistentDataType + @JvmField + val VIRTUAL_INVENTORY = VirtualInventoryPersistentDataType + @JvmField val KEYED = KeyedPersistentDataType diff --git a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/datatypes/VirtualInventoryPersistentDataType.kt b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/datatypes/VirtualInventoryPersistentDataType.kt new file mode 100644 index 000000000..59ba8e002 --- /dev/null +++ b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/datatypes/VirtualInventoryPersistentDataType.kt @@ -0,0 +1,19 @@ +package io.github.pylonmc.pylon.core.datatypes + +import org.bukkit.persistence.PersistentDataAdapterContext +import org.bukkit.persistence.PersistentDataType +import xyz.xenondevs.invui.inventory.VirtualInventory + +object VirtualInventoryPersistentDataType : PersistentDataType { + override fun getPrimitiveType(): Class = ByteArray::class.java + + override fun getComplexType(): Class = VirtualInventory::class.java + + override fun toPrimitive(complex: VirtualInventory, context: PersistentDataAdapterContext): ByteArray { + return complex.serialize() + } + + override fun fromPrimitive(primitive: ByteArray, context: PersistentDataAdapterContext): VirtualInventory { + return VirtualInventory.deserialize(primitive) + } +} \ No newline at end of file