playermanager: Ensure no duplicate hiscore lookups are performed (and cleanup) (#2690)

* playermanager: Make sure no duplicate hiscore lookups are done

* playermanager: cleanup
This commit is contained in:
Lucwousin
2020-06-17 04:44:23 +02:00
committed by GitHub
parent 187cbd14e9
commit c97f7b196e
2 changed files with 41 additions and 47 deletions

View File

@@ -48,6 +48,7 @@ public class PlayerContainer
private String targetString; private String targetString;
private CombatStats combatStats; private CombatStats combatStats;
private boolean httpRetry; private boolean httpRetry;
private boolean hiscoresRequested;
private boolean scouted; private boolean scouted;
private boolean attacking; private boolean attacking;
private boolean friend; private boolean friend;

View File

@@ -5,6 +5,7 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -70,15 +71,15 @@ public class PlayerManager
*/ */
public Set<PlayerContainer> getAllAttackers() public Set<PlayerContainer> getAllAttackers()
{ {
final Set<PlayerContainer> set = new HashSet<>(); Set<PlayerContainer> result = new HashSet<>();
for (PlayerContainer p : playerMap.values()) 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; return;
} }
if (player.isHiscoresRequested() && !player.isHttpRetry())
{
return;
}
player.setHiscoresRequested(true);
executorService.submit(() -> executorService.submit(() ->
{ {
player.setHttpRetry(true);
int timeout = 0; int timeout = 0;
HiscoreResult result; HiscoreResult result;
do do
@@ -174,6 +181,7 @@ public class PlayerManager
if (timeout == 10) if (timeout == 10)
{ {
log.error("HiScore Lookup timed out on: {}", player.getName()); log.error("HiScore Lookup timed out on: {}", player.getName());
player.setHttpRetry(true);
return; return;
} }
result = null; result = null;
@@ -194,19 +202,13 @@ public class PlayerManager
player.setPrayerLevel(player.getSkills().getPrayer().getLevel()); player.setPrayerLevel(player.getSkills().getPrayer().getLevel());
player.setHpLevel(player.getSkills().getHitpoints().getLevel()); player.setHpLevel(player.getSkills().getHitpoints().getLevel());
player.setHttpRetry(false); player.setHttpRetry(false);
player.setHiscoresRequested(false);
}); });
} }
private void onAppearenceChanged(PlayerAppearanceChanged event) private void onAppearenceChanged(PlayerAppearanceChanged event)
{ {
PlayerContainer player = playerMap.get(event.getPlayer().getName()); PlayerContainer player = playerMap.computeIfAbsent(event.getPlayer().getName(), s -> new PlayerContainer(event.getPlayer()));
if (player == null)
{
player = new PlayerContainer(event.getPlayer());
playerMap.put(event.getPlayer().getName(), player);
}
update(player); update(player);
player.setFriend(client.isFriended(player.getName(), false)); player.setFriend(client.isFriended(player.getName(), false));
player.setClan(clanManager.isClanMember(player.getName())); player.setClan(clanManager.isClanMember(player.getName()));
@@ -214,8 +216,7 @@ public class PlayerManager
private void onPlayerDespawned(PlayerDespawned event) private void onPlayerDespawned(PlayerDespawned event)
{ {
final Player player = event.getPlayer(); playerMap.remove(event.getPlayer().getName());
playerMap.remove(player.getName());
} }
private void onAnimationChanged(AnimationChanged event) private void onAnimationChanged(AnimationChanged event)
@@ -227,24 +228,22 @@ public class PlayerManager
return; return;
} }
final PlayerContainer player = playerMap.getOrDefault(actor.getName(), null); final PlayerContainer player = playerMap.get(actor.getName());
if (player == null) if (player == null)
{ {
return; return;
} }
if (player.getPlayer().getInteracting() != null && assert player.getPlayer() == actor;
player.getPlayer().getInteracting() == client.getLocalPlayer())
{
if (player.getSkills() == null)
{
updateStats(player.getPlayer());
}
player.setAttacking(true); if (player.getSkills() == null)
player.setTimer(8); {
updateStats(player.getPlayer());
} }
player.setAttacking(true);
player.setTimer(8);
} }
private void update(PlayerContainer player) private void update(PlayerContainer player)
@@ -424,8 +423,10 @@ public class PlayerManager
removeEntries(player.getRiskedGear(), player.getPrayerLevel() <= 25 ? 0 : 1); removeEntries(player.getRiskedGear(), player.getPrayerLevel() <= 25 ? 0 : 1);
} }
player.getRiskedGear().values().forEach(price -> player.setRisk(player.getRisk() + price)); int risk = 0;
prices.clear(); for (int val : player.getRiskedGear().values())
risk += val;
player.setRisk(risk);
} }
private void updateMeleeStyle(PlayerContainer player) private void updateMeleeStyle(PlayerContainer player)
@@ -457,22 +458,16 @@ public class PlayerManager
if (def.getName().toLowerCase().contains("staff")) if (def.getName().toLowerCase().contains("staff"))
{ {
player.setAttackStyle(AttackStyle.MAGE); player.setAttackStyle(AttackStyle.MAGE);
staff = true; if (oldStyle != player.getAttackStyle())
break; {
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(); final CombatStats stats = player.getCombatStats();
if (stats.getMagicStr() >= stats.getRangeStr() && stats.getMagicStr() >= stats.getMeleeStr()) if (stats.getMagicStr() >= stats.getRangeStr() && stats.getMagicStr() >= stats.getMeleeStr())
@@ -516,13 +511,11 @@ public class PlayerManager
private static void removeEntries(LinkedHashMap<Integer, Integer> map, int quantity) private static void removeEntries(LinkedHashMap<Integer, Integer> map, int quantity)
{ {
for (int i = 0; i < quantity; i++) final Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
for (int i = 0; it.hasNext() && i < quantity; i++)
{ {
if (!map.entrySet().iterator().hasNext()) it.next();
{ it.remove(); // LinkedHashMap iterator supports this
return;
}
map.entrySet().remove(map.entrySet().iterator().next());
} }
} }