diff --git a/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/CommonCloudPlayerImpl.kt b/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/CommonCloudPlayerImpl.kt index d868c92b..1a2d531f 100644 --- a/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/CommonCloudPlayerImpl.kt +++ b/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/CommonCloudPlayerImpl.kt @@ -22,6 +22,7 @@ abstract class CommonCloudPlayerImpl(uuid: UUID, override val name: String) : protected val persistentDataView = object : PersistentPlayerDataContainerViewImpl() { override fun toTagCompound() = ppdcReentrantLock.read { ppdc.tag } override fun getTag(key: String) = ppdcReentrantLock.read { ppdc.getTag(key) } + override fun snapshotTag() = ppdcReentrantLock.read { super.snapshotTag() } } override val persistentData get() = persistentDataView diff --git a/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/PersistentPlayerDataContainerImpl.kt b/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/PersistentPlayerDataContainerImpl.kt index f7b1d344..b7522f20 100644 --- a/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/PersistentPlayerDataContainerImpl.kt +++ b/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/PersistentPlayerDataContainerImpl.kt @@ -144,7 +144,7 @@ open class PersistentPlayerDataContainerImpl( } override fun snapshot(): PersistentPlayerDataContainerImpl { - return PersistentPlayerDataContainerImpl(tag.fast()) + return PersistentPlayerDataContainerImpl(snapshotTag().fast()) } fun fromTagCompound(tag: CompoundBinaryTag) { diff --git a/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/PersistentPlayerDataContainerViewImpl.kt b/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/PersistentPlayerDataContainerViewImpl.kt index 4e0480a9..055ae947 100644 --- a/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/PersistentPlayerDataContainerViewImpl.kt +++ b/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/PersistentPlayerDataContainerViewImpl.kt @@ -114,18 +114,27 @@ abstract class PersistentPlayerDataContainerViewImpl : PersistentPlayerDataConta } override fun snapshot(): PersistentPlayerDataContainerViewImpl { - val tag = deepCopy(toTagCompound()) - - val tagCopy = CompoundBinaryTag.builder() - .put(tag) - .build() + val tagCopy = snapshotTag() return object : PersistentPlayerDataContainerViewImpl() { override fun toTagCompound() = tagCopy override fun getTag(key: String) = tagCopy.get(key) + override fun snapshotTag() = tagCopy } } + /** + * Creates a snapshot of the tag compound. + * Subclasses should override this method to ensure the snapshot is created + * while holding appropriate locks to prevent concurrent modifications. + */ + protected open fun snapshotTag(): CompoundBinaryTag { + val tag = deepCopy(toTagCompound()) + return CompoundBinaryTag.builder() + .put(tag) + .build() + } + /** * Creates a deep copy of the provided `CompoundBinaryTag` without using recursion. diff --git a/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/TrackingPlayerPersistentDataContainerImpl.kt b/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/TrackingPlayerPersistentDataContainerImpl.kt index bc05262c..27eedd3b 100644 --- a/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/TrackingPlayerPersistentDataContainerImpl.kt +++ b/surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/player/ppdc/TrackingPlayerPersistentDataContainerImpl.kt @@ -77,6 +77,6 @@ open class TrackingPlayerPersistentDataContainerImpl( } override fun snapshot(): TrackingPlayerPersistentDataContainerImpl { - return TrackingPlayerPersistentDataContainerImpl(tag.fast()) + return TrackingPlayerPersistentDataContainerImpl(snapshotTag().fast()) } } \ No newline at end of file