From 5f6e3814d63df9bc29905d62ffc40d1615408928 Mon Sep 17 00:00:00 2001 From: Conutik <60240193+Conutik@users.noreply.github.com> Date: Wed, 17 Apr 2024 18:38:53 +0300 Subject: Feature: Visitor Super Craft (#1173) Co-authored-by: hannibal2 <24389977+hannibal002@users.noreply.github.com> Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> --- src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt | 2 + .../garden/visitor/ShoppingListConfig.java | 6 ++ .../garden/visitor/GardenVisitorSupercraft.kt | 96 ++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorSupercraft.kt (limited to 'src/main/java/at/hannibal2/skyhanni') diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 4ef7c0563..ed146902c 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -223,6 +223,7 @@ import at.hannibal2.skyhanni.features.garden.pests.StereoHarmonyDisplay import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorColorNames import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorDropStatistics import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorFeatures +import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorSupercraft import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorTimer import at.hannibal2.skyhanni.features.garden.visitor.HighlightVisitorsOutsideOfGarden import at.hannibal2.skyhanni.features.garden.visitor.NPCVisitorFix @@ -662,6 +663,7 @@ class SkyHanniMod { loadModule(GardenPlotMenuHighlighting()) loadModule(SkyMartCopperPrice()) loadModule(GardenVisitorFeatures) + loadModule(GardenVisitorSupercraft()) loadModule(NPCVisitorFix) loadModule(GardenInventoryNumbers()) loadModule(GardenVisitorTimer()) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/garden/visitor/ShoppingListConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/garden/visitor/ShoppingListConfig.java index 3155c5b0c..474b1a73b 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/garden/visitor/ShoppingListConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/garden/visitor/ShoppingListConfig.java @@ -48,6 +48,12 @@ public class ShoppingListConfig { @ConfigEditorBoolean public boolean showSackCount = true; + @Expose + @ConfigOption(name = "Show Super Craft", desc = "Show super craft button if there are enough materials to make in the sack.") + @ConfigEditorBoolean + @FeatureToggle + public boolean showSuperCraft = false; + @Expose @ConfigOption(name = "Item Preview", desc = "Show the base type for the required items next to new visitors. §cNote that some visitors may require any crop.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorSupercraft.kt b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorSupercraft.kt new file mode 100644 index 000000000..a3afd06ab --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/garden/visitor/GardenVisitorSupercraft.kt @@ -0,0 +1,96 @@ +package at.hannibal2.skyhanni.features.garden.visitor + +import at.hannibal2.skyhanni.data.SackAPI.getAmountInSacks +import at.hannibal2.skyhanni.events.GuiContainerEvent +import at.hannibal2.skyhanni.events.InventoryCloseEvent +import at.hannibal2.skyhanni.events.garden.visitor.VisitorOpenEvent +import at.hannibal2.skyhanni.utils.ChatUtils +import at.hannibal2.skyhanni.utils.ItemUtils.itemName +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import at.hannibal2.skyhanni.utils.NEUItems +import at.hannibal2.skyhanni.utils.NEUItems.getItemStack +import at.hannibal2.skyhanni.utils.SimpleTimeMark +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import io.github.moulberry.notenoughupdates.events.ReplaceItemEvent +import io.github.moulberry.notenoughupdates.util.Utils +import net.minecraft.entity.player.InventoryPlayer +import net.minecraftforge.fml.common.eventhandler.EventPriority +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.seconds + +class GardenVisitorSupercraft { + + private val isSupercraftEnabled get() = VisitorAPI.config.shoppingList.showSuperCraft + + private var hasIngredients = false + private var lastClick = SimpleTimeMark.farPast() + private var lastSuperCraftMaterial = "" + + private val superCraftItem by lazy { + val neuItem = "GOLD_PICKAXE".asInternalName().getItemStack() + Utils.createItemStack( + neuItem.item, + "§bSuper Craft", + "§7You have the items to craft", + "§7Click me to open the super crafter!" + ) + } + + @SubscribeEvent + fun onInventoryClose(event: InventoryCloseEvent) { + if (hasIngredients) { + hasIngredients = false + } + } + + // needs to run later than onVisitorOpen at GardenVisitorFeatures + @SubscribeEvent(priority = EventPriority.LOW) + fun onVisitorOpen(event: VisitorOpenEvent) { + val visitor = event.visitor + visitor.offer?.offerItem ?: return + for ((internalName, amount) in visitor.shoppingList) { + if (isSupercraftEnabled) getSupercraftForSacks(internalName, amount) + } + } + + fun getSupercraftForSacks(internalName: NEUInternalName, amount: Int) { + val ingredients = NEUItems.getRecipes(internalName).first { !it.ingredients.first().internalItemId.contains("PEST") }.ingredients + val ingredientReqs = mutableMapOf() + for (ingredient in ingredients) { + ingredientReqs[ingredient.internalItemId] = ingredientReqs.getOrDefault(ingredient.internalItemId, 0) + ingredient.count.toInt() + } + hasIngredients = true + for ((key, value) in ingredientReqs) { + val sackItem = key.asInternalName().getAmountInSacks() + lastSuperCraftMaterial = internalName.itemName.removeColor() + if (sackItem < value * amount) { + hasIngredients = false + break + } + } + } + + @SubscribeEvent + fun replaceItem(event: ReplaceItemEvent) { + if (!hasIngredients) return + if (event.inventory is InventoryPlayer) return + + if (event.slotNumber == 31) { + event.replaceWith(superCraftItem) + } + } + + @SubscribeEvent(priority = EventPriority.HIGH) + fun onStackClick(event: GuiContainerEvent.SlotClickEvent) { + if (!hasIngredients) return + + if (event.slotId == 31) { + event.isCanceled = true + if (lastClick.passedSince() > 0.3.seconds) { + ChatUtils.sendCommandToServer("recipe $lastSuperCraftMaterial") + lastClick = SimpleTimeMark.now() + } + } + } +} -- cgit