From 1dd603ab1cc42a602f1d82595dd15789ef63d2a3 Mon Sep 17 00:00:00 2001 From: nea Date: Thu, 18 May 2023 03:20:22 +0200 Subject: Add slot locking --- .../moe/nea/firmament/features/FeatureManager.kt | 6 +- .../moe/nea/firmament/features/FirmamentFeature.kt | 18 ++++++ .../moe/nea/firmament/features/NEUFeature.kt | 18 ------ .../firmament/features/fishing/FishingWarning.kt | 4 +- .../firmament/features/inventory/SlotLocking.kt | 68 ++++++++++++++++++++++ .../moe/nea/firmament/features/world/FairySouls.kt | 4 +- 6 files changed, 94 insertions(+), 24 deletions(-) create mode 100644 src/main/kotlin/moe/nea/firmament/features/FirmamentFeature.kt delete mode 100644 src/main/kotlin/moe/nea/firmament/features/NEUFeature.kt create mode 100644 src/main/kotlin/moe/nea/firmament/features/inventory/SlotLocking.kt (limited to 'src/main/kotlin/moe/nea/firmament/features') diff --git a/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt b/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt index 68205f4..580d745 100644 --- a/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt +++ b/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt @@ -4,6 +4,7 @@ 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.inventory.SlotLocking import moe.nea.firmament.features.world.FairySouls import moe.nea.firmament.util.data.DataHolder @@ -13,7 +14,7 @@ object FeatureManager : DataHolder(serializer(), "feature val enabledFeatures: MutableMap = mutableMapOf() ) - private val features = mutableMapOf() + private val features = mutableMapOf() private var hasAutoloaded = false @@ -26,11 +27,12 @@ object FeatureManager : DataHolder(serializer(), "feature if (hasAutoloaded) return loadFeature(FairySouls) loadFeature(FishingWarning) + loadFeature(SlotLocking) hasAutoloaded = true } } - fun loadFeature(feature: NEUFeature) { + fun loadFeature(feature: FirmamentFeature) { synchronized(features) { if (feature.identifier in features) { Firmament.logger.error("Double registering feature ${feature.identifier}. Ignoring second instance $feature") diff --git a/src/main/kotlin/moe/nea/firmament/features/FirmamentFeature.kt b/src/main/kotlin/moe/nea/firmament/features/FirmamentFeature.kt new file mode 100644 index 0000000..c9cb8f0 --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/features/FirmamentFeature.kt @@ -0,0 +1,18 @@ +package moe.nea.firmament.features + +import moe.nea.firmament.util.config.ManagedConfig + +interface FirmamentFeature { + val name: String + val identifier: String + val defaultEnabled: Boolean + get() = true + var isEnabled: Boolean + get() = FeatureManager.isEnabled(identifier) ?: defaultEnabled + set(value) { + FeatureManager.setEnabled(identifier, value) + } + val config: ManagedConfig? get() = null + fun onLoad() + +} diff --git a/src/main/kotlin/moe/nea/firmament/features/NEUFeature.kt b/src/main/kotlin/moe/nea/firmament/features/NEUFeature.kt deleted file mode 100644 index f231003..0000000 --- a/src/main/kotlin/moe/nea/firmament/features/NEUFeature.kt +++ /dev/null @@ -1,18 +0,0 @@ -package moe.nea.firmament.features - -import moe.nea.firmament.util.config.ManagedConfig - -interface NEUFeature { - val name: String - val identifier: String - val defaultEnabled: Boolean - get() = true - var isEnabled: Boolean - get() = FeatureManager.isEnabled(identifier) ?: defaultEnabled - set(value) { - FeatureManager.setEnabled(identifier, value) - } - val config: ManagedConfig? get() = null - fun onLoad() - -} diff --git a/src/main/kotlin/moe/nea/firmament/features/fishing/FishingWarning.kt b/src/main/kotlin/moe/nea/firmament/features/fishing/FishingWarning.kt index cdeb24c..ab8ebf4 100644 --- a/src/main/kotlin/moe/nea/firmament/features/fishing/FishingWarning.kt +++ b/src/main/kotlin/moe/nea/firmament/features/fishing/FishingWarning.kt @@ -13,13 +13,13 @@ import net.minecraft.util.math.Vec3d import moe.nea.firmament.events.ParticleSpawnEvent import moe.nea.firmament.events.WorldReadyEvent import moe.nea.firmament.events.WorldRenderLastEvent -import moe.nea.firmament.features.NEUFeature +import moe.nea.firmament.features.FirmamentFeature import moe.nea.firmament.util.MC import moe.nea.firmament.util.TimeMark import moe.nea.firmament.util.config.ManagedConfig import moe.nea.firmament.util.render.RenderBlockContext.Companion.renderBlocks -object FishingWarning : NEUFeature { +object FishingWarning : FirmamentFeature { override val name: String get() = "Fishing Warning" override val identifier: String diff --git a/src/main/kotlin/moe/nea/firmament/features/inventory/SlotLocking.kt b/src/main/kotlin/moe/nea/firmament/features/inventory/SlotLocking.kt new file mode 100644 index 0000000..9f75541 --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/features/inventory/SlotLocking.kt @@ -0,0 +1,68 @@ +package moe.nea.firmament.features.inventory + +import kotlinx.serialization.Serializable +import kotlinx.serialization.serializer +import net.minecraft.client.gui.DrawableHelper +import net.minecraft.entity.player.PlayerInventory +import moe.nea.firmament.events.HandledScreenKeyPressedEvent +import moe.nea.firmament.events.IsSlotProtectedEvent +import moe.nea.firmament.events.SlotRenderEvents +import moe.nea.firmament.features.FirmamentFeature +import moe.nea.firmament.keybindings.FirmamentKeyBindings +import moe.nea.firmament.mixins.accessor.AccessorHandledScreen +import moe.nea.firmament.util.CommonSoundEffects +import moe.nea.firmament.util.MC +import moe.nea.firmament.util.data.ProfileSpecificDataHolder + +object SlotLocking : FirmamentFeature { + override val name: String + get() = "Slot Locking" + override val identifier: String + get() = "slot-locking" + + @Serializable + data class Data( + val lockedSlots: MutableSet = mutableSetOf(), + ) + + object DConfig : ProfileSpecificDataHolder(serializer(), "locked-slots", ::Data) + + val keyBinding by FirmamentKeyBindings::SLOT_LOCKING + val lockedSlots get() = DConfig.data?.lockedSlots + override fun onLoad() { + HandledScreenKeyPressedEvent.subscribe { + if (!it.matches(keyBinding)) return@subscribe + val inventory = MC.handledScreen ?: return@subscribe + inventory as AccessorHandledScreen + + val slot = inventory.focusedSlot_NEU ?: return@subscribe + val lockedSlots = lockedSlots ?: return@subscribe + if (slot.inventory is PlayerInventory) { + if (slot.index in lockedSlots) { + lockedSlots.remove(slot.index) + } else { + lockedSlots.add(slot.index) + } + DConfig.markDirty() + CommonSoundEffects.playSuccess() + } + } + IsSlotProtectedEvent.subscribe { + if (it.slot.inventory is PlayerInventory && it.slot.index in (lockedSlots ?: setOf())) { + it.protect() + } + } + SlotRenderEvents.Before.subscribe { + if (it.slot.inventory is PlayerInventory && it.slot.index in (lockedSlots ?: setOf())) { + DrawableHelper.fill( + it.matrices, + it.slot.x, + it.slot.y, + it.slot.x + 16, + it.slot.y + 16, + 0xFFFF0000.toInt() + ) + } + } + } +} diff --git a/src/main/kotlin/moe/nea/firmament/features/world/FairySouls.kt b/src/main/kotlin/moe/nea/firmament/features/world/FairySouls.kt index f752963..ffde0b9 100644 --- a/src/main/kotlin/moe/nea/firmament/features/world/FairySouls.kt +++ b/src/main/kotlin/moe/nea/firmament/features/world/FairySouls.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.serializer import moe.nea.firmament.events.ServerChatLineReceivedEvent import moe.nea.firmament.events.SkyblockServerUpdateEvent import moe.nea.firmament.events.WorldRenderLastEvent -import moe.nea.firmament.features.NEUFeature +import moe.nea.firmament.features.FirmamentFeature import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.MC import moe.nea.firmament.util.SBData @@ -17,7 +17,7 @@ import moe.nea.firmament.util.render.RenderBlockContext.Companion.renderBlocks import moe.nea.firmament.util.unformattedString -object FairySouls : NEUFeature { +object FairySouls : FirmamentFeature { @Serializable -- cgit