diff --git a/gradle.properties b/gradle.properties index 93802dd88..8efdbdd52 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled javaVersion=25 mcVersion=26.1.1 group=dev.slne.surf.api -version=3.9.0 +version=3.9.2 relocationPrefix=dev.slne.surf.api.libs snapshot=false diff --git a/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/impl/pdc/block/BlockDataListener.kt b/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/impl/pdc/block/BlockDataListener.kt index 53c55080b..68560eaf3 100644 --- a/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/impl/pdc/block/BlockDataListener.kt +++ b/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/impl/pdc/block/BlockDataListener.kt @@ -22,9 +22,9 @@ */ package dev.slne.surf.api.paper.server.impl.pdc.block -import dev.slne.surf.api.paper.pdc.block.CustomBlockPersistentDataContainer import dev.slne.surf.api.paper.pdc.block.pdc import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap +import org.bukkit.NamespacedKey import org.bukkit.block.Block import org.bukkit.block.PistonMoveReaction import org.bukkit.block.data.type.Fire @@ -35,9 +35,10 @@ import org.bukkit.event.block.* import org.bukkit.event.entity.EntityChangeBlockEvent import org.bukkit.event.entity.EntityExplodeEvent import org.bukkit.event.world.StructureGrowEvent +import org.bukkit.persistence.PersistentDataContainer +import org.bukkit.persistence.PersistentDataType object BlockDataListener : Listener { - private fun remove(event: BlockEvent) { removeFromBlock(event.block) } @@ -160,24 +161,63 @@ object BlockDataListener : Listener { removeFromBlockList(event.blocks.map { it.block }) } - private fun handlePiston(blocks: List, event: BlockPistonEvent) { - val map = Object2ObjectLinkedOpenHashMap() + private fun handlePiston( + blocks: List, + event: BlockPistonEvent + ) { // TODO: Use a more efficient data structure + val map = Object2ObjectLinkedOpenHashMap>() val direction = event.direction + for (block in blocks) { - if (!BlockPdcManager.hasCustomData(block)) continue val pdc = block.pdc() if (pdc.isEmpty) continue + val reaction = block.pistonMoveReaction if (reaction == PistonMoveReaction.BREAK) { removeFromBlock(block) continue } + + val snapshot = pdc.keys.associateWith { key -> + when { + pdc.has(key, PersistentDataType.BYTE_ARRAY) -> + pdc.get(key, PersistentDataType.BYTE_ARRAY) + + pdc.has(key, PersistentDataType.STRING) -> + pdc.get(key, PersistentDataType.STRING) + + pdc.has(key, PersistentDataType.BOOLEAN) -> + pdc.get(key, PersistentDataType.BOOLEAN) + + pdc.has(key, PersistentDataType.INTEGER) -> + pdc.get(key, PersistentDataType.INTEGER) + + pdc.has(key, PersistentDataType.TAG_CONTAINER) -> + pdc.get(key, PersistentDataType.TAG_CONTAINER) + + else -> null + } + }.filterValues { it != null } as Map + val destination = block.getRelative(direction) - map[destination] = pdc + map[destination] = snapshot } - for ((block, pdc) in map.reversed()) { - pdc.copyTo(block) - pdc.clear() + + map.entries.toList().asReversed().forEach { (block, data) -> + val target = block.pdc() + + target.clear() + + data.forEach { (key, value) -> + when (value) { + is ByteArray -> target.set(key, PersistentDataType.BYTE_ARRAY, value) + is String -> target.set(key, PersistentDataType.STRING, value) + is Int -> target.set(key, PersistentDataType.INTEGER, value) + is Boolean -> target.set(key, PersistentDataType.BOOLEAN, value) + is PersistentDataContainer -> + target.set(key, PersistentDataType.TAG_CONTAINER, value) + } + } } } } \ No newline at end of file diff --git a/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/impl/pdc/block/CustomBlockData.kt b/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/impl/pdc/block/CustomBlockData.kt index 1efc77e0a..d67be4268 100644 --- a/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/impl/pdc/block/CustomBlockData.kt +++ b/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/impl/pdc/block/CustomBlockData.kt @@ -114,10 +114,7 @@ class CustomBlockData(val block: Block) : CustomBlockPersistentDataContainer { return pdc.isEmpty } - override fun copyTo( - other: PersistentDataContainer, - replace: Boolean, - ) { + override fun copyTo(other: PersistentDataContainer, replace: Boolean) { pdc.copyTo(other, replace) } diff --git a/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/listener/ListenerManager.kt b/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/listener/ListenerManager.kt index 81c625391..1680262fc 100644 --- a/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/listener/ListenerManager.kt +++ b/surf-api-paper/surf-api-paper-server/src/main/kotlin/dev/slne/surf/api/paper/server/listener/ListenerManager.kt @@ -2,6 +2,7 @@ package dev.slne.surf.api.paper.server.listener import dev.slne.surf.api.paper.event.register import dev.slne.surf.api.paper.server.impl.glow.GlowingListener +import dev.slne.surf.api.paper.server.impl.pdc.block.BlockDataListener import dev.slne.surf.api.paper.server.impl.visualizer.visualizer.VisualizerListener import dev.slne.surf.api.paper.server.plugin import org.bukkit.Bukkit @@ -14,6 +15,8 @@ object ListenerManager { Bukkit.getMessenger().registerOutgoingPluginChannel(plugin, "BungeeCord") VisualizerListener.register() GlowingListener.register() + + BlockDataListener.register() } /**