54 lines
1.2 KiB
Kotlin
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)
|
|
}
|