|
1 | 1 | package dev.aaronhowser.mods.geneticsresequenced.data |
2 | 2 |
|
3 | | -import com.google.gson.GsonBuilder |
4 | | -import com.google.gson.JsonElement |
5 | 3 | import com.mojang.serialization.Codec |
6 | | -import com.mojang.serialization.JsonOps |
7 | 4 | import com.mojang.serialization.codecs.RecordCodecBuilder |
8 | 5 | import dev.aaronhowser.mods.geneticsresequenced.GeneticsResequenced |
| 6 | +import dev.aaronhowser.mods.geneticsresequenced.event.custom.ModifyGeneRequirementsEvent |
9 | 7 | import dev.aaronhowser.mods.geneticsresequenced.gene.Gene |
| 8 | +import dev.aaronhowser.mods.geneticsresequenced.gene.Gene.Companion.isGene |
10 | 9 | import dev.aaronhowser.mods.geneticsresequenced.registry.ModGenes |
11 | | -import dev.aaronhowser.mods.geneticsresequenced.registry.ModGenes.getHolderOrThrow |
12 | 10 | import net.minecraft.core.Holder |
13 | 11 | import net.minecraft.core.HolderLookup |
| 12 | +import net.minecraft.core.Registry |
14 | 13 | import net.minecraft.resources.ResourceKey |
15 | | -import net.minecraft.resources.ResourceLocation |
16 | | -import net.minecraft.server.packs.resources.ResourceManager |
17 | | -import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener |
18 | | -import net.minecraft.util.profiling.ProfilerFiller |
| 14 | +import thedarkcolour.kotlinforforge.forge.FORGE_BUS |
| 15 | +import kotlin.jvm.optionals.getOrNull |
19 | 16 |
|
20 | | -class GeneRequirements : SimpleJsonResourceReloadListener( |
21 | | - GsonBuilder().setPrettyPrinting().create(), |
22 | | - DIRECTORY |
| 17 | +data class GeneRequirements( |
| 18 | + val gene: ResourceKey<Gene>, |
| 19 | + val requirements: List<ResourceKey<Gene>> |
23 | 20 | ) { |
24 | 21 |
|
25 | | - private fun addGeneRequirements(gene: ResourceKey<Gene>, requirements: List<ResourceKey<Gene>>) { |
26 | | - GENE_REQUIREMENTS_MAP[gene] = GENE_REQUIREMENTS_MAP[gene]?.plus(requirements) ?: requirements.toSet() |
27 | | - } |
| 22 | + companion object { |
| 23 | + val REGISTRY_KEY: ResourceKey<Registry<GeneRequirements>> = |
| 24 | + ResourceKey.createRegistryKey(GeneticsResequenced.modResource("gene_requirements")) |
28 | 25 |
|
29 | | - data class GeneRequirementsData( |
30 | | - val gene: ResourceKey<Gene>, |
31 | | - val requirements: List<ResourceKey<Gene>> |
32 | | - ) { |
33 | | - companion object { |
34 | | - val CODEC: Codec<GeneRequirementsData> = RecordCodecBuilder.create { instance -> |
| 26 | + val CODEC: Codec<GeneRequirements> = |
| 27 | + RecordCodecBuilder.create { instance -> |
35 | 28 | instance.group( |
36 | 29 | ResourceKey.codec(ModGenes.GENE_REGISTRY_KEY) |
37 | 30 | .fieldOf("gene") |
38 | | - .forGetter(GeneRequirementsData::gene), |
39 | | - ResourceKey.codec(ModGenes.GENE_REGISTRY_KEY).listOf() |
| 31 | + .forGetter(GeneRequirements::gene), |
| 32 | + ResourceKey.codec(ModGenes.GENE_REGISTRY_KEY) |
| 33 | + .listOf() |
40 | 34 | .fieldOf("requirements") |
41 | | - .forGetter(GeneRequirementsData::requirements) |
42 | | - ).apply(instance, ::GeneRequirementsData) |
| 35 | + .forGetter(GeneRequirements::requirements) |
| 36 | + ).apply(instance, ::GeneRequirements) |
43 | 37 | } |
44 | | - } |
45 | | - } |
46 | 38 |
|
47 | | - override fun apply( |
48 | | - pObject: Map<ResourceLocation, JsonElement>, |
49 | | - pResourceManager: ResourceManager, |
50 | | - pProfiler: ProfilerFiller |
51 | | - ) { |
52 | | - GENE_REQUIREMENTS_MAP.clear() |
| 39 | + fun getRequiredGeneHolders( |
| 40 | + gene: Holder.Reference<Gene>, |
| 41 | + registries: HolderLookup.Provider |
| 42 | + ): Set<Holder.Reference<Gene>> { |
| 43 | + val registry = registries.lookupOrThrow(REGISTRY_KEY) |
53 | 44 |
|
54 | | - for ((key: ResourceLocation, value: JsonElement) in pObject) { |
| 45 | + val resultRks = mutableSetOf<ResourceKey<Gene>>() |
55 | 46 |
|
56 | | - val geneRequirements: GeneRequirementsData = GeneRequirementsData.CODEC.parse( |
57 | | - JsonOps.INSTANCE, |
58 | | - value |
59 | | - ).getOrThrow(false) { |
60 | | - GeneticsResequenced.LOGGER.error("Error decoding gene requirements for $key: $it") |
| 47 | + for (grHolder in registry.listElements()) { |
| 48 | + val gr = grHolder.value() |
| 49 | + if (gene.isGene(gr.gene)) { |
| 50 | + resultRks.addAll(gr.requirements) |
| 51 | + } |
61 | 52 | } |
62 | 53 |
|
63 | | - addGeneRequirements( |
64 | | - geneRequirements.gene, |
65 | | - geneRequirements.requirements |
66 | | - ) |
67 | | - |
68 | | - GeneticsResequenced.LOGGER.info("Loaded gene requirements for ${geneRequirements.gene.location()}") |
69 | | - } |
70 | | - } |
71 | | - |
72 | | - companion object { |
73 | | - const val DIRECTORY = GeneticsResequenced.MOD_ID + "/gene_requirements" |
74 | | - |
75 | | - //TODO: There's probably a better way to do this that doesn't rely on a static map |
76 | | - private val GENE_REQUIREMENTS_MAP: MutableMap<ResourceKey<Gene>, Set<ResourceKey<Gene>>> = mutableMapOf() |
77 | | - fun getGeneRequirements(): Map<ResourceKey<Gene>, Set<ResourceKey<Gene>>> = GENE_REQUIREMENTS_MAP.toMap() |
78 | | - |
79 | | - fun getGeneRequiredGeneRks(gene: ResourceKey<Gene>): Set<ResourceKey<Gene>> { |
80 | | - return GENE_REQUIREMENTS_MAP[gene] ?: emptySet() |
81 | | - } |
82 | | - |
83 | | - fun getGeneRequiredGeneRks(gene: Holder<Gene>): Set<ResourceKey<Gene>> { |
84 | | - return getGeneRequiredGeneRks(gene.unwrapKey().get()) |
85 | | - } |
| 54 | + val event = ModifyGeneRequirementsEvent(gene.key(), resultRks) |
| 55 | + FORGE_BUS.post(event) |
86 | 56 |
|
87 | | - fun getGeneRequiredGeneHolders(gene: Holder<Gene>, registries: HolderLookup.Provider): Set<Holder<Gene>> { |
88 | | - return getGeneRequiredGeneRks(gene).map { it.getHolderOrThrow(registries) }.toSet() |
| 57 | + val geneRegistry = registries.lookupOrThrow(ModGenes.GENE_REGISTRY_KEY) |
| 58 | + return resultRks.mapNotNull { geneRegistry.get(it).getOrNull() }.toSet() |
89 | 59 | } |
90 | 60 | } |
91 | 61 |
|
|
0 commit comments