root.questConfig
This commit is contained in:
parent
0839a7baee
commit
aa4f73bc01
@ -16,6 +16,7 @@ import org.apache.logging.log4j.LogManager
|
|||||||
import ru.dbotthepony.kstarbound.api.IStarboundFile
|
import ru.dbotthepony.kstarbound.api.IStarboundFile
|
||||||
import ru.dbotthepony.kstarbound.lua.LuaState
|
import ru.dbotthepony.kstarbound.lua.LuaState
|
||||||
import ru.dbotthepony.kstarbound.util.PathStack
|
import ru.dbotthepony.kstarbound.util.PathStack
|
||||||
|
import ru.dbotthepony.kstarbound.util.set
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
@ -23,17 +24,44 @@ inline fun <reified T : Any> ObjectRegistry(name: String, noinline key: ((T) ->
|
|||||||
return ObjectRegistry(T::class, name, key, intKey)
|
return ObjectRegistry(T::class, name, key, intKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun merge(source: JsonObject, destination: JsonObject): JsonObject {
|
||||||
|
for ((k, v) in source.entrySet()) {
|
||||||
|
if (!destination.has(k)) {
|
||||||
|
destination[k] = v.deepCopy()
|
||||||
|
} else if (destination[k] is JsonObject && v is JsonObject) {
|
||||||
|
merge(v, destination[k] as JsonObject)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return destination
|
||||||
|
}
|
||||||
|
|
||||||
class RegistryObject<T : Any>(val value: T, private val json: JsonObject, val file: IStarboundFile, val gson: Gson, val pathStack: PathStack) {
|
class RegistryObject<T : Any>(val value: T, private val json: JsonObject, val file: IStarboundFile, val gson: Gson, val pathStack: PathStack) {
|
||||||
|
/**
|
||||||
|
* Возвращает копию оригинальной JSON структуры, из которой был спрототипирован [value]
|
||||||
|
*
|
||||||
|
* Более полная JSON структура (обработанная) доступа из метода [toJson]
|
||||||
|
*/
|
||||||
fun copy(): JsonObject {
|
fun copy(): JsonObject {
|
||||||
return json.deepCopy()
|
return json.deepCopy()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun push(lua: LuaState) {
|
fun push(lua: LuaState) {
|
||||||
lua.push(json)
|
lua.push(toJson())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun push(lua: LuaState.ArgStack) {
|
fun push(lua: LuaState.ArgStack) {
|
||||||
lua.push(json)
|
lua.push(toJson())
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает полную (обработанную) структуру [JsonObject] объекта [value]
|
||||||
|
*
|
||||||
|
* Полнота определяется тем, что [value] может иметь свойства по умолчанию, которые не указаны
|
||||||
|
* в оригинальной JSON структуре. [copy] не вернёт данные свойства по умолчанию, а [toJson] вернёт.
|
||||||
|
*/
|
||||||
|
fun toJson(): JsonObject {
|
||||||
|
return merge(json, gson.toJsonTree(value) as JsonObject)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
|
@ -438,7 +438,7 @@ class Starbound : ISBFileLocator {
|
|||||||
state.setTableFunction("npcConfig", this) { args ->
|
state.setTableFunction("npcConfig", this) { args ->
|
||||||
// Json root.npcConfig(String npcType)
|
// Json root.npcConfig(String npcType)
|
||||||
val name = args.getString()
|
val name = args.getString()
|
||||||
args.lua.push(npcTypes[name]?.copy() ?: throw NoSuchElementException("No such NPC type $name"))
|
args.push(npcTypes[name] ?: throw NoSuchElementException("No such NPC type $name"))
|
||||||
1
|
1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -608,6 +608,12 @@ class Starbound : ISBFileLocator {
|
|||||||
1
|
1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state.setTableFunction("questConfig", this) { args ->
|
||||||
|
val name = args.getString()
|
||||||
|
args.push(questTemplates[name] ?: throw NoSuchElementException("No such quest template $name"))
|
||||||
|
1
|
||||||
|
}
|
||||||
|
|
||||||
state.pop()
|
state.pop()
|
||||||
|
|
||||||
state.load(polyfill, "@starbound.jar!/scripts/polyfill.lua")
|
state.load(polyfill, "@starbound.jar!/scripts/polyfill.lua")
|
||||||
|
@ -19,6 +19,7 @@ import jnr.ffi.Pointer
|
|||||||
import org.apache.logging.log4j.LogManager
|
import org.apache.logging.log4j.LogManager
|
||||||
import org.lwjgl.system.MemoryStack
|
import org.lwjgl.system.MemoryStack
|
||||||
import org.lwjgl.system.MemoryUtil
|
import org.lwjgl.system.MemoryUtil
|
||||||
|
import ru.dbotthepony.kstarbound.RegistryObject
|
||||||
import ru.dbotthepony.kstarbound.Starbound
|
import ru.dbotthepony.kstarbound.Starbound
|
||||||
import ru.dbotthepony.kstarbound.io.json.InternedJsonElementAdapter
|
import ru.dbotthepony.kstarbound.io.json.InternedJsonElementAdapter
|
||||||
import ru.dbotthepony.kvector.vector.nint.Vector2i
|
import ru.dbotthepony.kvector.vector.nint.Vector2i
|
||||||
@ -595,6 +596,7 @@ class LuaState private constructor(private val pointer: Pointer, val stringInter
|
|||||||
fun push(value: Boolean) = this@LuaState.push(value)
|
fun push(value: Boolean) = this@LuaState.push(value)
|
||||||
fun push(value: String?) = this@LuaState.push(value)
|
fun push(value: String?) = this@LuaState.push(value)
|
||||||
fun push(value: JsonElement?) = this@LuaState.push(value)
|
fun push(value: JsonElement?) = this@LuaState.push(value)
|
||||||
|
fun push(value: RegistryObject<*>?) = this@LuaState.push(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1056,6 +1058,13 @@ class LuaState private constructor(private val pointer: Pointer, val stringInter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun push(value: RegistryObject<*>?) {
|
||||||
|
if (value == null)
|
||||||
|
push()
|
||||||
|
else
|
||||||
|
push(value.toJson())
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val LOGGER = LogManager.getLogger()
|
private val LOGGER = LogManager.getLogger()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user