diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java index 0af71d34eb..71705f064e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java @@ -1,19 +1,24 @@ package net.runelite.client.plugins.dpscounter; -import com.google.inject.Binder; import com.google.inject.Inject; +import com.google.inject.Provides; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import lombok.AccessLevel; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.Actor; import net.runelite.api.Client; +import net.runelite.api.MenuAction; import net.runelite.api.NPC; import net.runelite.api.Player; import net.runelite.api.Skill; import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.InteractingChanged; +import net.runelite.api.events.NpcDespawned; +import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.OverlayMenuClicked; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; @@ -24,8 +29,8 @@ import net.runelite.client.ws.WSClient; @PluginDescriptor( name = "DPS Counter", description = "counts dps?" -// ) +@Slf4j public class DpsCounterPlugin extends Plugin { private int lastXp = -1; @@ -50,10 +55,10 @@ public class DpsCounterPlugin extends Plugin @Getter(AccessLevel.PACKAGE) private final Map members = new ConcurrentHashMap<>(); - @Override - public void configure(Binder binder) + @Provides + DpsConfig provideConfig(ConfigManager configManager) { - //super.configure(binder); + return configManager.getConfig(DpsConfig.class); } @Override @@ -61,7 +66,6 @@ public class DpsCounterPlugin extends Plugin { overlayManager.add(dpsOverlay); wsClient.registerMessage(DpsUpdate.class); - //super.startUp(); } @Override @@ -70,25 +74,28 @@ public class DpsCounterPlugin extends Plugin wsClient.unregisterMessage(DpsUpdate.class); overlayManager.remove(dpsOverlay); boss = null; - //super.shutDown(); } @Subscribe - public void onInteractingChanged(InteractingChanged interactingChanged) { + public void onInteractingChanged(InteractingChanged interactingChanged) + { Actor source = interactingChanged.getSource(); Actor target = interactingChanged.getTarget(); - if (source != client.getLocalPlayer()) { + if (source != client.getLocalPlayer()) + { return; } - if (target instanceof NPC) { + if (target instanceof NPC) + { int npcId = ((NPC) target).getId(); Boss boss = Boss.findBoss(npcId); - if (boss != null) { + if (boss != null) + { this.boss = boss; npc = (NPC) target; - // boss = Boss.ABYSSAL_SIRE; + // boss = Boss.ABYSSAL_SIRE; } } } @@ -110,7 +117,6 @@ public class DpsCounterPlugin extends Plugin final int delta = xp - lastXp; final int hit = getHit(boss.getModifier(), delta); -// final int hit = getHit(1.0f, delta); lastXp = xp; // Update local member @@ -120,7 +126,6 @@ public class DpsCounterPlugin extends Plugin final String name = localMember == null ? player.getName() : localMember.getName(); DpsMember dpsMember = members.computeIfAbsent(name, n -> new DpsMember(name)); dpsMember.addDamage(hit); -// System.out.println("HIT "+ hit); if (hit > 0 && !partyService.getMembers().isEmpty()) { @@ -135,7 +140,8 @@ public class DpsCounterPlugin extends Plugin } @Subscribe - public void onDpsUpdate(DpsUpdate dpsUpdate) { + public void onDpsUpdate(DpsUpdate dpsUpdate) + { if (partyService.getLocalMember().getMemberId().equals(dpsUpdate.getMemberId())) { return; @@ -147,9 +153,36 @@ public class DpsCounterPlugin extends Plugin return; } + // Hmm - not attacking the same boss I am + if (npc == null || dpsUpdate.getNpcId() != npc.getId()) + { + return; + } + DpsMember dpsMember = members.computeIfAbsent(name, DpsMember::new); dpsMember.addDamage(dpsUpdate.getHit()); + } + @Subscribe + public void onOverlayMenuClicked(OverlayMenuClicked event) + { + if (event.getEntry().getMenuAction() == MenuAction.RUNELITE_OVERLAY && + event.getEntry().getTarget().equals("Reset") && + event.getEntry().getOption().equals("DPS counter")) + { + members.clear(); + } + } + + @Subscribe + public void onNpcDespawned(NpcDespawned npcDespawned) + { + if (npc == null || npcDespawned.getNpc() != npc || !npc.isDead()) + { + return; + } + + log.debug("Boss has died!"); } private int getHit(float modifier, int deltaExperience) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsMember.java b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsMember.java index 1a68d06e51..b83425834b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsMember.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsMember.java @@ -10,6 +10,7 @@ class DpsMember { private final String name; private Instant start = Instant.now(); + private Instant end; private int damage; void addDamage(int amount) @@ -17,10 +18,20 @@ class DpsMember damage += amount; } - int getDps() + float getDps() { - int diff = (int) (Instant.now().toEpochMilli() - start.toEpochMilli()) / 1000; - if (diff == 0) return 0; - return (int) ((float) damage / (float) diff); + Instant now = end == null ? Instant.now() : end; + int diff = (int) (now.toEpochMilli() - start.toEpochMilli()) / 1000; + if (diff == 0) + { + return 0; + } + + return (float) damage / (float) diff; + } + + void pause() + { + end = Instant.now(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsOverlay.java index 42254ab92e..52fe67dd6e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsOverlay.java @@ -2,9 +2,12 @@ package net.runelite.client.plugins.dpscounter; import java.awt.Dimension; import java.awt.Graphics2D; +import java.text.DecimalFormat; import java.util.Map; import javax.inject.Inject; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; @@ -12,62 +15,52 @@ import net.runelite.client.ws.PartyService; public class DpsOverlay extends Overlay { + private static final DecimalFormat DPS_FORMAT = new DecimalFormat("#0.0"); + private final DpsCounterPlugin dpsCounterPlugin; + private final DpsConfig dpsConfig; private final PartyService partyService; private final PanelComponent panelComponent = new PanelComponent(); @Inject - DpsOverlay(DpsCounterPlugin dpsCounterPlugin, PartyService partyService) + DpsOverlay(DpsCounterPlugin dpsCounterPlugin, DpsConfig dpsConfig, PartyService partyService) { super(dpsCounterPlugin); this.dpsCounterPlugin = dpsCounterPlugin; + this.dpsConfig = dpsConfig; this.partyService = partyService; - //setPosition(OverlayPosition.TOP_LEFT); + getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, "Reset", "DPS counter")); } @Override public Dimension render(Graphics2D graphics) { Map dpsMembers = dpsCounterPlugin.getMembers(); + if (dpsMembers.isEmpty()) + { + return null; + } + + boolean inParty = !partyService.getMembers().isEmpty(); + boolean showDamage = dpsConfig.showDamage(); panelComponent.getChildren().clear(); + panelComponent.getChildren().add( TitleComponent.builder() - .text("DPS") - //olor(HIGHLIGHT_COLOR) + .text(inParty ? "Party DPS" : "DPS") .build()); -// panelComponent.getChildren().add( -// LineComponent.builder() -// .left("Player") -// // .leftColor(HIGHLIGHT_COLOR) -// .right("DPS") -// // .rightColor(HIGHLIGHT_COLOR) -// .build()); - - for (DpsMember dpsMember : dpsMembers.values()) { + for (DpsMember dpsMember : dpsMembers.values()) + { panelComponent.getChildren().add( LineComponent.builder() .left(dpsMember.getName()) - .right(Integer.toString(dpsMember.getDps())) - //.right(Integer.toString(playerSkillLevel) + "/" + Integer.toString(opponentSkillLevel)) - //.rightColor(comparisonStatColor(playerSkillLevel, opponentSkillLevel)) + .right(showDamage ? Integer.toString(dpsMember.getDamage()) : DPS_FORMAT.format(dpsMember.getDps())) .build()); } - //partyService.getMemberByName() -// for (PartyMember member : partyService.getMembers()) { -// DpsMember dpsMember = dpsMembers.get(member.getName()); -// if (dpsMember == null) continue; -// panelComponent.getChildren().add( -// LineComponent.builder() -// .left(member.getName()) -// .right(Integer.toString(dpsMember.getDps())) -// //.right(Integer.toString(playerSkillLevel) + "/" + Integer.toString(opponentSkillLevel)) -// //.rightColor(comparisonStatColor(playerSkillLevel, opponentSkillLevel)) -// .build()); -// } return panelComponent.render(graphics); } }