root.generateName

This commit is contained in:
DBotThePony 2023-03-30 10:42:46 +07:00
parent c67c2095a0
commit 0839a7baee
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -67,8 +67,11 @@ import ru.dbotthepony.kstarbound.io.json.factory.ImmutableCollectionAdapterFacto
import ru.dbotthepony.kstarbound.lua.LuaState
import ru.dbotthepony.kstarbound.lua.loadInternalScript
import ru.dbotthepony.kstarbound.math.*
import ru.dbotthepony.kstarbound.util.ITimeSource
import ru.dbotthepony.kstarbound.util.ItemStack
import ru.dbotthepony.kstarbound.util.JVMTimeSource
import ru.dbotthepony.kstarbound.util.PathStack
import ru.dbotthepony.kstarbound.util.PausableTimeSource
import ru.dbotthepony.kstarbound.util.SBPattern
import ru.dbotthepony.kstarbound.util.WriteOnce
import ru.dbotthepony.kstarbound.util.filterNotNull
@ -88,6 +91,8 @@ import java.util.function.Supplier
import java.util.stream.Collector
import kotlin.NoSuchElementException
import kotlin.collections.ArrayList
import kotlin.random.Random
import kotlin.random.nextInt
class Starbound : ISBFileLocator {
private val logger = LogManager.getLogger()
@ -361,7 +366,11 @@ class Starbound : ISBFileLocator {
return Vector2i(image.width, image.height)
}
fun pushLuaAPI(state: LuaState) {
/**
* **ПРЕДУПРЕЖДЕНИЕ:**
* [time] не должен иметь ссылок (прямые или непрямые) на [state], иначе произойдёт утечка памяти!
*/
fun pushLuaAPI(state: LuaState, time: ITimeSource = JVMTimeSource.INSTANCE) {
state.pushWeak(this) { args ->
luaRequire(args.lua, args)
0
@ -563,6 +572,42 @@ class Starbound : ISBFileLocator {
1
}
state.setTableFunction("generateName", this) { args ->
val assetName = args.getString()
val seed = if (args.hasSomethingAt()) args.getLong() else time.nanos
val names = loadJsonAsset(assetName) ?: throw NoSuchElementException("No such JSON asset $assetName")
if (names !is JsonArray) {
var possibleName: String? = null
if (names is JsonObject) {
for ((k, v) in names.entrySet()) {
if (v is JsonArray && !v.isEmpty) {
if (possibleName == null || (names[possibleName] as JsonArray).size() < v.size())
possibleName = k
}
}
}
if (possibleName != null) {
if (assetName.contains(':')) {
throw IllegalArgumentException("JSON asset $assetName is not an array, did you mean $assetName.$possibleName?")
} else {
throw IllegalArgumentException("JSON asset $assetName is not an array, did you mean $assetName:$possibleName?")
}
} else {
throw IllegalArgumentException("JSON asset $assetName is not an array")
}
}
if (names.isEmpty) {
throw IllegalStateException("JSON array $assetName is empty")
}
args.push(names[Random(seed).nextInt(0, names.size())])
1
}
state.pop()
state.load(polyfill, "@starbound.jar!/scripts/polyfill.lua")