diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java index c8bd785eac..527123889b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java @@ -178,6 +178,16 @@ public interface RaidsConfig extends Config return false; } + @ConfigItem( + position = 1, + keyName = "ptsHr", + name = "Enable points per hour message", + description = "Enable the message" + ) + default boolean ptsHr() + { + return true; + } @ConfigItem( position = 16, keyName = "showRecommendedItems", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java new file mode 100644 index 0000000000..bfedc4b4dd --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPanel.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2018, Lyzrds + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.raids; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.lang.reflect.Method; +import javax.inject.Inject; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.ui.ColorScheme; +import net.runelite.client.ui.PluginPanel; + +public class RaidsPanel extends PluginPanel +{ + @Inject + private Client client; + @Inject + private RaidsPlugin raidsPlugin; + + @Inject + private ClientThread clientThread; + private JButton reloadButton = new JButton("Reload Instance"); + private JButton reloadScouter = new JButton("Reload Raid Overlay"); + private JLabel reloadMessage = new JLabel("

Instance Reload Helper

Reloading an instance will cause your client to disconnect temporarily.
"); + + void init(RaidsConfig config) + { + + // this may or may not qualify as a hack + // but this lets the editor pane expand to fill the whole parent panel + getParent().setLayout(new FlowLayout()); + getParent().add(this, BorderLayout.CENTER); + + setLayout(new BorderLayout()); + setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + setBackground(ColorScheme.DARK_GRAY_COLOR); + + JPanel reloadContainer = new JPanel(); + JPanel scouterContainer = new JPanel(); + JPanel buttons = new JPanel(); + reloadContainer.setLayout(new BorderLayout()); + buttons.setLayout(new BorderLayout()); + buttons.setBackground(ColorScheme.DARKER_GRAY_COLOR); + reloadContainer.setBackground(ColorScheme.DARKER_GRAY_COLOR); + scouterContainer.setLayout(new BorderLayout()); + scouterContainer.setBackground(ColorScheme.DARKER_GRAY_COLOR); + + JPanel reloadFrame = new JPanel(); + JPanel scoutFrame = new JPanel(); + reloadButton.addActionListener((ActionEvent e) -> + { + + + if ((client.getGameState() == GameState.LOGGED_IN)) + { + + try + { + //look for client.gameStateChanged(-1); in src files to find + Method m = client.getClass().getClassLoader().loadClass("jr").getDeclaredMethod("fn", int.class, int.class); + m.setAccessible(true); + m.invoke(null, 40, -1893789506); + + //Method m = client.getClass().getClassLoader().loadClass("jr").getDeclaredMethod("fn", int.class, int.class); + //m.setAccessible(true); + //m.invoke(null, 40, -1893789506); + //TODO: Since this is mainly for raids i'd like to reload the raids scouting plugin after the dc is finished + + } + catch (ReflectiveOperationException f) + { + throw new RuntimeException(f); + } + } + else + { + //TODO: User is still in a dc, or not logged in. Possibly provide a meaningful message somewhere. + } + }); + reloadScouter.addActionListener((ActionEvent e) -> + { + if ((client.getGameState() == GameState.LOGGED_IN)) + { + raidsPlugin.checkRaidPresence(true); + } + }); + + reloadFrame.add(reloadButton); + scoutFrame.add(reloadScouter); + reloadContainer.add(reloadFrame, BorderLayout.NORTH); + reloadContainer.add(scoutFrame, BorderLayout.SOUTH); + add(reloadMessage, BorderLayout.PAGE_START); + add(reloadContainer, BorderLayout.CENTER); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 79c4055264..5729d20cd6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -79,13 +79,16 @@ import net.runelite.client.plugins.PluginType; 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.ClientToolbar; import net.runelite.client.ui.DrawManager; import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.WidgetOverlay; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; import net.runelite.client.util.HotkeyListener; import org.apache.commons.lang3.StringUtils; @@ -174,12 +177,17 @@ public class RaidsPlugin extends Plugin @Getter private boolean inRaidChambers; + @Inject + private ClientToolbar clientToolbar; + private RaidsPanel panel; private int upperTime = -1; private int middleTime = -1; private int lowerTime = -1; private int raidTime = -1; private WidgetOverlay widgetOverlay; private String tooltip; + public boolean canShow; + private NavigationButton navButton; @Provides RaidsConfig provideConfig(ConfigManager configManager) @@ -201,6 +209,16 @@ public class RaidsPlugin extends Plugin updateLists(); clientThread.invokeLater(() -> checkRaidPresence(true)); widgetOverlay = overlayManager.getWidgetOverlay(WidgetInfo.RAIDS_POINTS_INFOBOX); + panel = injector.getInstance(RaidsPanel.class); + panel.init(config); + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(this.getClass(), "instancereloadhelper.png"); + navButton = NavigationButton.builder() + .tooltip("Raids Reload") + .icon(icon) + .priority(8) + .panel(panel) + .build(); + clientToolbar.addNavigation(navButton); } @Override @@ -208,6 +226,7 @@ public class RaidsPlugin extends Plugin { overlayManager.remove(overlay); overlayManager.remove(pointsOverlay); + clientToolbar.removeNavigation(navButton); inRaidChambers = false; widgetOverlay = null; raid = null; @@ -286,12 +305,14 @@ public class RaidsPlugin extends Plugin if (matcher.find()) { raidTime = timeToSeconds(matcher.group(1)); + int timesec = timeToSeconds(matcher.group(1)); updateTooltip(); if (config.pointsMessage()) { int totalPoints = client.getVar(Varbits.TOTAL_POINTS); int personalPoints = client.getVar(Varbits.PERSONAL_POINTS); + int partySize = client.getVar(Varbits.RAID_PARTY_SIZE); double percentage = personalPoints / (totalPoints / 100.0); @@ -316,6 +337,52 @@ public class RaidsPlugin extends Plugin .type(ChatMessageType.FRIENDSCHATNOTIFICATION) .runeLiteFormattedMessage(chatMessage) .build()); + if (config.ptsHr()) + { + String ptssolo; + { + ptssolo = POINTS_FORMAT.format(((float) personalPoints / (float) timesec) * 3600); + } + + String ptsteam; + { + ptsteam = POINTS_FORMAT.format(((float) totalPoints / (float) timesec) * 3600); + } + + String ptssplit; + { + ptssplit = POINTS_FORMAT.format(((float) (totalPoints / (float) timesec) * 3600) / (partySize)); + } + + + String chatMessage2 = new ChatMessageBuilder() + .append(ChatColorType.NORMAL) + .append("Solo Pts/Hr: ") + .append(ChatColorType.HIGHLIGHT) + .append(ptssolo) + .append(ChatColorType.NORMAL) + .append("Team Pts/Hr: ") + .append(ChatColorType.HIGHLIGHT) + .append(ptsteam) + .build(); + + chatMessageManager.queue(QueuedMessage.builder() + .type(ChatMessageType.FRIENDSCHATNOTIFICATION) + .runeLiteFormattedMessage(chatMessage2) + .build()); + + String chatMessage3 = new ChatMessageBuilder() + .append(ChatColorType.NORMAL) + .append("Split Pts/Hr: ") + .append(ChatColorType.HIGHLIGHT) + .append(ptssplit) + .build(); + + chatMessageManager.queue(QueuedMessage.builder() + .type(ChatMessageType.FRIENDSCHATNOTIFICATION) + .runeLiteFormattedMessage(chatMessage3) + .build()); + } } } } @@ -338,7 +405,7 @@ public class RaidsPlugin extends Plugin } } - private void checkRaidPresence(boolean force) + public void checkRaidPresence(boolean force) { if (client.getGameState() != GameState.LOGGED_IN) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java index 3c2cc3e5f1..5e4c98f4c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java @@ -104,16 +104,17 @@ public class RaidsPointsOverlay extends Overlay .left("Unique:") .right(UNIQUE_FORMAT.format(uniqueChance)) .build()); - + //TODO this is annoyingly bugged, personalpoints returns null for some reason +/* if (partySize > 1) { - double personalChance = uniqueChance * (personalPoints / totalPoints); + double personalChance = uniqueChance * (double)(personalPoints / totalPoints); - panel.getChildren().add(LineComponent.builder() + panel.getChildren().add(LineComponent.builder() .left("Personal:") .right(UNIQUE_FORMAT.format(personalChance)) .build()); - } + }*/ return panel.render(graphics); } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/raids/instancereloadhelper.png b/runelite-client/src/main/resources/net/runelite/client/plugins/raids/instancereloadhelper.png new file mode 100644 index 0000000000..13109b4b26 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/raids/instancereloadhelper.png differ