aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhannibal2 <24389977+hannibal00212@users.noreply.github.com>2023-01-21 08:26:38 +0100
committerhannibal2 <24389977+hannibal00212@users.noreply.github.com>2023-01-21 08:26:38 +0100
commit9360f10e193b4bc3d634cc853e7cfd82d5ff5b76 (patch)
tree3c500a54d1aeed214798d86123f41efb5388f017
parenta66db31bd1388d411365debf2914aa686c40dae0 (diff)
downloadskyhanni-9360f10e193b4bc3d634cc853e7cfd82d5ff5b76.tar.gz
skyhanni-9360f10e193b4bc3d634cc853e7cfd82d5ff5b76.tar.bz2
skyhanni-9360f10e193b4bc3d634cc853e7cfd82d5ff5b76.zip
Add locations for reputation quests, mini bosses and kuudra fight.
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Misc.java33
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt47
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt10
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt19
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/QuestLoader.kt32
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt10
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt6
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/KuudraQuest.kt1
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/MiniBossQuest.kt9
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt5
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt3
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt6
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt4
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt34
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt94
17 files changed, 293 insertions, 34 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java b/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java
index 4ddfc0b01..2667337af 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java
@@ -121,6 +121,29 @@ public class Misc {
public Position nonGodPotEffectPos = new Position(10, 10, false, true);
@Expose
+ @ConfigOption(name = "Crimson Reputation Helper", desc = "")
+ @ConfigEditorAccordion(id = 6)
+ public boolean reputationHelper = false;
+
+ @Expose
+ @ConfigOption(name = "Crimson Isle Reputation", desc = "Enable features around Reputation features in the Crimson Isle.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 6)
+ public boolean crimsonIsleReputationHelper = true;
+
+ @Expose
+ @ConfigOption(name = "Reputation Position", desc = "")
+ @ConfigEditorButton(runnableId = "crimsonIsleReputationHelper", buttonText = "Edit")
+ @ConfigAccordionId(id = 6)
+ public Position crimsonIsleReputationHelperPos = new Position(10, 10, false, true);
+
+ @Expose
+ @ConfigOption(name = "Reputation Locations", desc = "Show locations to the points where to do stuff in the Crimson Isle to get reputation.")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 6)
+ public boolean crimsonIsleReputationLocation = true;
+
+ @Expose
@ConfigOption(name = "Exp Bottles", desc = "Hides all the experience bottles lying on the ground.")
@ConfigEditorBoolean
public boolean hideExpBottles = false;
@@ -141,16 +164,6 @@ public class Misc {
public boolean brewingStandOverlay = true;
@Expose
- @ConfigOption(name = "Crimson Isle Reputation", desc = "Enable features around Reputation features in the Crimson Isle")
- @ConfigEditorBoolean
- public boolean crimsonIsleReputationHelper = true;
-
- @Expose
- @ConfigOption(name = "Reputation Position", desc = "")
- @ConfigEditorButton(runnableId = "crimsonIsleReputationHelper", buttonText = "Edit")
- public Position crimsonIsleReputationHelperPos = new Position(10, 10, false, true);
-
- @Expose
@ConfigOption(name = "Config Button", desc = "Add a button to the pause menu to configure SkyHanni.")
@ConfigEditorBoolean
public boolean configButtonOnPause = true;
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt
index 169603784..73fbac7dd 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/DailyKuudraBossHelper.kt
@@ -6,8 +6,13 @@ import at.hannibal2.skyhanni.data.IslandType
import at.hannibal2.skyhanni.data.ScoreboardData
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.features.nether.reputationhelper.CrimsonIsleReputationHelper
+import at.hannibal2.skyhanni.test.GriffinUtils.drawWaypointFilled
+import at.hannibal2.skyhanni.utils.LorenzColor
import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.NEUItems
+import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText
+import net.minecraftforge.client.event.RenderWorldLastEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import java.util.*
import java.util.regex.Pattern
@@ -16,6 +21,9 @@ class DailyKuudraBossHelper(private val reputationHelper: CrimsonIsleReputationH
val kuudraTiers = mutableListOf<KuudraTier>()
private val pattern = Pattern.compile(" Kuudra's Hollow \\(T(.*)\\)")
+ private var kuudraLocation: LorenzVec? = null
+ private var allKuudraDone = true
+
fun init() {
val repoData = reputationHelper.repoData
val jsonElement = repoData["KUUDRA"]
@@ -23,12 +31,40 @@ class DailyKuudraBossHelper(private val reputationHelper: CrimsonIsleReputationH
for ((displayName, extraData) in jsonElement.asJsonObject.entrySet()) {
val data = extraData.asJsonObject
val displayItem = data["item"]?.asString
- kuudraTiers.add(KuudraTier(displayName, displayItem, tier))
+
+ val locationData = data["location"]?.asJsonArray
+ val location: LorenzVec? = if (locationData == null || locationData.size() == 0) {
+ null
+ } else {
+ val x = locationData[0].asDouble
+ val y = locationData[1].asDouble
+ val z = locationData[2].asDouble
+ LorenzVec(x, y, z)
+ }
+ kuudraTiers.add(KuudraTier(displayName, displayItem, location, tier))
+ if (location != null) {
+ kuudraLocation = location
+ }
+
tier++
}
}
@SubscribeEvent
+ fun onRenderWorld(event: RenderWorldLastEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (LorenzUtils.skyBlockIsland != IslandType.CRIMSON_ISLE) return
+ if (!SkyHanniMod.feature.misc.crimsonIsleReputationHelper) return
+ if (!SkyHanniMod.feature.misc.crimsonIsleReputationLocation) return
+ if (allKuudraDone) return
+
+ kuudraLocation?.let {
+ event.drawWaypointFilled(it, LorenzColor.WHITE.toColor())
+ event.drawDynamicText(it, "Kuudra", 1.5)
+ }
+ }
+
+ @SubscribeEvent
fun onChat(event: LorenzChatEvent) {
if (!HyPixelData.skyBlock) return
if (LorenzUtils.skyBlockIsland != IslandType.KUUDRA_ARENA) return
@@ -52,6 +88,7 @@ class DailyKuudraBossHelper(private val reputationHelper: CrimsonIsleReputationH
LorenzUtils.debug("Detected kuudra tier done: $kuudraTier")
reputationHelper.questHelper.finishKuudra(kuudraTier)
kuudraTier.doneToday = true
+ updateAllKuudraDone()
reputationHelper.update()
}
@@ -81,6 +118,7 @@ class DailyKuudraBossHelper(private val reputationHelper: CrimsonIsleReputationH
for (miniBoss in kuudraTiers) {
miniBoss.doneToday = false
}
+ updateAllKuudraDone()
}
fun saveConfig() {
@@ -91,9 +129,16 @@ class DailyKuudraBossHelper(private val reputationHelper: CrimsonIsleReputationH
}
fun loadConfig() {
+ println("loadConfig")
for (name in SkyHanniMod.feature.hidden.crimsonIsleKuudraTiersDone) {
getByDisplayName(name)!!.doneToday = true
}
+ updateAllKuudraDone()
+ }
+
+ private fun updateAllKuudraDone() {
+ allKuudraDone = !kuudraTiers.any { !it.doneToday }
+ println("allKuudraDone: $allKuudraDone")
}
private fun getByDisplayName(name: String) = kuudraTiers.firstOrNull { it.name == name }
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt
index f938ab1fd..15d0086b8 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailykuudra/KuudraTier.kt
@@ -1,5 +1,13 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.dailykuudra
-class KuudraTier(val name: String, val displayItem: String?, val tierNumber: Int, var doneToday: Boolean = false) {
+import at.hannibal2.skyhanni.utils.LorenzVec
+
+class KuudraTier(
+ val name: String,
+ val displayItem: String?,
+ val location: LorenzVec?,
+ val tierNumber: Int,
+ var doneToday: Boolean = false
+) {
fun getDisplayName() = "Tier $tierNumber ($name)"
} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt
index 7400b4347..3a72c2f68 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/DailyQuestHelper.kt
@@ -10,16 +10,19 @@ import at.hannibal2.skyhanni.features.nether.reputationhelper.CrimsonIsleReputat
import at.hannibal2.skyhanni.features.nether.reputationhelper.dailykuudra.KuudraTier
import at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest.*
import at.hannibal2.skyhanni.features.nether.reputationhelper.miniboss.CrimsonMiniBoss
+import at.hannibal2.skyhanni.test.GriffinUtils.drawWaypointFilled
import at.hannibal2.skyhanni.utils.InventoryUtils.getInventoryName
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.ItemUtils.name
import at.hannibal2.skyhanni.utils.LorenzColor
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NEUItems
+import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText
import at.hannibal2.skyhanni.utils.RenderUtils.highlight
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.inventory.GuiChest
import net.minecraft.inventory.ContainerChest
+import net.minecraftforge.client.event.RenderWorldLastEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
import java.util.*
@@ -203,6 +206,22 @@ class DailyQuestHelper(val reputationHelper: CrimsonIsleReputationHelper) {
update()
}
+ @SubscribeEvent
+ fun onRenderWorld(event: RenderWorldLastEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (LorenzUtils.skyBlockIsland != IslandType.CRIMSON_ISLE) return
+ if (!SkyHanniMod.feature.misc.crimsonIsleReputationHelper) return
+ if (!SkyHanniMod.feature.misc.crimsonIsleReputationLocation) return
+
+ for (quest in quests) {
+ if (quest.state == QuestState.ACCEPTED) {
+ val location = quest.location ?: continue
+ event.drawWaypointFilled(location, LorenzColor.WHITE.toColor())
+ event.drawDynamicText(location, quest.displayName, 1.5)
+ }
+ }
+ }
+
fun render(display: MutableList<List<Any>>) {
val done = quests.count { it.state == QuestState.COLLECTED }
display.add(Collections.singletonList(""))
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/QuestLoader.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/QuestLoader.kt
index 61a1c4d77..d48d28fd3 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/QuestLoader.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/QuestLoader.kt
@@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest.*
import at.hannibal2.skyhanni.utils.InventoryUtils.getInventoryName
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.TabListUtils
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.inventory.GuiChest
@@ -85,19 +86,28 @@ class QuestLoader(val dailyQuestHelper: DailyQuestHelper) {
for ((entryName, extraData) in category.entrySet()) {
val data = extraData.asJsonObject
val displayItem = data["item"]?.asString
+ val locationData = data["location"]?.asJsonArray
+ val location: LorenzVec? = if (locationData == null || locationData.size() == 0) {
+ null
+ } else {
+ val x = locationData[0].asDouble
+ val y = locationData[1].asDouble
+ val z = locationData[2].asDouble
+ LorenzVec(x, y, z)
+ }
if (name.startsWith("$entryName Rank ")) {
val split = name.split(" Rank ")
val dojoName = split[0]
val dojoRankGoal = split[1]
- return DojoQuest(dojoName,displayItem, dojoRankGoal, state)
+ return DojoQuest(dojoName, location, displayItem, dojoRankGoal, state)
}
if (name == entryName) {
when (categoryName) {
- "FISHING" -> return TrophyFishQuest(name, displayItem, state, needAmount)
- "RESCUE" -> return RescueMissionQuest(displayItem, state)
- "FETCH" -> return FetchQuest(name, displayItem, state, needAmount)
+ "FISHING" -> return TrophyFishQuest(name, location, displayItem, state, needAmount)
+ "RESCUE" -> return RescueMissionQuest(displayItem, location, state)
+ "FETCH" -> return FetchQuest(name, location, displayItem, state, needAmount)
}
}
}
@@ -161,12 +171,14 @@ class QuestLoader(val dailyQuestHelper: DailyQuestHelper) {
val needAmount = split[2].toInt()
val quest = addQuest(name, state, needAmount)
if (quest is ProgressQuest) {
- try {
- val haveAmount = split[3].toInt()
- quest.haveAmount = haveAmount
- } catch (e: IndexOutOfBoundsException) {
- println("text: '$text'")
- e.printStackTrace()
+ if (split.size == 4) {
+ try {
+ val haveAmount = split[3].toInt()
+ quest.haveAmount = haveAmount
+ } catch (e: IndexOutOfBoundsException) {
+ println("text: '$text'")
+ e.printStackTrace()
+ }
}
}
dailyQuestHelper.quests.add(quest)
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt
index c8bc1a2c7..2328e963f 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/DojoQuest.kt
@@ -1,10 +1,18 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest
import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.LorenzVec
-class DojoQuest(val dojoName: String, displayItem: String?, dojoRankGoal: String, state: QuestState) :
+class DojoQuest(
+ val dojoName: String,
+ location: LorenzVec?,
+ displayItem: String?,
+ dojoRankGoal: String,
+ state: QuestState
+) :
Quest(
displayItem,
+ location,
QuestCategory.DOJO,
"$dojoName Rank $dojoRankGoal",
state,
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt
index 115cbcb32..645b09fdc 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/FetchQuest.kt
@@ -1,4 +1,6 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest
-class FetchQuest(val itemName: String, displayItem: String?, state: QuestState, needAmount: Int) :
- ProgressQuest(displayItem, QuestCategory.FETCH, itemName, state, needAmount) \ No newline at end of file
+import at.hannibal2.skyhanni.utils.LorenzVec
+
+class FetchQuest(val itemName: String, location: LorenzVec?, displayItem: String?, state: QuestState, needAmount: Int) :
+ ProgressQuest(displayItem, location, QuestCategory.FETCH, itemName, state, needAmount) \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/KuudraQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/KuudraQuest.kt
index 79085a6f1..096b46267 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/KuudraQuest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/KuudraQuest.kt
@@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.features.nether.reputationhelper.dailykuudra.Kuudra
class KuudraQuest(val kuudraTier: KuudraTier, state: QuestState) :
Quest(
kuudraTier.displayItem,
+ kuudraTier.location,
QuestCategory.KUUDRA,
"Kill Kuudra ${kuudraTier.name} Tier",
state,
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/MiniBossQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/MiniBossQuest.kt
index a36b32131..914f1e921 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/MiniBossQuest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/MiniBossQuest.kt
@@ -3,4 +3,11 @@ package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest
import at.hannibal2.skyhanni.features.nether.reputationhelper.miniboss.CrimsonMiniBoss
class MiniBossQuest(val miniBoss: CrimsonMiniBoss, state: QuestState, needAmount: Int) :
- ProgressQuest(miniBoss.displayItem, QuestCategory.MINIBOSS, miniBoss.displayName, state, needAmount) \ No newline at end of file
+ ProgressQuest(
+ miniBoss.displayItem,
+ miniBoss.location,
+ QuestCategory.MINIBOSS,
+ miniBoss.displayName,
+ state,
+ needAmount
+ ) \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt
index eac078cc0..23155eebb 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/ProgressQuest.kt
@@ -1,10 +1,13 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest
+import at.hannibal2.skyhanni.utils.LorenzVec
+
abstract class ProgressQuest(
displayItem: String?,
+ location: LorenzVec?,
questCategory: QuestCategory,
displayName: String,
state: QuestState,
val needAmount: Int,
var haveAmount: Int = 0
-) : Quest(displayItem, questCategory, displayName, state) \ No newline at end of file
+) : Quest(displayItem, location, questCategory, displayName, state) \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt
index 5a6bf3f89..230900153 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/Quest.kt
@@ -1,7 +1,10 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest
+import at.hannibal2.skyhanni.utils.LorenzVec
+
abstract class Quest(
val displayItem: String?,
+ val location: LorenzVec?,
val category: QuestCategory,
val internalName: String,
var state: QuestState,
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt
index ccc9d3c25..fbb266296 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/RescueMissionQuest.kt
@@ -1,4 +1,6 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest
-class RescueMissionQuest(displayItem: String?, state: QuestState) :
- Quest(displayItem, QuestCategory.RESCUE, "Rescue Mission", state, "Rescue the NPC") \ No newline at end of file
+import at.hannibal2.skyhanni.utils.LorenzVec
+
+class RescueMissionQuest(displayItem: String?, location: LorenzVec?, state: QuestState) :
+ Quest(displayItem, location, QuestCategory.RESCUE, "Rescue Mission", state, "Rescue the NPC") \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt
index 4a8a453c2..5b8a37a54 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/TrophyFishQuest.kt
@@ -1,4 +1,12 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest
-class TrophyFishQuest(val fishName: String, displayItem: String?, state: QuestState, needAmount: Int) :
- ProgressQuest(displayItem, QuestCategory.FISHING, fishName, state, needAmount) \ No newline at end of file
+import at.hannibal2.skyhanni.utils.LorenzVec
+
+class TrophyFishQuest(
+ val fishName: String,
+ location: LorenzVec?,
+ displayItem: String?,
+ state: QuestState,
+ needAmount: Int
+) :
+ ProgressQuest(displayItem, location, QuestCategory.FISHING, fishName, state, needAmount) \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt
index 1c1269c57..02819a28d 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/dailyquest/quest/UnknownQuest.kt
@@ -1,4 +1,4 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.dailyquest.quest
-class UnknownQuest(unknownName: String) : Quest(null, QuestCategory.UNKNOWN, unknownName, QuestState.NOT_ACCEPTED) {
-} \ No newline at end of file
+class UnknownQuest(unknownName: String) :
+ Quest(null, null, QuestCategory.UNKNOWN, unknownName, QuestState.NOT_ACCEPTED) \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt
index e2ac6ddb2..ad5255aac 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/CrimsonMiniBoss.kt
@@ -1,10 +1,12 @@
package at.hannibal2.skyhanni.features.nether.reputationhelper.miniboss
+import at.hannibal2.skyhanni.utils.LorenzVec
import java.util.regex.Pattern
class CrimsonMiniBoss(
val displayName: String,
val displayItem: String?,
+ val location: LorenzVec?,
val pattern: Pattern,
var doneToday: Boolean = false
) \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt
index e05e300d3..6cce8c68c 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/reputationhelper/miniboss/DailyMiniBossHelper.kt
@@ -5,8 +5,13 @@ import at.hannibal2.skyhanni.data.HyPixelData
import at.hannibal2.skyhanni.data.IslandType
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.features.nether.reputationhelper.CrimsonIsleReputationHelper
+import at.hannibal2.skyhanni.test.GriffinUtils.drawWaypointFilled
+import at.hannibal2.skyhanni.utils.LorenzColor
import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.NEUItems
+import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText
+import net.minecraftforge.client.event.RenderWorldLastEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import java.util.*
import java.util.regex.Pattern
@@ -22,7 +27,18 @@ class DailyMiniBossHelper(private val reputationHelper: CrimsonIsleReputationHel
val data = extraData.asJsonObject
val displayItem = data["item"]?.asString
val patterns = " *§r§6§l${displayName.uppercase()} DOWN!"
- miniBosses.add(CrimsonMiniBoss(displayName, displayItem, Pattern.compile(patterns)))
+
+ val locationData = data["location"]?.asJsonArray
+ val location: LorenzVec? = if (locationData == null || locationData.size() == 0) {
+ null
+ } else {
+ val x = locationData[0].asDouble
+ val y = locationData[1].asDouble
+ val z = locationData[2].asDouble
+ LorenzVec(x, y, z)
+ }
+
+ miniBosses.add(CrimsonMiniBoss(displayName, displayItem, location, Pattern.compile(patterns)))
}
}
@@ -40,6 +56,22 @@ class DailyMiniBossHelper(private val reputationHelper: CrimsonIsleReputationHel
}
}
+ @SubscribeEvent
+ fun onRenderWorld(event: RenderWorldLastEvent) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (LorenzUtils.skyBlockIsland != IslandType.CRIMSON_ISLE) return
+ if (!SkyHanniMod.feature.misc.crimsonIsleReputationHelper) return
+ if (!SkyHanniMod.feature.misc.crimsonIsleReputationLocation) return
+
+ for (miniBoss in miniBosses) {
+ if (!miniBoss.doneToday) {
+ val location = miniBoss.location ?: continue
+ event.drawWaypointFilled(location, LorenzColor.WHITE.toColor())
+ event.drawDynamicText(location, miniBoss.displayName, 1.5)
+ }
+ }
+ }
+
private fun finished(miniBoss: CrimsonMiniBoss) {
LorenzUtils.debug("Detected mini boss death: ${miniBoss.displayName}")
reputationHelper.questHelper.finishMiniBoss(miniBoss)
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
index a4e550f65..3796df912 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
@@ -396,6 +396,7 @@ object RenderUtils {
}
val f1 = 0.0266666688
+
val width = minecraft.fontRendererObj.getStringWidth(finalText) / 2
GlStateManager.pushMatrix()
GlStateManager.translate(x, y, z)
@@ -624,4 +625,97 @@ object RenderUtils {
factor = Math.min(1f, factor)
drawStringScaled(str, fr, x, y, shadow, colour, factor)
}
+
+ fun RenderWorldLastEvent.drawDynamicText(
+ location: LorenzVec,
+ text: String,
+ scaleMultiplier: Double,
+ yOff: Float = 0f,
+ hideTooCloseAt: Double = 4.5
+ ) {
+ val thePlayer = Minecraft.getMinecraft().thePlayer
+ val x = location.x
+ val y = location.y
+ val z = location.z
+
+ val render = Minecraft.getMinecraft().renderViewEntity
+ val renderOffsetX = render.lastTickPosX + (render.posX - render.lastTickPosX) * partialTicks
+ val renderOffsetY = render.lastTickPosY + (render.posY - render.lastTickPosY) * partialTicks
+ val renderOffsetZ = render.lastTickPosZ + (render.posZ - render.lastTickPosZ) * partialTicks
+ val eyeHeight = thePlayer.eyeHeight
+
+ val distToPlayerSq =
+ (x - renderOffsetX) * (x - renderOffsetX) + (y - (renderOffsetY + eyeHeight)) * (y - (renderOffsetY + eyeHeight)) + (z - renderOffsetZ) * (z - renderOffsetZ)
+ var distToPlayer = sqrt(distToPlayerSq)
+ //TODO this is optional maybe?
+ distToPlayer = distToPlayer.coerceAtLeast(8.0)
+
+ if (distToPlayer < hideTooCloseAt) return
+
+ val distRender = distToPlayer.coerceAtMost(50.0)
+
+ val resultX = renderOffsetX + (x + 0.5 - renderOffsetX) / (distToPlayer / distRender)
+ val resultY =
+ (renderOffsetY + eyeHeight) + (y + 20 * distToPlayer / 300 - (renderOffsetY + eyeHeight)) / (distToPlayer / distRender)
+ val resultZ = renderOffsetZ + (z + 0.5 - renderOffsetZ) / (distToPlayer / distRender)
+
+ val renderLocation = LorenzVec(resultX, resultY, resultZ)
+ var scale = distRender / 12
+ scale *= scaleMultiplier
+ render(renderLocation, "§f$text", scale, false, true, yOff)
+ }
+
+ private fun render(
+ location: LorenzVec,
+ text: String,
+ scale: Double,
+ depthTest: Boolean,
+ shadow: Boolean,
+ yOff: Float
+ ) {
+ if (!depthTest) {
+ GL11.glDisable(GL11.GL_DEPTH_TEST)
+ GL11.glDepthMask(false)
+ }
+ GlStateManager.pushMatrix()
+ GlStateManager.enableBlend()
+ GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0)
+
+ val minecraft = Minecraft.getMinecraft()
+ val fontRenderer = minecraft.fontRendererObj
+ val renderManager = minecraft.renderManager
+
+ GlStateManager.translate(
+ location.x - renderManager.viewerPosX,
+ location.y - renderManager.viewerPosY,
+ location.z - renderManager.viewerPosZ
+ )
+ GlStateManager.color(1f, 1f, 1f, 0.5f)
+ GlStateManager.rotate(-renderManager.playerViewY, 0.0f, 1.0f, 0.0f)
+ GlStateManager.rotate(renderManager.playerViewX, 1.0f, 0.0f, 0.0f)
+ GlStateManager.scale(-scale / 25, -scale / 25, scale / 25)
+ val stringWidth = fontRenderer.getStringWidth(text.removeColor())
+ if (shadow) {
+ fontRenderer.drawStringWithShadow(
+ text,
+ (-stringWidth / 2).toFloat(),
+ yOff,
+ 0
+ )
+ } else {
+ fontRenderer.drawString(
+ text,
+ -stringWidth / 2,
+ 0,
+ 0
+ )
+ }
+ GlStateManager.color(1f, 1f, 1f)
+ GlStateManager.disableBlend()
+ GlStateManager.popMatrix()
+ if (!depthTest) {
+ GL11.glEnable(GL11.GL_DEPTH_TEST)
+ GL11.glDepthMask(true)
+ }
+ }
} \ No newline at end of file