spec plugin: share specs with party

Co-authored-by: 15987632 <trevorguidry6@gmail.com>
This commit is contained in:
Adam
2019-03-24 15:59:54 -04:00
parent 57b600a257
commit fb2fdadbc5
3 changed files with 158 additions and 13 deletions

View File

@@ -25,15 +25,18 @@
package net.runelite.client.plugins.specialcounter;
import java.awt.image.BufferedImage;
import java.util.Map;
import net.runelite.client.ui.overlay.infobox.Counter;
class SpecialCounter extends Counter
{
private final SpecialCounterPlugin plugin;
private SpecialWeapon weapon;
SpecialCounter(BufferedImage image, SpecialCounterPlugin plugin, int hitValue, SpecialWeapon weapon)
{
super(image, plugin, hitValue);
this.plugin = plugin;
this.weapon = weapon;
}
@@ -46,7 +49,29 @@ class SpecialCounter extends Counter
@Override
public String getTooltip()
{
Map<String, Integer> partySpecs = plugin.getPartySpecs();
int hitValue = getCount();
if (partySpecs.isEmpty())
{
return buildTooltip(hitValue);
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(buildTooltip(hitValue));
for (Map.Entry<String, Integer> entry : partySpecs.entrySet())
{
stringBuilder.append("</br>")
.append(entry.getKey() == null ? "You" : entry.getKey()).append(": ")
.append(buildTooltip(entry.getValue()));
}
return stringBuilder.toString();
}
private String buildTooltip(int hitValue)
{
if (!weapon.isDamage())
{
if (hitValue == 1)

View File

@@ -24,9 +24,13 @@
*/
package net.runelite.client.plugins.specialcounter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import lombok.AccessLevel;
import lombok.Getter;
import net.runelite.api.Actor;
import net.runelite.api.Client;
import net.runelite.api.EquipmentInventorySlot;
@@ -42,11 +46,14 @@ import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.NpcDespawned;
import net.runelite.api.events.VarbitChanged;
import net.runelite.client.callback.ClientThread;
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.overlay.infobox.InfoBoxManager;
import net.runelite.client.ws.PartyService;
import net.runelite.client.ws.WSClient;
@PluginDescriptor(
name = "Special Attack Counter",
@@ -65,20 +72,38 @@ public class SpecialCounterPlugin extends Plugin
private SpecialWeapon specialWeapon;
private final Set<Integer> interactedNpcIds = new HashSet<>();
private final SpecialCounter[] specialCounter = new SpecialCounter[SpecialWeapon.values().length];
@Getter(AccessLevel.PACKAGE)
private final Map<String, Integer> partySpecs = new HashMap<>();
@Inject
private Client client;
@Inject
private ClientThread clientThread;
@Inject
private WSClient wsClient;
@Inject
private PartyService party;
@Inject
private InfoBoxManager infoBoxManager;
@Inject
private ItemManager itemManager;
@Override
protected void startUp()
{
wsClient.registerMessage(SpecialCounterUpdate.class);
}
@Override
protected void shutDown()
{
removeCounters();
wsClient.unregisterMessage(SpecialCounterUpdate.class);
}
@Subscribe
@@ -139,7 +164,16 @@ public class SpecialCounterPlugin extends Plugin
{
if (specialWeapon != null)
{
updateCounter(specialWeapon, deltaExperience);
int hit = getHit(specialWeapon, deltaExperience);
updateCounter(specialWeapon, null, hit);
if (!party.getMembers().isEmpty())
{
final SpecialCounterUpdate specialCounterUpdate = new SpecialCounterUpdate(interactingId, specialWeapon, hit);
specialCounterUpdate.setMemberId(party.getLocalMember().getMemberId());
wsClient.send(specialCounterUpdate);
}
}
}
}
@@ -157,16 +191,7 @@ public class SpecialCounterPlugin extends Plugin
if (!interactedNpcIds.contains(interactingId))
{
removeCounters();
modifier = 1d;
interactedNpcIds.add(interactingId);
final Boss boss = Boss.getBoss(interactingId);
if (boss != null)
{
modifier = boss.getModifier();
interactedNpcIds.addAll(boss.getIds());
}
addInteracting(interactingId);
}
return interactingId;
@@ -175,6 +200,20 @@ public class SpecialCounterPlugin extends Plugin
return -1;
}
private void addInteracting(int npcId)
{
modifier = 1d;
interactedNpcIds.add(npcId);
// Add alternate forms of bosses
final Boss boss = Boss.getBoss(npcId);
if (boss != null)
{
modifier = boss.getModifier();
interactedNpcIds.addAll(boss.getIds());
}
}
@Subscribe
public void onNpcDespawned(NpcDespawned npcDespawned)
{
@@ -186,6 +225,36 @@ public class SpecialCounterPlugin extends Plugin
}
}
@Subscribe
public void onSpecialCounterUpdate(SpecialCounterUpdate event)
{
if (party.getLocalMember().getMemberId().equals(event.getMemberId()))
{
return;
}
String name = party.getMemberById(event.getMemberId()).getName();
if (name == null)
{
return;
}
clientThread.invoke(() ->
{
// If not interacting with any npcs currently, add to interacting list
if (interactedNpcIds.isEmpty())
{
addInteracting(event.getNpcId());
}
// Otherwise we only add the count if it is against a npc we are already tracking
if (interactedNpcIds.contains(event.getNpcId()))
{
updateCounter(event.getWeapon(), name, event.getHit());
}
});
}
private SpecialWeapon usedSpecialWeapon()
{
ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT);
@@ -214,10 +283,9 @@ public class SpecialCounterPlugin extends Plugin
return null;
}
private void updateCounter(SpecialWeapon specialWeapon, int deltaExperience)
private void updateCounter(SpecialWeapon specialWeapon, String name, int hit)
{
SpecialCounter counter = specialCounter[specialWeapon.ordinal()];
int hit = getHit(specialWeapon, deltaExperience);
if (counter == null)
{
@@ -230,11 +298,25 @@ public class SpecialCounterPlugin extends Plugin
{
counter.addHits(hit);
}
// If in a party, add hit to partySpecs for the infobox tooltip
if (!party.getMembers().isEmpty())
{
if (partySpecs.containsKey(name))
{
partySpecs.put(name, hit + partySpecs.get(name));
}
else
{
partySpecs.put(name, hit);
}
}
}
private void removeCounters()
{
interactedNpcIds.clear();
partySpecs.clear();
for (int i = 0; i < specialCounter.length; ++i)
{

View File

@@ -0,0 +1,38 @@
/*
* Copyright (c) 2019, Trevor <https://github.com/15987632>
* 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.specialcounter;
import lombok.EqualsAndHashCode;
import lombok.Value;
import net.runelite.http.api.ws.messages.party.PartyMemberMessage;
@Value
@EqualsAndHashCode(callSuper = true)
public class SpecialCounterUpdate extends PartyMemberMessage
{
private final int npcId;
private final SpecialWeapon weapon;
private final int hit;
}