diff --git a/src/main/java/at/hannibal2/skyhanni/api/event/EventHandler.kt b/src/main/java/at/hannibal2/skyhanni/api/event/EventHandler.kt index d164e0e774d7..63d3e14cfb21 100644 --- a/src/main/java/at/hannibal2/skyhanni/api/event/EventHandler.kt +++ b/src/main/java/at/hannibal2/skyhanni/api/event/EventHandler.kt @@ -8,77 +8,25 @@ import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.inAnyIsland import at.hannibal2.skyhanni.utils.StringUtils import at.hannibal2.skyhanni.utils.chat.Text -import java.lang.invoke.LambdaMetafactory -import java.lang.invoke.MethodHandles -import java.lang.invoke.MethodType -import java.lang.reflect.Method -import java.lang.reflect.ParameterizedType -import java.util.function.Consumer -class EventHandler private constructor(val name: String, private val isGeneric: Boolean) { - - private val listeners: MutableList = mutableListOf() - - private var isFrozen = false - private var canReceiveCancelled = false +class EventHandler private constructor( + val name: String, + private val listeners: List, + private val canReceiveCancelled: Boolean, +) { var invokeCount: Long = 0L private set - constructor(event: Class) : this( + constructor(event: Class, listeners: List) : this( (event.name.split(".").lastOrNull() ?: event.name).replace("$", "."), - GenericSkyHanniEvent::class.java.isAssignableFrom(event) + listeners.sortedBy { it.options.priority }.toList(), + listeners.any { it.options.receiveCancelled } ) - fun addListener(method: Method, instance: Any, options: HandleEvent) { - if (isFrozen) throw IllegalStateException("Cannot add listener to frozen event handler") - val generic: Class<*>? = if (isGeneric) { - method.genericParameterTypes - .firstNotNullOfOrNull { it as? ParameterizedType } - ?.let { it.actualTypeArguments.firstOrNull() as? Class<*> } - ?: throw IllegalArgumentException("Generic event handler must have a generic type") - } else { - null - } - val name = "${method.declaringClass.name}.${method.name}${ - method.parameterTypes.joinTo( - StringBuilder(), - prefix = "(", - postfix = ")", - separator = ", ", - transform = Class<*>::getTypeName - ) - }" - listeners.add(Listener(name, createEventConsumer(name, instance, method), options, generic)) - } - - @Suppress("UNCHECKED_CAST") - private fun createEventConsumer(name: String, instance: Any, method: Method): Consumer { - try { - val handle = MethodHandles.lookup().unreflect(method) - return LambdaMetafactory.metafactory( - MethodHandles.lookup(), - "accept", - MethodType.methodType(Consumer::class.java, instance::class.java), - MethodType.methodType(Nothing::class.javaPrimitiveType, Object::class.java), - handle, - MethodType.methodType(Nothing::class.javaPrimitiveType, method.parameterTypes[0]) - ).target.bindTo(instance).invokeExact() as Consumer - } catch (e: Throwable) { - throw IllegalArgumentException("Method $name is not a valid consumer", e) - } - } - - fun freeze() { - isFrozen = true - listeners.sortBy { it.options.priority } - canReceiveCancelled = listeners.any { it.options.receiveCancelled } - } - fun post(event: T, onError: ((Throwable) -> Unit)? = null): Boolean { invokeCount++ if (this.listeners.isEmpty()) return false - if (!isFrozen) error("Cannot invoke event on unfrozen event handler") if (SkyHanniEvents.isDisabledHandler(name)) return false @@ -112,7 +60,7 @@ class EventHandler private constructor(val name: String, priv return event.isCancelled } - private fun shouldInvoke(event: SkyHanniEvent, listener: Listener): Boolean { + private fun shouldInvoke(event: SkyHanniEvent, listener: EventListeners.Listener): Boolean { if (SkyHanniEvents.isDisabledInvoker(listener.name)) return false if (listener.options.onlyOnSkyblock && !LorenzUtils.inSkyBlock) return false if (IslandType.ANY !in listener.onlyOnIslandTypes && !inAnyIsland(listener.onlyOnIslandTypes)) return false @@ -126,19 +74,4 @@ class EventHandler private constructor(val name: String, priv } return true } - - private class Listener( - val name: String, - val invoker: Consumer, - val options: HandleEvent, - val generic: Class<*>?, - ) { - val onlyOnIslandTypes: Set = getIslands(options) - - companion object { - private fun getIslands(options: HandleEvent): Set = - if (options.onlyOnIslands.isEmpty()) setOf(options.onlyOnIsland) - else options.onlyOnIslands.toSet() - } - } } diff --git a/src/main/java/at/hannibal2/skyhanni/api/event/EventListeners.kt b/src/main/java/at/hannibal2/skyhanni/api/event/EventListeners.kt new file mode 100644 index 000000000000..ce8194ebc5f3 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/api/event/EventListeners.kt @@ -0,0 +1,78 @@ +package at.hannibal2.skyhanni.api.event + +import at.hannibal2.skyhanni.data.IslandType +import java.lang.invoke.LambdaMetafactory +import java.lang.invoke.MethodHandles +import java.lang.invoke.MethodType +import java.lang.reflect.Method +import java.lang.reflect.ParameterizedType +import java.util.function.Consumer + +class EventListeners private constructor(val name: String, private val isGeneric: Boolean) { + + private val listeners: MutableList = mutableListOf() + + constructor(event: Class<*>) : this( + (event.name.split(".").lastOrNull() ?: event.name).replace("$", "."), + GenericSkyHanniEvent::class.java.isAssignableFrom(event) + ) + + fun addListener(method: Method, instance: Any, options: HandleEvent) { + val generic: Class<*>? = if (isGeneric) { + method.genericParameterTypes + .firstNotNullOfOrNull { it as? ParameterizedType } + ?.let { it.actualTypeArguments.firstOrNull() as? Class<*> } + ?: throw IllegalArgumentException("Generic event handler must have a generic type") + } else { + null + } + val name = "${method.declaringClass.name}.${method.name}${ + method.parameterTypes.joinTo( + StringBuilder(), + prefix = "(", + postfix = ")", + separator = ", ", + transform = Class<*>::getTypeName + ) + }" + listeners.add(Listener(name, createEventConsumer(name, instance, method), options, generic)) + } + + /** + * Creates a consumer using LambdaMetafactory, this is the most efficient way to reflectively call + * a method from within code. + */ + @Suppress("UNCHECKED_CAST") + private fun createEventConsumer(name: String, instance: Any, method: Method): Consumer { + try { + val handle = MethodHandles.lookup().unreflect(method) + return LambdaMetafactory.metafactory( + MethodHandles.lookup(), + "accept", + MethodType.methodType(Consumer::class.java, instance::class.java), + MethodType.methodType(Nothing::class.javaPrimitiveType, Object::class.java), + handle, + MethodType.methodType(Nothing::class.javaPrimitiveType, method.parameterTypes[0]) + ).target.bindTo(instance).invokeExact() as Consumer + } catch (e: Throwable) { + throw IllegalArgumentException("Method $name is not a valid consumer", e) + } + } + + fun getListeners(): List = listeners + + class Listener( + val name: String, + val invoker: Consumer, + val options: HandleEvent, + val generic: Class<*>?, + ) { + val onlyOnIslandTypes: Set = getIslands(options) + + companion object { + private fun getIslands(options: HandleEvent): Set = + if (options.onlyOnIslands.isEmpty()) setOf(options.onlyOnIsland) + else options.onlyOnIslands.toSet() + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/api/event/SkyHanniEvents.kt b/src/main/java/at/hannibal2/skyhanni/api/event/SkyHanniEvents.kt index e3dff201485b..ace86b224de4 100644 --- a/src/main/java/at/hannibal2/skyhanni/api/event/SkyHanniEvents.kt +++ b/src/main/java/at/hannibal2/skyhanni/api/event/SkyHanniEvents.kt @@ -11,6 +11,7 @@ import java.lang.reflect.Method @SkyHanniModule object SkyHanniEvents { + private val listeners: MutableMap, EventListeners> = mutableMapOf() private val handlers: MutableMap, EventHandler<*>> = mutableMapOf() private var disabledHandlers = emptySet() private var disabledHandlerInvokers = emptySet() @@ -21,12 +22,14 @@ object SkyHanniEvents { registerMethod(it, instance) } } - handlers.values.forEach { it.freeze() } } @Suppress("UNCHECKED_CAST") fun getEventHandler(event: Class): EventHandler = handlers.getOrPut(event) { - EventHandler(event) + EventHandler( + event, + getEventClasses(event).mapNotNull { listeners[it] }.flatMap(EventListeners::getListeners) + ) } as EventHandler fun isDisabledHandler(handler: String): Boolean = handler in disabledHandlers @@ -38,8 +41,8 @@ object SkyHanniEvents { val options = method.getAnnotation(HandleEvent::class.java) ?: return val event = method.parameterTypes[0] if (!SkyHanniEvent::class.java.isAssignableFrom(event)) return - val handler = getEventHandler(event as Class) - handler.addListener(method, instance, options) + listeners.getOrPut(event as Class) { EventListeners(event) } + .addListener(method, instance, options) } @SubscribeEvent @@ -61,4 +64,23 @@ object SkyHanniEvents { } } } + + /** + * Returns a list of all super classes and the class itself up to [SkyHanniEvent]. + */ + private fun getEventClasses(clazz: Class<*>): List> { + val classes = mutableListOf>() + classes.add(clazz) + + var current = clazz + while (current.superclass != null) { + val superClass = current.superclass + if (superClass == SkyHanniEvent::class.java) break + if (superClass == GenericSkyHanniEvent::class.java) break + if (superClass == CancellableSkyHanniEvent::class.java) break + classes.add(superClass) + current = superClass + } + return classes + } } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chat/TranslatorConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chat/TranslatorConfig.java index 648afbd8739c..fdd678d0b2dc 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/chat/TranslatorConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chat/TranslatorConfig.java @@ -2,8 +2,10 @@ import at.hannibal2.skyhanni.config.FeatureToggle; import at.hannibal2.skyhanni.features.chat.translation.TranslatableLanguage; +import at.hannibal2.skyhanni.utils.OSUtils; import com.google.gson.annotations.Expose; import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorButton; import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDropdown; import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorText; import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; @@ -14,7 +16,7 @@ public class TranslatorConfig { @Expose @ConfigOption( name = "Translate On Click", - desc = "Click on a message to translate it to English.\n" + + desc = "Click on a message to translate it to your language.\n" + "Use §e/shcopytranslation§7 to translate from English.\n" + "§cTranslation is not guaranteed to be 100% accurate." ) @@ -22,7 +24,7 @@ public class TranslatorConfig { @FeatureToggle public boolean translateOnClick = false; - @ConfigOption(name = "Language Name", desc = "The name of the language selected below. Note that languages marked as unknown might still be supported.") + @ConfigOption(name = "Your Language", desc = "The language that messages should be translated to.") @Expose @ConfigEditorDropdown public Property languageName = Property.of(TranslatableLanguage.ENGLISH); @@ -30,8 +32,18 @@ public class TranslatorConfig { @Expose @ConfigOption( name = "Language Code", - desc = "Enter a language code here to translate on chat click into another language. " + - "E.g. `es` for spanish or 'de' for german. Empty for english.") + desc = "If your language doesn't show in the dropdown, enter your language code here. " + + "E.g. 'es' for Spanish or 'de' for German. Empty will use English." + ) @ConfigEditorText public Property languageCode = Property.of("en"); + + @ConfigOption( + name = "List of Language Codes", + desc = "A list of Google Translate's suppored language codes." + ) + @ConfigEditorButton(buttonText = "Open") + public Runnable langCodesURL = () -> OSUtils.openBrowser( + "https://cloud.google.com/translate/docs/languages#try-it-for-yourself" + ); } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalHighlighterConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalHighlighterConfig.java new file mode 100644 index 000000000000..06c60b507024 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalHighlighterConfig.java @@ -0,0 +1,35 @@ +package at.hannibal2.skyhanni.config.features.mining; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import com.google.gson.annotations.Expose; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorSlider; +import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; + +public class CrystalHighlighterConfig { + + @Expose + @ConfigOption( + name = "Highlight Crystal Nucleus barriers", + desc = "Draw visible bounding boxes around the Crystal Nucleus crystal barrier blocks." + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = true; + + @Expose + @ConfigOption( + name = "Highlight Opacity", + desc = "Set the opacity of the highlighted boxes.\n§70§8: §7Transparent\n§7100§8: §7Solid" + ) + @ConfigEditorSlider(minValue = 0, maxValue = 100, minStep = 1) + public int opacity = 60; + + @Expose + @ConfigOption( + name = "Only Show During Hoppity's", + desc = "Only show the highlighted boxes during Hoppity's Hunt." + ) + @ConfigEditorBoolean + public boolean onlyDuringHoppity = false; +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java index 2c460bd2f0f2..f6a5a83baca6 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java @@ -73,6 +73,11 @@ public class MiningConfig { @Accordion public MineshaftPityDisplayConfig mineshaftPityDisplay = new MineshaftPityDisplayConfig(); + @Expose + @ConfigOption(name = "Crystal Nucleus Crystal Highlights", desc = "") + @Accordion + public CrystalHighlighterConfig crystalHighlighter = new CrystalHighlighterConfig(); + @Expose @ConfigOption(name = "Highlight Commission Mobs", desc = "Highlight mobs that are part of active commissions.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/misc/EstimatedItemValueConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/misc/EstimatedItemValueConfig.java index 3f5874ac0941..2bdae5c59290 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/misc/EstimatedItemValueConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/misc/EstimatedItemValueConfig.java @@ -106,5 +106,6 @@ public String toString() { @Expose @ConfigLink(owner = EstimatedItemValueConfig.class, field = "enabled") + // TODO rename "position" public Position itemPriceDataPos = new Position(140, 90, false, true); } diff --git a/src/main/java/at/hannibal2/skyhanni/data/ItemClickData.kt b/src/main/java/at/hannibal2/skyhanni/data/ItemClickData.kt index e7fa75331924..2bcf589a3d50 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/ItemClickData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/ItemClickData.kt @@ -24,23 +24,23 @@ object ItemClickData { packet is C08PacketPlayerBlockPlacement -> { if (packet.placedBlockDirection != 255) { val position = packet.position.toLorenzVec() - BlockClickEvent(ClickType.RIGHT_CLICK, position, packet.stack).postAndCatch() + BlockClickEvent(ClickType.RIGHT_CLICK, position, packet.stack).post() } else { - ItemClickEvent(InventoryUtils.getItemInHand(), ClickType.RIGHT_CLICK).postAndCatch() + ItemClickEvent(InventoryUtils.getItemInHand(), ClickType.RIGHT_CLICK).post() } } packet is C07PacketPlayerDigging && packet.status == C07PacketPlayerDigging.Action.START_DESTROY_BLOCK -> { val position = packet.position.toLorenzVec() val blockClickCancelled = - BlockClickEvent(ClickType.LEFT_CLICK, position, InventoryUtils.getItemInHand()).postAndCatch() + BlockClickEvent(ClickType.LEFT_CLICK, position, InventoryUtils.getItemInHand()).post() ItemClickEvent(InventoryUtils.getItemInHand(), ClickType.LEFT_CLICK).also { - it.isCanceled = blockClickCancelled - }.postAndCatch() + if (blockClickCancelled) it.cancel() + }.post() } packet is C0APacketAnimation -> { - ItemClickEvent(InventoryUtils.getItemInHand(), ClickType.LEFT_CLICK).postAndCatch() + ItemClickEvent(InventoryUtils.getItemInHand(), ClickType.LEFT_CLICK).post() } packet is C02PacketUseEntity -> { @@ -51,7 +51,7 @@ object ItemClickData { else -> return } val clickedEntity = packet.getEntityFromWorld(Minecraft.getMinecraft().theWorld) ?: return - EntityClickEvent(clickType, clickedEntity, InventoryUtils.getItemInHand()).postAndCatch() + EntityClickEvent(clickType, clickedEntity, InventoryUtils.getItemInHand()).post() } else -> { diff --git a/src/main/java/at/hannibal2/skyhanni/data/MiningAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/MiningAPI.kt index 47133f199a49..54d186ae52c3 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/MiningAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/MiningAPI.kt @@ -163,7 +163,7 @@ object MiningAPI { } } - @SubscribeEvent + @HandleEvent fun onBlockClick(event: BlockClickEvent) { if (!inCustomMiningIsland()) return if (event.clickType != ClickType.LEFT_CLICK) return diff --git a/src/main/java/at/hannibal2/skyhanni/events/BlockClickEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/BlockClickEvent.kt index 2822c28a98c5..42587b3909db 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/BlockClickEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/BlockClickEvent.kt @@ -4,9 +4,7 @@ import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.utils.BlockUtils.getBlockStateAt import at.hannibal2.skyhanni.utils.LorenzVec import net.minecraft.item.ItemStack -import net.minecraftforge.fml.common.eventhandler.Cancelable -@Cancelable class BlockClickEvent(clickType: ClickType, val position: LorenzVec, itemInHand: ItemStack?) : WorldClickEvent(itemInHand, clickType) { diff --git a/src/main/java/at/hannibal2/skyhanni/events/EntityClickEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/EntityClickEvent.kt index d0cf14214789..2c85ef110670 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/EntityClickEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/EntityClickEvent.kt @@ -3,8 +3,6 @@ package at.hannibal2.skyhanni.events import at.hannibal2.skyhanni.data.ClickType import net.minecraft.entity.Entity import net.minecraft.item.ItemStack -import net.minecraftforge.fml.common.eventhandler.Cancelable -@Cancelable class EntityClickEvent(clickType: ClickType, val clickedEntity: Entity?, itemInHand: ItemStack?) : WorldClickEvent(itemInHand, clickType) diff --git a/src/main/java/at/hannibal2/skyhanni/events/ItemClickEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/ItemClickEvent.kt index a34cb43f19de..e0a96d7e5db6 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/ItemClickEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/ItemClickEvent.kt @@ -2,7 +2,5 @@ package at.hannibal2.skyhanni.events import at.hannibal2.skyhanni.data.ClickType import net.minecraft.item.ItemStack -import net.minecraftforge.fml.common.eventhandler.Cancelable -@Cancelable class ItemClickEvent(itemInHand: ItemStack?, clickType: ClickType) : WorldClickEvent(itemInHand, clickType) diff --git a/src/main/java/at/hannibal2/skyhanni/events/WorldClickEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/WorldClickEvent.kt index 4597041a1d32..ff3892859ce4 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/WorldClickEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/WorldClickEvent.kt @@ -1,8 +1,7 @@ package at.hannibal2.skyhanni.events +import at.hannibal2.skyhanni.api.event.CancellableSkyHanniEvent import at.hannibal2.skyhanni.data.ClickType import net.minecraft.item.ItemStack -import net.minecraftforge.fml.common.eventhandler.Cancelable -@Cancelable -open class WorldClickEvent(val itemInHand: ItemStack?, val clickType: ClickType) : LorenzEvent() +open class WorldClickEvent(val itemInHand: ItemStack?, val clickType: ClickType) : CancellableSkyHanniEvent() diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/translation/TranslatableLanguage.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/translation/TranslatableLanguage.kt index 13a19a1dcbc8..7f5db80d1ef8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/translation/TranslatableLanguage.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/translation/TranslatableLanguage.kt @@ -34,8 +34,8 @@ enum class TranslatableLanguage(private val englishName: String, private val nat TAGALOG("Tagalog", "Tagalog", "tl"), // Major language in the Philippines PUNJABI("Punjabi", "ਪੰਜਾਬੀ", "pa"), // Significant in India and Pakistan - // 5. need better name - UNKNOWN("Unknown Language", "", ""), + // 5. Other Language + UNKNOWN("Other", "", ""), ; // Limit to 20 characters so that the text is not too small in the config diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/translation/Translator.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/translation/Translator.kt index 24809faac798..ca827432fad9 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/translation/Translator.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/translation/Translator.kt @@ -66,7 +66,7 @@ object Translator { if (text.isEmpty()) { config.languageName.set(TranslatableLanguage.ENGLISH) } else { - for (language in TranslatableLanguage.values()) { + for (language in TranslatableLanguage.entries) { if (language.languageCode.equals(text, ignoreCase = true)) { config.languageName.set(language) return@onToggle @@ -107,102 +107,107 @@ object Translator { * ] * ], * null, - * '"target language as a two-letter code following ISO 639-1"', + * '"target language as a (usually) two-letter code following ISO 639-1"', * ] */ - private fun getJSONResponse(urlString: String) = - APIUtils.getJSONResponseAsElement(urlString, false, "Google Translate API") + private fun getJSONResponse(urlString: String) = APIUtils.getJSONResponseAsElement(urlString, false, "Google Translate API") - private fun getTranslationToEnglish(message: String): String { - val url = - "https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=" + - URLEncoder.encode(message, "UTF-8") + fun getTranslation( + message: String, + targetLanguage: String, + sourceLanguage: String = "auto", + ): Array? { + // TODO add &dj=1 to use named json + val url = "https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=$sourceLanguage&tl=$targetLanguage&q=" + + URLEncoder.encode(message, "UTF-8") var messageToSend = "" - val layer1 = getJSONResponse(url).asJsonArray - if (layer1.size() <= 2) return "Error!" + val fullResponse = getJSONResponse(url).asJsonArray + if (fullResponse.size() < 3) return null - val language = layer1[2].toString() - if (language == "\"en\"") return "Unable to translate!" - if (language.length != 4) return "Error!" + val language = fullResponse[2].toString() // the detected language the message is in + val sentences = fullResponse[0] as? JsonArray ?: return null - val layer2 = try { - layer1[0] as JsonArray - } catch (_: Exception) { - return "Error!" - } - - for (layer3 in layer2) { - val arrayLayer3 = layer3 as? JsonArray ?: continue - val sentence = arrayLayer3[0].toString() + for (rawSentence in sentences) { + val arrayPhrase = rawSentence as? JsonArray ?: continue + val sentence = arrayPhrase[0].toString() val sentenceWithoutQuotes = sentence.substring(1, sentence.length - 1) messageToSend = "$messageToSend$sentenceWithoutQuotes" } - messageToSend = "$messageToSend §7(Language: $language)" + messageToSend = URLDecoder.decode(messageToSend, "UTF-8").replace("\\", "") // Not sure if this is actually needed + return arrayOf(messageToSend, language) + } - return URLDecoder.decode(messageToSend, "UTF-8").replace("\\", "") + @Deprecated("Use toNativeLanguage() instead", ReplaceWith("Translator.toNativeLanguage(args)")) + fun toEnglish(args: Array) { + toNativeLanguage(args) } - private fun getTranslationFromEnglish(message: String, lang: String): String { - val url = - "https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=$lang&dt=t&q=" + - URLEncoder.encode(message, "UTF-8") - - val layer1 = getJSONResponse(url).asJsonArray - if (layer1.size() < 1) return "Error!" - val layer2 = layer1[0] as? JsonArray - - val firstSentence = (layer2?.get(0) as? JsonArray)?.get(0).toString() - var messageToSend = firstSentence.substring(0, firstSentence.length - 1) - if (layer2 != null) { - for (sentenceIndex in 1..) { + fromNativeLanguage(args) } - fun toEnglish(args: Array) { + fun toNativeLanguage(args: Array) { val message = args.joinToString(" ").removeColor() coroutineScope.launch { - var lang = config.languageCode.get() - val translation = if (lang.isEmpty()) { - getTranslationToEnglish(message) - } else { - getTranslationFromEnglish(message, lang) - } - if (message == translation) { - ChatUtils.userError("Translation is the same as the original message!") - return@launch - } + val translation = getTranslation(message, nativeLanguage()) + val translatedMessage = translation?.get(0) ?: "Error!" + val detectedLanguage = translation?.get(1) ?: "Error!" - if (translation == "Unable to translate!") { - ChatUtils.userError("Unable to translate message :( (is it in English?)") + if (message == translatedMessage) { + ChatUtils.userError("Translation is the same as the original message!") return@launch } - ChatUtils.chat("Found translation: §f$translation") + ChatUtils.clickableChat( + "Found translation: §f$translatedMessage", + onClick = { OSUtils.copyToClipboard(translatedMessage) }, + "§eClick to copy!\n§eOriginal message: §f$message §7(Language: $detectedLanguage)", + ) } } - fun fromEnglish(args: Array) { - if (args.size < 2 || args[0].length != 2) { // args[0] is the language code - ChatUtils.userError("Usage: /shcopytranslation ") + fun fromNativeLanguage(args: Array) { + if (args.size < 2) { + ChatUtils.userError("Usage: /shcopytranslation ") return } val language = args[0] val message = args.drop(1).joinToString(" ") coroutineScope.launch { - val translation = getTranslationFromEnglish(message, language) - ChatUtils.chat("Copied translation to clipboard: §f$translation") - OSUtils.copyToClipboard(translation) + val translation = getTranslation(message, language, nativeLanguage())?.get(0) ?: "Error!" + ChatUtils.clickableChat( + "Copied §f$language §etranslation to clipboard: §f$translation", + onClick = { OSUtils.copyToClipboard(translation) }, + "§eClick to copy!\n§eOriginal message: §f$message", + ) } } + fun translateAdvancedCommand(args: Array) { + if (args.size < 3) { + ChatUtils.userError("Usage: /shtranslateadvanced ") + return + } + val sourceLanguage = args[0] + val targetLanguage = args[1] + val message = args.drop(2).joinToString(" ") + + val translation = getTranslation(message, sourceLanguage, targetLanguage) + val translatedMessage = translation?.get(0) ?: "Error!" + val detectedLanguage = if (sourceLanguage == "auto") " ${translation?.get(1) ?: "Error!"}" else "" + + ChatUtils.clickableChat( + "Found translation from sl: $sourceLanguage: §f$translatedMessage §7(tl: $targetLanguage)", + onClick = { OSUtils.copyToClipboard(translatedMessage) }, + "§eClick to copy!\n§eOriginal message: §f$message §7(sl: $sourceLanguage$detectedLanguage)", + ) + } + + fun nativeLanguage(): String = config.languageCode.get().ifEmpty { "en" } + fun isEnabled() = config.translateOnClick } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonAPI.kt index f95c846b2a0a..7ea372b20d33 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonAPI.kt @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.features.dungeon +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.data.ClickedBlockType import at.hannibal2.skyhanni.data.IslandType @@ -360,9 +361,9 @@ object DungeonAPI { } } - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.CATACOMBS) fun onBlockClick(event: BlockClickEvent) { - if (!inDungeon() || event.clickType != ClickType.RIGHT_CLICK) return + if (event.clickType != ClickType.RIGHT_CLICK) return val position = event.position val blockType: ClickedBlockType = when (position.getBlockAt()) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/carnival/CarnivalQuickStart.kt b/src/main/java/at/hannibal2/skyhanni/features/event/carnival/CarnivalQuickStart.kt index 2257772c8f3c..fe7a73d09053 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/carnival/CarnivalQuickStart.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/carnival/CarnivalQuickStart.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.event.carnival import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.Perk import at.hannibal2.skyhanni.events.EntityClickEvent import at.hannibal2.skyhanni.events.LorenzChatEvent @@ -34,7 +35,7 @@ object CarnivalQuickStart { private var lastChat = SimpleTimeMark.farPast() private var lastClicked = SimpleTimeMark.farPast() - @SubscribeEvent + @HandleEvent fun onEntityClick(event: EntityClickEvent) { if (!isEnabled()) return if (lastChat.passedSince() > 5.0.seconds) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaFixChat.kt b/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaFixChat.kt index 2f3d19c24cb5..aefce4e58088 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaFixChat.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/diana/DianaFixChat.kt @@ -1,7 +1,9 @@ package at.hannibal2.skyhanni.features.event.diana import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType +import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.BurrowGuessEvent import at.hannibal2.skyhanni.events.ItemClickEvent import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent @@ -102,7 +104,7 @@ object DianaFixChat { } } - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.HUB) fun onItemClick(event: ItemClickEvent) { if (!isEnabled()) return if (event.clickType != ClickType.RIGHT_CLICK) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowHelper.kt index 57cc77df583e..64b33c93418f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowHelper.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.event.diana import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.data.EntityMovementData import at.hannibal2.skyhanni.data.IslandType @@ -358,7 +359,7 @@ object GriffinBurrowHelper { event.move(2, "diana", "event.diana") } - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.HUB) fun onBlockClick(event: BlockClickEvent) { if (!isEnabled()) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowParticleFinder.kt b/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowParticleFinder.kt index 80d6ea0e0df9..f3860276ad47 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowParticleFinder.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/diana/GriffinBurrowParticleFinder.kt @@ -165,7 +165,7 @@ object GriffinBurrowParticleFinder { return true } - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.HUB) fun onBlockClick(event: BlockClickEvent) { if (!isEnabled()) return if (!config.burrowsSoopyGuess) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/hoppity/HoppityEggLocator.kt b/src/main/java/at/hannibal2/skyhanni/features/event/hoppity/HoppityEggLocator.kt index bef61bfbf5db..92dbd9dcba8f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/event/hoppity/HoppityEggLocator.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/event/hoppity/HoppityEggLocator.kt @@ -208,7 +208,7 @@ object HoppityEggLocator { lastParticlePosition = null } - @SubscribeEvent + @HandleEvent(onlyOnSkyblock = true) fun onItemClick(event: ItemClickEvent) { if (!isEnabled()) return val item = event.itemInHand ?: return diff --git a/src/main/java/at/hannibal2/skyhanni/features/event/hoppity/NucleusBarriersBox.kt b/src/main/java/at/hannibal2/skyhanni/features/event/hoppity/NucleusBarriersBox.kt new file mode 100644 index 000000000000..47ab47a38240 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/event/hoppity/NucleusBarriersBox.kt @@ -0,0 +1,81 @@ +package at.hannibal2.skyhanni.features.event.hoppity + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent +import at.hannibal2.skyhanni.events.LorenzTickEvent +import at.hannibal2.skyhanni.features.misc.IslandAreas +import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule +import at.hannibal2.skyhanni.utils.LorenzColor +import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland +import at.hannibal2.skyhanni.utils.RenderUtils.drawFilledBoundingBox_nea +import at.hannibal2.skyhanni.utils.RenderUtils.expandBlock +import net.minecraft.util.AxisAlignedBB +import net.minecraft.util.BlockPos +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +@SkyHanniModule +object NucleusBarriersBox { + private val config get() = SkyHanniMod.feature.mining.crystalHighlighter + + private var inNucleus = false + + private enum class Crystal(val color: LorenzColor, val boundingBox: AxisAlignedBB) { + AMBER( + LorenzColor.GOLD, + AxisAlignedBB( + BlockPos(474.0, 124.0, 524.0), + BlockPos(485.0, 111.0, 535.0), + ).expandBlock(), + ), + AMETHYST( + LorenzColor.DARK_PURPLE, + AxisAlignedBB( + BlockPos(474.0, 124.0, 492.0), + BlockPos(485.0, 111.0, 503.0), + ).expandBlock(), + ), + TOPAZ( + LorenzColor.YELLOW, + AxisAlignedBB( + BlockPos(508.0, 124.0, 473.0), + BlockPos(519.0, 111.0, 484.0), + ).expandBlock(), + ), + JADE( + LorenzColor.GREEN, + AxisAlignedBB( + BlockPos(542.0, 124.0, 492.0), + BlockPos(553.0, 111.0, 503.0), + ).expandBlock(), + ), + SAPPHIRE( + LorenzColor.BLUE, + AxisAlignedBB( + BlockPos(542.0, 124.0, 524.0), + BlockPos(553.0, 111.0, 535.0), + ).expandBlock(), + ), + } + + @SubscribeEvent + fun onTick(event: LorenzTickEvent) { + inNucleus = IslandAreas.currentAreaName == "Crystal Nucleus" + } + + @SubscribeEvent + fun onRenderWorld(event: LorenzRenderWorldEvent) { + if (!isEnabled()) return + + Crystal.entries.forEach { crystal -> + event.drawFilledBoundingBox_nea( + crystal.boundingBox, + crystal.color.addOpacity(config.opacity), + renderRelativeToCamera = false, + ) + } + } + + private fun isEnabled() = + IslandType.CRYSTAL_HOLLOWS.isInIsland() && (HoppityAPI.isHoppityEvent() || !config.onlyDuringHoppity) && config.enabled && inNucleus +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt index 4e80bdbea678..7e1800931c41 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/GardenAPI.kt @@ -213,10 +213,8 @@ object GardenAPI { private var lastLocation: LorenzVec? = null - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.GARDEN) fun onBlockClick(event: BlockClickEvent) { - if (!inGarden()) return - val blockState = event.getBlockState val cropBroken = blockState.getCropType() ?: return if (cropBroken.multiplier == 1 && blockState.isBabyCrop()) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt index ff9af9cff523..bd8636b9ff86 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleLine.kt @@ -1,7 +1,9 @@ package at.hannibal2.skyhanni.features.garden.pests import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType +import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.ItemClickEvent import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent import at.hannibal2.skyhanni.events.ReceiveParticleEvent @@ -33,7 +35,7 @@ object PestParticleLine { private var lastPestTrackerUse = SimpleTimeMark.farPast() private val locations = mutableListOf>() - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.GARDEN) fun onItemClick(event: ItemClickEvent) { if (!isEnabled()) return if (PestAPI.hasVacuumInHand()) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt index 6056c054eac9..33c9dbea2f57 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/pests/PestParticleWaypoint.kt @@ -48,7 +48,7 @@ object PestParticleWaypoint { private var isPointingToPest = false private var color: Color? = null - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.GARDEN) fun onItemClick(event: ItemClickEvent) { if (!isEnabled()) return if (PestAPI.hasVacuumInHand()) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/ExperimentsProfitTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/ExperimentsProfitTracker.kt index ac1e8105ef25..79f0304f433f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/ExperimentsProfitTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/inventory/experimentationtable/ExperimentsProfitTracker.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.inventory.experimentationtable import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.ItemAddManager @@ -164,7 +165,7 @@ object ExperimentsProfitTracker { } } - @SubscribeEvent + @HandleEvent fun onItemClick(event: ItemClickEvent) { if (isEnabled() && event.clickType == ClickType.RIGHT_CLICK) { val item = event.itemInHand ?: return diff --git a/src/main/java/at/hannibal2/skyhanni/features/itemabilities/FireVeilWandParticles.kt b/src/main/java/at/hannibal2/skyhanni/features/itemabilities/FireVeilWandParticles.kt index 81477957e4cd..5923433d1b36 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/itemabilities/FireVeilWandParticles.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/itemabilities/FireVeilWandParticles.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.itemabilities import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.config.features.itemability.FireVeilWandConfig.DisplayEntry import at.hannibal2.skyhanni.data.ClickType @@ -39,9 +40,8 @@ object FireVeilWandParticles { } } - @SubscribeEvent + @HandleEvent(onlyOnSkyblock = true) fun onItemClick(event: ItemClickEvent) { - if (!LorenzUtils.inSkyBlock) return if (event.clickType != ClickType.RIGHT_CLICK) return val internalName = event.itemInHand?.getInternalName() diff --git a/src/main/java/at/hannibal2/skyhanni/features/itemabilities/abilitycooldown/ItemAbility.kt b/src/main/java/at/hannibal2/skyhanni/features/itemabilities/abilitycooldown/ItemAbility.kt index 68f9798c309b..6bc24f055ada 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/itemabilities/abilitycooldown/ItemAbility.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/itemabilities/abilitycooldown/ItemAbility.kt @@ -52,6 +52,8 @@ enum class ItemAbility( ROYAL_PIGEON(5), WAND_OF_STRENGTH(10), TACTICAL_INSERTION(20), + TOTEM_OF_CORRUPTION(20), + ENRAGER(20), // doesn't have a sound ENDER_BOW("Ender Warp", 5, "Ender Bow"), diff --git a/src/main/java/at/hannibal2/skyhanni/features/itemabilities/abilitycooldown/ItemAbilityCooldown.kt b/src/main/java/at/hannibal2/skyhanni/features/itemabilities/abilitycooldown/ItemAbilityCooldown.kt index 7715f7456055..fb15bd703a44 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/itemabilities/abilitycooldown/ItemAbilityCooldown.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/itemabilities/abilitycooldown/ItemAbilityCooldown.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.itemabilities.abilitycooldown import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.events.ActionBarUpdateEvent import at.hannibal2.skyhanni.events.ItemClickEvent @@ -54,12 +55,14 @@ object ItemAbilityCooldown { private var lastAbility = "" private var items = mapOf>() private var abilityItems = mapOf>() + private val recentItemsInHand = InventoryUtils.recentItemsInHand.values private val WEIRD_TUBA = "WEIRD_TUBA".asInternalName() private val WEIRDER_TUBA = "WEIRDER_TUBA".asInternalName() private val VOODOO_DOLL_WILTED = "VOODOO_DOLL_WILTED".asInternalName() private val WARNING_FLARE = "WARNING_FLARE".asInternalName() private val ALERT_FLARE = "ALERT_FLARE".asInternalName() private val SOS_FLARE = "SOS_FLARE".asInternalName() + private val TOTEM_OF_CORRUPTION = "TOTEM_OF_CORRUPTION".asInternalName() @SubscribeEvent @@ -191,20 +194,30 @@ object ItemAbilityCooldown { event.soundName == "mob.zombie.remedy" && event.pitch == 1.8888888f && event.volume == 0.7f -> { ItemAbility.TACTICAL_INSERTION.activate(null, 17_000) } + // Totem of Corruption + event.soundName == "random.wood_click" && event.pitch == 0.84126985f && event.volume == 0.5f -> { + if (TOTEM_OF_CORRUPTION in recentItemsInHand) { + ItemAbility.TOTEM_OF_CORRUPTION.sound() + } + } + // Enrager + event.soundName == "mob.enderdragon.growl" && event.pitch == 0.4920635f && event.volume == 2.0f -> { + ItemAbility.ENRAGER.sound() + } + // Blaze Slayer Flares event.soundName == "fireworks.launch" && event.pitch == 1.0f && event.volume == 3.0f -> { - val recent = InventoryUtils.recentItemsInHand.values - if (WARNING_FLARE in recent || ALERT_FLARE in recent) { + if (WARNING_FLARE in recentItemsInHand || ALERT_FLARE in recentItemsInHand) { ItemAbility.ALERT_FLARE.sound() } - if (SOS_FLARE in recent) { + if (SOS_FLARE in recentItemsInHand) { ItemAbility.SOS_FLARE.sound() } } } } - @SubscribeEvent + @HandleEvent fun onItemClick(event: ItemClickEvent) { if (AshfangFreezeCooldown.isCurrentlyFrozen()) return handleItemClick(event.itemInHand) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/TunnelsMaps.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/TunnelsMaps.kt index 0012ed8b0ef8..2d7487ddcb15 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/TunnelsMaps.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/TunnelsMaps.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.mining import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.model.Graph @@ -484,7 +485,7 @@ object TunnelsMaps { nextSpotKey(event) } - @SubscribeEvent + @HandleEvent fun onItemClick(event: ItemClickEvent) { if (!isEnabled() || !config.leftClickPigeon) return if (event.clickType != ClickType.LEFT_CLICK) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt index c7d7bb5042e6..a9dc3dce34df 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.minion import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.config.storage.ProfileSpecificStorage import at.hannibal2.skyhanni.data.ClickType @@ -121,7 +122,7 @@ object MinionFeatures { } } - @SubscribeEvent + @HandleEvent(onlyOnSkyblock = true) fun onEntityClick(event: EntityClickEvent) { if (!enableWithHub()) return if (event.clickType != ClickType.RIGHT_CLICK) return @@ -129,7 +130,7 @@ object MinionFeatures { lastClickedEntity = event.clickedEntity?.getLorenzVec() ?: return } - @SubscribeEvent + @HandleEvent(onlyOnSkyblock = true) fun onBlockClick(event: BlockClickEvent) { if (!enableWithHub()) return if (event.clickType != ClickType.RIGHT_CLICK) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/PrivateIslandNoPickaxeAbility.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/PrivateIslandNoPickaxeAbility.kt index 093c7d80ed3c..ca735ce2c8ff 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/PrivateIslandNoPickaxeAbility.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/PrivateIslandNoPickaxeAbility.kt @@ -1,23 +1,21 @@ package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.WorldClickEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ItemCategory import at.hannibal2.skyhanni.utils.ItemUtils.getItemCategoryOrNull -import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @SkyHanniModule object PrivateIslandNoPickaxeAbility { private val config get() = SkyHanniMod.feature.mining - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.PRIVATE_ISLAND) fun onClick(event: WorldClickEvent) { - if (!IslandType.PRIVATE_ISLAND.isInIsland()) return if (!config.privateIslandNoPickaxeAbility) return if (event.clickType != ClickType.RIGHT_CLICK) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/dreadfarm/WoodenButtonsHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/dreadfarm/WoodenButtonsHelper.kt index 516ecfd90805..d3fbefa999a7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/area/dreadfarm/WoodenButtonsHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/dreadfarm/WoodenButtonsHelper.kt @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.features.rift.area.dreadfarm +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.data.IslandGraphs import at.hannibal2.skyhanni.data.jsonobjects.repo.RiftWoodenButtonsJson @@ -105,7 +106,7 @@ object WoodenButtonsHelper { } } - @SubscribeEvent + @HandleEvent fun onBlockClick(event: BlockClickEvent) { if (!checkButtons()) return @@ -115,7 +116,7 @@ object WoodenButtonsHelper { } } - @SubscribeEvent + @HandleEvent fun onItemClick(event: ItemClickEvent) { if (!checkButtons()) return if (event.clickType != ClickType.RIGHT_CLICK) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt index 63a4e35cb750..08079849e11e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/area/livingcave/LivingCaveLivingMetalHelper.kt @@ -1,6 +1,8 @@ package at.hannibal2.skyhanni.features.rift.area.livingcave +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType +import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.BlockClickEvent import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent import at.hannibal2.skyhanni.events.ReceiveParticleEvent @@ -22,7 +24,7 @@ object LivingCaveLivingMetalHelper { private var pair: Pair? = null private var startTime = 0L - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.THE_RIFT) fun onBlockClick(event: BlockClickEvent) { if (!isEnabled()) return if (event.clickType == ClickType.LEFT_CLICK) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/PunchcardHighlight.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/PunchcardHighlight.kt index 10be4a54abd9..d1fcea62e871 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/PunchcardHighlight.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/PunchcardHighlight.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.rift.everywhere import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.HypixelData import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.data.mob.MobData @@ -169,9 +170,8 @@ object PunchcardHighlight { } } - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.THE_RIFT) fun onPunch(event: EntityClickEvent) { - if (!RiftAPI.inRift()) return val entity = event.clickedEntity if (entity !is AbstractClientPlayer) return if (entity.isNPC()) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerQuestWarning.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerQuestWarning.kt index 162675486946..c879c202b42d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerQuestWarning.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerQuestWarning.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.slayer import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.events.EntityHealthUpdateEvent @@ -148,7 +149,7 @@ object SlayerQuestWarning { return getSlayerData().lastSlayerType == slayerType } - @SubscribeEvent + @HandleEvent(onlyOnSkyblock = true) fun onItemClick(event: ItemClickEvent) { val internalName = event.itemInHand?.getInternalNameOrNull() diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/VampireSlayerFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/VampireSlayerFeatures.kt index df7ab69d907a..13186cd96910 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/VampireSlayerFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/VampireSlayerFeatures.kt @@ -1,8 +1,10 @@ package at.hannibal2.skyhanni.features.slayer import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.data.ClickType +import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.EntityClickEvent import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent import at.hannibal2.skyhanni.events.LorenzTickEvent @@ -203,7 +205,7 @@ object VampireSlayerFeatures { return toChromaColor().withAlpha(config.withAlpha) } - @SubscribeEvent + @HandleEvent(onlyOnIsland = IslandType.THE_RIFT) fun onEntityClick(event: EntityClickEvent) { if (!isEnabled()) return if (event.clickType != ClickType.LEFT_CLICK) return diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerDaggerHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerDaggerHelper.kt index 8a5b5f727193..2f01af9033cc 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerDaggerHelper.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerDaggerHelper.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.features.slayer.blaze import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.config.core.config.gui.GuiPositionEditor import at.hannibal2.skyhanni.config.features.slayer.blaze.BlazeHellionConfig.FirstDaggerEntry @@ -202,7 +203,7 @@ object BlazeSlayerDaggerHelper { return LorenzUtils.inSkyBlock && config.daggers } - @SubscribeEvent + @HandleEvent(onlyOnSkyblock = true) fun onBlockClick(event: BlockClickEvent) { if (!isEnabled()) return if (clientSideClicked) return diff --git a/src/main/java/at/hannibal2/skyhanni/test/WorldEdit.kt b/src/main/java/at/hannibal2/skyhanni/test/WorldEdit.kt index 9b3cec0a09b3..0c5f66626de2 100644 --- a/src/main/java/at/hannibal2/skyhanni/test/WorldEdit.kt +++ b/src/main/java/at/hannibal2/skyhanni/test/WorldEdit.kt @@ -1,6 +1,7 @@ package at.hannibal2.skyhanni.test import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.events.BlockClickEvent import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent @@ -52,7 +53,7 @@ object WorldEdit { return text } - @SubscribeEvent + @HandleEvent fun onBlockClick(event: BlockClickEvent) { if (!isEnabled()) return if (event.itemInHand?.getItemId() != "WOOD_AXE") return