From df231d1ff98ef53412db55efc016c29fc096b549 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 16 Sep 2021 12:55:04 -0400 Subject: [PATCH 1/3] xtea: skip unknown map regions The client will include keys 0,0,0,0 for unknown map regions, which should just be skipped over instead of failing the entire request --- .../runelite/http/service/xtea/XteaEntry.java | 75 +------------------ .../http/service/xtea/XteaService.java | 36 +++++---- 2 files changed, 26 insertions(+), 85 deletions(-) diff --git a/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java b/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java index e1e86d0bf7..c5e60b1119 100644 --- a/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java +++ b/http-service/src/main/java/net/runelite/http/service/xtea/XteaEntry.java @@ -25,8 +25,10 @@ package net.runelite.http.service.xtea; import java.time.Instant; +import lombok.Data; -public class XteaEntry +@Data +class XteaEntry { private int region; private Instant time; @@ -35,75 +37,4 @@ public class XteaEntry private int key2; private int key3; private int key4; - - public int getRegion() - { - return region; - } - - public void setRegion(int region) - { - this.region = region; - } - - public Instant getTime() - { - return time; - } - - public void setTime(Instant time) - { - this.time = time; - } - - public int getRev() - { - return rev; - } - - public void setRev(int rev) - { - this.rev = rev; - } - - public int getKey1() - { - return key1; - } - - public void setKey1(int key1) - { - this.key1 = key1; - } - - public int getKey2() - { - return key2; - } - - public void setKey2(int key2) - { - this.key2 = key2; - } - - public int getKey3() - { - return key3; - } - - public void setKey3(int key3) - { - this.key3 = key3; - } - - public int getKey4() - { - return key4; - } - - public void setKey4(int key4) - { - this.key4 = key4; - } - } diff --git a/http-service/src/main/java/net/runelite/http/service/xtea/XteaService.java b/http-service/src/main/java/net/runelite/http/service/xtea/XteaService.java index 61650b4e51..8a5d651b05 100644 --- a/http-service/src/main/java/net/runelite/http/service/xtea/XteaService.java +++ b/http-service/src/main/java/net/runelite/http/service/xtea/XteaService.java @@ -28,6 +28,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.io.IOException; import java.util.List; +import lombok.extern.slf4j.Slf4j; import net.runelite.cache.IndexType; import net.runelite.cache.fs.Container; import net.runelite.cache.util.Djb2; @@ -45,6 +46,7 @@ import org.sql2o.Query; import org.sql2o.Sql2o; @Service +@Slf4j public class XteaService { private static final String CREATE_SQL = "CREATE TABLE IF NOT EXISTS `xtea` (\n" @@ -101,6 +103,11 @@ public class XteaService int region = key.getRegion(); int[] keys = key.getKeys(); + if (keys.length != 4) + { + throw new IllegalArgumentException("Key length must be 4"); + } + XteaCache xteaCache = keyCache.getIfPresent(region); if (xteaCache == null || xteaCache.getKey1() != keys[0] @@ -136,11 +143,6 @@ public class XteaService XteaEntry xteaEntry = findLatestXtea(con, region); - if (keys.length != 4) - { - throw new IllegalArgumentException("Key length must be 4"); - } - // already have these? if (xteaEntry != null && xteaEntry.getKey1() == keys[0] @@ -151,7 +153,14 @@ public class XteaService continue; } - if (!checkKeys(cache, region, keys)) + ArchiveEntry archiveEntry = archiveForRegion(cache, region); + if (archiveEntry == null) + { + // the client sends 0,0,0,0 for non-existent regions, just ignore them + continue; + } + + if (!checkKeys(archiveEntry, keys)) { continue; } @@ -169,6 +178,8 @@ public class XteaService .addParameter("key3", keys[2]) .addParameter("key4", keys[3]) .addToBatch(); + + log.debug("Inserted keys for {}: {}, {}, {}, {}", region, keys[0], keys[1], keys[2], keys[3]); } if (query != null) @@ -202,7 +213,7 @@ public class XteaService } } - private boolean checkKeys(CacheEntry cache, int regionId, int[] keys) + private ArchiveEntry archiveForRegion(CacheEntry cache, int regionId) { int x = regionId >>> 8; int y = regionId & 0xFF; @@ -215,16 +226,15 @@ public class XteaService .toString(); int archiveNameHash = Djb2.hash(archiveName); - ArchiveEntry archiveEntry = cacheService.findArchiveForTypeAndName(cache, IndexType.MAPS, archiveNameHash); - if (archiveEntry == null) - { - throw new InternalServerErrorException("Unable to find archive for region"); - } + return cacheService.findArchiveForTypeAndName(cache, IndexType.MAPS, archiveNameHash); + } + private boolean checkKeys(ArchiveEntry archiveEntry, int[] keys) + { byte[] data = cacheService.getArchive(archiveEntry); if (data == null) { - throw new InternalServerErrorException("Unable to get archive data"); + throw new InternalServerErrorException("Unable to get archive data for archive " + archiveEntry.getArchiveId()); } try From 3c009c8f54791a4dafeee1dbefc665962835d396 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 14 Sep 2021 23:40:31 -0700 Subject: [PATCH 2/3] status bars: Fix left bar Y offset Due to an apparent typo, the wrong value was being referenced for the left bar's Y offset specifically for the resizable viewport with bottom line interfaces. This commit fixes this reference and the associated value. --- .../runelite/client/plugins/statusbars/StatusBarsOverlay.java | 2 +- .../java/net/runelite/client/plugins/statusbars/Viewport.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java index c406bf0d1f..4ef453d4e7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java @@ -251,7 +251,7 @@ class StatusBarsOverlay extends Overlay { height = RESIZED_BOTTOM_HEIGHT; offsetLeftBarX = (location.getX() + RESIZED_BOTTOM_OFFSET_X - offsetLeft.getX()); - offsetLeftBarY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetRight.getY()); + offsetLeftBarY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetLeft.getY()); offsetRightBarX = (location.getX() + RESIZED_BOTTOM_OFFSET_X - offsetRight.getX()); offsetRightBarY = (location.getY() - RESIZED_BOTTOM_OFFSET_Y - offsetRight.getY()); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java index 8b32eb6723..e681645e69 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/Viewport.java @@ -36,7 +36,7 @@ enum Viewport RESIZED_BOX(WidgetInfo.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX, WidgetInfo.RESIZABLE_VIEWPORT_INTERFACE_CONTAINER, new Point(20, -4), new Point(0, -4)), RESIZED_BOTTOM(WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INTERFACE_CONTAINER, - new Point(61, 8), new Point(35, -12)), + new Point(61, -12), new Point(35, -12)), FIXED(WidgetInfo.FIXED_VIEWPORT, WidgetInfo.FIXED_VIEWPORT_INTERFACE_CONTAINER, new Point(20, -4), new Point(0, -4)), FIXED_BANK(WidgetInfo.BANK_CONTAINER, WidgetInfo.BANK_INVENTORY_ITEMS_CONTAINER, From 847c44c44c3fd012073e548b8ad468c1242ab047 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 16 Sep 2021 15:03:00 -0700 Subject: [PATCH 3/3] status bars: Clean up rendering code --- .../plugins/statusbars/BarRenderer.java | 48 +++++++++---------- .../plugins/statusbars/StatusBarsOverlay.java | 16 +++---- 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/BarRenderer.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/BarRenderer.java index 03cc2f326c..84c9c8ab44 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/BarRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/BarRenderer.java @@ -39,15 +39,10 @@ class BarRenderer { private static final Color BACKGROUND = new Color(0, 0, 0, 150); private static final Color OVERHEAL_COLOR = new Color(216, 255, 139, 150); - private static final int OVERHEAL_OFFSET = 2; - private static final int HEAL_OFFSET = 3; - private static final int ICON_AND_COUNTER_OFFSET_X = -4; - private static final int ICON_AND_COUNTER_OFFSET_Y = 25; private static final int SKILL_ICON_HEIGHT = 35; private static final int COUNTER_ICON_HEIGHT = 18; - private static final int OFFSET = 2; private static final int WIDTH = 20; - private static final int PADDING = 1; + private static final int BORDER_SIZE = 1; private final Supplier maxValueSupplier; private final Supplier currentValueSupplier; private final Supplier healSupplier; @@ -80,14 +75,14 @@ class BarRenderer refreshSkills(); graphics.setColor(BACKGROUND); - graphics.drawRect(x, y, WIDTH - PADDING, height - PADDING); + graphics.drawRect(x, y, WIDTH - BORDER_SIZE, height - BORDER_SIZE); graphics.fillRect(x, y, WIDTH, height); graphics.setColor(fill); - graphics.fillRect(x + PADDING, - y + PADDING + (height - filledHeight), - WIDTH - PADDING * OFFSET, - filledHeight - PADDING * OFFSET); + graphics.fillRect(x + BORDER_SIZE, + y + BORDER_SIZE + (height - filledHeight), + WIDTH - BORDER_SIZE * 2, + filledHeight - BORDER_SIZE * 2); if (config.enableRestorationBars()) { @@ -107,7 +102,8 @@ class BarRenderer if (skillIconEnabled) { final Image icon = iconSupplier.get(); - graphics.drawImage(icon, x + ICON_AND_COUNTER_OFFSET_X + PADDING, y + ICON_AND_COUNTER_OFFSET_Y - icon.getWidth(null), null); + final int xDraw = x + (WIDTH / 2) - (icon.getWidth(null) / 2); + graphics.drawImage(icon, xDraw, y, null); } if (config.enableCounter()) @@ -115,12 +111,12 @@ class BarRenderer graphics.setFont(FontManager.getRunescapeSmallFont()); final String counterText = Integer.toString(currentValue); final int widthOfCounter = graphics.getFontMetrics().stringWidth(counterText); - final int centerText = (WIDTH - PADDING) / 2 - (widthOfCounter / 2); + final int centerText = (WIDTH / 2) - (widthOfCounter / 2); final int yOffset = skillIconEnabled ? SKILL_ICON_HEIGHT : COUNTER_ICON_HEIGHT; final TextComponent textComponent = new TextComponent(); textComponent.setText(counterText); - textComponent.setPosition(new Point(x + centerText + PADDING, y + yOffset)); + textComponent.setPosition(new Point(x + centerText, y + yOffset)); textComponent.render(graphics); } } @@ -136,26 +132,26 @@ class BarRenderer } final int filledCurrentHeight = getBarHeight(maxValue, currentValue, height); - int filledHeight = getBarHeight(maxValue, heal, height); + final int filledHealHeight = getBarHeight(maxValue, heal, height); + final int fillY, fillHeight; graphics.setColor(color); - if (filledHeight + filledCurrentHeight > height) + if (filledHealHeight + filledCurrentHeight > height) { - final int overHeal = filledHeight + filledCurrentHeight - height; - filledHeight = filledHeight - overHeal + OVERHEAL_OFFSET; graphics.setColor(OVERHEAL_COLOR); - graphics.fillRect(x + PADDING, - y - filledCurrentHeight + (height - filledHeight) + HEAL_OFFSET, - WIDTH - PADDING * OVERHEAL_OFFSET, - filledHeight - PADDING * OVERHEAL_OFFSET); + fillY = y + BORDER_SIZE; + fillHeight = height - filledCurrentHeight - BORDER_SIZE; } else { - graphics.fillRect(x + PADDING, - y - OVERHEAL_OFFSET - filledCurrentHeight + (height - filledHeight) + HEAL_OFFSET, - WIDTH - PADDING * OVERHEAL_OFFSET, - filledHeight + OVERHEAL_OFFSET - PADDING * OVERHEAL_OFFSET); + fillY = y + BORDER_SIZE + height - (filledCurrentHeight + filledHealHeight); + fillHeight = filledHealHeight; } + + graphics.fillRect(x + BORDER_SIZE, + fillY, + WIDTH - BORDER_SIZE * 2, + fillHeight); } private static int getBarHeight(int base, int current, int size) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java index 4ef453d4e7..b08a1d5331 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java @@ -73,7 +73,7 @@ class StatusBarsOverlay extends Overlay private static final int HEIGHT = 252; private static final int RESIZED_BOTTOM_HEIGHT = 272; private static final int IMAGE_SIZE = 17; - private static final int ICON_DIMENSIONS = 26; + private static final Dimension ICON_DIMENSIONS = new Dimension(26, 25); private static final int RESIZED_BOTTOM_OFFSET_Y = 12; private static final int RESIZED_BOTTOM_OFFSET_X = 10; private static final int MAX_SPECIAL_ATTACK_VALUE = 100; @@ -105,7 +105,7 @@ class StatusBarsOverlay extends Overlay this.itemStatService = itemstatservice; this.spriteManager = spriteManager; - prayerIcon = ImageUtil.resizeCanvas(ImageUtil.resizeImage(skillIconManager.getSkillImage(Skill.PRAYER, true), IMAGE_SIZE, IMAGE_SIZE), ICON_DIMENSIONS, ICON_DIMENSIONS); + prayerIcon = ImageUtil.resizeCanvas(ImageUtil.resizeImage(skillIconManager.getSkillImage(Skill.PRAYER, true), IMAGE_SIZE, IMAGE_SIZE), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); initRenderers(); } @@ -317,11 +317,11 @@ class StatusBarsOverlay extends Overlay return; } - heartIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_HITPOINTS_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartDisease = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.DISEASE_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartPoison = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.POISON_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartVenom = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.VENOM_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); - energyIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_WALK_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); - specialIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_SPECIAL_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); + heartIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_HITPOINTS_ICON, 0)), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + heartDisease = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.DISEASE_HEART), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + heartPoison = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.POISON_HEART), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + heartVenom = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.VENOM_HEART), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + energyIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_WALK_ICON, 0)), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); + specialIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_SPECIAL_ICON, 0)), ICON_DIMENSIONS.width, ICON_DIMENSIONS.height); } }