Move criteria triggers registration to deferred register

This commit is contained in:
DBotThePony 2024-08-27 22:20:54 +07:00
parent 3f77b86bd5
commit 02db21cde9
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 77 additions and 32 deletions

View File

@ -126,6 +126,7 @@ public final class OverdriveThatMatters {
MRecipes.INSTANCE.register(bus);
MDataComponentTypes.INSTANCE.register(bus);
MArmorMaterials.INSTANCE.register(bus);
MCriteriaTriggers.INSTANCE.register(bus);
StorageStack.Companion.register(bus);
MatteryChestMenu.Companion.register(bus);

View File

@ -0,0 +1,60 @@
package ru.dbotthepony.mc.otm.registry
import net.minecraft.advancements.CriteriaTriggers
import net.minecraft.core.registries.BuiltInRegistries
import net.neoforged.bus.api.IEventBus
import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger
import ru.dbotthepony.mc.otm.triggers.AndroidResearchTrigger
import ru.dbotthepony.mc.otm.triggers.AndroidTravelUnderwater
import ru.dbotthepony.mc.otm.triggers.BecomeAndroidDeathTrigger
import ru.dbotthepony.mc.otm.triggers.BecomeAndroidSleepTrigger
import ru.dbotthepony.mc.otm.triggers.BecomeAndroidTrigger
import ru.dbotthepony.mc.otm.triggers.BecomeHumaneTrigger
import ru.dbotthepony.mc.otm.triggers.BlackHoleTrigger
import ru.dbotthepony.mc.otm.triggers.EnderTeleporterFallDeathTrigger
import ru.dbotthepony.mc.otm.triggers.ExopackBatterySlotTrigger
import ru.dbotthepony.mc.otm.triggers.ExopackGainedCraftingTrigger
import ru.dbotthepony.mc.otm.triggers.ExopackGainedEnderAccessTrigger
import ru.dbotthepony.mc.otm.triggers.ExopackGainedSmeltingTrigger
import ru.dbotthepony.mc.otm.triggers.ExopackObtainedTrigger
import ru.dbotthepony.mc.otm.triggers.ExopackSlotsExpandedTrigger
import ru.dbotthepony.mc.otm.triggers.FallDampenersSaveTrigger
import ru.dbotthepony.mc.otm.triggers.KillAsAndroidTrigger
import ru.dbotthepony.mc.otm.triggers.NailedEntityTrigger
import ru.dbotthepony.mc.otm.triggers.NanobotsArmorTrigger
import ru.dbotthepony.mc.otm.triggers.ShockwaveDamageMobTrigger
import ru.dbotthepony.mc.otm.triggers.ShockwaveTrigger
import ru.dbotthepony.mc.otm.triggers.TakeItemOutOfReplicatorTrigger
object MCriteriaTriggers {
private val registrar = MDeferredRegister(BuiltInRegistries.TRIGGER_TYPES)
fun register(bus: IEventBus) {
registrar.register(bus)
}
init {
registrar.register(BlackHoleTrigger.id, BlackHoleTrigger)
registrar.register(BecomeAndroidTrigger.id, BecomeAndroidTrigger)
registrar.register(BecomeAndroidDeathTrigger.id, BecomeAndroidDeathTrigger)
registrar.register(BecomeAndroidSleepTrigger.id, BecomeAndroidSleepTrigger)
registrar.register(BecomeHumaneTrigger.id, BecomeHumaneTrigger)
registrar.register(AndroidResearchTrigger.id, AndroidResearchTrigger)
registrar.register(ShockwaveDamageMobTrigger.id, ShockwaveDamageMobTrigger)
registrar.register(ShockwaveTrigger.id, ShockwaveTrigger)
registrar.register(AndroidBatteryTrigger.id, AndroidBatteryTrigger)
registrar.register(NanobotsArmorTrigger.id, NanobotsArmorTrigger)
registrar.register(FallDampenersSaveTrigger.id, FallDampenersSaveTrigger)
registrar.register(EnderTeleporterFallDeathTrigger.id, EnderTeleporterFallDeathTrigger)
registrar.register(KillAsAndroidTrigger.id, KillAsAndroidTrigger)
registrar.register(AndroidTravelUnderwater.id, AndroidTravelUnderwater)
registrar.register(NailedEntityTrigger.id, NailedEntityTrigger)
registrar.register(ExopackObtainedTrigger.id, ExopackObtainedTrigger)
registrar.register(ExopackGainedSmeltingTrigger.id, ExopackGainedSmeltingTrigger)
registrar.register(ExopackGainedCraftingTrigger.id, ExopackGainedCraftingTrigger)
registrar.register(ExopackGainedEnderAccessTrigger.id, ExopackGainedEnderAccessTrigger)
registrar.register(ExopackSlotsExpandedTrigger.id, ExopackSlotsExpandedTrigger)
registrar.register(ExopackBatterySlotTrigger.id, ExopackBatterySlotTrigger)
registrar.register(TakeItemOutOfReplicatorTrigger.id, TakeItemOutOfReplicatorTrigger)
}
}

View File

@ -35,12 +35,12 @@ import kotlin.reflect.KProperty
class MDeferredRegister<R : Any>(val registry: ResourceKey<out Registry<R>>, val modId: String = OverdriveThatMatters.MOD_ID, val allowParallel: Boolean = false) {
constructor(registry: Registry<R>, modId: String = OverdriveThatMatters.MOD_ID, allowParallel: Boolean = false) : this(registry.key(), modId, allowParallel)
private val entriesInternal = Object2ObjectLinkedOpenHashMap<String, Entry<R>>()
private val entriesInternal = Object2ObjectLinkedOpenHashMap<ResourceLocation, Entry<R>>()
private var allowRegistration = true
private var eventRegistered = false
private val stages = ArrayList<RegistrationStage>()
val entries: Map<String, Entry<R>> = Collections.unmodifiableMap(entriesInternal)
val entries: Map<ResourceLocation, Entry<R>> = Collections.unmodifiableMap(entriesInternal)
private inner class RegistrationStage(val serial: Boolean) {
private val entries = ArrayList<Entry<R>>()
@ -79,8 +79,10 @@ class MDeferredRegister<R : Any>(val registry: ResourceKey<out Registry<R>>, val
}
}
inner class Entry<out T : R>(val name: String, private val factory: Supplier<T>, serial: Boolean) : Supplier<@UnsafeVariance T>, Lazy<T>, Holder<R> {
constructor(name: String, factory: Supplier<T>) : this(name, factory, false)
inner class Entry<out T : R>(name: ResourceLocation, private val factory: Supplier<T>, serial: Boolean) : Supplier<@UnsafeVariance T>, Lazy<T>, Holder<R> {
constructor(name: String, factory: Supplier<T>, serial: Boolean) : this(ResourceLocation(modId, name), factory, serial)
constructor(name: String, factory: Supplier<T>) : this(ResourceLocation(modId, name), factory, false)
constructor(name: ResourceLocation, factory: Supplier<T>) : this(name, factory, false)
init {
check(allowRegistration) { "Unable to register new entries after RegisterEvent has been fired" }
@ -98,7 +100,7 @@ class MDeferredRegister<R : Any>(val registry: ResourceKey<out Registry<R>>, val
}
@JvmField
val key: ResourceKey<R> = ResourceKey.create(registry, ResourceLocation(modId, name))
val key: ResourceKey<R> = ResourceKey.create(registry, name)
private var parentHolder: Holder<R>? = null
override fun value(): T {
@ -153,7 +155,7 @@ class MDeferredRegister<R : Any>(val registry: ResourceKey<out Registry<R>>, val
private var _value: T? = null
override val value: T get() {
return _value ?: throw IllegalStateException("Trying to access $name of $registry before it is initialized")
return _value ?: throw IllegalStateException("Trying to access ${key.location()} of $registry before it is initialized")
}
override fun isInitialized(): Boolean {
@ -169,12 +171,12 @@ class MDeferredRegister<R : Any>(val registry: ResourceKey<out Registry<R>>, val
}
fun initialize(registry: Registry<R>): T {
check(_value == null) { "Already initialized $name of $registry!" }
check(_value == null) { "Already initialized ${key.location()} of $registry!" }
val compute = try {
factory.get()
} catch (err: Throwable) {
throw RuntimeException("Unable to initialize registry entry $name of $registry", err)
throw RuntimeException("Unable to initialize registry entry ${key.location()} of $registry", err)
}
_value = compute
@ -200,6 +202,12 @@ class MDeferredRegister<R : Any>(val registry: ResourceKey<out Registry<R>>, val
fun <T : R> register(name: String, factory: Supplier<T>, serial: Boolean) = Entry(name, factory, serial)
fun <T : R> register(name: String, serial: Boolean, factory: Supplier<T>) = Entry(name, factory, serial)
fun <T : R> register(name: ResourceLocation, factory: Supplier<T>) = Entry(name, factory)
fun <T : R> register(name: ResourceLocation, factory: Supplier<T>, serial: Boolean) = Entry(name, factory, serial)
fun <T : R> register(name: ResourceLocation, serial: Boolean, factory: Supplier<T>) = Entry(name, factory, serial)
fun <T : R> register(name: ResourceLocation, value: T) = Entry(name) { value }
private fun onRegisterEvent(event: RegisterEvent) {
if (event.registryKey == registry) {
allowRegistration = false

View File

@ -295,29 +295,6 @@ object MRegistry : IBlockItemRegistryAcceptor {
// call static constructors
NanobotsArmorFeature.Companion
EnderTeleporterFeature.Companion
CriteriaTriggers.register(BlackHoleTrigger.id.toString(), BlackHoleTrigger)
CriteriaTriggers.register(BecomeAndroidTrigger.id.toString(), BecomeAndroidTrigger)
CriteriaTriggers.register(BecomeAndroidDeathTrigger.id.toString(), BecomeAndroidDeathTrigger)
CriteriaTriggers.register(BecomeAndroidSleepTrigger.id.toString(), BecomeAndroidSleepTrigger)
CriteriaTriggers.register(BecomeHumaneTrigger.id.toString(), BecomeHumaneTrigger)
CriteriaTriggers.register(AndroidResearchTrigger.id.toString(), AndroidResearchTrigger)
CriteriaTriggers.register(ShockwaveDamageMobTrigger.id.toString(), ShockwaveDamageMobTrigger)
CriteriaTriggers.register(ShockwaveTrigger.id.toString(), ShockwaveTrigger)
CriteriaTriggers.register(AndroidBatteryTrigger.id.toString(), AndroidBatteryTrigger)
CriteriaTriggers.register(NanobotsArmorTrigger.id.toString(), NanobotsArmorTrigger)
CriteriaTriggers.register(FallDampenersSaveTrigger.id.toString(), FallDampenersSaveTrigger)
CriteriaTriggers.register(EnderTeleporterFallDeathTrigger.id.toString(), EnderTeleporterFallDeathTrigger)
CriteriaTriggers.register(KillAsAndroidTrigger.id.toString(), KillAsAndroidTrigger)
CriteriaTriggers.register(AndroidTravelUnderwater.id.toString(), AndroidTravelUnderwater)
CriteriaTriggers.register(NailedEntityTrigger.id.toString(), NailedEntityTrigger)
CriteriaTriggers.register(ExopackObtainedTrigger.id.toString(), ExopackObtainedTrigger)
CriteriaTriggers.register(ExopackGainedSmeltingTrigger.id.toString(), ExopackGainedSmeltingTrigger)
CriteriaTriggers.register(ExopackGainedCraftingTrigger.id.toString(), ExopackGainedCraftingTrigger)
CriteriaTriggers.register(ExopackGainedEnderAccessTrigger.id.toString(), ExopackGainedEnderAccessTrigger)
CriteriaTriggers.register(ExopackSlotsExpandedTrigger.id.toString(), ExopackSlotsExpandedTrigger)
CriteriaTriggers.register(ExopackBatterySlotTrigger.id.toString(), ExopackBatterySlotTrigger)
CriteriaTriggers.register(TakeItemOutOfReplicatorTrigger.id.toString(), TakeItemOutOfReplicatorTrigger)
}
private fun initializeCommon(event: FMLCommonSetupEvent) {

View File

@ -1,6 +1,5 @@
package ru.dbotthepony.mc.otm.triggers
import net.minecraft.resources.ResourceLocation
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.core.ResourceLocation