Better party tracking

This commit is contained in:
bjornenalfa
2019-03-10 12:02:38 +01:00
parent 4139fc29fd
commit a950763a92
2 changed files with 105 additions and 52 deletions

View File

@@ -32,12 +32,13 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.api.ClanMember; import net.runelite.api.*;
import net.runelite.api.Client;
import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG;
import net.runelite.api.VarPlayer; import net.runelite.client.chat.ChatColorType;
import net.runelite.api.Varbits; 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 net.runelite.client.ui.overlay.Overlay;
import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
import net.runelite.client.ui.overlay.OverlayMenuEntry; 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 class RaidsPartyOverlay extends Overlay
{ {
public static final String PARTY_OVERLAY_DEBUG = "Debug";
public static final String PARTY_OVERLAY_RESET = "Reset missing";
@Inject @Inject
private Client client; private Client client;
@@ -62,7 +66,9 @@ public class RaidsPartyOverlay extends Overlay
super(plugin); super(plugin);
setPosition(OverlayPosition.TOP_RIGHT); setPosition(OverlayPosition.TOP_RIGHT);
setPriority(OverlayPriority.HIGH); 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 @Override
@@ -73,11 +79,12 @@ public class RaidsPartyOverlay extends Overlay
return null; 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 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); int partySize = client.getVar(Varbits.RAID_PARTY_SIZE);
@@ -88,15 +95,16 @@ public class RaidsPartyOverlay extends Overlay
Color countColor = Color.WHITE; Color countColor = Color.WHITE;
if (inLobby) { if (inLobby) {
partyCountString = String.format("%d/%d", playerCount, partySize); partyCountString = String.format("%d/%d", playerCount, partySize);
// While we are in the lobby compare to players visible on the screen
if (partySize <= playerCount) { if (partySize <= playerCount) {
countColor = Color.GREEN; countColor = Color.GREEN;
} else { } else {
countColor = Color.RED; countColor = Color.RED;
} }
} else { } 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()); partyCountString = String.format("%d/%d", partySize, plugin.getStartPlayerCount());
if (partySize < plugin.getStartPlayerCount()) { if (plugin.getMissingPartyMembers().size() > 0) {
countColor = Color.RED; // Somebody is missing countColor = Color.RED; // Somebody is missing
} }
} }
@@ -113,28 +121,27 @@ public class RaidsPartyOverlay extends Overlay
if (inLobby) { if (inLobby) {
int world = client.getWorld(); int world = client.getWorld();
int wrongWorldClanMembers = 0; int wrongWorldClanMembers = 0;
HashSet<String> members = new HashSet<>(); int clanMemberCount = 0;
for (ClanMember clanMember : client.getClanMembers()) { for (ClanMember clanMember : client.getClanMembers()) {
if (clanMember != null) { if (clanMember != null) {
if (clanMember.getWorld() != world) { if (clanMember.getWorld() != world) {
wrongWorldClanMembers++; wrongWorldClanMembers++;
} else { } else {
members.add(clanMember.getUsername()); clanMemberCount++;
//System.out.println("Added clanmember: " + clanMember.getUsername());
} }
} }
} }
// Show amount of people on the right world but not at the raids area // Show amount of people on the right world but not at the raids area
Color notInPartyColor = Color.GREEN; Color notInPartyColor = Color.GREEN;
int notInParty = Math.max(members.size() - partySize, 0); int notInParty = clanMemberCount - partySize;
if (notInParty > 0) { if (notInParty > 0) {
notInPartyColor = Color.WHITE; notInPartyColor = Color.WHITE;
} }
panel.getChildren().add(LineComponent.builder() panel.getChildren().add(LineComponent.builder()
.left("Not in party:") .left("Not at raids:")
.right(String.valueOf(notInParty)) .right(String.valueOf(notInParty))
.rightColor(notInPartyColor) .rightColor(notInPartyColor)
.build()); .build());
@@ -155,7 +162,7 @@ public class RaidsPartyOverlay extends Overlay
} else { } else {
Set<String> missingPartyMembers = plugin.getMissingPartyMembers(); Set<String> missingPartyMembers = plugin.getMissingPartyMembers();
if (missingPartyMembers != null && missingPartyMembers.size() > 0) { if (missingPartyMembers.size() > 0) {
panel.getChildren().add(LineComponent.builder() panel.getChildren().add(LineComponent.builder()
.left("Missing players:") .left("Missing players:")
.build()); .build());

View File

@@ -24,6 +24,7 @@
*/ */
package net.runelite.client.plugins.raids; package net.runelite.client.plugins.raids;
import com.google.common.collect.Lists;
import com.google.inject.Binder; import com.google.inject.Binder;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.text.DecimalFormat; import java.text.DecimalFormat;
@@ -49,6 +50,7 @@ import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.chat.QueuedMessage; import net.runelite.client.chat.QueuedMessage;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.OverlayMenuClicked;
import net.runelite.client.game.SpriteManager; import net.runelite.client.game.SpriteManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; 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.LayoutSolver;
import net.runelite.client.plugins.raids.solver.RotationSolver; import net.runelite.client.plugins.raids.solver.RotationSolver;
import net.runelite.client.ui.overlay.OverlayManager; 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.ui.overlay.infobox.InfoBoxManager;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
@@ -129,15 +132,14 @@ public class RaidsPlugin extends Plugin
@Getter @Getter
private int startPlayerCount; private int startPlayerCount;
private int storedVarPartySize; @Getter
private List<String> partyMembers = new ArrayList<>();
@Getter @Getter
private List<String> partyMembers; private List<String> startingPartyMembers = new ArrayList<>();
private List<String> startingPartyMembers;
@Getter @Getter
private Set<String> missingPartyMembers; private Set<String> missingPartyMembers = new HashSet<>();
@Provides @Provides
RaidsConfig provideConfig(ConfigManager configManager) RaidsConfig provideConfig(ConfigManager configManager)
@@ -205,7 +207,9 @@ public class RaidsPlugin extends Plugin
public void onVarbitChanged(VarbitChanged event) public void onVarbitChanged(VarbitChanged event)
{ {
checkRaidPresence(false); checkRaidPresence(false);
updatePartyMembers(); if (config.partyDisplay()) {
updatePartyMembers(false);
}
} }
@Subscribe @Subscribe
@@ -222,13 +226,17 @@ public class RaidsPlugin extends Plugin
infoBoxManager.addInfoBox(timer); infoBoxManager.addInfoBox(timer);
} }
if (config.partyDisplay()) { if (config.partyDisplay()) {
updatePartyMembers(); // Base this on visible players since party size shows people outside the lobby
startPlayerCount = client.getVar(Varbits.RAID_PARTY_SIZE); // and they did not get to come on the raid
if (partyMembers == null) { List<Player> players = client.getPlayers();
startingPartyMembers = new ArrayList<>(); startPlayerCount = players.size();
} else {
startingPartyMembers = new ArrayList<>(partyMembers); 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); int partySize = client.getVar(Varbits.RAID_PARTY_SIZE);
if (partySize <= 0) { if (partySize <= 0) {
partyMembers = null;
return; return;
} }
partyMembers = new ArrayList<>(); if (force) {
try { partyMembers.clear();
Widget[] widgets = client.getWidget(WidgetInfo.RAIDING_PARTY).getStaticChildren()[2].getStaticChildren()[3].getDynamicChildren(); 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++) { for (int i = 0; i < widgets.length; i++) {
if (widgets[i] != null) { 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(); String name = widgets[i].getName();
if (name.length() > 1) { if (name.length() > 1) {
// Clean away tag
partyMembers.add(name.substring(name.indexOf('>') + 1, name.indexOf('<', 1))); 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 && // If there are more people now than there were, update starting members
(startingPartyMembers == null || startingPartyMembers.size() < partyMembers.size())) { if (partySize > startingPartyMembers.size()) {
// If raid started and there are more people now than there were then, update missingPartyMembers.clear();
startingPartyMembers = new ArrayList<>(partyMembers); startingPartyMembers.clear();
} startingPartyMembers.addAll(partyMembers);
} else {
if (config.partyDisplay()) { // Check if anyone left
if (client.getVar(VarPlayer.IN_RAID_PARTY) == -1) { if (startingPartyMembers.size() > partyMembers.size()) {
// Raid started, check if anyone left missingPartyMembers.clear();
if (startingPartyMembers != null && startingPartyMembers.size() < partyMembers.size()) { missingPartyMembers.addAll(startingPartyMembers);
missingPartyMembers = new HashSet<>(startingPartyMembers); missingPartyMembers.removeAll(partyMembers);
for (String player : partyMembers) {
missingPartyMembers.remove(player);
}
} }
} }
} }
} }
private void checkRaidPresence(boolean force) private void checkRaidPresence(boolean force)