From 2e8b8a23c52e372c03d13101c597b8f854a58c13 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 13 Dec 2025 21:01:09 +0100 Subject: [PATCH 1/7] Remove entity method --- .../pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt | 5 +++++ 1 file changed, 5 insertions(+) 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 eafa7867d..5e76073ac 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,11 @@ interface PylonEntityHolderBlock { fun addEntity(name: String, entity: PylonEntity<*>) = addEntity(name, entity.entity) + fun removeEntity(name: String) { + val uuid = heldEntities[name] ?: return + Bukkit.getEntity(uuid)?.remove() + } + @ApiStatus.NonExtendable fun getHeldEntityUuid(name: String) = heldEntities[name] From 5dcf11b9819f2d6235c12b0f58ae612ae2c55d18 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 13 Dec 2025 21:11:03 +0100 Subject: [PATCH 2/7] Nuke entity method --- .../pylon/core/block/base/PylonEntityHolderBlock.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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 5e76073ac..4aee6d24c 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 @@ -49,6 +49,12 @@ interface PylonEntityHolderBlock { Bukkit.getEntity(uuid)?.remove() } + fun nukeEntities() { + heldEntities.values.forEach { + Bukkit.getEntity(it)?.let { if (it.isValid) it.remove() } + } + } + @ApiStatus.NonExtendable fun getHeldEntityUuid(name: String) = heldEntities[name] @@ -136,9 +142,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.nukeEntities() holders.remove(block) } else if (block is PhantomBlock) { block.pdc.get(entityKey, entityType)?.values?.forEach { From 1fed6917b61d57453a61bdb7ee0deab573b41bbf Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 13 Dec 2025 22:11:58 +0100 Subject: [PATCH 3/7] concurrent whining fix --- .../pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 4aee6d24c..886c27097 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 @@ -50,7 +50,9 @@ interface PylonEntityHolderBlock { } fun nukeEntities() { - heldEntities.values.forEach { + val list = ArrayList(heldEntities.values.size) + list.addAll(heldEntities.values) + list.forEach { Bukkit.getEntity(it)?.let { if (it.isValid) it.remove() } } } From 034d27c12f81d50d00d475dae466877a76ffed18 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 13 Dec 2025 22:15:24 +0100 Subject: [PATCH 4/7] Listy list kotlin enlist --- .../pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 886c27097..a8e1acc1e 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 @@ -50,8 +50,7 @@ interface PylonEntityHolderBlock { } fun nukeEntities() { - val list = ArrayList(heldEntities.values.size) - list.addAll(heldEntities.values) + val list = heldEntities.values.toList() list.forEach { Bukkit.getEntity(it)?.let { if (it.isValid) it.remove() } } From f46a1a72e67f5e6821c526a07193470cd50988e2 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sun, 14 Dec 2025 13:46:38 +0100 Subject: [PATCH 5/7] Rename to removeAllEntities --- .../pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 a8e1acc1e..476ede468 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 @@ -1,6 +1,5 @@ package io.github.pylonmc.pylon.core.block.base -import io.github.pylonmc.pylon.core.block.context.BlockBreakContext import io.github.pylonmc.pylon.core.block.BlockStorage import io.github.pylonmc.pylon.core.block.PhantomBlock import io.github.pylonmc.pylon.core.datatypes.PylonSerializers @@ -49,7 +48,7 @@ interface PylonEntityHolderBlock { Bukkit.getEntity(uuid)?.remove() } - fun nukeEntities() { + fun removeAllEntities() { val list = heldEntities.values.toList() list.forEach { Bukkit.getEntity(it)?.let { if (it.isValid) it.remove() } @@ -143,7 +142,7 @@ interface PylonEntityHolderBlock { val block = event.pylonBlock if (block is PylonEntityHolderBlock) { // Best-effort removal; unlikely to cause issues - block.nukeEntities() + block.removeAllEntities() holders.remove(block) } else if (block is PhantomBlock) { block.pdc.get(entityKey, entityType)?.values?.forEach { From f015d1f6538cfae76b1d6f45b95fddd2d63cf36c Mon Sep 17 00:00:00 2001 From: Intybyte Date: Mon, 15 Dec 2025 09:11:26 +0100 Subject: [PATCH 6/7] Create and use new serializers --- .../pylon/core/datatypes/PylonSerializers.kt | 3 +++ .../VirtualInventoryPersistentDataType.kt | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/datatypes/VirtualInventoryPersistentDataType.kt 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 f413692ac..4ef16337e 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 @@ -101,6 +101,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 From 5961019b8cbce88f15379a1b9d0a1f6c9e55c3e4 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sun, 21 Dec 2025 15:22:28 +0100 Subject: [PATCH 7/7] Rename methods --- .../pylonmc/pylon/core/block/base/PylonEntityHolderBlock.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 476ede468..ef9deef9a 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 @@ -43,12 +43,12 @@ interface PylonEntityHolderBlock { fun addEntity(name: String, entity: PylonEntity<*>) = addEntity(name, entity.entity) - fun removeEntity(name: String) { + fun tryRemoveEntity(name: String) { val uuid = heldEntities[name] ?: return Bukkit.getEntity(uuid)?.remove() } - fun removeAllEntities() { + fun tryRemoveAllEntities() { val list = heldEntities.values.toList() list.forEach { Bukkit.getEntity(it)?.let { if (it.isValid) it.remove() } @@ -142,7 +142,7 @@ interface PylonEntityHolderBlock { val block = event.pylonBlock if (block is PylonEntityHolderBlock) { // Best-effort removal; unlikely to cause issues - block.removeAllEntities() + block.tryRemoveAllEntities() holders.remove(block) } else if (block is PhantomBlock) { block.pdc.get(entityKey, entityType)?.values?.forEach {