Рецепты теперь завёрнуты в RegistryObject
This commit is contained in:
parent
2d87575bfc
commit
63944456c6
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user