Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Highlight Placeable NPCs (Stranded) #723

Merged
merged 7 commits into from
Dec 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ import at.hannibal2.skyhanni.features.slayer.blaze.BlazeSlayerFirePitsWarning
import at.hannibal2.skyhanni.features.slayer.blaze.HellionShieldHelper
import at.hannibal2.skyhanni.features.slayer.enderman.EndermanSlayerFeatures
import at.hannibal2.skyhanni.features.slayer.enderman.EndermanSlayerHideParticles
import at.hannibal2.skyhanni.features.stranded.HighlightPlaceableNpcs
import at.hannibal2.skyhanni.features.summonings.SummoningMobManager
import at.hannibal2.skyhanni.features.summonings.SummoningSoulsName
import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper
Expand Down Expand Up @@ -668,6 +669,7 @@ class SkyHanniMod {
loadModule(PestSpawnTimer)
loadModule(PestFinder())
loadModule(SprayFeatures())
loadModule(HighlightPlaceableNpcs())
loadModule(PresentWaypoints())

init()
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/at/hannibal2/skyhanni/config/Features.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import at.hannibal2.skyhanni.config.features.dungeon.DungeonConfig;
import at.hannibal2.skyhanni.config.features.event.EventConfig;
import at.hannibal2.skyhanni.config.features.fishing.FishingConfig;
import at.hannibal2.skyhanni.config.features.gui.GUIConfig;
import at.hannibal2.skyhanni.config.features.garden.GardenConfig;
import at.hannibal2.skyhanni.config.features.gui.GUIConfig;
import at.hannibal2.skyhanni.config.features.inventory.InventoryConfig;
import at.hannibal2.skyhanni.config.features.itemability.ItemAbilityConfig;
import at.hannibal2.skyhanni.config.features.markedplayer.MarkedPlayerConfig;
Expand All @@ -22,6 +22,7 @@
import at.hannibal2.skyhanni.config.features.misc.MiscConfig;
import at.hannibal2.skyhanni.config.features.rift.RiftConfig;
import at.hannibal2.skyhanni.config.features.slayer.SlayerConfig;
import at.hannibal2.skyhanni.config.features.stranded.StrandedConfig;
import com.google.gson.annotations.Expose;
import io.github.moulberry.moulconfig.Config;
import io.github.moulberry.moulconfig.Social;
Expand Down Expand Up @@ -137,6 +138,10 @@ public String getTitle() {
@Category(name = "Slayer", desc = "Slayer features.")
public SlayerConfig slayer = new SlayerConfig();

@Expose
@Category(name = "Stranded", desc = "Features for the Stranded game mode.")
public StrandedConfig stranded = new StrandedConfig();

@Expose
@Category(name = "The Rift", desc = "Features for The Rift dimension.")
public RiftConfig rift = new RiftConfig();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package at.hannibal2.skyhanni.config.features.stranded;

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 StrandedConfig {
@Expose
@ConfigOption(name = "Highlight Placeable NPCs", desc = "Highlight NPCs that can be placed, but aren't, in the NPC menu.")
@ConfigEditorBoolean
@FeatureToggle
public boolean highlightPlaceableNpcs = false;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package at.hannibal2.skyhanni.features.stranded

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.GuiContainerEvent
import at.hannibal2.skyhanni.events.InventoryCloseEvent
import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent
import at.hannibal2.skyhanni.utils.InventoryUtils
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.LorenzColor
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RenderUtils.highlight
import net.minecraftforge.fml.common.eventhandler.EventPriority
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

class HighlightPlaceableNpcs {
private val config get() = SkyHanniMod.feature.stranded.highlightPlaceableNpcs
private val locationPattern = "§7Location: §f\\[§e\\d+§f, §e\\d+§f, §e\\d+§f]".toPattern()

private var inInventory = false
private var highlightedItems = emptyList<Int>()

@SubscribeEvent
fun onInventoryOpen(event: InventoryFullyOpenedEvent) {
inInventory = false
if (!isEnabled()) return

if (event.inventoryName != "Island NPCs") return

val highlightedItems = mutableListOf<Int>()
for ((slot, stack) in event.inventoryItems) {
if (isPlaceableNpc(stack.getLore())) {
highlightedItems.add(slot)
}
}
inInventory = true
this.highlightedItems = highlightedItems
}

@SubscribeEvent
fun onInventoryClose(event: InventoryCloseEvent) {
inInventory = false
highlightedItems = emptyList()
}

@SubscribeEvent(priority = EventPriority.LOW)
fun onBackgroundDrawn(event: GuiContainerEvent.BackgroundDrawnEvent) {
if (!isEnabled() || !inInventory) return
for (slot in InventoryUtils.getItemsInOpenChest()) {
if (slot.slotIndex in highlightedItems) {
slot highlight LorenzColor.GREEN
}
}
}

private fun isPlaceableNpc(lore: List<String>): Boolean {
// Checking if NPC & placeable
if (lore.isEmpty() || !(lore.last() == "§ethis NPC!" || lore.last() == "§eyour location!")) {
return false
}

// Checking if is already placed
for (line in lore) {
if (locationPattern.matcher(line).matches()) return false
}
return true
}

private fun isEnabled() = LorenzUtils.inSkyBlock && config
}
Loading