Skip to content

Commit

Permalink
add methods for getting OfflinePlayer PDCs
Browse files Browse the repository at this point in the history
  • Loading branch information
Boy0000 committed Aug 11, 2023
1 parent 3c1b8f4 commit b1d7824
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.mineinabyss.idofront.nms.nbt

import jdk.jfr.internal.management.ManagementSupport.logError
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.NbtIo
import org.bukkit.Bukkit
import org.bukkit.OfflinePlayer
import org.bukkit.craftbukkit.v1_20_R1.CraftServer
import java.io.File
import java.nio.file.Files
import java.util.*

/**
* Gets the PlayerData from file for this UUID.
*/
fun UUID.getOfflinePlayerData(): CompoundTag? = (Bukkit.getServer() as CraftServer).handle.playerIo.getPlayerData(this.toString())

/**
* Gets a copy of the WrappedPDC for this OfflinePlayer.
* Care should be taken to ensure that the player is not online when this is called.
*/
fun OfflinePlayer.getOfflinePDC() : WrappedPDC? {
if (isOnline) return null
val baseTag = uniqueId.getOfflinePlayerData()?.getCompound("BukkitValues") ?: return null
return WrappedPDC(baseTag)
}

/**
* Saves the given WrappedPDC to the OfflinePlayer's PlayerData file.
* Care should be taken to ensure that the player is not online when this is called.
* @return true if successful, false otherwise.
*/
fun OfflinePlayer.saveOfflinePDC(pdc: WrappedPDC): Boolean {
if (isOnline) return false
val worldNBTStorage = (Bukkit.getServer() as CraftServer).server.playerDataStorage
val tempFile = File(worldNBTStorage.playerDir, "$uniqueId.dat.tmp")
val playerFile = File(worldNBTStorage.playerDir, "$uniqueId.dat")

val mainPDc = uniqueId.getOfflinePlayerData() ?: return false
mainPDc.put("BukkitValues", pdc.compoundTag) ?: return false
runCatching {
Files.newOutputStream(tempFile.toPath()).use { outStream ->
NbtIo.writeCompressed(mainPDc, outStream)
if (playerFile.exists() && !playerFile.delete()) logError("Failed to delete player file $uniqueId")
if (!tempFile.renameTo(playerFile)) logError("Failed to rename player file $uniqueId")
}
}.onFailure {
logError("Failed to save player file $uniqueId")
it.printStackTrace()
return false
}
return true
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class WrappedPDC(
}
}

override fun readFromBytes(bytes: ByteArray?, clear: Boolean) {
override fun readFromBytes(bytes: ByteArray, clear: Boolean) {
if (clear) compoundTag.tags.clear()
DataInputStream(ByteArrayInputStream(bytes)).use { dataInput ->
val compound = NbtIo.read(dataInput)
Expand Down

0 comments on commit b1d7824

Please sign in to comment.