root.generateName
This commit is contained in:
parent
c67c2095a0
commit
0839a7baee
@ -67,8 +67,11 @@ import ru.dbotthepony.kstarbound.io.json.factory.ImmutableCollectionAdapterFacto
|
|||||||
import ru.dbotthepony.kstarbound.lua.LuaState
|
import ru.dbotthepony.kstarbound.lua.LuaState
|
||||||
import ru.dbotthepony.kstarbound.lua.loadInternalScript
|
import ru.dbotthepony.kstarbound.lua.loadInternalScript
|
||||||
import ru.dbotthepony.kstarbound.math.*
|
import ru.dbotthepony.kstarbound.math.*
|
||||||
|
import ru.dbotthepony.kstarbound.util.ITimeSource
|
||||||
import ru.dbotthepony.kstarbound.util.ItemStack
|
import ru.dbotthepony.kstarbound.util.ItemStack
|
||||||
|
import ru.dbotthepony.kstarbound.util.JVMTimeSource
|
||||||
import ru.dbotthepony.kstarbound.util.PathStack
|
import ru.dbotthepony.kstarbound.util.PathStack
|
||||||
|
import ru.dbotthepony.kstarbound.util.PausableTimeSource
|
||||||
import ru.dbotthepony.kstarbound.util.SBPattern
|
import ru.dbotthepony.kstarbound.util.SBPattern
|
||||||
import ru.dbotthepony.kstarbound.util.WriteOnce
|
import ru.dbotthepony.kstarbound.util.WriteOnce
|
||||||
import ru.dbotthepony.kstarbound.util.filterNotNull
|
import ru.dbotthepony.kstarbound.util.filterNotNull
|
||||||
@ -88,6 +91,8 @@ import java.util.function.Supplier
|
|||||||
import java.util.stream.Collector
|
import java.util.stream.Collector
|
||||||
import kotlin.NoSuchElementException
|
import kotlin.NoSuchElementException
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
import kotlin.random.Random
|
||||||
|
import kotlin.random.nextInt
|
||||||
|
|
||||||
class Starbound : ISBFileLocator {
|
class Starbound : ISBFileLocator {
|
||||||
private val logger = LogManager.getLogger()
|
private val logger = LogManager.getLogger()
|
||||||
@ -361,7 +366,11 @@ class Starbound : ISBFileLocator {
|
|||||||
return Vector2i(image.width, image.height)
|
return Vector2i(image.width, image.height)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun pushLuaAPI(state: LuaState) {
|
/**
|
||||||
|
* **ПРЕДУПРЕЖДЕНИЕ:**
|
||||||
|
* [time] не должен иметь ссылок (прямые или непрямые) на [state], иначе произойдёт утечка памяти!
|
||||||
|
*/
|
||||||
|
fun pushLuaAPI(state: LuaState, time: ITimeSource = JVMTimeSource.INSTANCE) {
|
||||||
state.pushWeak(this) { args ->
|
state.pushWeak(this) { args ->
|
||||||
luaRequire(args.lua, args)
|
luaRequire(args.lua, args)
|
||||||
0
|
0
|
||||||
@ -563,6 +572,42 @@ class Starbound : ISBFileLocator {
|
|||||||
1
|
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.pop()
|
||||||
|
|
||||||
state.load(polyfill, "@starbound.jar!/scripts/polyfill.lua")
|
state.load(polyfill, "@starbound.jar!/scripts/polyfill.lua")
|
||||||
|
Loading…
Reference in New Issue
Block a user