mirror of
https://gitlab.com/2009scape/rt4-client.git
synced 2025-12-20 21:40:30 -07:00
Faster loading XP Widgets, file loading heleprs and XP widget resetting
This commit is contained in:
parent
7f09263209
commit
7cc56d0e53
5 changed files with 255 additions and 99 deletions
|
|
@ -34,27 +34,25 @@ object XPTrackerView {
|
|||
val initialXP: MutableMap<Int, Int> = HashMap()
|
||||
var xpTrackerView: JPanel? = null
|
||||
const val VIEW_NAME = "XP_TRACKER_VIEW"
|
||||
private val skillIconCache: MutableMap<Int, java.awt.image.BufferedImage> = HashMap()
|
||||
|
||||
|
||||
val npcHitpointsMap: Map<Int, Int> = try {
|
||||
BufferedReader(InputStreamReader(plugin::class.java.getResourceAsStream("res/npc_hitpoints_map.json"), StandardCharsets.UTF_8))
|
||||
.useLines { lines ->
|
||||
val json = lines.joinToString("\n")
|
||||
val pairs = json.trim().removeSurrounding("{", "}").split(",")
|
||||
val map = mutableMapOf<Int, Int>()
|
||||
val json = Helpers.readResourceText("res/npc_hitpoints_map.json") ?: "{}"
|
||||
val pairs = json.trim().removeSurrounding("{", "}").split(",")
|
||||
val map = mutableMapOf<Int, Int>()
|
||||
|
||||
for (pair in pairs) {
|
||||
val keyValue = pair.split(":")
|
||||
val id = keyValue[0].trim().trim('\"').toIntOrNull()
|
||||
val hitpoints = keyValue[1].trim()
|
||||
for (pair in pairs) {
|
||||
val keyValue = pair.split(":")
|
||||
val id = keyValue[0].trim().trim('\"').toIntOrNull()
|
||||
val hitpoints = keyValue[1].trim()
|
||||
|
||||
if (id != null && hitpoints.isNotEmpty()) {
|
||||
map[id] = hitpoints.toIntOrNull() ?: 0
|
||||
}
|
||||
}
|
||||
|
||||
map
|
||||
if (id != null && hitpoints.isNotEmpty()) {
|
||||
map[id] = hitpoints.toIntOrNull() ?: 0
|
||||
}
|
||||
}
|
||||
|
||||
map
|
||||
} catch (e: Exception) {
|
||||
println("XPTracker Error parsing NPC HP: ${e.message}")
|
||||
emptyMap()
|
||||
|
|
@ -267,6 +265,18 @@ object XPTrackerView {
|
|||
widgetViewPanel.add(Box.createVerticalStrut(5))
|
||||
|
||||
xpTrackerView = widgetViewPanel
|
||||
|
||||
// Preload skill icons to avoid first-drop lag
|
||||
try {
|
||||
for (i in 0 until 24) {
|
||||
if (!skillIconCache.containsKey(i)) {
|
||||
val img = getBufferedImageFromSprite(API.GetSprite(getSpriteId(i)))
|
||||
skillIconCache[i] = img
|
||||
}
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
// Ignore preload errors; fallback at use time
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -293,6 +303,61 @@ object XPTrackerView {
|
|||
return popupMenu
|
||||
}
|
||||
|
||||
fun removeXPWidgetMenu(toRemove: Container, skillId: Int): JPopupMenu {
|
||||
val popupMenu = JPopupMenu()
|
||||
val rFont = Font("RuneScape Small", Font.TRUETYPE_FONT, 16)
|
||||
popupMenu.background = POPUP_BACKGROUND
|
||||
|
||||
val resetItem = JMenuItem("Reset").apply {
|
||||
font = rFont
|
||||
background = POPUP_BACKGROUND
|
||||
foreground = POPUP_FOREGROUND
|
||||
}
|
||||
popupMenu.add(resetItem)
|
||||
|
||||
val removeItem = JMenuItem("Remove").apply {
|
||||
font = rFont
|
||||
background = POPUP_BACKGROUND
|
||||
foreground = POPUP_FOREGROUND
|
||||
}
|
||||
popupMenu.add(removeItem)
|
||||
|
||||
resetItem.addActionListener {
|
||||
xpWidgets[skillId]?.let { widget ->
|
||||
// Baseline at current XP and clear per-widget counters
|
||||
initialXP[skillId] = widget.previousXp
|
||||
widget.totalXpGained = 0
|
||||
widget.startTime = System.currentTimeMillis()
|
||||
|
||||
// Recompute labels/progress for current XP without adding totals
|
||||
updateWidget(widget, widget.previousXp)
|
||||
}
|
||||
}
|
||||
|
||||
removeItem.addActionListener {
|
||||
// Reset the per-skill baseline to the current XP so next widget starts fresh
|
||||
xpWidgets[skillId]?.let { widget ->
|
||||
initialXP[skillId] = widget.previousXp
|
||||
}
|
||||
// Remove widget container and following spacer if present
|
||||
xpTrackerView?.let { parent ->
|
||||
val components = parent.components
|
||||
val toRemoveIndex = components.indexOf(toRemove)
|
||||
if (toRemoveIndex >= 0 && toRemoveIndex < components.size - 1) {
|
||||
val nextComponent = components[toRemoveIndex + 1]
|
||||
if (nextComponent is Box.Filler) {
|
||||
parent.remove(nextComponent)
|
||||
}
|
||||
}
|
||||
parent.remove(toRemove)
|
||||
xpWidgets.remove(skillId)
|
||||
parent.revalidate()
|
||||
if (focusedView == VIEW_NAME) parent.repaint()
|
||||
}
|
||||
}
|
||||
return popupMenu
|
||||
}
|
||||
|
||||
|
||||
fun createXPWidget(skillId: Int, previousXp: Int): XPWidget {
|
||||
val widgetPanel = Panel().apply {
|
||||
|
|
@ -303,7 +368,12 @@ object XPTrackerView {
|
|||
minimumSize = WIDGET_SIZE
|
||||
}
|
||||
|
||||
val bufferedImageSprite = getBufferedImageFromSprite(API.GetSprite(getSpriteId(skillId)))
|
||||
val bufferedImageSprite = skillIconCache[skillId]
|
||||
?: run {
|
||||
val img = getBufferedImageFromSprite(API.GetSprite(getSpriteId(skillId)))
|
||||
skillIconCache[skillId] = img
|
||||
img
|
||||
}
|
||||
val imageContainer = Panel(FlowLayout()).apply {
|
||||
background = WIDGET_COLOR
|
||||
preferredSize = IMAGE_SIZE
|
||||
|
|
@ -441,4 +511,4 @@ data class XPWidget(
|
|||
var totalXpGained: Int = 0,
|
||||
var startTime: Long = System.currentTimeMillis(),
|
||||
var previousXp: Int = 0
|
||||
)
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue