package moe.nea.firmament.features import kotlinx.serialization.Serializable import kotlinx.serialization.serializer import moe.nea.firmament.Firmament import moe.nea.firmament.features.fishing.FishingWarning import moe.nea.firmament.features.world.FairySouls import moe.nea.firmament.util.data.DataHolder object FeatureManager : DataHolder(serializer(), "features", ::Config) { @Serializable data class Config( val enabledFeatures: MutableMap = mutableMapOf() ) private val features = mutableMapOf() private var hasAutoloaded = false init { autoload() } fun autoload() { synchronized(this) { if (hasAutoloaded) return loadFeature(FairySouls) loadFeature(FishingWarning) hasAutoloaded = true } } fun loadFeature(feature: NEUFeature) { synchronized(features) { if (feature.identifier in features) { Firmament.logger.error("Double registering feature ${feature.identifier}. Ignoring second instance $feature") return } features[feature.identifier] = feature feature.onLoad() } } fun isEnabled(identifier: String): Boolean? = data.enabledFeatures[identifier] fun setEnabled(identifier: String, value: Boolean) { data.enabledFeatures[identifier] = value markDirty() } }