From c97f7b196e81d2dc1b1b4f367ea4f43eb462e762 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Wed, 17 Jun 2020 04:44:23 +0200 Subject: [PATCH] playermanager: Ensure no duplicate hiscore lookups are performed (and cleanup) (#2690) * playermanager: Make sure no duplicate hiscore lookups are done * playermanager: cleanup --- .../runelite/client/game/PlayerContainer.java | 1 + .../runelite/client/game/PlayerManager.java | 87 +++++++++---------- 2 files changed, 41 insertions(+), 47 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/PlayerContainer.java b/runelite-client/src/main/java/net/runelite/client/game/PlayerContainer.java index 60e54e28a4..ec778e7b51 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/PlayerContainer.java +++ b/runelite-client/src/main/java/net/runelite/client/game/PlayerContainer.java @@ -48,6 +48,7 @@ public class PlayerContainer private String targetString; private CombatStats combatStats; private boolean httpRetry; + private boolean hiscoresRequested; private boolean scouted; private boolean attacking; private boolean friend; diff --git a/runelite-client/src/main/java/net/runelite/client/game/PlayerManager.java b/runelite-client/src/main/java/net/runelite/client/game/PlayerManager.java index f6a35943ae..3667303d83 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/PlayerManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/PlayerManager.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; @@ -70,15 +71,15 @@ public class PlayerManager */ public Set getAllAttackers() { - final Set set = new HashSet<>(); - for (PlayerContainer p : playerMap.values()) + Set result = new HashSet<>(); + for (PlayerContainer playerContainer : playerMap.values()) { - if (p.isAttacking()) + if (playerContainer.isAttacking()) { - set.add(p); + result.add(playerContainer); } } - return set; + return Collections.unmodifiableSet(result); } /** @@ -158,9 +159,15 @@ public class PlayerManager return; } + if (player.isHiscoresRequested() && !player.isHttpRetry()) + { + return; + } + + player.setHiscoresRequested(true); + executorService.submit(() -> { - player.setHttpRetry(true); int timeout = 0; HiscoreResult result; do @@ -174,6 +181,7 @@ public class PlayerManager if (timeout == 10) { log.error("HiScore Lookup timed out on: {}", player.getName()); + player.setHttpRetry(true); return; } result = null; @@ -194,19 +202,13 @@ public class PlayerManager player.setPrayerLevel(player.getSkills().getPrayer().getLevel()); player.setHpLevel(player.getSkills().getHitpoints().getLevel()); player.setHttpRetry(false); + player.setHiscoresRequested(false); }); } private void onAppearenceChanged(PlayerAppearanceChanged event) { - PlayerContainer player = playerMap.get(event.getPlayer().getName()); - - if (player == null) - { - player = new PlayerContainer(event.getPlayer()); - playerMap.put(event.getPlayer().getName(), player); - } - + PlayerContainer player = playerMap.computeIfAbsent(event.getPlayer().getName(), s -> new PlayerContainer(event.getPlayer())); update(player); player.setFriend(client.isFriended(player.getName(), false)); player.setClan(clanManager.isClanMember(player.getName())); @@ -214,8 +216,7 @@ public class PlayerManager private void onPlayerDespawned(PlayerDespawned event) { - final Player player = event.getPlayer(); - playerMap.remove(player.getName()); + playerMap.remove(event.getPlayer().getName()); } private void onAnimationChanged(AnimationChanged event) @@ -227,24 +228,22 @@ public class PlayerManager return; } - final PlayerContainer player = playerMap.getOrDefault(actor.getName(), null); + final PlayerContainer player = playerMap.get(actor.getName()); if (player == null) { return; } - if (player.getPlayer().getInteracting() != null && - player.getPlayer().getInteracting() == client.getLocalPlayer()) - { - if (player.getSkills() == null) - { - updateStats(player.getPlayer()); - } + assert player.getPlayer() == actor; - player.setAttacking(true); - player.setTimer(8); + if (player.getSkills() == null) + { + updateStats(player.getPlayer()); } + + player.setAttacking(true); + player.setTimer(8); } private void update(PlayerContainer player) @@ -424,8 +423,10 @@ public class PlayerManager removeEntries(player.getRiskedGear(), player.getPrayerLevel() <= 25 ? 0 : 1); } - player.getRiskedGear().values().forEach(price -> player.setRisk(player.getRisk() + price)); - prices.clear(); + int risk = 0; + for (int val : player.getRiskedGear().values()) + risk += val; + player.setRisk(risk); } private void updateMeleeStyle(PlayerContainer player) @@ -457,22 +458,16 @@ public class PlayerManager if (def.getName().toLowerCase().contains("staff")) { player.setAttackStyle(AttackStyle.MAGE); - staff = true; - break; + if (oldStyle != player.getAttackStyle()) + { + eventBus.post(AttackStyleChanged.class, new AttackStyleChanged( + player.getPlayer(), oldStyle, player.getAttackStyle()) + ); + } + return; } } - if (staff) - { - if (oldStyle != player.getAttackStyle()) - { - eventBus.post(AttackStyleChanged.class, new AttackStyleChanged( - player.getPlayer(), oldStyle, player.getAttackStyle()) - ); - } - return; - } - final CombatStats stats = player.getCombatStats(); if (stats.getMagicStr() >= stats.getRangeStr() && stats.getMagicStr() >= stats.getMeleeStr()) @@ -516,13 +511,11 @@ public class PlayerManager private static void removeEntries(LinkedHashMap map, int quantity) { - for (int i = 0; i < quantity; i++) + final Iterator> it = map.entrySet().iterator(); + for (int i = 0; it.hasNext() && i < quantity; i++) { - if (!map.entrySet().iterator().hasNext()) - { - return; - } - map.entrySet().remove(map.entrySet().iterator().next()); + it.next(); + it.remove(); // LinkedHashMap iterator supports this } }