Skip to content

Commit b289095

Browse files
committed
add: implement ModifyGeneRequirementsEvent and refactor GeneRequirements handling
1 parent bee0d6b commit b289095

File tree

3 files changed

+47
-67
lines changed

3 files changed

+47
-67
lines changed

src/main/kotlin/dev/aaronhowser/mods/geneticsresequenced/data/GeneRequirements.kt

Lines changed: 33 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,61 @@
11
package dev.aaronhowser.mods.geneticsresequenced.data
22

3-
import com.google.gson.GsonBuilder
4-
import com.google.gson.JsonElement
53
import com.mojang.serialization.Codec
6-
import com.mojang.serialization.JsonOps
74
import com.mojang.serialization.codecs.RecordCodecBuilder
85
import dev.aaronhowser.mods.geneticsresequenced.GeneticsResequenced
6+
import dev.aaronhowser.mods.geneticsresequenced.event.custom.ModifyGeneRequirementsEvent
97
import dev.aaronhowser.mods.geneticsresequenced.gene.Gene
8+
import dev.aaronhowser.mods.geneticsresequenced.gene.Gene.Companion.isGene
109
import dev.aaronhowser.mods.geneticsresequenced.registry.ModGenes
11-
import dev.aaronhowser.mods.geneticsresequenced.registry.ModGenes.getHolderOrThrow
1210
import net.minecraft.core.Holder
1311
import net.minecraft.core.HolderLookup
12+
import net.minecraft.core.Registry
1413
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
1916

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>>
2320
) {
2421

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"))
2825

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 ->
3528
instance.group(
3629
ResourceKey.codec(ModGenes.GENE_REGISTRY_KEY)
3730
.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()
4034
.fieldOf("requirements")
41-
.forGetter(GeneRequirementsData::requirements)
42-
).apply(instance, ::GeneRequirementsData)
35+
.forGetter(GeneRequirements::requirements)
36+
).apply(instance, ::GeneRequirements)
4337
}
44-
}
45-
}
4638

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)
5344

54-
for ((key: ResourceLocation, value: JsonElement) in pObject) {
45+
val resultRks = mutableSetOf<ResourceKey<Gene>>()
5546

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+
}
6152
}
6253

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)
8656

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()
8959
}
9060
}
9161

src/main/kotlin/dev/aaronhowser/mods/geneticsresequenced/datagen/gene/ModGeneRequirementsProvider.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,26 @@ import java.util.function.BiConsumer
1616
class ModGeneRequirementsProvider(
1717
output: PackOutput,
1818
existingFileHelper: ExistingFileHelper
19-
) : JsonCodecProvider<GeneRequirements.GeneRequirementsData>(
19+
) : JsonCodecProvider<GeneRequirements>(
2020
output,
2121
existingFileHelper,
2222
GeneticsResequenced.MOD_ID,
2323
JsonOps.INSTANCE,
2424
PackType.SERVER_DATA,
2525
"geneticsresequenced/gene_requirements",
26-
GeneRequirements.GeneRequirementsData.CODEC,
26+
GeneRequirements.CODEC,
2727
mapOf()
2828
) {
2929

30-
override fun gather(consumer: BiConsumer<ResourceLocation, GeneRequirements.GeneRequirementsData>) {
30+
override fun gather(consumer: BiConsumer<ResourceLocation, GeneRequirements>) {
3131

3232
fun addRequirements(
3333
geneRk: ResourceKey<Gene>,
3434
vararg requirements: ResourceKey<Gene>
3535
) {
3636
consumer.accept(
3737
geneRk.location(),
38-
GeneRequirements.GeneRequirementsData(
38+
GeneRequirements(
3939
geneRk,
4040
requirements.toList()
4141
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dev.aaronhowser.mods.geneticsresequenced.event.custom
2+
3+
import dev.aaronhowser.mods.geneticsresequenced.gene.Gene
4+
import net.minecraft.resources.ResourceKey
5+
import net.minecraftforge.eventbus.api.Event
6+
7+
class ModifyGeneRequirementsEvent(
8+
val gene: ResourceKey<Gene>,
9+
val requirements: MutableSet<ResourceKey<Gene>>
10+
) : Event()

0 commit comments

Comments
 (0)