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(val original: RegistryObject) { @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) }