package net.shadowfacts.phycon.util import net.minecraft.nbt.NbtCompound import net.minecraft.util.Identifier import net.shadowfacts.phycon.PhysicalConnectivityClient import net.shadowfacts.phycon.api.TerminalSettingKey import net.shadowfacts.phycon.api.TerminalSetting /** * @author shadowfacts */ class TerminalSettings { companion object { private val SETTINGS = mutableMapOf>() private val DEFAULTS = mutableMapOf, Enum<*>>() val allKeys: Collection> get() = SETTINGS.values fun register(id: Identifier, defaultValue: E): SettingKey where E: Enum, E: TerminalSetting { val setting = SettingKey(id, defaultValue.javaClass) SETTINGS[id] = setting DEFAULTS[setting] = defaultValue return setting } fun getDefault(setting: TerminalSettingKey): E where E: Enum, E: TerminalSetting { @Suppress("UNCHECKED_CAST") return DEFAULTS[setting] as E } } class SettingKey( val id: Identifier, val clazz: Class, ): TerminalSettingKey where E: Enum, E: TerminalSetting { fun value(ordinal: Int): E? { @Suppress("UNCHECKED_CAST") return if (clazz.enumConstants.size <= ordinal) null else clazz.enumConstants[ordinal] as E } override fun getID() = id override fun getValue() = PhysicalConnectivityClient.terminalSettings[this] } private val settings = mutableMapOf, Enum<*>>() operator fun get(key: TerminalSettingKey): E where E: Enum, E: TerminalSetting { @Suppress("UNCHECKED_CAST") return settings[key] as? E ?: getDefault(key) } operator fun set(key: SettingKey, value: E) where E: Enum, E: TerminalSetting { settings[key] = value } fun toTag(): NbtCompound { return NbtCompound().also { settings.forEach { (s, v) -> it.putInt(s.id.toString(), v.ordinal) } } } fun fromTag(tag: NbtCompound) { settings.clear() tag.keys.forEach { k -> val id = Identifier.tryParse(k) ?: return@forEach val setting = SETTINGS[id] ?: return@forEach setValueFromOrdinal(setting, tag.getInt(k)) } } private fun setValueFromOrdinal(setting: SettingKey, ordinal: Int) where E: Enum, E: TerminalSetting { val value = setting.value(ordinal) if (value != null) { this[setting] = value } } }