Рецепты теперь завёрнуты в 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 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.Object2ObjectFunction
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap
import ru.dbotthepony.kstarbound.api.IStarboundFile
import ru.dbotthepony.kstarbound.defs.player.RecipeDefinition import ru.dbotthepony.kstarbound.defs.player.RecipeDefinition
import java.util.Collections import java.util.Collections
class RecipeRegistry { class RecipeRegistry {
private val recipesInternal = ArrayList<RecipeDefinition>() private val recipesInternal = ArrayList<RegistryObject<RecipeDefinition>>()
private val group2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RecipeDefinition>>() private val group2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RegistryObject<RecipeDefinition>>>()
private val group2recipesBacking = Object2ObjectOpenHashMap<String, List<RecipeDefinition>>() private val group2recipesBacking = Object2ObjectOpenHashMap<String, List<RegistryObject<RecipeDefinition>>>()
private val output2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RecipeDefinition>>() private val output2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RegistryObject<RecipeDefinition>>>()
private val output2recipesBacking = Object2ObjectOpenHashMap<String, List<RecipeDefinition>>() private val output2recipesBacking = Object2ObjectOpenHashMap<String, List<RegistryObject<RecipeDefinition>>>()
private val input2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RecipeDefinition>>() private val input2recipesInternal = Object2ObjectOpenHashMap<String, ArrayList<RegistryObject<RecipeDefinition>>>()
private val input2recipesBacking = Object2ObjectOpenHashMap<String, List<RecipeDefinition>>() private val input2recipesBacking = Object2ObjectOpenHashMap<String, List<RegistryObject<RecipeDefinition>>>()
val recipes: List<RecipeDefinition> = Collections.unmodifiableList(recipesInternal) val recipes: List<RegistryObject<RecipeDefinition>> = Collections.unmodifiableList(recipesInternal)
val group2recipes: Map<String, List<RecipeDefinition>> = Collections.unmodifiableMap(group2recipesBacking) val group2recipes: Map<String, List<RegistryObject<RecipeDefinition>>> = Collections.unmodifiableMap(group2recipesBacking)
val output2recipes: Map<String, List<RecipeDefinition>> = Collections.unmodifiableMap(output2recipesBacking) val output2recipes: Map<String, List<RegistryObject<RecipeDefinition>>> = Collections.unmodifiableMap(output2recipesBacking)
val input2recipes: Map<String, List<RecipeDefinition>> = Collections.unmodifiableMap(input2recipesBacking) 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) recipesInternal.add(recipe)
for (group in recipe.groups) { for (group in value.groups) {
group2recipesInternal.computeIfAbsent(group, Object2ObjectFunction { p -> group2recipesInternal.computeIfAbsent(group, Object2ObjectFunction { p ->
ArrayList<RecipeDefinition>().also { ArrayList<RegistryObject<RecipeDefinition>>().also {
group2recipesBacking[p as String] = Collections.unmodifiableList(it) group2recipesBacking[p as String] = Collections.unmodifiableList(it)
} }
}).add(recipe) }).add(recipe)
} }
output2recipesInternal.computeIfAbsent(recipe.output.item.name, Object2ObjectFunction { p -> output2recipesInternal.computeIfAbsent(value.output.item.name, Object2ObjectFunction { p ->
ArrayList<RecipeDefinition>().also { ArrayList<RegistryObject<RecipeDefinition>>().also {
output2recipesBacking[p as String] = Collections.unmodifiableList(it) output2recipesBacking[p as String] = Collections.unmodifiableList(it)
} }
}).add(recipe) }).add(recipe)
for (input in recipe.input) { for (input in value.input) {
input2recipesInternal.computeIfAbsent(input.item.name, Object2ObjectFunction { p -> input2recipesInternal.computeIfAbsent(input.item.name, Object2ObjectFunction { p ->
ArrayList<RecipeDefinition>().also { ArrayList<RegistryObject<RecipeDefinition>>().also {
input2recipesBacking[p as String] = Collections.unmodifiableList(it) input2recipesBacking[p as String] = Collections.unmodifiableList(it)
} }
}).add(recipe) }).add(recipe)

View File

@ -467,7 +467,7 @@ class Starbound : ISBFileLocator {
state.setTableFunction("recipesForItem", this) { args -> state.setTableFunction("recipesForItem", this) { args ->
args.lua.push(JsonArray().also { a -> 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) a.add(it)
} }
}) })
@ -986,7 +986,9 @@ class Starbound : ISBFileLocator {
for (listedFile in files) { for (listedFile in files) {
try { try {
callback("Loading $listedFile") 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) { } catch (err: Throwable) {
logger.error("Loading recipe definition file $listedFile", err) logger.error("Loading recipe definition file $listedFile", err)
} }