Better party tracking
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user