Рецепты теперь завёрнуты в RegistryObject

This commit is contained in:
DBotThePony 2023-04-01 16:20:17 +07:00
parent 2d87575bfc
commit 63944456c6
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 26 additions and 20 deletions

View File

@ -1,44 +1,48 @@
package ru.dbotthepony.kstarbound
import com.google.gson.Gson
import com.google.gson.JsonObject
import it.unimi.dsi.fastutil.objects.Object2ObjectFunction
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap
import ru.dbotthepony.kstarbound.api.IStarboundFile
import ru.dbotthepony.kstarbound.defs.player.RecipeDefinition
import java.util.Collections
class RecipeRegistry {
private val recipesInternal = ArrayList<RecipeDefinition>()
private val group2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RecipeDefinition>>()
private val group2recipesBacking = Object2ObjectOpenHashMap<String, List<RecipeDefinition>>()
private val output2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RecipeDefinition>>()
private val output2recipesBacking = Object2ObjectOpenHashMap<String, List<RecipeDefinition>>()
private val input2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RecipeDefinition>>()
private val input2recipesBacking = Object2ObjectOpenHashMap<String, List<RecipeDefinition>>()
private val recipesInternal = ArrayList<RegistryObject<RecipeDefinition>>()
private val group2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RegistryObject<RecipeDefinition>>>()
private val group2recipesBacking = Object2ObjectOpenHashMap<String, List<RegistryObject<RecipeDefinition>>>()
private val output2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RegistryObject<RecipeDefinition>>>()
private val output2recipesBacking = Object2ObjectOpenHashMap<String, List<RegistryObject<RecipeDefinition>>>()
private val input2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RegistryObject<RecipeDefinition>>>()
private val input2recipesBacking = Object2ObjectOpenHashMap<String, List<RegistryObject<RecipeDefinition>>>()
val recipes: List<RecipeDefinition> = Collections.unmodifiableList(recipesInternal)
val group2recipes: Map<String, List<RecipeDefinition>> = Collections.unmodifiableMap(group2recipesBacking)
val output2recipes: Map<String, List<RecipeDefinition>> = Collections.unmodifiableMap(output2recipesBacking)
val input2recipes: Map<String, List<RecipeDefinition>> = Collections.unmodifiableMap(input2recipesBacking)
val recipes: List<RegistryObject<RecipeDefinition>> = Collections.unmodifiableList(recipesInternal)
val group2recipes: Map<String, List<RegistryObject<RecipeDefinition>>> = Collections.unmodifiableMap(group2recipesBacking)
val output2recipes: Map<String, List<RegistryObject<RecipeDefinition>>> = Collections.unmodifiableMap(output2recipesBacking)
val input2recipes: Map<String, List<RegistryObject<RecipeDefinition>>> = Collections.unmodifiableMap(input2recipesBacking)
fun add(recipe: RecipeDefinition) {
fun add(recipe: RegistryObject<RecipeDefinition>) {
val value = recipe.value
recipesInternal.add(recipe)
for (group in recipe.groups) {
for (group in value.groups) {
group2recipesInternal.computeIfAbsent(group, Object2ObjectFunction { p ->
ArrayList<RecipeDefinition>().also {
ArrayList<RegistryObject<RecipeDefinition>>().also {
group2recipesBacking[p as String] = Collections.unmodifiableList(it)
}
}).add(recipe)
}
output2recipesInternal.computeIfAbsent(recipe.output.item.name, Object2ObjectFunction { p ->
ArrayList<RecipeDefinition>().also {
output2recipesInternal.computeIfAbsent(value.output.item.name, Object2ObjectFunction { p ->
ArrayList<RegistryObject<RecipeDefinition>>().also {
output2recipesBacking[p as String] = Collections.unmodifiableList(it)
}
}).add(recipe)
for (input in recipe.input) {
for (input in value.input) {
input2recipesInternal.computeIfAbsent(input.item.name, Object2ObjectFunction { p ->
ArrayList<RecipeDefinition>().also {
ArrayList<RegistryObject<RecipeDefinition>>().also {
input2recipesBacking[p as String] = Collections.unmodifiableList(it)
}
}).add(recipe)

View File

@ -467,7 +467,7 @@ class Starbound : ISBFileLocator {
state.setTableFunction("recipesForItem", this) { args ->
args.lua.push(JsonArray().also { a ->
recipeRegistry.output2recipes[args.getString()]?.stream()?.map { gson.toJsonTree(it) }?.forEach {
recipeRegistry.output2recipes[args.getString()]?.stream()?.map { it.toJson() }?.forEach {
a.add(it)
}
})
@ -986,7 +986,9 @@ class Starbound : ISBFileLocator {
for (listedFile in files) {
try {
callback("Loading $listedFile")
recipeRegistry.add(gson.fromJson(listedFile.reader(), RecipeDefinition::class.java))
val json = gson.fromJson(listedFile.reader(), JsonElement::class.java)
val value = gson.fromJson<RecipeDefinition>(JsonTreeReader(json), RecipeDefinition::class.java)
recipeRegistry.add(RegistryObject(value, json, listedFile, gson, pathStack))
} catch (err: Throwable) {
logger.error("Loading recipe definition file $listedFile", err)
}