/*
* Copyright (C) 2022-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.inventory
import io.github.moulberry.notenoughupdates.NotEnoughUpdates
import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe
import io.github.moulberry.notenoughupdates.core.ChromaColour
import io.github.moulberry.notenoughupdates.core.util.StringUtils
import io.github.moulberry.notenoughupdates.events.GuiContainerBackgroundDrawnEvent
import io.github.moulberry.notenoughupdates.events.ReplaceItemEvent
import io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent
import io.github.moulberry.notenoughupdates.util.ItemUtils
import io.github.moulberry.notenoughupdates.util.LRUCache
import io.github.moulberry.notenoughupdates.util.MuseumUtil
import io.github.moulberry.notenoughupdates.util.MuseumUtil.isMuseumInventory
import net.minecraft.client.gui.Gui
import net.minecraft.init.Items
import net.minecraft.inventory.ContainerChest
import net.minecraft.item.EnumDyeColor
import net.minecraft.item.ItemStack
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
@NEUAutoSubscribe
object MuseumItemHighlighter {
private val manager get() = NotEnoughUpdates.INSTANCE.manager
private val config get() = NotEnoughUpdates.INSTANCE.config.museum
private fun getHighlightColor() = ChromaColour.specialToChromaRGB(config.museumItemColor)
private val findRawItemForName = LRUCache.memoize(::findRawItemForName0, 4 * 7 * 2)
@SubscribeEvent
fun onRepositoryReload(event: RepositoryReloadEvent) {
findRawItemForName.clearCache()
}
private fun findRawItemForName0(arg: Pair): ItemStack? {
val (name, armor) = arg
return MuseumUtil.findItemsByName(name, armor).firstOrNull()?.let { manager.createItem(it) }
}
@SubscribeEvent
fun onItemOverride(event: ReplaceItemEvent) {
if (!config.museumItemShow) return
if (!isMuseumInventory(event.inventory)) return
val original = event.original ?: return
if (!isCompletedRetrievedItem(original)) return
val armor = StringUtils.cleanColour(event.inventory.displayName.unformattedText).endsWith("Armor Sets")
val rawItem = findRawItemForName.apply(original.displayName to armor) ?: return
val hydratedItem = hydrateMuseumItem(rawItem, original)
event.replaceWith(hydratedItem)
}
fun isCompletedRetrievedItem(itemStack: ItemStack): Boolean {
return itemStack.hasDisplayName() && itemStack.item == Items.dye && EnumDyeColor.byDyeDamage(itemStack.itemDamage) == EnumDyeColor.LIME
}
@SubscribeEvent
fun onBackgroundDrawn(event: GuiContainerBackgroundDrawnEvent) {
val egui = event.container ?: return
val chest = egui.inventorySlots as? ContainerChest ?: return
if (!config.museumItemShow) return
if (!isMuseumInventory(chest.lowerChestInventory)) return
val fixedHighlightColor = getHighlightColor()
for (slot in chest.inventorySlots) {
if (slot == null || slot.stack == null) continue
if (isHydratedMuseumItem(slot.stack) || isCompletedRetrievedItem(slot.stack)) {
val left = slot.xDisplayPosition
val top = slot.yDisplayPosition
Gui.drawRect(
left, top,
left + 16, top + 16,
fixedHighlightColor
)
}
}
}
fun hydrateMuseumItem(rawItem: ItemStack, original: ItemStack) = rawItem.copy().apply {
setStackDisplayName(original.displayName)
val originalLore = ItemUtils.getLore(original).toMutableList()
ItemUtils.setLore(this, originalLore)
val data = ItemUtils.getOrCreateTag(this)
val extraAttributes = data.getCompoundTag("ExtraAttributes")
extraAttributes.setByte("donated_museum", 1)
data.setTag("ExtraAttributes", extraAttributes)
data.setBoolean(MUSEUM_HYDRATED_ITEM_TAG, true)
}
fun isHydratedMuseumItem(stack: ItemStack): Boolean {
return ItemUtils.getOrCreateTag(stack).getBoolean(MUSEUM_HYDRATED_ITEM_TAG)
}
const val MUSEUM_HYDRATED_ITEM_TAG = "NEU_HYDRATED_MUSEUM_ITEM"
}