diff --git a/.gitignore b/.gitignore
index cb8687ac..a28bff27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,4 @@ build
.classpath
nbactions.xml
nb-configuration.xml
-nbproject/
-*.iml
-*.json
\ No newline at end of file
+nbproject/
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 00000000..26d33521
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 00000000..b0cd809c
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 00000000..35eb1ddf
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 1975a5be..0432b62f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,8 @@
BSD 2-Clause License
+Copyright (c) 2022, LlemonDuck
+Copyright (c) 2022, TheStonedTurtle
+Copyright (c) 2019, Ron Young
Copyright (c) 2020, CasvM
All rights reserved.
diff --git a/build.gradle b/build.gradle
index e0241af7..d9f2c7cd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,7 +10,7 @@ repositories {
mavenCentral()
}
-def runeLiteVersion = '1.8.17'
+def runeLiteVersion = 'latest.release'
dependencies {
compileOnly group: 'net.runelite', name:'client', version: runeLiteVersion
@@ -18,11 +18,13 @@ dependencies {
compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
- testImplementation "org.mockito:mockito-core:3.3.3"
- testImplementation "com.google.inject.extensions:guice-testlib:4.1.0"
- testImplementation 'junit:junit:4.12'
- testImplementation group: 'net.runelite', name:'client', version: runeLiteVersion
- testImplementation group: 'net.runelite', name:'jshell', version: runeLiteVersion
+ testImplementation "org.mockito:mockito-core:3.3.3"
+ testImplementation group: 'com.google.inject.extensions', name: 'guice-testlib', version: '4.2.0', {
+ exclude group: 'com.google.inject', module: 'guice'
+ }
+ testImplementation 'junit:junit:4.12'
+ testImplementation group: 'net.runelite', name:'client', version: runeLiteVersion
+ testImplementation group: 'net.runelite', name:'jshell', version: runeLiteVersion
}
group = 'raidtracker'
@@ -31,4 +33,5 @@ sourceCompatibility = '1.8'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
+ options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
diff --git a/runelite-plugin.properties b/runelite-plugin.properties
index 08ecbc36..381b6fda 100644
--- a/runelite-plugin.properties
+++ b/runelite-plugin.properties
@@ -1,5 +1,5 @@
displayName=Raid Data Tracker
-author=Canvasba
+author=Canvasba/Cox Insider
support=https://github.com/CasvM/runelite-external-plugins/tree/raid-tracker
description=Tracks all loot received within the Chambers of Xeric, including splits. Also tracks the total, and personal points received, so that you can accurately determine your personal droprate, and dryness.
tags=raids, raid, cox, chambers, tracker,raid tracker, raid data, raid data tracker
diff --git a/src/main/java/com/raidtracker/RaidTracker.java b/src/main/java/com/raidtracker/RaidTracker.java
index 7d8c592e..cb482096 100644
--- a/src/main/java/com/raidtracker/RaidTracker.java
+++ b/src/main/java/com/raidtracker/RaidTracker.java
@@ -1,77 +1,49 @@
package com.raidtracker;
+import com.raidtracker.utils.UniqueDrop;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.UUID;
+@AllArgsConstructor
+@NoArgsConstructor
@Data
public class RaidTracker {
-
boolean chestOpened = false;
boolean raidComplete = false;
boolean loggedIn = false;
boolean challengeMode = false;
- boolean inRaidChambers = false;
- boolean inTheatreOfBlood = false;
- boolean FreeForAll = false;
+ boolean inRaid = false;
+ /*
+ boolean inRaidCox = false;
+ boolean inRaidTob = false;
+ boolean inRaidToa = false;
+ */
+ // Global
+ public int[] roomTimes = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
+ int teamSize = -1;
+ int completionCount = -1;
+ ArrayList Uniques = new ArrayList<>();
+ ArrayList nTradables = new ArrayList<>();
+ ArrayList pets = new ArrayList<>();
- int upperTime = -1;
- int middleTime = -1;
- int lowerTime = -1;
+ int inRaidType = -1;
int raidTime = -1;
-
- int shamansTime = -1;
- int vasaTime = -1;
- int vanguardsTime = -1;
- int mysticsTime = -1;
- int tektonTime = -1;
- int muttadilesTime = -1;
- int guardiansTime = -1;
- int vespulaTime = -1;
- int iceDemonTime = -1;
- int thievingTime = -1;
- int tightropeTime = -1;
- int crabsTime = -1;
-
int totalPoints = -1;
int personalPoints = -1;
- int teamSize = -1;
double percentage = -1.0;
- int completionCount = -1;
- String specialLoot = "";
- String specialLootReceiver = "";
- boolean specialLootInOwnName = false;
- int specialLootValue = -1;
- String kitReceiver = "";
- String dustReceiver = "";
- String petReceiver = "";
- boolean petInMyName = false;
- int lootSplitReceived = -1;
- int lootSplitPaid = -1;
ArrayList lootList = new ArrayList<>();
- int maidenTime = -1;
- int bloatTime = -1;
- int nyloTime = -1;
- int sotetsegTime = -1;
- int xarpusTime = -1;
- int verzikTime = -1;
-
String mvp= "";
boolean mvpInOwnName = false;
- String tobPlayer1 = "";
- String tobPlayer2 = "";
- String tobPlayer3 = "";
- String tobPlayer4 = "";
- String tobPlayer5 = "";
-
- int tobPlayer1DeathCount = 0;
- int tobPlayer2DeathCount = 0;
- int tobPlayer3DeathCount = 0;
- int tobPlayer4DeathCount = 0;
- int tobPlayer5DeathCount = 0;
+ int[] tobDeaths = {0,0,0,0,0};
+ String[] tobPlayers = {"", "", "", "", ""};
+ // toa specific
+ int invocation = -1;
//Every RaidTracker has a unique uniqueID but not necessarily a unique killCountID, if there are multiple drops.
String uniqueID = UUID.randomUUID().toString();
String killCountID = UUID.randomUUID().toString();
diff --git a/src/main/java/com/raidtracker/RaidTrackerConfig.java b/src/main/java/com/raidtracker/RaidTrackerConfig.java
index b9d176b2..43290c78 100644
--- a/src/main/java/com/raidtracker/RaidTrackerConfig.java
+++ b/src/main/java/com/raidtracker/RaidTrackerConfig.java
@@ -3,10 +3,23 @@
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
+import net.runelite.client.config.ConfigSection;
@ConfigGroup("raidtracker")
public interface RaidTrackerConfig extends Config
{
+ @ConfigSection(
+ name = "Tombs of Amascot",
+ description = "Settings for Tombs of Amascot",
+ position = 1
+ )
+ String toasection = "Tombs of Amascot";
+ @ConfigSection(
+ name = "Chambers of Xeric",
+ description = "Settings for Chambers of Xeric",
+ position = 1
+ )
+ String coxSection = "Chambers of Xeric";
@ConfigItem(
keyName = "defaultFFA",
name = "default FFA",
@@ -26,7 +39,6 @@ default boolean defaultFFA()
default int FFACutoff() {
return 1000000;
}
-
@ConfigItem(
keyName = "lastXKills",
name = "Last X Kills",
@@ -48,15 +60,23 @@ default boolean showTitle()
@ConfigItem(
keyName = "dey0Tracker",
name = "Log raid room times (dey0)",
- description = "Track raid room times with dey0's raid timers plugin. This will replace the regular time splits panel with more detailed times of each part of the raid"
+ description = "Track raid room times with dey0's raid timers plugin. This will replace the regular time splits panel with more detailed times of each part of the raid",
+ section = coxSection
)
default boolean dey0Tracker() { return false; }
-
+ @ConfigItem(
+ keyName = "toatracker",
+ name = "Compact TOA times",
+ description = "If enabled will track seperate room times, not combining path/boss",
+ section = toasection
+ )
+ default boolean toatracker() { return false; }
@ConfigItem(
keyName = "showKillsLogged",
name = "Show Kills Logged",
description = "Disable this checkmark to hide the Kills Logged panel in the ui"
+
)
default boolean showKillsLogged()
{
@@ -87,7 +107,8 @@ default boolean showUniquesTable()
@ConfigItem(
keyName = "showPoints",
name = "Show Points",
- description = "Disable this checkmark to hide the Points Panel in the ui"
+ description = "Disable this checkmark to hide the Points Panel in the ui",
+ section = coxSection
)
default boolean showPoints()
{
diff --git a/src/main/java/com/raidtracker/RaidTrackerItem.java b/src/main/java/com/raidtracker/RaidTrackerItem.java
index df73a1e8..cb3bffa4 100644
--- a/src/main/java/com/raidtracker/RaidTrackerItem.java
+++ b/src/main/java/com/raidtracker/RaidTrackerItem.java
@@ -1,11 +1,16 @@
package com.raidtracker;
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
+@AllArgsConstructor
+@NoArgsConstructor
@Data
public class RaidTrackerItem {
+
public String name;
public int id;
public int quantity;
public int price;
-}
+};
diff --git a/src/main/java/com/raidtracker/RaidTrackerPlugin.java b/src/main/java/com/raidtracker/RaidTrackerPlugin.java
index 8a1ad772..33c45169 100644
--- a/src/main/java/com/raidtracker/RaidTrackerPlugin.java
+++ b/src/main/java/com/raidtracker/RaidTrackerPlugin.java
@@ -1,29 +1,28 @@
package com.raidtracker;
-import com.google.inject.Provides;
import com.google.inject.Inject;
+import com.google.inject.Provides;
import com.raidtracker.filereadwriter.FileReadWriter;
import com.raidtracker.ui.RaidTrackerPanel;
+import com.raidtracker.utils.*;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.*;
import net.runelite.api.coords.WorldPoint;
-import net.runelite.api.events.ChatMessage;
-import net.runelite.api.events.GameStateChanged;
-import net.runelite.api.events.VarbitChanged;
-import net.runelite.api.events.WidgetLoaded;
+import net.runelite.api.events.*;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetID;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.ConfigManager;
+import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.Subscribe;
+import net.runelite.client.game.ItemManager;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.ui.ClientToolbar;
import net.runelite.client.ui.NavigationButton;
import net.runelite.client.util.ImageUtil;
import net.runelite.client.util.Text;
-import net.runelite.client.game.ItemManager;
import javax.swing.*;
import java.awt.image.BufferedImage;
@@ -32,21 +31,40 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
-import static java.lang.Integer.parseInt;
import static java.lang.Float.parseFloat;
+import static java.lang.Integer.parseInt;
+import static net.runelite.client.util.Text.toJagexName;
@Slf4j
@PluginDescriptor(
name = "Raid Data Tracker"
)
+
public class RaidTrackerPlugin extends Plugin
{
- private static final String LEVEL_COMPLETE_MESSAGE = "complete! Duration:";
- private static final String RAID_COMPLETE_MESSAGE = "Congratulations - your raid is complete!";
- private static final String DUST_RECIPIENTS = "Dust recipients: ";
- private static final String TWISTED_KIT_RECIPIENTS = "Twisted Kit recipients: ";
+ public static final String LEVEL_COMPLETE_MESSAGE = "complete! Duration:";
+ public static final String RAID_COMPLETE_MESSAGE = "Congratulations - your raid is complete!";
+ public static final String DUST_RECIPIENTS = "Dust recipients: ";
+ public static final String TWISTED_KIT_RECIPIENTS = "Twisted Kit recipients: ";
+ private static final String[] ROOM_COMPLETE_MESSAGE =
+ {
+ LEVEL_COMPLETE_MESSAGE, // Chambers
+ "wave '", // Tob
+ "Challenge complete:" // Toa
+ };
+ private static final String[] SPECIAL_LOOT_MESSAGE =
+ {
+ " - ", // cox
+ " found something special: ", // tob and toa
+ };
+
+ private static final int REGION_LOBBY = 13454;
+ private static final int WIDGET_PARENT_ID = 481;
+ private static final int WIDGET_CHILD_ID = 40;
+ private RaidState currentState = new RaidState(false, -1);
+ private EventBus eventBus;
@Inject
private Client client;
@@ -59,24 +77,37 @@ public class RaidTrackerPlugin extends Plugin
@Inject
private RaidTrackerConfig config;
-
+ @Inject
+ private ConfigManager configManager;
@Inject
private ItemManager itemManager;
@Inject
private RaidTracker raidTracker;
-
+
+ @Inject RaidStateTracker tracker;
+
private static final WorldPoint TEMP_LOCATION = new WorldPoint(3360, 5152, 2);
@Setter
private RaidTrackerPanel panel;
private NavigationButton navButton;
+ @Inject
+ public raidUtils RaidUtils;
@Setter
private FileReadWriter fw = new FileReadWriter();
-
+ @Setter
+ private uiUtils uiUtils = new uiUtils();
private boolean writerStarted = false;
+ public String RTName = "";
+ public static String profileKey;
+ private RaidTrackerPlugin RaidTrackerPlugin;
+ public String getProfileKey(ConfigManager configManager)
+ {
+ return configManager.getRSProfileKey();
+ }
@Provides
RaidTrackerConfig provideConfig(ConfigManager configManager)
{
@@ -84,77 +115,39 @@ RaidTrackerConfig provideConfig(ConfigManager configManager)
}
@Override
- protected void startUp() {
- panel = new RaidTrackerPanel(itemManager, fw, config, clientThread);
-
+ public void startUp() {
+ tracker.onPluginStart();
+ panel = new RaidTrackerPanel(itemManager, fw, config, clientThread,client);
final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "panel-icon.png");
-
navButton = NavigationButton.builder()
.tooltip("Raid Data Tracker")
.priority(6)
.icon(icon)
.panel(panel)
.build();
-
clientToolbar.addNavigation(navButton);
-
-
- if (client.getGameState().equals(GameState.LOGGED_IN) || client.getGameState().equals(GameState.LOADING))
- {
- fw.updateUsername(client.getUsername());
- SwingUtilities.invokeLater(() -> panel.loadRTList());
- }
}
-
@Override
protected void shutDown() {
- raidTracker.setInRaidChambers(false);
clientToolbar.removeNavigation(navButton);
+ tracker.onPluginStop();
reset();
}
-
@Subscribe
public void onVarbitChanged(VarbitChanged event)
{
- boolean tempInRaid = client.getVar(Varbits.IN_RAID) == 1;
- boolean tempInTob = client.getVar(Varbits.THEATRE_OF_BLOOD) > 1;
-
- // if the player's raid state has changed
- if (tempInRaid ^ raidTracker.isInRaidChambers()) {
- // if the player is inside of a raid then check the raid
- if (tempInRaid && raidTracker.isLoggedIn()) {
- checkRaidPresence();
- }
- else if (raidTracker.isRaidComplete() && !raidTracker.isChestOpened()) {
- //player just exited a raid, if the chest is not looted write the raid tracker anyway.
- //might deprecate the writing after widgetloaded in the future, not decided yet.
- if (writerStarted) {
- return;
- }
-
- fw.writeToFile(raidTracker);
-
- writerStarted = true;
-
- SwingUtilities.invokeLater(() -> {
- panel.addDrop(raidTracker);
- reset();
- });
- }
- }
+ if (writerStarted) return;
- if (tempInTob ^ raidTracker.isInTheatreOfBlood()) {
- if (tempInTob && raidTracker.isLoggedIn()) {
- checkTobPresence();
- }
- else if (raidTracker.isRaidComplete()) {
- //not tested
-
- if (writerStarted) {
- return;
- }
+ boolean tempInRaid = tracker.isInRaid();
+ if (tempInRaid ^ raidTracker.inRaid)
+ {
+ if (tempInRaid && raidTracker.isLoggedIn())
+ {
+ //checkRaidPresence();
+ } else if (raidTracker.isRaidComplete() && !raidTracker.isChestOpened())
+ {
fw.writeToFile(raidTracker);
writerStarted = true;
@@ -163,23 +156,29 @@ else if (raidTracker.isRaidComplete()) {
panel.addDrop(raidTracker);
reset();
});
- }
- else {
- reset();
- }
- }
- }
+ };
+ };
+
+ };
@Subscribe
- public void onGameStateChanged(GameStateChanged event)
+ public void onPlayerSpawned(PlayerSpawned event)
{
- if (event.getGameState() == GameState.LOGGING_IN)
+ if (client.getLocalPlayer().getName() != null && RTName == "")
{
- fw.updateUsername(client.getUsername());
+ RTName = toJagexName(client.getLocalPlayer().getName());
+ fw.updateUsername(getProfileKey(configManager));
+ profileKey = getProfileKey(configManager);
SwingUtilities.invokeLater(() -> panel.loadRTList());
+ };
+ }
- }
+ @Subscribe
+ public void onGameStateChanged(GameStateChanged event)
+ {
+
+ if (event.getGameState() == GameState.LOGGING_IN) {};
if (client.getGameState() == GameState.LOGGED_IN)
{
// skip event while the game decides if the player belongs in a raid or not
@@ -209,11 +208,31 @@ public void onChatMessage(ChatMessage event)
@Subscribe
public void onWidgetLoaded(WidgetLoaded event) {
+ if (raidTracker.isChestOpened() || !raidTracker.isRaidComplete()) return;
+ raidTracker.setLoggedIn(true);
+ if (writerStarted) return;
+
switch (event.getGroupId()) {
+ case (WidgetID.TOA_REWARD_GROUP_ID) :
+ raidTracker.setChestOpened(true);
+
+ ItemContainer toaChestContainer = client.getItemContainer(InventoryID.TOA_REWARD_CHEST);
+
+ if (toaChestContainer == null) return;
+
+
+ raidTracker.setLootList((lootListFactory(toaChestContainer.getItems())));
+ raidTracker.inRaidType = 2;
+ fw.writeToFile(raidTracker);
+
+ writerStarted = true;
+ SwingUtilities.invokeLater(() -> {
+ panel.addDrop(raidTracker);
+ reset();
+ });
+ break;
case (WidgetID.CHAMBERS_OF_XERIC_REWARD_GROUP_ID):
- if (raidTracker.isChestOpened() || !raidTracker.isRaidComplete()) {
- return;
- }
+
raidTracker.setChestOpened(true);
@@ -223,13 +242,9 @@ public void onWidgetLoaded(WidgetLoaded event) {
return;
}
- if (writerStarted) {
- //unnecessary return check?
- return;
- }
raidTracker.setLootList(lootListFactory(rewardItemContainer.getItems()));
-
+ raidTracker.inRaidType = 0;
fw.writeToFile(raidTracker);
writerStarted = true;
@@ -242,9 +257,6 @@ public void onWidgetLoaded(WidgetLoaded event) {
break;
case (WidgetID.THEATRE_OF_BLOOD_GROUP_ID):
- if (raidTracker.isChestOpened() || !raidTracker.isRaidComplete()) {
- return;
- }
raidTracker.setChestOpened(true);
@@ -256,54 +268,52 @@ public void onWidgetLoaded(WidgetLoaded event) {
}
raidTracker.setLootList(lootListFactory(rewardItemContainer.getItems()));
+ raidTracker.inRaidType = 1;
+ fw.writeToFile(raidTracker);
+
+ writerStarted = true;
+
+ SwingUtilities.invokeLater(() -> {
+ panel.addDrop(raidTracker);
+ reset();
+ });
break;
//459 is the mvp screen of TOB
case (459):
AtomicReference mvp = new AtomicReference<>("");
- AtomicReference player1 = new AtomicReference<>("");
- AtomicReference player2 = new AtomicReference<>("");
- AtomicReference player3 = new AtomicReference<>("");
- AtomicReference player4 = new AtomicReference<>("");
- AtomicReference player5 = new AtomicReference<>("");
- AtomicInteger deathsPlayer1 = new AtomicInteger();
- AtomicInteger deathsPlayer2 = new AtomicInteger();
- AtomicInteger deathsPlayer3 = new AtomicInteger();
- AtomicInteger deathsPlayer4 = new AtomicInteger();
- AtomicInteger deathsPlayer5 = new AtomicInteger();
+ AtomicReference[] tobPlayers;
+ AtomicInteger[] tobDeaths = {new AtomicInteger(), new AtomicInteger(), new AtomicInteger(), new AtomicInteger()};
+
+ String[] players;
clientThread.invokeLater(() -> {
- mvp.set(getWidgetText(client.getWidget(459, 14)));
- player1.set(getWidgetText(client.getWidget(459, 22)));
- player2.set(getWidgetText(client.getWidget(459, 24)));
- player3.set(getWidgetText(client.getWidget(459, 26)));
- player4.set(getWidgetText(client.getWidget(459, 28)));
- player5.set(getWidgetText(client.getWidget(459, 30)));
- deathsPlayer1.set(getWidgetNumber(client.getWidget(459, 23)));
- deathsPlayer2.set(getWidgetNumber(client.getWidget(459, 25)));
- deathsPlayer3.set(getWidgetNumber(client.getWidget(459, 27)));
- deathsPlayer4.set(getWidgetNumber(client.getWidget(459, 29)));
- deathsPlayer5.set(getWidgetNumber(client.getWidget(459, 31)));
-
- raidTracker.setMvp(mvp.get());
- raidTracker.setTobPlayer1(player1.get());
- raidTracker.setTobPlayer2(player2.get());
- raidTracker.setTobPlayer3(player3.get());
- raidTracker.setTobPlayer4(player4.get());
- raidTracker.setTobPlayer5(player5.get());
-
- raidTracker.setTobPlayer1DeathCount(deathsPlayer1.get());
- raidTracker.setTobPlayer2DeathCount(deathsPlayer2.get());
- raidTracker.setTobPlayer3DeathCount(deathsPlayer3.get());
- raidTracker.setTobPlayer4DeathCount(deathsPlayer4.get());
- raidTracker.setTobPlayer5DeathCount(deathsPlayer5.get());
+
+ raidTracker.tobPlayers = new String[]{
+ getWidgetText(client.getWidget(459, 22)),
+ getWidgetText(client.getWidget(459, 24)),
+ getWidgetText(client.getWidget(459, 26)),
+ getWidgetText(client.getWidget(459, 28)),
+ getWidgetText(client.getWidget(459, 30))
+ };
+
+ raidTracker.tobDeaths = new int[]{
+ getWidgetNumber(client.getWidget(459, 23)),
+ getWidgetNumber(client.getWidget(459, 25)),
+ getWidgetNumber(client.getWidget(459, 27)),
+ getWidgetNumber(client.getWidget(459, 29)),
+ getWidgetNumber(client.getWidget(459, 31))
+ };
+
+ raidTracker.setMvp(getWidgetText(client.getWidget(459, 14)));
if (client.getLocalPlayer() != null && client.getLocalPlayer().getName() != null) {
- raidTracker.setMvpInOwnName(mvp.get().toLowerCase().equals(client.getLocalPlayer().getName().toLowerCase()));
- }
+ raidTracker.setMvpInOwnName(getWidgetText(client.getWidget(459, 14)).equalsIgnoreCase(client.getLocalPlayer().getName()));
+ };
});
break;
+
}
}
@@ -330,130 +340,100 @@ else if (widget.getText().equals("-")) {
public void checkChatMessage(ChatMessage event, RaidTracker raidTracker)
{
raidTracker.setLoggedIn(true);
-
String playerName = "";
-
if (client.getLocalPlayer() != null && client.getLocalPlayer().getName() != null) {
playerName = client.getLocalPlayer().getName();
}
- if ((raidTracker.isInRaidChambers() || raidTracker.isInTheatreOfBlood()) &&
- (event.getType() == ChatMessageType.FRIENDSCHATNOTIFICATION || event.getType() == ChatMessageType.GAMEMESSAGE)) {
+ if (tracker.isInRaid() && (event.getType() == ChatMessageType.FRIENDSCHATNOTIFICATION || event.getType() == ChatMessageType.GAMEMESSAGE))
+ {
+
//unescape java to avoid unicode
String message = unescapeJavaString(Text.removeTags(event.getMessage()));
- if (message.contains(LEVEL_COMPLETE_MESSAGE)) {
- String timeString = message.split("complete! Duration: ")[1];
-
- if (message.startsWith("Upper")) {
- raidTracker.setUpperTime(stringTimeToSeconds(timeString.split(" ")[timeString.split(" ").length - 1]));
- }
- if (message.startsWith("Middle")) {
- raidTracker.setMiddleTime(stringTimeToSeconds(timeString.split(" ")[timeString.split(" ").length - 1]));
- }
- if (message.startsWith("Lower")) {
- raidTracker.setLowerTime(stringTimeToSeconds(timeString.split(" ")[timeString.split(" ").length - 1]));
- }
-
- if (message.toLowerCase().contains("shamans")) {
- raidTracker.setShamansTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("vasa")) {
- raidTracker.setVasaTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("vanguards")) {
- raidTracker.setVanguardsTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("mystics")) {
- raidTracker.setMysticsTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("tekton")) {
- raidTracker.setTektonTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("muttadiles")) {
- raidTracker.setMuttadilesTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("vespula")) {
- raidTracker.setVespulaTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("ice demon")) {
- raidTracker.setIceDemonTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("thieving")) {
- raidTracker.setThievingTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("tightrope")) {
- raidTracker.setTightropeTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- if (message.toLowerCase().contains("crabs")) {
- raidTracker.setCrabsTime(stringTimeToSeconds(timeString.split(" ")[0]));
- }
-
- }
-
- if (message.startsWith(RAID_COMPLETE_MESSAGE)) {
- raidTracker.setTotalPoints(client.getVar(Varbits.TOTAL_POINTS));
-
- raidTracker.setPersonalPoints(client.getVar(Varbits.PERSONAL_POINTS));
-
- raidTracker.setPercentage(raidTracker.getPersonalPoints() / (raidTracker.getTotalPoints() / 100.0));
-
- raidTracker.setTeamSize(client.getVar(Varbits.RAID_PARTY_SIZE));
-
+ // zz chambers.
+ if (message.startsWith(RAID_COMPLETE_MESSAGE))
+ {
raidTracker.setRaidComplete(true);
+ };
+ String[] pets = {"olmlet", "lil' zik", "tumeken's guardian"};
+ boolean hasPet = Utils.containsCaseInsensitive(message, pets);
+ if (raidTracker.isRaidComplete() && (hasPet || message.toLowerCase().contains("would have been followed")))
+ {
+ RaidUtils.parsePets(message, raidTracker, tracker);
+ return;
+ };
+ if (Utils.containsCaseInsensitive(Arrays.asList(ROOM_COMPLETE_MESSAGE), message))
+ {
+ RaidUtils.parseRaidTime(message, raidTracker, tracker);
+ return;
+ };
+
+ if (
+ raidTracker.isRaidComplete() && // if the raid is complete
+ Utils.containsCaseInsensitive(Arrays.asList(SPECIAL_LOOT_MESSAGE), message) && // and it comtains special loot message
+ !Utils.containsCaseInsensitive(Arrays.asList(ROOM_COMPLETE_MESSAGE), message) &&
+ !message.startsWith(RAID_COMPLETE_MESSAGE)// and it doesn't contain raid completed message
+ )
+ {
+ if (Utils.containsCaseInsensitive(Arrays.asList(SPECIAL_LOOT_MESSAGE), message))
+ {
+ String[] tobUntradables = {"Sanguine Ornement Kit", "Holy Ornement Kit", "Sanguine Dust"};
+ if (Utils.containsCaseInsensitive(Arrays.asList(tobUntradables), message))
+ {
+ RaidUtils.parseUntradables(message, raidTracker, tracker);
+ return;
+ };
+ };
+ RaidUtils.parseRaidUniques(message, raidTracker, tracker);
+ return;
+ };
- raidTracker.setDate(System.currentTimeMillis());
- }
-
- //the message after every completed tob wave.
- if (message.toLowerCase().contains("wave '")) {
- String wave = message.toLowerCase().split("'")[1];
-
- switch (wave) {
- case("the maiden of sugadinti"):
- raidTracker.setMaidenTime(stringTimeToSeconds(message.toLowerCase().split("duration: ")[1].split(" total")[0]));
- break;
- case("the pestilent bloat"):
- raidTracker.setBloatTime(stringTimeToSeconds(message.toLowerCase().split("duration: ")[1].split(" total")[0]));
- break;
- case("the nylocas"):
- raidTracker.setNyloTime(stringTimeToSeconds(message.toLowerCase().split("duration: ")[1].split(" total")[0]));
- break;
- case("sotetseg"):
- raidTracker.setSotetsegTime(stringTimeToSeconds(message.toLowerCase().split("duration: ")[1].split(" total")[0]));
- break;
- case("xarpus"):
- raidTracker.setXarpusTime(stringTimeToSeconds(message.toLowerCase().split("duration: ")[1].split(" total")[0]));
- break;
- case("the final challenge"):
- raidTracker.setVerzikTime(stringTimeToSeconds(message.toLowerCase().split("duration: ")[1].split("theatre")[0]));
- break;
- }
- }
-
- if (message.toLowerCase().contains("theatre of blood wave completion")) {
- raidTracker.setRaidTime(stringTimeToSeconds(message.toLowerCase().split("time: ")[1].split("personal")[0]));
- }
+ if (raidTracker.isRaidComplete() && (message.startsWith(TWISTED_KIT_RECIPIENTS) || (raidTracker.isRaidComplete() && message.startsWith(DUST_RECIPIENTS))))
+ {
+ RaidUtils.parseUntradables(message, raidTracker, tracker);
+ return;
+ };
- if (raidTracker.isRaidComplete() && message.contains("Team size:")) {
+ if (raidTracker.isRaidComplete() && message.contains("Team size:"))
+ {
raidTracker.setRaidTime(stringTimeToSeconds(message.split("Duration: ")[1].split(" ")[0]));
+ return;
}
//works for tob
if (message.contains("count is:")) {
raidTracker.setChallengeMode(message.contains("Chambers of Xeric Challenge Mode"));
raidTracker.setCompletionCount(parseInt(message.split("count is:")[1].trim().replace(".", "")));
- if (raidTracker.isInTheatreOfBlood()) {
+ System.out.println(tracker);
+ if (tracker.getCurrentState().getRaidType() == 0)
+ {
+ raidTracker.setTotalPoints(client.getVarbitValue(Varbits.TOTAL_POINTS));
+ raidTracker.setPersonalPoints(client.getVarbitValue(Varbits.PERSONAL_POINTS));
+ raidTracker.setPercentage(raidTracker.getPersonalPoints() / (raidTracker.getTotalPoints() / 100.0));
+ raidTracker.setTeamSize(client.getVarbitValue(Varbits.RAID_PARTY_SIZE));
+ raidTracker.setRaidComplete(true);
+ raidTracker.setDate(System.currentTimeMillis());
+ };
+
+ if (tracker.getCurrentState().getRaidType() == 2)
+ {
+ int[] playerVarbits = {
+ Varbits.TOA_MEMBER_0_HEALTH, Varbits.TOA_MEMBER_1_HEALTH, Varbits.TOA_MEMBER_2_HEALTH,
+ Varbits.TOA_MEMBER_3_HEALTH, Varbits.TOA_MEMBER_4_HEALTH, Varbits.TOA_MEMBER_5_HEALTH,
+ Varbits.TOA_MEMBER_6_HEALTH, Varbits.TOA_MEMBER_7_HEALTH
+
+ };
+
+ raidTracker.setTeamSize(Arrays.stream(playerVarbits).filter(vb -> (client.getVarbitValue(vb) > 0)).toArray().length);
+ raidTracker.setRaidComplete(true);
+ raidTracker.setDate(System.currentTimeMillis());
+ raidTracker.setInvocation(client.getVarbitValue(Varbits.TOA_RAID_LEVEL));
+ };
+
+
+ if (tracker.getCurrentState().getRaidType() == 1)
+ {
int teamSize = 0;
for (int i = 6442; i < 6447; i++) {
@@ -465,147 +445,8 @@ public void checkChatMessage(ChatMessage event, RaidTracker raidTracker)
raidTracker.setRaidComplete(true);
}
}
-
- //only special loot contain the "-" (except for the raid complete message)
- if (raidTracker.isRaidComplete() && message.contains("-") && !message.startsWith(RAID_COMPLETE_MESSAGE)) {
- //in case of multiple purples, a new purple is stored on a new line in the file, so a new raidtracker object will be used and written to the file
- if (!raidTracker.getSpecialLootReceiver().isEmpty()) {
- RaidTracker altRT = copyData();
-
- altRT.setSpecialLootReceiver(message.split(" - ")[0]);
- altRT.setSpecialLoot(message.split(" - ")[1]);
-
- altRT.setSpecialLootInOwnName(altRT.getSpecialLootReceiver().toLowerCase().trim().equals(playerName.toLowerCase().trim()));
-
-
- altRT.setSpecialLootValue(itemManager.search(raidTracker.getSpecialLoot()).get(0).getPrice());
-
- setSplits(altRT);
-
- fw.writeToFile(altRT);
-
- SwingUtilities.invokeLater(() -> panel.addDrop(altRT, false));
- }
- else {
- raidTracker.setSpecialLootReceiver(message.split(" - ")[0]);
- raidTracker.setSpecialLoot(message.split(" - ")[1]);
-
- raidTracker.setSpecialLootValue(itemManager.search(raidTracker.getSpecialLoot()).get(0).getPrice());
-
- raidTracker.setSpecialLootInOwnName(raidTracker.getSpecialLootReceiver().toLowerCase().trim().equals(playerName.toLowerCase().trim()));
-
-
- setSplits(raidTracker);
- }
- }
-
- //for tob it works a bit different, not possible to get duplicates. - not tested in game yet.
- if (raidTracker.isRaidComplete() && message.toLowerCase().contains("found something special") && !message.toLowerCase().contains("lil' zik")) {
- raidTracker.setSpecialLootReceiver(message.split(" found something special: ")[0]);
- raidTracker.setSpecialLoot(message.split(" found something special: ")[1]);
-
- raidTracker.setSpecialLootValue(itemManager.search(raidTracker.getSpecialLoot()).get(0).getPrice());
-
- raidTracker.setSpecialLootInOwnName(raidTracker.getSpecialLootReceiver().toLowerCase().trim().equals(playerName.toLowerCase().trim()));
-
- }
-
- if (raidTracker.isRaidComplete() && message.startsWith(TWISTED_KIT_RECIPIENTS)) {
- String[] recipients = message.split(TWISTED_KIT_RECIPIENTS)[1].split(",");
-
- for (String recip : recipients) {
- if (raidTracker.getKitReceiver().isEmpty()) {
- raidTracker.setKitReceiver(recip.trim());
- }
- else {
- RaidTracker altRT = copyData();
- altRT.setKitReceiver(recip.trim());
-
- fw.writeToFile(altRT);
-
- SwingUtilities.invokeLater(() -> panel.addDrop(altRT, false));
- }
- }
- }
-
- if (raidTracker.isRaidComplete() && message.startsWith(DUST_RECIPIENTS)) {
- String[] recipients = message.split(DUST_RECIPIENTS)[1].split(",");
-
- for (String recip : recipients) {
- if (raidTracker.getDustReceiver().isEmpty()) {
- raidTracker.setDustReceiver(recip.trim());
- }
- else {
- RaidTracker altRT = copyData();
- altRT.setDustReceiver(recip.trim());
-
- fw.writeToFile(altRT);
-
- SwingUtilities.invokeLater(() -> panel.addDrop(altRT, false));
- }
- }
- }
-
- if (raidTracker.isRaidComplete() && (message.toLowerCase().contains("olmlet") || message.toLowerCase().contains("lil' zik")) || message.toLowerCase().contains("would have been followed")) {
- boolean inOwnName = false;
- boolean duplicate = message.toLowerCase().contains("would have been followed");
-
- if (playerName.equals(message.split(" ")[0]) || duplicate) {
- inOwnName = true;
- }
-
- if (!raidTracker.getPetReceiver().isEmpty()) {
- RaidTracker altRT = copyData();
-
- if (duplicate) {
- altRT.setPetReceiver(playerName);
- }
- else {
- altRT.setPetReceiver(message.split(" ")[0]);
- }
-
- altRT.setPetInMyName(inOwnName);
-
- fw.writeToFile(altRT);
-
- SwingUtilities.invokeLater(() -> panel.addDrop(altRT, false));
- }
- else {
- if (duplicate) {
- raidTracker.setPetReceiver(playerName);
- }
- else {
- raidTracker.setPetReceiver(message.split(" ")[0]);
- }
- raidTracker.setPetInMyName(inOwnName);
- }
- }
}
}
-
- public void setSplits(RaidTracker raidTracker)
- {
-
- int lootSplit = raidTracker.getSpecialLootValue() / raidTracker.getTeamSize();
-
- int cutoff = config.FFACutoff();
-
- //
- if (raidTracker.getSpecialLoot().length() > 0) {
- if (config.defaultFFA() || lootSplit < cutoff) {
- raidTracker.setFreeForAll(true);
- if (raidTracker.isSpecialLootInOwnName()) {
- raidTracker.setLootSplitReceived(raidTracker.getSpecialLootValue());
- }
- } else if (raidTracker.isSpecialLootInOwnName()) {
- raidTracker.setLootSplitPaid(raidTracker.getSpecialLootValue() - lootSplit);
- raidTracker.setLootSplitReceived(lootSplit);
- } else {
- raidTracker.setLootSplitReceived(lootSplit);
- }
- }
- }
-
public ArrayList lootListFactory(Item[] items)
{
ArrayList lootList = new ArrayList<>();
@@ -613,54 +454,17 @@ public ArrayList lootListFactory(Item[] items)
.filter(item -> item.getId() > -1)
.forEach(item -> {
ItemComposition comp = itemManager.getItemComposition(item.getId());
- lootList.add(new RaidTrackerItem() {
- {
- name = comp.getName();
- id = comp.getId();
- quantity = item.getQuantity();
- price = comp.getPrice() * quantity;
- }
- });
+ lootList.add(new RaidTrackerItem(comp.getName(), comp.getId(), item.getQuantity(),comp.getPrice() * item.getQuantity()));
});
return lootList;
}
- private void checkRaidPresence()
- {
- if (client.getGameState() != GameState.LOGGED_IN) {
- return;
- }
-
- raidTracker.setInRaidChambers(client.getVar(Varbits.IN_RAID) == 1);
- }
-
- private void checkTobPresence() {
- if (client.getGameState() != GameState.LOGGED_IN) {
- return;
- }
- //1 = in party outside, 2 = spectating, 3 = dead spectating
- raidTracker.setInTheatreOfBlood(client.getVar(Varbits.THEATRE_OF_BLOOD) > 1);
- }
-
- private int stringTimeToSeconds(String s)
+ public static int stringTimeToSeconds(String s)
{
String[] split = s.split(":");
return split.length == 3 ? parseInt(split[0]) * 3600 + parseInt(split[1]) * 60 + Math.round(parseFloat(split[2])) : parseInt(split[0]) * 60 + Math.round(parseFloat(split[1]));
}
- public RaidTracker copyData() {
- RaidTracker RT = new RaidTracker();
-
- RT.setDate(raidTracker.getDate());
- RT.setTeamSize(raidTracker.getTeamSize());
- RT.setChallengeMode(raidTracker.isChallengeMode());
- RT.setInTheatreOfBlood(raidTracker.isInTheatreOfBlood());
- RT.setCompletionCount(raidTracker.getCompletionCount());
- RT.setKillCountID(raidTracker.getKillCountID());
-
- return RT;
- }
-
private void reset()
{
raidTracker = new RaidTracker();
@@ -668,78 +472,5 @@ private void reset()
}
//from stackoverflow
- public String unescapeJavaString(String st) {
-
- if (st == null) {
- return null;
- }
-
- StringBuilder sb = new StringBuilder(st.length());
-
- for (int i = 0; i < st.length(); i++) {
- char ch = st.charAt(i);
- if (ch == '\\') {
- char nextChar = (i == st.length() - 1) ? '\\' : st
- .charAt(i + 1);
- // Octal escape?
- if (nextChar >= '0' && nextChar <= '7') {
- String code = "" + nextChar;
- i++;
- if ((i < st.length() - 1) && st.charAt(i + 1) >= '0'
- && st.charAt(i + 1) <= '7') {
- code += st.charAt(i + 1);
- i++;
- if ((i < st.length() - 1) && st.charAt(i + 1) >= '0'
- && st.charAt(i + 1) <= '7') {
- code += st.charAt(i + 1);
- i++;
- }
- }
- sb.append((char) Integer.parseInt(code, 8));
- continue;
- }
- switch (nextChar) {
- case '\\':
- ch = '\\';
- break;
- case 'b':
- ch = '\b';
- break;
- case 'f':
- ch = '\f';
- break;
- case 'n':
- ch = '\n';
- break;
- case 'r':
- ch = '\r';
- break;
- case 't':
- ch = '\t';
- break;
- case '\"':
- ch = '\"';
- break;
- case '\'':
- ch = '\'';
- break;
- // Hex Unicode: u????
- case 'u':
- if (i >= st.length() - 5) {
- ch = 'u';
- break;
- }
- int code = Integer.parseInt(
- "" + st.charAt(i + 2) + st.charAt(i + 3)
- + st.charAt(i + 4) + st.charAt(i + 5), 16);
- sb.append(Character.toChars(code));
- i += 5;
- continue;
- }
- i++;
- }
- sb.append(ch);
- }
- return sb.toString();
- }
+ public String unescapeJavaString(String st) {return uiUtils.unescapeJavaString(st);}
}
diff --git a/src/main/java/com/raidtracker/filereadwriter/FileReadWriter.java b/src/main/java/com/raidtracker/filereadwriter/FileReadWriter.java
index 4800dbe3..859921e6 100644
--- a/src/main/java/com/raidtracker/filereadwriter/FileReadWriter.java
+++ b/src/main/java/com/raidtracker/filereadwriter/FileReadWriter.java
@@ -1,103 +1,76 @@
package com.raidtracker.filereadwriter;
-import com.google.gson.*;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.google.gson.reflect.TypeToken;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonSyntaxException;
import com.raidtracker.RaidTracker;
-import com.raidtracker.RaidTrackerItem;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
-import static net.runelite.client.RuneLite.RUNELITE_DIR;
+import java.io.*;
+import java.util.ArrayList;
+import static net.runelite.client.RuneLite.RUNELITE_DIR;
@Slf4j
public class FileReadWriter {
@Getter
- private String username;
+ private String username = "Canvasba";
private String coxDir;
private String tobDir;
+ private String toaDir;
+
public void writeToFile(RaidTracker raidTracker)
{
- String dir;
-
- if (raidTracker.isInTheatreOfBlood()) {
- dir = tobDir;
- }
- else {
- dir = coxDir;
- }
- try
+ if (coxDir == null)
{
- log.info("writer started");
-
- //use json format so serializing and deserializing is easy
- Gson gson = new GsonBuilder().create();
-
- JsonParser parser = new JsonParser();
-
- String fileName = dir + "\\raid_tracker_data.log";
-
- FileWriter fw = new FileWriter(fileName,true); //the true will append the new data
-
- gson.toJson(parser.parse(getJSONString(raidTracker, gson, parser)), fw);
-
- fw.append("\n");
-
- fw.close();
- }
- catch(IOException ioe)
+ createFolders();
+ };
+ log.info("writer started");
+ ArrayList saved = readFromFile(raidTracker.getInRaidType());
+ boolean newrt = true;
+ int index = 0;
+ for (RaidTracker srt : saved)
{
- System.err.println("IOException: " + ioe.getMessage() + " in writeToFile");
- }
+ if (srt.getKillCountID().equalsIgnoreCase(raidTracker.getKillCountID()))
+ {
+ newrt = false;
+ saved.set(index, raidTracker);
+ };
+ index ++;
+ }
+ if (newrt)
+ {
+ saved.add(raidTracker);
+ };
+ updateRTList(saved, raidTracker.getInRaidType());
}
public String getJSONString(RaidTracker raidTracker, Gson gson, JsonParser parser)
{
- JsonObject RTJson = parser.parse(gson.toJson(raidTracker)).getAsJsonObject();
-
-
- List lootList = raidTracker.getLootList();
-
- //------------------ temporary fix until i can get gson.tojson to work for arraylist ---------
- JsonArray lootListToString = new JsonArray();
-
-
- for (RaidTrackerItem item : lootList) {
- lootListToString.add(parser.parse(gson.toJson(item, new TypeToken() {
- }.getType())));
- }
+ return gson.toJson(raidTracker);
+ };
- RTJson.addProperty("lootList", lootListToString.toString());
-
- //-------------------------------------------------------------------------------------------------------------
-
-// System.out.println(
-// gson.toJson(lootList, new TypeToken>(){}.getType())); //[null], raidtrackerplugin is added to the list of types, which is automatically set to skipserialize true -> null return;
-
-
-
- //massive bodge, works for now
- return RTJson.toString().replace("\\\"", "\"").replace("\"[", "[").replace("]\"", "]");
- }
-
- public ArrayList readFromFile(String alternateFile, boolean isTob)
+ public ArrayList readFromFile(String alternateFile, int raidType)
{
String dir;
-
- if (isTob) {
- dir = tobDir;
- }
- else {
- dir = coxDir;
+ switch (raidType)
+ {
+ case 0 : // chambers;
+ dir = coxDir;
+ break;
+ case 1: // Tob
+ dir = tobDir;
+ break;
+ case 2 :// toa
+ dir = toaDir;
+ break;
+ default:
+ throw new IllegalStateException("Unexpected value: " + raidType);
}
-
String fileName;
if (alternateFile.length() != 0) {
fileName = alternateFile;
@@ -122,7 +95,6 @@ public ArrayList readFromFile(String alternateFile, boolean isTob)
catch (JsonSyntaxException e) {
System.out.println("Bad line: " + line);
}
-
}
bufferedreader.close();
@@ -133,36 +105,39 @@ public ArrayList readFromFile(String alternateFile, boolean isTob)
}
}
- public ArrayList readFromFile() {
- return readFromFile("", false);
- }
+ public ArrayList readFromFile(int type) {
+ return readFromFile("", type);
- public ArrayList readFromFile(boolean isTob) {
- return readFromFile("", isTob);
}
public void createFolders()
{
- File dir = new File(RUNELITE_DIR, "raid-data tracker");
+ System.out.println("creating folders with name "+ username);
+ File dir = new File(RUNELITE_DIR, "raid-data-tracker");
IGNORE_RESULT(dir.mkdir());
dir = new File(dir, username);
IGNORE_RESULT(dir.mkdir());
File dir_cox = new File(dir, "cox");
File dir_tob = new File(dir, "tob");
+ File dir_toa = new File(dir, "toa");
IGNORE_RESULT(dir_cox.mkdir());
IGNORE_RESULT(dir_tob.mkdir());
+ IGNORE_RESULT(dir_toa.mkdir());
File newCoxFile = new File(dir_cox + "\\raid_tracker_data.log");
File newTobFile = new File(dir_tob + "\\raid_tracker_data.log");
+ File newToaFile = new File(dir_toa + "\\raid_tracker_data.log");
try {
IGNORE_RESULT(newCoxFile.createNewFile());
IGNORE_RESULT(newTobFile.createNewFile());
+ IGNORE_RESULT(newToaFile.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
this.coxDir = dir_cox.getAbsolutePath();
this.tobDir = dir_tob.getAbsolutePath();
+ this.toaDir = dir_toa.getAbsolutePath();
}
public void updateUsername(final String username) {
@@ -170,39 +145,40 @@ public void updateUsername(final String username) {
createFolders();
}
- public void updateRTList(ArrayList RTList, boolean isTob) {
+ public void updateRTList(ArrayList RTList, int type) {
String dir;
+ if (coxDir == null)
+ {
+ createFolders();
+ };
+ switch (type)
+ {
+ case 0 : // chambers;
+ dir = coxDir;
+ break;
+ case 1: // Tob
+ dir = tobDir;
+ break;
+ case 2 :// toa
+ dir = toaDir;
+ break;
+ default:
+ throw new IllegalStateException("Unexpected value: " + type);
+ };
- if (isTob) {
- dir = tobDir;
- }
- else {
- dir = coxDir;
- }
try {
Gson gson = new GsonBuilder().create();
JsonParser parser = new JsonParser();
-
String fileName = dir + "\\raid_tracker_data.log";
FileWriter fw = new FileWriter(fileName, false); //the true will append the new data
-
- for (RaidTracker RT : RTList) {
- if (RT.getLootSplitPaid() > 0) {
- RT.setSpecialLootInOwnName(true);
- }
- else {
- //bit of a wonky check, so try to avoid with lootsplitpaid if possible
- RT.setSpecialLootInOwnName(RT.getLootList().size() > 0 && RT.getLootList().get(0).getName().toLowerCase().equals(RT.getSpecialLoot().toLowerCase()));
- }
-
+ for (RaidTracker RT : RTList)
+ {
gson.toJson(parser.parse(getJSONString(RT, gson, parser)), fw);
-
fw.append("\n");
}
-
fw.close();
} catch (IOException e) {
@@ -210,19 +186,27 @@ public void updateRTList(ArrayList RTList, boolean isTob) {
}
}
- public void updateRTList(ArrayList RTList) {
- updateRTList(RTList, false);
- }
- public boolean delete(boolean isTob) {
+ public boolean delete(int type) {
String dir;
-
- if (isTob) {
- dir = tobDir;
- }
- else {
- dir = coxDir;
- }
+ if (coxDir == null)
+ {
+ createFolders();
+ };
+ switch (type)
+ {
+ case 0 : // chambers;
+ dir = coxDir;
+ break;
+ case 1: // Tob
+ dir = tobDir;
+ break;
+ case 2 :// toa
+ dir = toaDir;
+ break;
+ default:
+ throw new IllegalStateException("Unexpected value: " + type);
+ };
File newFile = new File(dir + "\\raid_tracker_data.log");
diff --git a/src/main/java/com/raidtracker/ui/RaidTrackerPanel.java b/src/main/java/com/raidtracker/ui/RaidTrackerPanel.java
index 09e330f9..6a5fddeb 100644
--- a/src/main/java/com/raidtracker/ui/RaidTrackerPanel.java
+++ b/src/main/java/com/raidtracker/ui/RaidTrackerPanel.java
@@ -1,13 +1,14 @@
package com.raidtracker.ui;
-import com.raidtracker.RaidTracker;
-import com.raidtracker.RaidTrackerConfig;
-import com.raidtracker.RaidTrackerItem;
+import com.raidtracker.*;
import com.raidtracker.filereadwriter.FileReadWriter;
+import com.raidtracker.utils.UniqueDrop;
+import com.raidtracker.utils.uiUtils;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
+import net.runelite.api.Client;
import net.runelite.api.ItemComposition;
import net.runelite.api.ItemID;
import net.runelite.client.callback.ClientThread;
@@ -17,6 +18,7 @@
import net.runelite.client.ui.PluginPanel;
import net.runelite.client.util.AsyncBufferedImage;
import net.runelite.client.util.ImageUtil;
+import org.apache.commons.lang3.ArrayUtils;
import javax.swing.*;
import javax.swing.border.CompoundBorder;
@@ -25,19 +27,15 @@
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
-import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.text.NumberFormat;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.ZoneId;
import java.util.*;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
import java.util.stream.Collectors;
-import static java.lang.Math.floor;
import static java.util.Comparator.comparing;
@Slf4j
@@ -48,13 +46,15 @@ public class RaidTrackerPanel extends PluginPanel {
private final FileReadWriter fw;
private final RaidTrackerConfig config;
private final ClientThread clientThread;
-
+ private final Client client;
+ private final uiUtils uiUtils = new uiUtils();
@Setter
private ArrayList RTList;
private ArrayList tobRTList;
-
+ private ArrayList toaRTList;
private final HashMap UUIDMap = new LinkedHashMap<>();
private final HashMap TobUUIDMap = new LinkedHashMap<>();
+ private final HashMap ToaUUIDMap = new LinkedHashMap<>();
@Setter
private boolean loaded = false;
@@ -65,16 +65,22 @@ public class RaidTrackerPanel extends PluginPanel {
@Setter
private String dateFilter = "All Time";
@Setter
- private String cmFilter = "CM & Normal";
+ private String cmFilter = "";
+
+ @Setter
+ private Integer cmIndex = -1;
+
@Setter
private String mvpFilter = "Both";
@Setter
private String teamSizeFilter = "All sizes";
- @Getter
- private boolean isTob = false;
+ @Setter
+ private int RaidIndex = 0;
+
- private JPanel regularDrops = new JPanel();
+ @Getter
+ private final boolean isTob = false;
@Getter
EnumSet tobUniques = EnumSet.of(
@@ -85,7 +91,10 @@ public class RaidTrackerPanel extends PluginPanel {
RaidUniques.JUSTI_CHESTGUARD,
RaidUniques.JUSTI_LEGGUARDS,
RaidUniques.SCYTHE,
- RaidUniques.LILZIK
+ RaidUniques.LILZIK,
+ RaidUniques.HOLY_KIT,
+ RaidUniques.SANG_DUST,
+ RaidUniques.SANG_KIT
);
@Getter
@@ -107,230 +116,139 @@ public class RaidTrackerPanel extends PluginPanel {
RaidUniques.OLMLET
);
+ @Getter
+ EnumSet toaUniques = EnumSet.of(
+ RaidUniques.GUARDIAN,
+ RaidUniques.SHADOW,
+ RaidUniques.ELIDNIS_WARD,
+ RaidUniques.MASORI_HEAD,
+ RaidUniques.MASORI_CHEST,
+ RaidUniques.MASORI_LEGS,
+ RaidUniques.FANG,
+ RaidUniques.LIGHTBEARER
+ );
- public RaidTrackerPanel(final ItemManager itemManager, FileReadWriter fw, RaidTrackerConfig config, ClientThread clientThread) {
+ public RaidTrackerPanel(final ItemManager itemManager, FileReadWriter fw, RaidTrackerConfig config, ClientThread clientThread, Client client) {
this.itemManager = itemManager;
this.fw = fw;
this.config = config;
this.clientThread = clientThread;
+ this.client = client;
panel.setBackground(ColorScheme.DARK_GRAY_COLOR);
-
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
add(panel, BorderLayout.NORTH);
-
- updateView();
+ reloadPanel(0);
}
- private void updateView() {
- panel.removeAll();
-
- JPanel title = getTitle();
- JPanel filterPanel = getFilterPanel();
- JPanel killsLoggedPanel = getKillsLoggedPanel();
- JPanel uniquesPanel = getUniquesPanel();
- JPanel pointsPanel = getPointsPanel();
- JPanel splitsEarnedPanel = getSplitsEarnedPanel();
- JPanel changePurples = getChangePurples();
- JPanel mvpPanel = getMvpPanel();
- JPanel timeSplitsPanel = getTimeSplitsPanel();
- if (config.showRegularDrops()) {
- SwingUtilities.invokeLater(() -> {
- regularDrops = getRegularDropsPanel();
-
- panel.removeAll();
-
- if (config.showTitle()) {
- panel.add(title);
- }
-
- if (config.showFilters()) {
- panel.add(filterPanel);
- }
-
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
+ private JPanel getHeader() {
+ final JPanel title = new JPanel();
+ title.setBorder(new EmptyBorder(3, 0, 10, 0));
+ title.setLayout(new BoxLayout(title,BoxLayout.Y_AXIS));
- if (config.showKillsLogged()) {
- panel.add(killsLoggedPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
- }
+ final JPanel buttonWrapper = new JPanel();
+ buttonWrapper.setLayout(new GridLayout(0,1));
+ buttonWrapper.setBorder(new EmptyBorder(5,0,0,0));
- if (config.showUniquesTable()) {
- panel.add(uniquesPanel, BorderLayout.CENTER);
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
- }
+ JComboBox raidType = new JComboBox<>(new String []{"Chambers Of Xeric", "Theatre of Blood", "Tombs of Amascot"});
+ raidType.setRenderer(new MyComboRenderer());
+ raidType.setFocusable(false);
+ raidType.setSelectedIndex(RaidIndex);
+ raidType.setPreferredSize(new Dimension(220,25));
+ buttonWrapper.add(raidType);
+ raidType.addActionListener(e -> {
+ RaidIndex = raidType.getSelectedIndex();
+ reloadPanel(raidType.getSelectedIndex());
+ });
- if (isTob && config.showMVPs()) {
- panel.add(mvpPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
- }
- else if (config.showPoints()){
- panel.add(pointsPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
- }
+ JPanel titleLabelWrapper = new JPanel();
+ JLabel titleLabel = new JLabel("Raids Data Tracker");
+ titleLabel.setForeground(Color.WHITE);
+ titleLabel.setBorder(new CompoundBorder(
+ new MatteBorder(0, 0, 1, 0, ColorScheme.LIGHT_GRAY_COLOR.darker()),
+ new EmptyBorder(0, 20, 5, 20)
+ ));
- if (config.showSplitGPEarned()) {
- panel.add(splitsEarnedPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 15)));
- }
+ titleLabelWrapper.add(titleLabel, BorderLayout.CENTER);
+ title.add(titleLabelWrapper);
+ title.add(buttonWrapper);
- if (config.showTimeSplits()) {
- panel.add(timeSplitsPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 15)));
- }
- if (config.showRegularDrops()) {
- panel.add(regularDrops);
- panel.add(Box.createRigidArea(new Dimension(0, 15)));
- }
+ panel.add(title);
- if (config.showSplitChanger()) {
- panel.add(changePurples);
- }
- panel.revalidate();
- panel.repaint();
- });
- }
+ return title;
+ }
- if (config.showTitle()) {
- panel.add(title);
- }
+ private void reloadPanel(int index) {
- if (config.showFilters()) {
- panel.add(filterPanel);
- }
+ panel.removeAll();
+ panel.setBorder(new EmptyBorder(5, 5, 5, 5));
+ JPanel title = getHeader();
+ panel.add(title);
+ panel.add(getFilterPanel());
panel.add(Box.createRigidArea(new Dimension(0, 5)));
-
- if (config.showKillsLogged()) {
- panel.add(killsLoggedPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
- }
-
- if (config.showUniquesTable()) {
- panel.add(uniquesPanel, BorderLayout.CENTER);
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
- }
-
- if (isTob && config.showMVPs()) {
- panel.add(mvpPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
- }
- else if (config.showPoints()){
- panel.add(pointsPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 5)));
- }
-
- if (config.showSplitGPEarned()) {
- panel.add(splitsEarnedPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 15)));
- }
-
- if (config.showTimeSplits()) {
- panel.add(timeSplitsPanel);
- panel.add(Box.createRigidArea(new Dimension(0, 15)));
- }
-
- if (config.showRegularDrops()) {
- panel.add(regularDrops);
- panel.add(Box.createRigidArea(new Dimension(0, 15)));
- }
-
- if (config.showSplitChanger()) {
- panel.add(changePurples);
+ panel.add(getKillsLoggedPanel());
+ panel.add(Box.createRigidArea(new Dimension(0, 5)));
+ switch (index) {
+ case 0 :
+ panel.add(getPointsPanel());
+ panel.add(Box.createRigidArea(new Dimension(0, 5)));
+ break;
+ case 1 :
+ panel.add(getMvpPanel());
+ panel.add(Box.createRigidArea(new Dimension(0, 5)));
+ break;
+ case 2 :
+ break;
+ default :
+ System.out.println("Error with user selection");
+ break;
}
-
+ panel.add(getUniquesPanel());
+ panel.add(Box.createRigidArea(new Dimension(0, 5)));
+ panel.add(getSplitsEarnedPanel());
+ panel.add(Box.createRigidArea(new Dimension(0, 5)));
+ panel.add(getTimeSplitsPanel());
+ panel.add(Box.createRigidArea(new Dimension(0, 5)));
+ panel.add(getRegularDropsPanel());
+ panel.add(Box.createRigidArea(new Dimension(0, 5)));
+ panel.add(getChangePurples());
panel.revalidate();
panel.repaint();
}
- private JPanel getTitle() {
- final JPanel title = new JPanel();
- title.setBorder(new EmptyBorder(3, 0, 10, 0));
- title.setLayout(new BoxLayout(title,BoxLayout.Y_AXIS));
-
-
- final JPanel buttonWrapper = new JPanel();
- buttonWrapper.setLayout(new GridLayout(0,2));
- buttonWrapper.setBorder(new EmptyBorder(5,0,0,0));
-
- JPanel coxButtonWrapper = new JPanel();
- coxButtonWrapper.setLayout(new GridLayout(0, 1));
- JButton coxButton = new JButton();
- coxButton.setText("Chambers of Xeric");
- coxButton.setForeground(Color.white);
- coxButton.setFont(FontManager.getRunescapeSmallFont());
- coxButton.setContentAreaFilled(false);
- coxButton.setOpaque(false);
- coxButton.setFocusable(false);
- coxButton.setBorderPainted(false);
- coxButton.setBorder(new EmptyBorder(10, 0, 10, 0));
-
- if (isTob) {
- coxButtonWrapper.setBorder(new MatteBorder(0, 0, 1, 0, ColorScheme.LIGHT_GRAY_COLOR.darker()));
- }
- else {
- coxButtonWrapper.setBorder(new MatteBorder(1, 1, 0, 1, ColorScheme.LIGHT_GRAY_COLOR.darker()));
- }
- coxButton.setFocusPainted(false);
- coxButton.setToolTipText("Show Chambers of Xeric Loot");
- coxButton.addActionListener(e -> {
- if (isTob) {
- isTob = false;
- updateView();
- }
- });
+ public int getRaidIndex() {
+ return this.RaidIndex;
+ }
- JPanel tobButtonWrapper = new JPanel();
- tobButtonWrapper.setLayout(new GridLayout(0, 1));
- JButton tobButton = new JButton();
- tobButton.setText("Theatre of Blood");
- tobButton.setForeground(Color.white);
- tobButton.setFont(FontManager.getRunescapeSmallFont());
- tobButton.setContentAreaFilled(false);
- tobButton.setFocusable(false);
- tobButton.setBorderPainted(false);
- tobButton.setBorder(new EmptyBorder(7, 0, 7, 0));
-
- if (isTob) {
- tobButtonWrapper.setBorder(new MatteBorder(1, 1, 0, 1, ColorScheme.LIGHT_GRAY_COLOR.darker()));
- coxButton.setOpaque(false);
- }
- else {
- tobButtonWrapper.setBorder(new MatteBorder(0, 0, 1, 0, ColorScheme.LIGHT_GRAY_COLOR.darker()));
- }
- tobButton.setFocusPainted(false);
- tobButton.setToolTipText("Show Theatre of Blood Loot");
- tobButton.addActionListener(e -> {
- if (!isTob) {
- isTob = true;
- updateView();
- }
- });
- coxButtonWrapper.add(coxButton);
- tobButtonWrapper.add(tobButton);
+ public final class MyComboRenderer extends JLabel implements ListCellRenderer