aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/features
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/features')
-rw-r--r--src/main/kotlin/features/FeatureManager.kt107
-rw-r--r--src/main/kotlin/features/FirmamentFeature.kt23
-rw-r--r--src/main/kotlin/features/chat/AutoCompletions.kt33
-rw-r--r--src/main/kotlin/features/chat/ChatLinks.kt101
-rw-r--r--src/main/kotlin/features/chat/CopyChat.kt21
-rw-r--r--src/main/kotlin/features/chat/PartyCommands.kt8
-rw-r--r--src/main/kotlin/features/chat/QuickCommands.kt55
-rw-r--r--src/main/kotlin/features/debug/AnimatedClothingScanner.kt184
-rw-r--r--src/main/kotlin/features/debug/DebugLogger.kt11
-rw-r--r--src/main/kotlin/features/debug/DebugView.kt29
-rw-r--r--src/main/kotlin/features/debug/DeveloperFeatures.kt78
-rw-r--r--src/main/kotlin/features/debug/ExportedTestConstantMeta.kt27
-rw-r--r--src/main/kotlin/features/debug/MinorTrolling.kt10
-rw-r--r--src/main/kotlin/features/debug/PowerUserTools.kt193
-rw-r--r--src/main/kotlin/features/debug/SkinPreviews.kt91
-rw-r--r--src/main/kotlin/features/debug/SoundVisualizer.kt65
-rw-r--r--src/main/kotlin/features/debug/itemeditor/ExportRecipe.kt256
-rw-r--r--src/main/kotlin/features/debug/itemeditor/ItemExporter.kt250
-rw-r--r--src/main/kotlin/features/debug/itemeditor/LegacyItemData.kt87
-rw-r--r--src/main/kotlin/features/debug/itemeditor/LegacyItemExporter.kt318
-rw-r--r--src/main/kotlin/features/diana/AncestralSpadeSolver.kt35
-rw-r--r--src/main/kotlin/features/diana/DianaWaypoints.kt36
-rw-r--r--src/main/kotlin/features/diana/NearbyBurrowsSolver.kt19
-rw-r--r--src/main/kotlin/features/events/anniversity/AnniversaryFeatures.kt396
-rw-r--r--src/main/kotlin/features/events/anniversity/CenturyRaffleFeatures.kt32
-rw-r--r--src/main/kotlin/features/events/carnival/CarnivalFeatures.kt13
-rw-r--r--src/main/kotlin/features/events/carnival/MinesweeperHelper.kt55
-rw-r--r--src/main/kotlin/features/fixes/CompatibliltyFeatures.kt41
-rw-r--r--src/main/kotlin/features/fixes/Fixes.kt76
-rw-r--r--src/main/kotlin/features/garden/HideComposterNoises.kt34
-rw-r--r--src/main/kotlin/features/inventory/CraftingOverlay.kt33
-rw-r--r--src/main/kotlin/features/inventory/ItemHotkeys.kt10
-rw-r--r--src/main/kotlin/features/inventory/ItemRarityCosmetics.kt37
-rw-r--r--src/main/kotlin/features/inventory/JunkHighlighter.kt30
-rw-r--r--src/main/kotlin/features/inventory/PetFeatures.kt551
-rw-r--r--src/main/kotlin/features/inventory/PriceData.kt149
-rw-r--r--src/main/kotlin/features/inventory/REIDependencyWarner.kt32
-rw-r--r--src/main/kotlin/features/inventory/SaveCursorPosition.kt113
-rw-r--r--src/main/kotlin/features/inventory/SlotLocking.kt257
-rw-r--r--src/main/kotlin/features/inventory/TimerInLore.kt45
-rw-r--r--src/main/kotlin/features/inventory/WardrobeKeybinds.kt80
-rw-r--r--src/main/kotlin/features/inventory/buttons/InventoryButton.kt162
-rw-r--r--src/main/kotlin/features/inventory/buttons/InventoryButtonEditor.kt231
-rw-r--r--src/main/kotlin/features/inventory/buttons/InventoryButtonTemplates.kt5
-rw-r--r--src/main/kotlin/features/inventory/buttons/InventoryButtons.kt158
-rw-r--r--src/main/kotlin/features/inventory/storageoverlay/StorageBackingHandle.kt24
-rw-r--r--src/main/kotlin/features/inventory/storageoverlay/StorageOverlay.kt105
-rw-r--r--src/main/kotlin/features/inventory/storageoverlay/StorageOverlayCustom.kt84
-rw-r--r--src/main/kotlin/features/inventory/storageoverlay/StorageOverlayScreen.kt362
-rw-r--r--src/main/kotlin/features/inventory/storageoverlay/StorageOverviewScreen.kt82
-rw-r--r--src/main/kotlin/features/inventory/storageoverlay/VirtualInventory.kt68
-rw-r--r--src/main/kotlin/features/items/BlockZapperOverlay.kt139
-rw-r--r--src/main/kotlin/features/items/BonemerangOverlay.kt94
-rw-r--r--src/main/kotlin/features/items/EtherwarpOverlay.kt234
-rw-r--r--src/main/kotlin/features/items/recipes/ArrowWidget.kt38
-rw-r--r--src/main/kotlin/features/items/recipes/ComponentWidget.kt27
-rw-r--r--src/main/kotlin/features/items/recipes/EntityWidget.kt27
-rw-r--r--src/main/kotlin/features/items/recipes/FireWidget.kt19
-rw-r--r--src/main/kotlin/features/items/recipes/ItemList.kt308
-rw-r--r--src/main/kotlin/features/items/recipes/ItemSlotWidget.kt141
-rw-r--r--src/main/kotlin/features/items/recipes/MoulConfigWidget.kt46
-rw-r--r--src/main/kotlin/features/items/recipes/RecipeRegistry.kt116
-rw-r--r--src/main/kotlin/features/items/recipes/RecipeScreen.kt129
-rw-r--r--src/main/kotlin/features/items/recipes/RecipeWidget.kt37
-rw-r--r--src/main/kotlin/features/items/recipes/RenderableRecipe.kt27
-rw-r--r--src/main/kotlin/features/items/recipes/StandaloneRecipeRenderer.kt77
-rw-r--r--src/main/kotlin/features/items/recipes/TooltipWidget.kt30
-rw-r--r--src/main/kotlin/features/macros/ComboProcessor.kt103
-rw-r--r--src/main/kotlin/features/macros/HotkeyAction.kt40
-rw-r--r--src/main/kotlin/features/macros/KeyComboTrie.kt73
-rw-r--r--src/main/kotlin/features/macros/MacroData.kt19
-rw-r--r--src/main/kotlin/features/macros/MacroUI.kt293
-rw-r--r--src/main/kotlin/features/macros/RadialMenu.kt153
-rw-r--r--src/main/kotlin/features/mining/CommissionFeatures.kt10
-rw-r--r--src/main/kotlin/features/mining/Histogram.kt3
-rw-r--r--src/main/kotlin/features/mining/HotmPresets.kt69
-rw-r--r--src/main/kotlin/features/mining/MiningBlockInfoUi.kt9
-rw-r--r--src/main/kotlin/features/mining/PickaxeAbility.kt100
-rw-r--r--src/main/kotlin/features/mining/PristineProfitTracker.kt47
-rw-r--r--src/main/kotlin/features/misc/CustomCapes.kt172
-rw-r--r--src/main/kotlin/features/misc/Devs.kt42
-rw-r--r--src/main/kotlin/features/misc/Hud.kt75
-rw-r--r--src/main/kotlin/features/misc/LicenseViewer.kt136
-rw-r--r--src/main/kotlin/features/misc/ModAnnouncer.kt80
-rw-r--r--src/main/kotlin/features/notifications/Notifications.kt7
-rw-r--r--src/main/kotlin/features/world/ColeWeightCompat.kt125
-rw-r--r--src/main/kotlin/features/world/FairySouls.kt214
-rw-r--r--src/main/kotlin/features/world/FirmWaypointManager.kt168
-rw-r--r--src/main/kotlin/features/world/FirmWaypoints.kt37
-rw-r--r--src/main/kotlin/features/world/NavigableWaypoint.kt2
-rw-r--r--src/main/kotlin/features/world/NavigationHelper.kt24
-rw-r--r--src/main/kotlin/features/world/NpcWaypointGui.kt3
-rw-r--r--src/main/kotlin/features/world/TemporaryWaypoints.kt72
-rw-r--r--src/main/kotlin/features/world/Waypoints.kt384
94 files changed, 7298 insertions, 1953 deletions
diff --git a/src/main/kotlin/features/FeatureManager.kt b/src/main/kotlin/features/FeatureManager.kt
index f0c1857..d474d65 100644
--- a/src/main/kotlin/features/FeatureManager.kt
+++ b/src/main/kotlin/features/FeatureManager.kt
@@ -1,100 +1,20 @@
package moe.nea.firmament.features
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.serializer
-import moe.nea.firmament.Firmament
-import moe.nea.firmament.events.FeaturesInitializedEvent
import moe.nea.firmament.events.FirmamentEvent
import moe.nea.firmament.events.subscription.Subscription
import moe.nea.firmament.events.subscription.SubscriptionList
-import moe.nea.firmament.features.chat.AutoCompletions
-import moe.nea.firmament.features.chat.ChatLinks
-import moe.nea.firmament.features.chat.QuickCommands
-import moe.nea.firmament.features.debug.DebugView
-import moe.nea.firmament.features.debug.DeveloperFeatures
-import moe.nea.firmament.features.debug.MinorTrolling
-import moe.nea.firmament.features.debug.PowerUserTools
-import moe.nea.firmament.features.diana.DianaWaypoints
-import moe.nea.firmament.features.events.anniversity.AnniversaryFeatures
-import moe.nea.firmament.features.events.carnival.CarnivalFeatures
-import moe.nea.firmament.features.fixes.CompatibliltyFeatures
-import moe.nea.firmament.features.fixes.Fixes
-import moe.nea.firmament.features.inventory.CraftingOverlay
-import moe.nea.firmament.features.inventory.ItemRarityCosmetics
-import moe.nea.firmament.features.inventory.PetFeatures
-import moe.nea.firmament.features.inventory.PriceData
-import moe.nea.firmament.features.inventory.SaveCursorPosition
-import moe.nea.firmament.features.inventory.SlotLocking
-import moe.nea.firmament.features.inventory.buttons.InventoryButtons
-import moe.nea.firmament.features.inventory.storageoverlay.StorageOverlay
-import moe.nea.firmament.features.mining.PickaxeAbility
-import moe.nea.firmament.features.mining.PristineProfitTracker
-import moe.nea.firmament.features.world.FairySouls
-import moe.nea.firmament.features.world.Waypoints
+import moe.nea.firmament.util.ErrorUtil
import moe.nea.firmament.util.compatloader.ICompatMeta
-import moe.nea.firmament.util.data.DataHolder
-object FeatureManager : DataHolder<FeatureManager.Config>(serializer(), "features", ::Config) {
- @Serializable
- data class Config(
- val enabledFeatures: MutableMap<String, Boolean> = mutableMapOf()
- )
-
- private val features = mutableMapOf<String, FirmamentFeature>()
-
- val allFeatures: Collection<FirmamentFeature> get() = features.values
-
- private var hasAutoloaded = false
-
- fun autoload() {
- synchronized(this) {
- if (hasAutoloaded) return
- loadFeature(MinorTrolling)
- loadFeature(FairySouls)
- loadFeature(AutoCompletions)
- // TODO: loadFeature(FishingWarning)
- loadFeature(SlotLocking)
- loadFeature(StorageOverlay)
- loadFeature(PristineProfitTracker)
- loadFeature(CraftingOverlay)
- loadFeature(PowerUserTools)
- loadFeature(Waypoints)
- loadFeature(ChatLinks)
- loadFeature(InventoryButtons)
- loadFeature(CompatibliltyFeatures)
- loadFeature(AnniversaryFeatures)
- loadFeature(QuickCommands)
- loadFeature(PetFeatures)
- loadFeature(SaveCursorPosition)
- loadFeature(PriceData)
- loadFeature(Fixes)
- loadFeature(DianaWaypoints)
- loadFeature(ItemRarityCosmetics)
- loadFeature(PickaxeAbility)
- loadFeature(CarnivalFeatures)
- if (Firmament.DEBUG) {
- loadFeature(DeveloperFeatures)
- loadFeature(DebugView)
- }
- allFeatures.forEach { it.config }
- FeaturesInitializedEvent.publish(FeaturesInitializedEvent(allFeatures.toList()))
- hasAutoloaded = true
- }
- }
+object FeatureManager {
fun subscribeEvents() {
SubscriptionList.allLists.forEach { list ->
if (ICompatMeta.shouldLoad(list.javaClass.name))
- runCatching {
+ ErrorUtil.catch("Error while loading events from $list") {
list.provideSubscriptions {
- it.owner.javaClass.classes.forEach {
- runCatching { it.getDeclaredField("INSTANCE").get(null) }
- }
subscribeSingleEvent(it)
}
- }.getOrElse {
- // TODO: allow annotating source sets to specifically opt out of loading for mods, maybe automatically
- Firmament.logger.info("Ignoring events from $list, likely due to a missing compat mod.", it)
}
}
}
@@ -102,25 +22,4 @@ object FeatureManager : DataHolder<FeatureManager.Config>(serializer(), "feature
private fun <T : FirmamentEvent> subscribeSingleEvent(it: Subscription<T>) {
it.eventBus.subscribe(false, "${it.owner.javaClass.simpleName}:${it.methodName}", it.invoke)
}
-
- fun loadFeature(feature: FirmamentFeature) {
- 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()
- }
-
}
diff --git a/src/main/kotlin/features/FirmamentFeature.kt b/src/main/kotlin/features/FirmamentFeature.kt
deleted file mode 100644
index 2cfc4fd..0000000
--- a/src/main/kotlin/features/FirmamentFeature.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-package moe.nea.firmament.features
-
-import moe.nea.firmament.events.subscription.SubscriptionOwner
-import moe.nea.firmament.gui.config.ManagedConfig
-
-// TODO: remove this entire feature system and revamp config
-interface FirmamentFeature : SubscriptionOwner {
- val identifier: String
- val defaultEnabled: Boolean
- get() = true
- var isEnabled: Boolean
- get() = FeatureManager.isEnabled(identifier) ?: defaultEnabled
- set(value) {
- FeatureManager.setEnabled(identifier, value)
- }
- override val delegateFeature: FirmamentFeature
- get() = this
- val config: ManagedConfig? get() = null
- fun onLoad() {}
-
-}
diff --git a/src/main/kotlin/features/chat/AutoCompletions.kt b/src/main/kotlin/features/chat/AutoCompletions.kt
index 9e0de40..f13fe7e 100644
--- a/src/main/kotlin/features/chat/AutoCompletions.kt
+++ b/src/main/kotlin/features/chat/AutoCompletions.kt
@@ -1,6 +1,15 @@
package moe.nea.firmament.features.chat
+import com.mojang.brigadier.Message
import com.mojang.brigadier.arguments.StringArgumentType.string
+import com.mojang.brigadier.context.CommandContext
+import com.mojang.brigadier.exceptions.BuiltInExceptions
+import com.mojang.brigadier.exceptions.CommandExceptionType
+import com.mojang.brigadier.exceptions.CommandSyntaxException
+import com.mojang.brigadier.exceptions.SimpleCommandExceptionType
+import kotlin.concurrent.thread
+import net.minecraft.SharedConstants
+import net.minecraft.commands.BrigadierExceptions
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.commands.get
import moe.nea.firmament.commands.suggestsList
@@ -8,21 +17,21 @@ import moe.nea.firmament.commands.thenArgument
import moe.nea.firmament.commands.thenExecute
import moe.nea.firmament.events.CommandEvent
import moe.nea.firmament.events.MaskCommands
-import moe.nea.firmament.features.FirmamentFeature
-import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.MC
+import moe.nea.firmament.util.data.Config
+import moe.nea.firmament.util.data.ManagedConfig
+import moe.nea.firmament.util.tr
-object AutoCompletions : FirmamentFeature {
+object AutoCompletions {
+ @Config
object TConfig : ManagedConfig(identifier, Category.CHAT) {
val provideWarpTabCompletion by toggle("warp-complete") { true }
val replaceWarpIsByWarpIsland by toggle("warp-is") { true }
}
- override val config: ManagedConfig?
- get() = TConfig
- override val identifier: String
+ val identifier: String
get() = "auto-completions"
@Subscribe
@@ -44,12 +53,20 @@ object AutoCompletions : FirmamentFeature {
thenExecute {
val warpName = get(toArg)
if (warpName == "is" && TConfig.replaceWarpIsByWarpIsland) {
- MC.sendServerCommand("warp island")
+ MC.sendCommand("warp island")
} else {
- MC.sendServerCommand("warp $warpName")
+ redirectToServer()
}
}
}
}
}
+
+ fun CommandContext<*>.redirectToServer() {
+ val message = tr(
+ "firmament.warp.auto-complete.internal-throw",
+ "This is an internal syntax exception that should not show up in gameplay, used to pass on a command to the server"
+ )
+ throw CommandSyntaxException(CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownCommand(), message)
+ }
}
diff --git a/src/main/kotlin/features/chat/ChatLinks.kt b/src/main/kotlin/features/chat/ChatLinks.kt
index f85825b..aca7af8 100644
--- a/src/main/kotlin/features/chat/ChatLinks.kt
+++ b/