Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
}
Expand Down Expand Up @@ -160,24 +161,63 @@ object BlockDataListener : Listener {
removeFromBlockList(event.blocks.map { it.block })
}

private fun handlePiston(blocks: List<Block>, event: BlockPistonEvent) {
val map = Object2ObjectLinkedOpenHashMap<Block, CustomBlockPersistentDataContainer>()
private fun handlePiston(
blocks: List<Block>,
event: BlockPistonEvent
) { // TODO: Use a more efficient data structure
val map = Object2ObjectLinkedOpenHashMap<Block, Map<NamespacedKey, Any>>()
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<NamespacedKey, Any>

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)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -14,6 +15,8 @@ object ListenerManager {
Bukkit.getMessenger().registerOutgoingPluginChannel(plugin, "BungeeCord")
VisualizerListener.register()
GlowingListener.register()

BlockDataListener.register()
}
Comment thread
TheBjoRedCraft marked this conversation as resolved.

/**
Expand Down