All Downloads are FREE. Search and download functionalities are using the official Maven repository.

walkmc.Storage.kt Maven / Gradle / Ivy

There is a newer version: 2.4.0
Show newest version
package walkmc

import org.bukkit.*
import org.bukkit.block.*
import org.bukkit.entity.*
import org.bukkit.inventory.*
import walkmc.block.*
import walkmc.cache.*
import walkmc.extensions.*
import walkmc.extensions.constants.*
import walkmc.serializer.tag.*
import walkmc.serializer.tag.impl.*
import kotlin.reflect.*
import java.util.*

/**
 * Returns if this compound tag has the specified key.
 */
fun CompoundTag.hasKey(key: String) = key in this

/**
 * A player storage that is persistent across server restarts. Use this when data is permanent.
 */
object PlayerLocalStorage : Cache() {
	
	@Synchronized
	fun save(uuid: UUID) = (get(uuid) ?: CompoundTag()).writeTo(uuid.playerRepository)
	
	@Synchronized
	fun load(uuid: UUID) = put(uuid, uuid.playerRepository.readTagGroup())
}

/**
 * A player storage that is not persistent across server restarts. Use this when data is temporary.
 */
object PlayerSessionStorage : Cache()

/**
 * A location storage that is persistent across server restarts. Use this when data is permanent.
 */
object LocationLocalStorage : Cache() {
	private val file = TaggedFile(LocationRepository)
	
	@Synchronized
	fun saveAll() {
		for ((key, value) in this) {
			val str = key.stringify(false)
			file[str] = value
		}
		
		file.save()
	}
	
	@Synchronized
	fun loadAll() {
		file.load()
		
		for ((key, value) in file) {
			val loc = location(key, false)
			put(loc, value as CompoundTag)
		}
	}
}

/**
 * A location storage that is not persistent across server restarts. Use this when data is temporary.
 */
object LocationSessionStorage : Cache()

class Storage : HashMap() {
	fun recover(key: String) = get(key)!!
	
	fun hasKey(key: String) = key in this
	@JvmName("hasKeyOf")
	inline fun  hasKey(key: String) = key in this && recover(key) is T
	
	fun  getByOrNull(key: String) = runCatching { get(key)?.cast() }.getOrNull()
	fun  getBy(key: String, default: T? = null) = getByOrNull(key) ?: default ?: error("Unknown value at key $key")
	
	fun getByteOrNull(key: String) = getByOrNull(key)
	fun getByte(key: String, default: Byte = 0) = getBy(key, default)
	
	fun getShortOrNull(key: String) = getByOrNull(key)
	fun getShort(key: String, default: Short = 0) = getBy(key, default)
	
	fun getIntOrNull(key: String) = getByOrNull(key)
	fun getInt(key: String, default: Int = 0) = getBy(key, default)
	
	fun getLongOrNull(key: String) = getByOrNull(key)
	fun getLong(key: String, default: Long = 0) = getBy(key, default)
	
	fun getFloatOrNull(key: String) = getByOrNull(key)
	fun getFloat(key: String, default: Float = 0f) = getBy(key, default)
	
	fun getDoubleOrNull(key: String) = getByOrNull(key)
	fun getDouble(key: String, default: Double = 0.0) = getBy(key, default)
	
	fun getCharOrNull(key: String) = getByOrNull(key)
	fun getChar(key: String, default: Char = ' ') = getBy(key, default)
	
	fun getBooleanOrNull(key: String) = getByOrNull(key)
	fun getBoolean(key: String, default: Boolean = false) = getBy(key, default)
	
	fun getStringOrNull(key: String) = getByOrNull(key)
	fun getString(key: String, default: String = "") = getBy(key, default)
	
	fun getItemOrNull(key: String) = getByOrNull(key)
	fun getItem(key: String, default: ItemStack? = null) = getBy(key, default)
	
	fun getSlotOrNull(key: String) = getByOrNull(key)
	fun getSlot(key: String, default: Slot? = null) = getBy(key, default)
	
	fun getInventoryOrNull(key: String) = getByOrNull(key)
	fun getInventory(key: String, default: Inventory? = null) = getBy(key, default)
	
	fun getUuidOrNull(key: String) = getByOrNull(key)
	fun getUuid(key: String, default: UUID? = null) = getBy(key, default)
	
	fun > getEnumOrNull(key: String) = getByOrNull>(key)
	fun > getEnum(key: String, default: Enum? = null) = getBy(key, default)
	
	fun  getClassOrNull(key: String) = getByOrNull>(key)
	inline fun  getClass(key: String, default: Class = T::class.java) = getBy(key, default)
	
	fun  getKClassOrNull(key: String) = getByOrNull>(key)
	inline fun  getKClass(key: String, default: KClass = T::class) = getBy(key, default)
	
	fun getEntityOrNull(key: String) = getByOrNull(key)
	fun getEntity(key: String, default: Entity? = null) = getBy(key, default)
	
	@JvmName("getEntityOrNullOf")
	fun  getEntityOrNull(key: String) = getByOrNull(key)
	@JvmName("getEntityOf")
	fun  getEntity(key: String, default: T? = null) = getBy(key, default)
	
	fun getLocationOrNull(key: String) = getByOrNull(key)
	fun getLocation(key: String, default: Location? = null) = getBy(key, default)
	
	fun getBlockOrNull(key: String) = getByOrNull(key)
	fun getBlock(key: String, default: Block? = null) = getBy(key, default)
	
	fun getCustomBlockOrNull(key: String) = getByOrNull(key)
	fun getCustomBlock(key: String, default: IBlock? = null) = getBy(key, default)
	
	@JvmName("getCustomBlockOrNullOf")
	fun  getCustomBlockOrNull(key: String) = getByOrNull(key)
	@JvmName("getCustomBlockOf")
	fun  getCustomBlock(key: String, default: T? = null) = getBy(key, default)
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy