/*
* Copyright (C) 2023 NotEnoughUpdates contributors
*
* This file is part of NotEnoughUpdates.
*
* NotEnoughUpdates is free software: you can redistribute it
* and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* NotEnoughUpdates is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with NotEnoughUpdates. If not, see .
*/
package io.github.moulberry.notenoughupdates.miscfeatures
import io.github.moulberry.notenoughupdates.NotEnoughUpdates
import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe
import io.github.moulberry.notenoughupdates.events.ReplaceItemEvent
import io.github.moulberry.notenoughupdates.events.SlotClickEvent
import io.github.moulberry.notenoughupdates.util.ItemUtils
import io.github.moulberry.notenoughupdates.util.SBInfo
import io.github.moulberry.notenoughupdates.util.Utils
import net.minecraft.client.player.inventory.ContainerLocalMenu
import net.minecraft.init.Items
import net.minecraft.item.Item
import net.minecraft.item.ItemStack
import net.minecraftforge.fml.common.eventhandler.EventPriority
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.util.*
@NEUAutoSubscribe
object OldSkyBlockMenu {
private val decimalFormat = DecimalFormat("##,##0", DecimalFormatSymbols(Locale.US))
val map: Map by lazy {
val map = mutableMapOf()
for (button in SkyBlockButton.values()) {
map[button.slot] = button
}
map
}
@SubscribeEvent
fun replaceItem(event: ReplaceItemEvent) {
if (!isRightInventory()) return
if (event.inventory !is ContainerLocalMenu) return
if (SBInfo.getInstance().getLocation() != null && SBInfo.getInstance().getLocation().equals("rift")) return
val skyBlockButton = map[event.slotNumber] ?: return
val showWarning = skyBlockButton.requiresBoosterCookie && !CookieWarning.hasActiveBoosterCookie()
val item = if (showWarning) skyBlockButton.itemWithCookieWarning else skyBlockButton.itemWithoutCookieWarning
if (skyBlockButton == SkyBlockButton.ACCESSORY) {
val magicalPower = NotEnoughUpdates.INSTANCE.config.profileSpecific?.magicalPower ?: 0
val lore = ItemUtils.getLore(item)
lore.add(4, "")
val format = decimalFormat.format(magicalPower)
lore.add(5, "§7Magical Power: §6$format")
val newItem = ItemStack.copyItemStack(item)
ItemUtils.setLore(newItem, lore)
event.replaceWith(newItem)
} else {
event.replaceWith(item)
}
}
@SubscribeEvent(priority = EventPriority.HIGH)
fun onStackClick(event: SlotClickEvent) {
if (!isRightInventory()) return
if (SBInfo.getInstance().getLocation() != null && SBInfo.getInstance().getLocation().equals("rift")) return
val skyBlockButton = map[event.slotId] ?: return
event.isCanceled = true
if (!skyBlockButton.requiresBoosterCookie || CookieWarning.hasActiveBoosterCookie()) {
NotEnoughUpdates.INSTANCE.sendChatMessage("/" + skyBlockButton.command)
}
}
private fun isRightInventory(): Boolean {
return NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() &&
NotEnoughUpdates.INSTANCE.config.misc.oldSkyBlockMenu &&
Utils.getOpenChestName() == "SkyBlock Menu"
}
enum class SkyBlockButton(
val command: String,
val slot: Int,
private val displayName: String,
private vararg val displayDescription: String,
private val itemData: ItemData,
val requiresBoosterCookie: Boolean = true,
) {
TRADES(
"trades", 40,
"Trades",
"View your available trades.",
"These trades are always",
"available and accessible through",
"the SkyBlock Menu.",
itemData = NormalItemData(Items.emerald),
requiresBoosterCookie = false
),
ACCESSORY(
"accessories", 53,
"Accessory Bag",
"A special bag which can hold",
"Talismans, Rings, Artifacts, Relics, and",
"Orbs within it. All will still",
"work while in this bag!",
itemData = SkullItemData(
"2b73dd76-5fc1-4ac3-8139-6a8992f8ce80",
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTYxYTkxOGMw" +
"YzQ5YmE4ZDA1M2U1MjJjYjkxYWJjNzQ2ODkzNjdiNGQ4YWEwNmJmYzFiYTkxNTQ3MzA5ODVmZiJ9fX0="
)
),
POTION(
"potionbag", 52,
"Potion Bag",
"A handy bag for holding your",
"Potions in.",
itemData = SkullItemData(
"991c4a18-3283-4629-b0fc-bbce23cd658c",
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWY4Yjg" +
"yNDI3YjI2MGQwYTYxZTY0ODNmYzNiMmMzNWE1ODU4NTFlMDhhOWE5ZGYzNzI1NDhiNDE2OGNjODE3YyJ9fX0="
)
),
QUIVER(
"quiver", 44,
"Quiver",
"A masterfully crafted Quiver",
"which holds any kind of",
"projectile you can think of!",
itemData = SkullItemData(
"41758912-e6b1-4700-9de5-04f2cfb9c422",
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGNiM2FjZ" +
"GMxMWNhNzQ3YmY3MTBlNTlmNGM4ZTliM2Q5NDlmZGQzNjRjNjg2OTgzMWNhODc4ZjA3NjNkMTc4NyJ9fX0="
)
),
FISHING(
"fishingbag", 43,
"Fishing Bag",
"A useful bag which can hold all",
"types of fish, baits, and fishing",
"loot!",
itemData = SkullItemData(
"508c01d6-eabe-430b-9811-874691ee7ee4",
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWI4ZT" +
"I5N2RmNmI4ZGZmY2YxMzVkYmE4NGVjNzkyZDQyMGFkOGVjYjQ1OGQxNDQyODg1NzJhODQ2MDNiMTYzMSJ9fX0="
)
),
SACK_OF_SACKS(
"sacks", 35,
"Sack of Sacks",
"A sack which contains other",
"sacks. Sackception!",
itemData = SkullItemData(
"a206a7eb-70fc-4f9f-8316-c3f69d6ba2ca",
"ewogICJ0aW1lc3RhbXAiIDogMTU5MTMxMDU4NTYwOSwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0" +
"ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVl" +
"LAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5l" +
"Y3JhZnQubmV0L3RleHR1cmUvODBhMDc3ZTI0OGQxNDI3NzJlYTgwMDg2NGY4YzU3OGI5ZDM2ODg1YjI5ZGFmODM2YjY0" +
"YTcwNjg4MmI2ZWMxMCIKICAgIH0KICB9Cn0="
),
requiresBoosterCookie = false
),
;
val itemWithCookieWarning: ItemStack by lazy { createItem(true) }
val itemWithoutCookieWarning: ItemStack by lazy { createItem(false) }
private fun createItem(showCookieWarning: Boolean): ItemStack {
val lore = mutableListOf()
for (line in displayDescription) {
lore.add("§7$line")
}
lore.add("")
if (showCookieWarning) {
lore.add("§cYou need a booster cookie active")
lore.add("§cto use this shortcut!")
} else {
lore.add("§eClick to execute /${command}")
}
val array = lore.toTypedArray()
val name = "§a${displayName}"
return when (itemData) {
is NormalItemData -> Utils.createItemStackArray(itemData.displayIcon, name, array)
is SkullItemData -> Utils.createSkull(
name,
itemData.uuid,
itemData.value,
array
)
}
}
}
sealed interface ItemData
class NormalItemData(val displayIcon: Item) : ItemData
class SkullItemData(val uuid: String, val value: String) : ItemData
}