From e8bed5216315ec3d1442bf8c47ecedf70aa7294c Mon Sep 17 00:00:00 2001 From: Pyrethus Date: Fri, 26 Jan 2024 01:58:43 +0200 Subject: [PATCH] Manually adjust globe skill sprite positioning --- .../main/kotlin/XPGlobesPlugin/Constants.kt | 1 + .../main/kotlin/XPGlobesPlugin/XPSprites.kt | 40 +++++++++++++++++++ .../src/main/kotlin/XPGlobesPlugin/plugin.kt | 16 ++++---- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/plugin-playground/src/main/kotlin/XPGlobesPlugin/Constants.kt b/plugin-playground/src/main/kotlin/XPGlobesPlugin/Constants.kt index 6e53496..2a05b7c 100644 --- a/plugin-playground/src/main/kotlin/XPGlobesPlugin/Constants.kt +++ b/plugin-playground/src/main/kotlin/XPGlobesPlugin/Constants.kt @@ -2,6 +2,7 @@ package XPGlobesPlugin import java.awt.Color + object Constants { const val SKILL_COUNT = 24 const val MAX_LEVEL = 99 diff --git a/plugin-playground/src/main/kotlin/XPGlobesPlugin/XPSprites.kt b/plugin-playground/src/main/kotlin/XPGlobesPlugin/XPSprites.kt index cc3e05a..0005f2b 100644 --- a/plugin-playground/src/main/kotlin/XPGlobesPlugin/XPSprites.kt +++ b/plugin-playground/src/main/kotlin/XPGlobesPlugin/XPSprites.kt @@ -3,11 +3,51 @@ package XPGlobesPlugin import plugin.api.API import rt4.Sprite + object XPSprites { + + private val spriteOffsets: Array> = arrayOf( + Pair(1,-1), // attack + Pair(0,0), // defense + Pair(0,0), // strength + Pair(0,1), // health + Pair(0,0), // ranged + Pair(0,0), // prayer + Pair(0,-1), // magic + Pair(0,-1), // cooking + Pair(0,0), // woodcutting + Pair(1,0), // fletching + Pair(3,0), // fishing + Pair(0,-1), // fire-making + Pair(1,0), // crafting + Pair(1,0), // smithing + Pair(2,-1), // mining + Pair(0,1), // herblore + Pair(2,0), // agility + Pair(0,0), // thieving + Pair(-1,0), // slayer + Pair(0,0), // farming + Pair(0,0), // runecrafting + Pair(0,0), // hunter + Pair(1,-1), // construction + Pair(2,-1), // summoning + ) + + fun getSpriteForSkill(skillId: Int) : Sprite? { return API.GetSprite(getSpriteId(skillId)) } + + fun getSpriteOffsetForSkill(skillId: Int) : Pair { + if (skillId < 0 || skillId >= Constants.SKILL_COUNT) { + return Pair(0,0) + } + + return spriteOffsets[skillId]; + } + + private fun getSpriteId(skillId: Int) : Int { return when (skillId) { 0 -> 197 diff --git a/plugin-playground/src/main/kotlin/XPGlobesPlugin/plugin.kt b/plugin-playground/src/main/kotlin/XPGlobesPlugin/plugin.kt index 8c99b7e..144f2a0 100644 --- a/plugin-playground/src/main/kotlin/XPGlobesPlugin/plugin.kt +++ b/plugin-playground/src/main/kotlin/XPGlobesPlugin/plugin.kt @@ -18,7 +18,7 @@ import java.awt.image.BufferedImage class plugin : Plugin() { - private var xpGlobes = Array(Constants.SKILL_COUNT) { skillId -> XPGlobe(skillId, Constants.INVALID_XP, Constants.INVALID_XP, 0L, null) } + private var xpGlobes = Array(Constants.SKILL_COUNT) { skillId -> XPGlobe(skillId, Constants.INVALID_XP, 0L, null) } private var lastGain = 0L private var backgroundSprite: Sprite? = null private var borderSprite: Sprite? = null @@ -49,6 +49,7 @@ class plugin : Plugin() { activeGlobes.add(xpGlobe) // alive } } + val maxGlobes = if (API.GetWindowMode() == WindowMode.FIXED) Constants.MAX_GLOBES_SD else Constants.MAX_GLOBES val globeCount = if (activeGlobes.size > maxGlobes) maxGlobes else activeGlobes.size val (backgroundSize, globeBorder, xpBorder) = getGlobeDimensions() @@ -67,7 +68,6 @@ class plugin : Plugin() { override fun OnXPUpdate(skillId: Int, xp: Int) { if (xpGlobes[skillId].xp == Constants.INVALID_XP) { xpGlobes[skillId].xp = xp - xpGlobes[skillId].prevXp = xp return } @@ -77,14 +77,12 @@ class plugin : Plugin() { val prevXp = xpGlobes[skillId].xp xpGlobes[skillId].xp = xp - xpGlobes[skillId].prevXp = prevXp xpGlobes[skillId].timestamp = 0L val (prevLevel, _) = XPTable.getLevelForXp(prevXp) val (level, gainedXp) = XPTable.getLevelForXp(xp) // we do not draw XP globes for level >= MAX_LEVEL if (level != Constants.INVALID_LEVEL && level < Constants.MAX_LEVEL) { - var arcWeight = 1.0 var arcColor = Constants.GLOBE_XP_ARC_LEVEL_UP_COLOR @@ -114,11 +112,11 @@ class plugin : Plugin() { override fun OnLogout() { lastGain = 0L - xpGlobes = Array(Constants.SKILL_COUNT) { skillId -> XPGlobe(skillId, Constants.INVALID_XP, Constants.INVALID_XP, 0L, null) } + xpGlobes = Array(Constants.SKILL_COUNT) { skillId -> XPGlobe(skillId, Constants.INVALID_XP, 0L, null) } } - data class XPGlobe(val skillId: Int, var prevXp: Int, var xp: Int, var timestamp: Long, var arcSprite: Sprite?) + data class XPGlobe(val skillId: Int, var xp: Int, var timestamp: Long, var arcSprite: Sprite?) private fun getGlobeDimensions() : Triple { @@ -150,7 +148,11 @@ class plugin : Plugin() { val drawX = posX + totalBorder + xOffset val drawY = posY + totalBorder + yOffset - skillSprite?.render(drawX, drawY) + // even if the centering logic is correct, the sprite seems not to be well-centered inside the + // graphic resource. Manually adjust... + val (spriteXOffset, spriteYOffset) = XPSprites.getSpriteOffsetForSkill(globe.skillId) + + skillSprite?.render(drawX + spriteXOffset, drawY + spriteYOffset) }