From a950763a92f71b11c88e13acd98a01e69ab9bc38 Mon Sep 17 00:00:00 2001 From: bjornenalfa Date: Sun, 10 Mar 2019 12:02:38 +0100 Subject: [PATCH] Better party tracking --- .../plugins/raids/RaidsPartyOverlay.java | 41 ++++--- .../client/plugins/raids/RaidsPlugin.java | 116 ++++++++++++------ 2 files changed, 105 insertions(+), 52 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPartyOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPartyOverlay.java index 140bdc32c3..00d2688f09 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPartyOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPartyOverlay.java @@ -32,12 +32,13 @@ import java.util.HashSet; import java.util.Set; import javax.inject.Inject; -import net.runelite.api.ClanMember; -import net.runelite.api.Client; -import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.*; -import net.runelite.api.VarPlayer; -import net.runelite.api.Varbits; +import net.runelite.client.chat.ChatColorType; +import net.runelite.client.chat.ChatMessageBuilder; +import net.runelite.client.chat.QueuedMessage; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.OverlayMenuClicked; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; @@ -48,6 +49,9 @@ import net.runelite.client.ui.overlay.components.PanelComponent; public class RaidsPartyOverlay extends Overlay { + public static final String PARTY_OVERLAY_DEBUG = "Debug"; + public static final String PARTY_OVERLAY_RESET = "Reset missing"; + @Inject private Client client; @@ -62,7 +66,9 @@ public class RaidsPartyOverlay extends Overlay super(plugin); setPosition(OverlayPosition.TOP_RIGHT); setPriority(OverlayPriority.HIGH); - getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Raids overlay")); + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Raids party overlay")); + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY, PARTY_OVERLAY_DEBUG, "Raids party overlay")); + getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY, PARTY_OVERLAY_RESET, "Raids party overlay")); } @Override @@ -73,11 +79,12 @@ public class RaidsPartyOverlay extends Overlay return null; } - // Leaver display doesn't quite work yet - + if (client.getClanChatCount() == 0) { + // Player left clan chat + return null; + } boolean inLobby = client.getVar(VarPlayer.IN_RAID_PARTY) != -1; // -1 if raid started - //boolean inRaid = client.getVar(Varbits.IN_RAID) == 1; // 1 while in raids int partySize = client.getVar(Varbits.RAID_PARTY_SIZE); @@ -88,15 +95,16 @@ public class RaidsPartyOverlay extends Overlay Color countColor = Color.WHITE; if (inLobby) { partyCountString = String.format("%d/%d", playerCount, partySize); + // While we are in the lobby compare to players visible on the screen if (partySize <= playerCount) { countColor = Color.GREEN; } else { countColor = Color.RED; } } else { - // If raid has started then we compare the current party size to what it was whe + // If raid has started then we compare the current party size to what it was when we started partyCountString = String.format("%d/%d", partySize, plugin.getStartPlayerCount()); - if (partySize < plugin.getStartPlayerCount()) { + if (plugin.getMissingPartyMembers().size() > 0) { countColor = Color.RED; // Somebody is missing } } @@ -113,28 +121,27 @@ public class RaidsPartyOverlay extends Overlay if (inLobby) { int world = client.getWorld(); int wrongWorldClanMembers = 0; - HashSet members = new HashSet<>(); + int clanMemberCount = 0; for (ClanMember clanMember : client.getClanMembers()) { if (clanMember != null) { if (clanMember.getWorld() != world) { wrongWorldClanMembers++; } else { - members.add(clanMember.getUsername()); - //System.out.println("Added clanmember: " + clanMember.getUsername()); + clanMemberCount++; } } } // Show amount of people on the right world but not at the raids area Color notInPartyColor = Color.GREEN; - int notInParty = Math.max(members.size() - partySize, 0); + int notInParty = clanMemberCount - partySize; if (notInParty > 0) { notInPartyColor = Color.WHITE; } panel.getChildren().add(LineComponent.builder() - .left("Not in party:") + .left("Not at raids:") .right(String.valueOf(notInParty)) .rightColor(notInPartyColor) .build()); @@ -155,7 +162,7 @@ public class RaidsPartyOverlay extends Overlay } else { Set missingPartyMembers = plugin.getMissingPartyMembers(); - if (missingPartyMembers != null && missingPartyMembers.size() > 0) { + if (missingPartyMembers.size() > 0) { panel.getChildren().add(LineComponent.builder() .left("Missing players:") .build()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 952701a22f..29502c52f5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.raids; +import com.google.common.collect.Lists; import com.google.inject.Binder; import com.google.inject.Provides; import java.text.DecimalFormat; @@ -49,6 +50,7 @@ import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.QueuedMessage; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.OverlayMenuClicked; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -56,6 +58,7 @@ import net.runelite.client.plugins.raids.solver.Layout; import net.runelite.client.plugins.raids.solver.LayoutSolver; import net.runelite.client.plugins.raids.solver.RotationSolver; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.Text; @@ -129,15 +132,14 @@ public class RaidsPlugin extends Plugin @Getter private int startPlayerCount; - private int storedVarPartySize; + @Getter + private List partyMembers = new ArrayList<>(); @Getter - private List partyMembers; - - private List startingPartyMembers; + private List startingPartyMembers = new ArrayList<>(); @Getter - private Set missingPartyMembers; + private Set missingPartyMembers = new HashSet<>(); @Provides RaidsConfig provideConfig(ConfigManager configManager) @@ -205,7 +207,9 @@ public class RaidsPlugin extends Plugin public void onVarbitChanged(VarbitChanged event) { checkRaidPresence(false); - updatePartyMembers(); + if (config.partyDisplay()) { + updatePartyMembers(false); + } } @Subscribe @@ -222,13 +226,17 @@ public class RaidsPlugin extends Plugin infoBoxManager.addInfoBox(timer); } if (config.partyDisplay()) { - updatePartyMembers(); - startPlayerCount = client.getVar(Varbits.RAID_PARTY_SIZE); - if (partyMembers == null) { - startingPartyMembers = new ArrayList<>(); - } else { - startingPartyMembers = new ArrayList<>(partyMembers); - } + // Base this on visible players since party size shows people outside the lobby + // and they did not get to come on the raid + List players = client.getPlayers(); + startPlayerCount = players.size(); + + partyMembers.clear(); + startingPartyMembers.clear(); + missingPartyMembers.clear(); + + partyMembers.addAll(Lists.transform(players, Player::getName)); + startingPartyMembers.addAll(partyMembers); } } @@ -278,46 +286,84 @@ public class RaidsPlugin extends Plugin } } - private void updatePartyMembers() { + @Subscribe + public void onOverlayMenuClicked(OverlayMenuClicked event) + { + OverlayMenuEntry entry = event.getEntry(); + if (entry.getMenuAction() == MenuAction.RUNELITE_OVERLAY && + entry.getTarget().equals("Raids party overlay")) + { + switch (entry.getOption()) { + case RaidsPartyOverlay.PARTY_OVERLAY_DEBUG: + System.out.println("Starting players: "); + getPartyMembers().stream().map(player -> "* " + player).forEach(System.out::println); + System.out.println("Current players: "); + getPartyMembers().stream().map(player -> "* " + player).forEach(System.out::println); + System.out.println("Missing players: "); + getMissingPartyMembers().stream().map(player -> "* " + player).forEach(System.out::println); + break; + case RaidsPartyOverlay.PARTY_OVERLAY_RESET: + updatePartyMembers(true); + break; + default: + break; + } + } + } + + private void updatePartyMembers(boolean force) { int partySize = client.getVar(Varbits.RAID_PARTY_SIZE); if (partySize <= 0) { - partyMembers = null; return; } - partyMembers = new ArrayList<>(); - try { - Widget[] widgets = client.getWidget(WidgetInfo.RAIDING_PARTY).getStaticChildren()[2].getStaticChildren()[3].getDynamicChildren(); + if (force) { + partyMembers.clear(); + startingPartyMembers.clear(); + missingPartyMembers.clear(); + } + + if (startingPartyMembers.size() == partySize) { + // Skip update if we have a list of starting party members the same size as current party + return; + } + + // Only update while in raid + if (client.getVar(VarPlayer.IN_RAID_PARTY) == -1 || force) { + Widget[] widgets; + try { + widgets = client.getWidget(WidgetInfo.RAIDING_PARTY).getStaticChildren()[2].getStaticChildren()[3].getDynamicChildren(); + } catch (NullPointerException e) { + return; // Raid widget not (fully) loaded yet + } + + partyMembers.clear(); for (int i = 0; i < widgets.length; i++) { if (widgets[i] != null) { + // Party members names can be found as a color tagged string in every fourth(ish) of these children String name = widgets[i].getName(); if (name.length() > 1) { + // Clean away tag partyMembers.add(name.substring(name.indexOf('>') + 1, name.indexOf('<', 1))); } } } - } catch (NullPointerException e) { - // Raid widget not loaded yet - } - if (client.getVar(VarPlayer.IN_RAID_PARTY) == -1 && - (startingPartyMembers == null || startingPartyMembers.size() < partyMembers.size())) { - // If raid started and there are more people now than there were then, update - startingPartyMembers = new ArrayList<>(partyMembers); - } + // If there are more people now than there were, update starting members + if (partySize > startingPartyMembers.size()) { + missingPartyMembers.clear(); + startingPartyMembers.clear(); + startingPartyMembers.addAll(partyMembers); + } else { - if (config.partyDisplay()) { - if (client.getVar(VarPlayer.IN_RAID_PARTY) == -1) { - // Raid started, check if anyone left - if (startingPartyMembers != null && startingPartyMembers.size() < partyMembers.size()) { - missingPartyMembers = new HashSet<>(startingPartyMembers); - for (String player : partyMembers) { - missingPartyMembers.remove(player); - } + // Check if anyone left + if (startingPartyMembers.size() > partyMembers.size()) { + missingPartyMembers.clear(); + missingPartyMembers.addAll(startingPartyMembers); + missingPartyMembers.removeAll(partyMembers); } } } - } private void checkRaidPresence(boolean force)