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 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<String> 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<String> missingPartyMembers = plugin.getMissingPartyMembers();
if (missingPartyMembers != null && missingPartyMembers.size() > 0) {
if (missingPartyMembers.size() > 0) {
panel.getChildren().add(LineComponent.builder()
.left("Missing players:")
.build());

View File

@@ -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<String> partyMembers = new ArrayList<>();
@Getter
private List<String> partyMembers;
private List<String> startingPartyMembers;
private List<String> startingPartyMembers = new ArrayList<>();
@Getter
private Set<String> missingPartyMembers;
private Set<String> 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<Player> 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)