aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThunderblade73 <85900443+Thunderblade73@users.noreply.github.com>2024-02-19 15:40:02 +0100
committerGitHub <noreply@github.com>2024-02-19 15:40:02 +0100
commit96c657cbb5e1c9282911bb8b7b6f6239392ae07f (patch)
tree8796bcfaad5210bd6a834d81cef673160bc1c96c
parent30c49ad2a76be6b4d70924135c7a80d0a6f548cf (diff)
downloadskyhanni-96c657cbb5e1c9282911bb8b7b6f6239392ae07f.tar.gz
skyhanni-96c657cbb5e1c9282911bb8b7b6f6239392ae07f.tar.bz2
skyhanni-96c657cbb5e1c9282911bb8b7b6f6239392ae07f.zip
Added GetFromSackAPI. #968
-rw-r--r--src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/api/GetFromSackAPI.kt198
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt39
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/inventory/GetFromSackConfig.java20
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/inventory/InventoryConfig.java6
-rw-r--r--src/main/java/at/hannibal2/skyhanni/data/ChatManager.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt3
-rw-r--r--src/main/java/at/hannibal2/skyhanni/events/MessageSendToServerEvent.kt7
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/GetFromSacksTabComplete.kt28
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/minion/MinionXp.kt6
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/ChatUtils.kt14
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/PrimitiveItemStack.kt13
12 files changed, 287 insertions, 51 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
index fc3fd348a..c7e544839 100644
--- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
+++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
@@ -2,6 +2,7 @@ package at.hannibal2.skyhanni
import at.hannibal2.skyhanni.api.CollectionAPI
import at.hannibal2.skyhanni.api.DataWatcherAPI
+import at.hannibal2.skyhanni.api.GetFromSackAPI
import at.hannibal2.skyhanni.config.ConfigFileType
import at.hannibal2.skyhanni.config.ConfigManager
import at.hannibal2.skyhanni.config.Features
@@ -428,6 +429,7 @@ class SkyHanniMod {
loadModule(ToolTipData())
loadModule(HighlightVisitorsOutsideOfGarden())
loadModule(GuiEditManager())
+ loadModule(GetFromSackAPI)
loadModule(UpdateManager)
loadModule(CropAccessoryData())
loadModule(MayorElection())
diff --git a/src/main/java/at/hannibal2/skyhanni/api/GetFromSackAPI.kt b/src/main/java/at/hannibal2/skyhanni/api/GetFromSackAPI.kt
new file mode 100644
index 000000000..942114203
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/api/GetFromSackAPI.kt
@@ -0,0 +1,198 @@
+package at.hannibal2.skyhanni.api
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.data.jsonobjects.repo.SacksJson
+import at.hannibal2.skyhanni.events.GuiContainerEvent
+import at.hannibal2.skyhanni.events.InventoryCloseEvent
+import at.hannibal2.skyhanni.events.LorenzChatEvent
+import at.hannibal2.skyhanni.events.LorenzTickEvent
+import at.hannibal2.skyhanni.events.LorenzToolTipEvent
+import at.hannibal2.skyhanni.events.MessageSendToServerEvent
+import at.hannibal2.skyhanni.events.RepositoryReloadEvent
+import at.hannibal2.skyhanni.utils.ChatUtils
+import at.hannibal2.skyhanni.utils.ChatUtils.isCommand
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.NEUInternalName
+import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
+import at.hannibal2.skyhanni.utils.NumberUtil.isInt
+import at.hannibal2.skyhanni.utils.PrimitiveItemStack
+import at.hannibal2.skyhanni.utils.PrimitiveItemStack.Companion.makePrimitiveStack
+import at.hannibal2.skyhanni.utils.SimpleTimeMark
+import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase
+import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher
+import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
+import net.minecraft.inventory.Slot
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import java.util.Deque
+import java.util.LinkedList
+import kotlin.time.Duration.Companion.seconds
+
+object GetFromSackAPI {
+ private val config get() = SkyHanniMod.feature.inventory.gfs
+
+ val commands = arrayOf("gfs", "getfromsacks")
+ val commandsWithSlash = commands.map { "/$it" }
+
+ private val fromSacksChatPattern by RepoPattern.pattern(
+ "gfs.chat.from",
+ "§aMoved §r§e(?<amount>\\d+) (?<item>.+)§r§a from your Sacks to your inventory."
+ )
+ private val missingChatPattern by RepoPattern.pattern(
+ "gfs.chat.missing",
+ "§cYou have no (?<item>.+) in your Sacks!"
+ )
+
+ fun getFromSack(item: NEUInternalName, amount: Int) = getFromSack(item.makePrimitiveStack(amount))
+
+ fun getFromSack(item: PrimitiveItemStack) = getFromSack(listOf(item))
+
+ fun getFromSack(items: List<PrimitiveItemStack>) = addToQueue(items)
+
+ fun getFromChatMessageSackItems(
+ item: PrimitiveItemStack,
+ text: String = "§lCLICK HERE§r§e to grab §ax${item.amount} §9${item.name.asString()}§e from sacks!"
+ ) =
+ ChatUtils.clickableChat(text, "${commands.first()} ${item.name.asString()} ${item.amount}")
+
+ fun getFromSlotClickedSackItems(items: List<PrimitiveItemStack>, slotIndex: Int) = addToInventory(items, slotIndex)
+
+ fun Slot.getFromSackWhenClicked(items: List<PrimitiveItemStack>) = getFromSlotClickedSackItems(items, slotIndex)
+
+ private val minimumDelay = 1.65.seconds
+
+ private val queue: Deque<PrimitiveItemStack> = LinkedList()
+ private val inventoryMap = mutableMapOf<Int, List<PrimitiveItemStack>>()
+
+ private var lastTimeOfCommand = SimpleTimeMark.farPast()
+
+ private var lastItemStack: PrimitiveItemStack? = null
+
+ var sackList = emptyList<NEUInternalName>()
+ private set
+
+ private fun addToQueue(items: List<PrimitiveItemStack>) = queue.addAll(items)
+
+ private fun addToInventory(items: List<PrimitiveItemStack>, slotId: Int) = inventoryMap.put(slotId, items)
+
+ @SubscribeEvent
+ fun onTick(event: LorenzTickEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (queue.isNotEmpty() && lastTimeOfCommand.passedSince() >= minimumDelay) {
+ val item = queue.poll()
+ LorenzUtils.sendCommandToServer("gfs ${item.name.asString()} ${item.amount}")
+ lastTimeOfCommand = ChatUtils.getTimeWhenNewlyQueuedMessageGetsExecuted()
+ }
+ }
+
+ @SubscribeEvent
+ fun onInventoryClose(event: InventoryCloseEvent) {
+ inventoryMap.clear()
+ }
+
+ @SubscribeEvent
+ fun onSlotClicked(event: GuiContainerEvent.SlotClickEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (event.clickedButton != 1) return // filter none right clicks
+ addToQueue(inventoryMap[event.slotId] ?: return)
+ inventoryMap.remove(event.slotId)
+ event.isCanceled = true
+ }
+
+ @SubscribeEvent
+ fun onTooltipRender(event: LorenzToolTipEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ val list = inventoryMap[event.slot.slotIndex] ?: return
+ event.toolTip.let { tip ->
+ tip.add("")
+ tip.add("§ePress right click to get from sack:")
+ tip.addAll(list.map { "§ex" + it.amount.toString() + " " + it.name.asString() })
+ }
+ }
+
+ @SubscribeEvent
+ fun onMessageToServer(event: MessageSendToServerEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (!config.queuedGFS && !config.bazaarGFS) return
+ if (!event.isCommand(commandsWithSlash)) return
+ queuedHandler(event)
+ bazaarHandler(event)
+ }
+
+ private fun queuedHandler(event: MessageSendToServerEvent) {
+ if (!config.queuedGFS) return
+ if (event.originatingModContainer?.modId == "skyhanni") return
+
+ val (result, stack) = commandValidator(event.splitMessage.drop(1))
+
+ when (result) {
+ CommandResult.VALID -> getFromSack(stack ?: return)
+ CommandResult.WRONG_ARGUMENT -> ChatUtils.userError("Missing arguments! Usage: /getfromsacks <name/id> <amount>")
+ CommandResult.WRONG_IDENTIFIER -> ChatUtils.userError("Couldn't find an item with this name or identifier!")
+ CommandResult.WRONG_AMOUNT -> ChatUtils.userError("Invalid amount!")
+ }
+ event.isCanceled = true
+ }
+
+ private fun bazaarHandler(event: MessageSendToServerEvent) {
+ if (event.isCanceled) return
+ if (!config.bazaarGFS || LorenzUtils.noTradeMode) return
+ lastItemStack = commandValidator(event.splitMessage.drop(1)).second
+ }
+
+ private fun bazaarMessage(item: String, amount: Int, isRemaining: Boolean = false) = ChatUtils.clickableChat(
+ "§lCLICK §r§eto get the ${if (isRemaining) "remaining " else ""}§ax${amount} §9$item §efrom bazaar",
+ "bz $item"
+ )
+
+ private fun commandValidator(args: List<String>): Pair<CommandResult, PrimitiveItemStack?> {
+ if (args.size != 2) {
+ return CommandResult.WRONG_ARGUMENT to null
+ }
+
+ val item = args[0].asInternalName()
+
+ if (!sackList.contains(item)) {
+ return CommandResult.WRONG_IDENTIFIER to null
+ }
+
+ val amountString = args[1]
+
+ if (!amountString.isInt()) {
+ return CommandResult.WRONG_AMOUNT to null
+ }
+
+ return CommandResult.VALID to item.makePrimitiveStack(amountString.toInt())
+ }
+
+ @SubscribeEvent
+ fun onChat(event: LorenzChatEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (!config.bazaarGFS || LorenzUtils.noTradeMode) return
+ val stack = lastItemStack ?: return
+ val message = event.message
+ fromSacksChatPattern.matchMatcher(message) {
+ val diff = stack.amount - group("amount").toInt()
+ if (diff <= 0) return
+ bazaarMessage(stack.name.asString().firstLetterUppercase(), diff, true)
+ lastItemStack = null
+ return
+ }
+ missingChatPattern.matchMatcher(message) {
+ bazaarMessage(stack.name.asString().firstLetterUppercase(), stack.amount)
+ lastItemStack = null
+ return
+ }
+ }
+
+ private enum class CommandResult {
+ VALID,
+ WRONG_ARGUMENT,
+ WRONG_IDENTIFIER,
+ WRONG_AMOUNT
+ }
+
+ @SubscribeEvent
+ fun onRepoReload(event: RepositoryReloadEvent) {
+ sackList = event.getConstant<SacksJson>("Sacks").sackList.map { it.replace(" ", "_").asInternalName() }
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt
index 3a0290b6a..5283c0c6e 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt
+++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt
@@ -14,7 +14,6 @@ import at.hannibal2.skyhanni.features.chat.Translator
import at.hannibal2.skyhanni.features.combat.endernodetracker.EnderNodeTracker
import at.hannibal2.skyhanni.features.combat.ghostcounter.GhostUtil
import at.hannibal2.skyhanni.features.commands.PartyCommands
-import at.hannibal2.skyhanni.features.commands.WikiManager
import at.hannibal2.skyhanni.features.event.diana.BurrowWarpHelper
import at.hannibal2.skyhanni.features.event.diana.DianaProfitTracker
import at.hannibal2.skyhanni.features.event.diana.GriffinBurrowHelper
@@ -240,28 +239,22 @@ object Commands {
"shresetseacreaturetracker",
"Resets the Sea Creature Tracker"
) { SeaCreatureTracker.resetCommand(it) }
- registerCommand(
- "shfandomwiki",
- "Searches the fandom wiki with SkyHanni's own method."
- ) {WikiManager.otherWikiCommands(it, true)}
- registerCommand(
- "shfandomwikithis",
- "Searches the fandom wiki with SkyHanni's own method."
- ) {WikiManager.otherWikiCommands(it, true, true)}
- registerCommand(
- "shofficialwiki",
- "Searches the official wiki with SkyHanni's own method."
- ) {WikiManager.otherWikiCommands(it, false)}
- registerCommand(
- "shofficialwikithis",
- "Searches the official wiki with SkyHanni's own method."
- ) {WikiManager.otherWikiCommands(it, false, true)}
- registerCommand0("shcalccrop", "Calculate how many crops need to be farmed between different crop milestones.", {
- FarmingMilestoneCommand.onCommand(it.getOrNull(0), it.getOrNull(1), it.getOrNull(2), false)
- }, FarmingMilestoneCommand::onComplete)
- registerCommand0("shcalccroptime", "Calculate how long you need to farm crops between different crop milestones.", {
- FarmingMilestoneCommand.onCommand(it.getOrNull(0), it.getOrNull(1), it.getOrNull(2), true)
- }, FarmingMilestoneCommand::onComplete)
+ registerCommand0(
+ "shcalccrop",
+ "Calculate how many crops need to be farmed between different crop milestones.",
+ {
+ FarmingMilestoneCommand.onCommand(it.getOrNull(0), it.getOrNull(1), it.getOrNull(2), false)
+ },
+ FarmingMilestoneCommand::onComplete
+ )
+ registerCommand0(
+ "shcalccroptime",
+ "Calculate how long you need to farm crops between different crop milestones.",
+ {
+ FarmingMilestoneCommand.onCommand(it.getOrNull(0), it.getOrNull(1), it.getOrNull(2), true)
+ },
+ FarmingMilestoneCommand::onComplete
+ )
}
private fun usersBugFix() {
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/inventory/GetFromSackConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/inventory/GetFromSackConfig.java
new file mode 100644
index 000000000..9454bd3fe
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/inventory/GetFromSackConfig.java
@@ -0,0 +1,20 @@
+package at.hannibal2.skyhanni.config.features.inventory;
+
+import at.hannibal2.skyhanni.config.FeatureToggle;
+import com.google.gson.annotations.Expose;
+import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean;
+import io.github.moulberry.moulconfig.annotations.ConfigOption;
+
+public class GetFromSackConfig {
+
+ @Expose
+ @ConfigOption(name = "Queued GfS", desc = "If §e/gfs §for §e/getfromsacks §fis used it queues up the commands so all items are guarantied to be received.")
+ @ConfigEditorBoolean
+ @FeatureToggle
+ public boolean queuedGFS = true;
+
+ @Expose
+ @ConfigOption(name = "Bazaar GfS", desc = "If you don't have enough items in sack get a prompt to buy them from bazaar.")
+ @ConfigEditorBoolean
+ public boolean bazaarGFS = false;
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/inventory/InventoryConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/inventory/InventoryConfig.java
index 9e7a88e9d..ce60c05ff 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/inventory/InventoryConfig.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/inventory/InventoryConfig.java
@@ -57,6 +57,11 @@ public class InventoryConfig {
public HelperConfig helper = new HelperConfig();
@Expose
+ @ConfigOption(name = "Get From Sack", desc = "")
+ @Accordion
+ public GetFromSackConfig gfs = new GetFromSackConfig();
+
+ @Expose
@ConfigOption(
name = "Item Number",
desc = "Showing the item number as a stack size for these items."
@@ -200,5 +205,4 @@ public class InventoryConfig {
@ConfigEditorBoolean
@FeatureToggle
public boolean shiftClickBrewing = false;
-
}
diff --git a/src/main/java/at/hannibal2/skyhanni/data/ChatManager.kt b/src/main/java/at/hannibal2/skyhanni/data/ChatManager.kt
index 9a5f93c0f..8b9ebc0d0 100644
--- a/src/main/java/at/hannibal2/skyhanni/data/ChatManager.kt
+++ b/src/main/java/at/hannibal2/skyhanni/data/ChatManager.kt
@@ -93,7 +93,7 @@ object ChatManager {
)
messageHistory[IdentityCharacteristics(component)] = result
- if (MessageSendToServerEvent(message).postAndCatch()) {
+ if (MessageSendToServerEvent(message, message.split(" "), originatingModContainer).postAndCatch()) {
event.isCanceled = true
messageHistory[IdentityCharacteristics(component)] = result.copy(actionKind = ActionKind.OUTGOING_BLOCKED)
}
diff --git a/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt
index ee9ea621c..73ca7ca17 100644
--- a/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt
+++ b/src/main/java/at/hannibal2/skyhanni/data/SackAPI.kt
@@ -15,7 +15,6 @@ import at.hannibal2.skyhanni.utils.CollectionUtils.editCopy
import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.ItemUtils.name
-import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NEUInternalName
import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
import at.hannibal2.skyhanni.utils.NEUItems.getNpcPriceOrNull
@@ -299,8 +298,6 @@ object SackAPI {
return sackData[item] ?: return SackItem(0, 0, SackStatus.MISSING)
}
- fun commandGetFromSacks(item: String, amount: Int) = LorenzUtils.sendCommandToServer("gfs $item $amount")
-
private fun saveSackData() {
ProfileStorageData.sackProfiles?.sackContents = sackData
SkyHanniMod.configManager.saveConfig(ConfigFileType.SACKS, "saving-data")
diff --git a/src/main/java/at/hannibal2/skyhanni/events/MessageSendToServerEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/MessageSendToServerEvent.kt
index b6dff658e..49e51a30b 100644
--- a/src/main/java/at/hannibal2/skyhanni/events/MessageSendToServerEvent.kt
+++ b/src/main/java/at/hannibal2/skyhanni/events/MessageSendToServerEvent.kt
@@ -1,6 +1,11 @@
package at.hannibal2.skyhanni.events
+import net.minecraftforge.fml.common.ModContainer
import net.minecraftforge.fml.common.eventhandler.Cancelable
@Cancelable
-class MessageSendToServerEvent(val message: String) : LorenzEvent()
+class MessageSendToServerEvent(
+ val message: String,
+ val splitMessage: List<String>,
+ val originatingModContainer: ModContainer?
+) : LorenzEvent()
diff --git a/src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/GetFromSacksTabComplete.kt b/src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/GetFromSacksTabComplete.kt
index 1cbc853b2..a777c76b4 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/GetFromSacksTabComplete.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/commands/tabcomplete/GetFromSacksTabComplete.kt
@@ -1,44 +1,38 @@
package at.hannibal2.skyhanni.features.commands.tabcomplete
import at.hannibal2.skyhanni.SkyHanniMod
-import at.hannibal2.skyhanni.data.jsonobjects.repo.SacksJson
+import at.hannibal2.skyhanni.api.GetFromSackAPI
+import at.hannibal2.skyhanni.api.GetFromSackAPI.commands
import at.hannibal2.skyhanni.events.MessageSendToServerEvent
-import at.hannibal2.skyhanni.events.RepositoryReloadEvent
import at.hannibal2.skyhanni.utils.ChatUtils
+import at.hannibal2.skyhanni.utils.ChatUtils.isCommand
import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
object GetFromSacksTabComplete {
private val config get() = SkyHanniMod.feature.commands.tabComplete
- private var sackList = emptyList<String>()
- private val commands = arrayOf("gfs", "getfromsacks")
-
- @SubscribeEvent
- fun onRepoReload(event: RepositoryReloadEvent) {
- sackList = event.getConstant<SacksJson>("Sacks").sackList
- }
fun handleTabComplete(command: String): List<String>? {
if (!isEnabled()) return null
if (command !in commands) return null
- return sackList.map { it.replace(" ", "_") }
+ return GetFromSackAPI.sackList.map { it.asString() }
}
@SubscribeEvent
fun onMessageSendToServer(event: MessageSendToServerEvent) {
if (!isEnabled()) return
- val message = event.message
- if (!commands.any { message.startsWith("/$it ") }) return
+ if (!event.isCommand(GetFromSackAPI.commandsWithSlash)) return
- val rawName = message.split(" ")[1]
- val realName = rawName.replace("_", " ")
- if (realName == rawName) return
- if (realName !in sackList) return
+ val rawName = event.splitMessage[1]
+ val realName = rawName.asInternalName()
+ if (realName.asString() == rawName) return
+ if (realName !in GetFromSackAPI.sackList) return
event.isCanceled = true
- ChatUtils.sendMessageToServer(message.replace(rawName, realName))
+ ChatUtils.sendMessageToServer(event.message.replace(rawName, realName.asString()))
}
fun isEnabled() = LorenzUtils.inSkyBlock && config.gfsSack
diff --git a/src/main/java/at/hannibal2/skyhanni/features/minion/MinionXp.kt b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionXp.kt
index ddebeb7c4..d866ecc8d 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/minion/MinionXp.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionXp.kt
@@ -16,6 +16,7 @@ import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.NEUInternalName
import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
+import at.hannibal2.skyhanni.utils.PrimitiveItemStack
import at.hannibal2.skyhanni.utils.SimpleTimeMark
import net.minecraft.block.BlockChest
import net.minecraft.client.Minecraft
@@ -44,9 +45,6 @@ class MinionXp {
val timestamp: SimpleTimeMark = SimpleTimeMark.now()
}
- // TODO move to some other spot. This can be used at other features as well
- private data class PrimitiveItemStack(val name: NEUInternalName, val stackSize: Int)
-
private fun toPrimitiveItemStack(itemStack: ItemStack) =
PrimitiveItemStack(itemStack.getInternalName(), itemStack.stackSize)
@@ -113,7 +111,7 @@ class MinionXp {
val xp = xpInfoMap[name] ?: return@forEach
// TODO add wisdom and temporary skill exp (Events) to calculation
- val baseXp = xp.amount * item.stackSize
+ val baseXp = xp.amount * item.amount
val xpAmount = if (MayorElection.isPerkActive("Derpy", "MOAR SKILLZ!!!")) {
baseXp * 1.5
} else baseXp
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/ChatUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/ChatUtils.kt
index f8a156644..533c67731 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/ChatUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/ChatUtils.kt
@@ -2,6 +2,7 @@ package at.hannibal2.skyhanni.utils
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.LorenzTickEvent
+import at.hannibal2.skyhanni.events.MessageSendToServerEvent
import at.hannibal2.skyhanni.utils.StringUtils.removeColor
import net.minecraft.client.Minecraft
import net.minecraft.event.ClickEvent
@@ -11,6 +12,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import java.util.LinkedList
import java.util.Queue
import kotlin.time.Duration.Companion.milliseconds
+import kotlin.time.times
object ChatUtils {
@@ -183,6 +185,10 @@ object ChatUtils {
private var lastMessageSent = SimpleTimeMark.farPast()
private val sendQueue: Queue<String> = LinkedList()
+ private val messageDelay = 300.milliseconds
+
+ fun getTimeWhenNewlyQueuedMessageGetsExecuted() =
+ (lastMessageSent + sendQueue.size * messageDelay).takeIf { !it.isInPast() } ?: SimpleTimeMark.now()
@SubscribeEvent
fun sendQueuedChatMessages(event: LorenzTickEvent) {
@@ -191,7 +197,7 @@ object ChatUtils {
sendQueue.clear()
return
}
- if (lastMessageSent.passedSince() > 300.milliseconds) {
+ if (lastMessageSent.passedSince() > messageDelay) {
player.sendChatMessage(sendQueue.poll() ?: return)
lastMessageSent = SimpleTimeMark.now()
}
@@ -204,4 +210,10 @@ object ChatUtils {
fun sendCommandToServer(command: String) {
sendMessageToServer("/$command")
}
+
+ fun MessageSendToServerEvent.isCommand(commandWithSlash: String) =
+ splitMessage.takeIf { it.isNotEmpty() }?.get(0) == commandWithSlash
+
+ fun MessageSendToServerEvent.isCommand(commandsWithSlash: Collection<String>) =
+ splitMessage.takeIf { it.isNotEmpty() }?.get(0) in commandsWithSlash
}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/PrimitiveItemStack.kt b/src/main/java/at/hannibal2/skyhanni/utils/PrimitiveItemStack.kt
new file mode 100644
index 000000000..ad7b864b1
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/PrimitiveItemStack.kt
@@ -0,0 +1,13 @@
+package at.hannibal2.skyhanni.utils
+
+import at.hannibal2.skyhanni.utils.NEUItems.getItemStack
+
+data class PrimitiveItemStack(val name: NEUInternalName, val amount: Int) {
+
+ fun createItem() = name.getItemStack().apply { stackSize = amount }
+
+ companion object {
+
+ fun NEUInternalName.makePrimitiveStack(amount: Int) = PrimitiveItemStack(this, amount)
+ }
+}