KStarbound/src/main/kotlin/ru/dbotthepony/kstarbound/defs/DynamicDefinition.kt

54 lines
1.2 KiB
Kotlin

package ru.dbotthepony.kstarbound.defs
import com.google.gson.JsonObject
import com.google.gson.internal.bind.JsonTreeReader
import ru.dbotthepony.kstarbound.RegistryObject
import ru.dbotthepony.kstarbound.mergeJsonElements
abstract class DynamicDefinition<Def : Any>(val original: RegistryObject<Def>) {
@Volatile
private var isDirty = false
private var dynamicData = JsonObject()
fun markDirty() {
isDirty = true
}
var def: Def = original.value
get() {
if (isDirty) {
synchronized(this) {
if (!isDirty) return field
val copy = original.copy()
mergeJsonElements(copy, dynamicData)
original.pathStack(original.file.computeDirectory()) {
field = original.gson.fromJson(JsonTreeReader(copy), field::class.java)
}
isDirty = false
}
}
return field
}
private set
fun setJson(saveInput: JsonObject) {
if (saveInput == dynamicData) return
sanitize(saveInput)
if (saveInput == dynamicData) return
isDirty = true
dynamicData = saveInput
}
fun toJsonTree(): JsonObject {
val tree = original.gson.toJsonTree(def) as JsonObject
sanitize(tree)
return tree
}
abstract fun sanitize(saveInput: JsonObject)
}