From 78bf68e03639bd0f7be733e9ae794f3bfe6c68eb Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 May 2019 19:56:47 -0400 Subject: [PATCH 1/3] chat: ensure queued messages are always cleared after adding Mark queued message type as non null because addChatMessage will throw if it is. This was causing the client to get stuck trying to add the same broken message each loop. --- .../net/runelite/client/chat/ChatMessageManager.java | 10 ++++++++-- .../java/net/runelite/client/chat/QueuedMessage.java | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java index bc0d3bc58a..da4c222fd6 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java @@ -548,8 +548,14 @@ public class ChatMessageManager { if (!queuedMessages.isEmpty()) { - queuedMessages.forEach(this::add); - queuedMessages.clear(); + try + { + queuedMessages.forEach(this::add); + } + finally + { + queuedMessages.clear(); + } } } diff --git a/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java b/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java index 9c88826af7..f89ce84b43 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java @@ -26,12 +26,14 @@ package net.runelite.client.chat; import lombok.Builder; import lombok.Data; +import lombok.NonNull; import net.runelite.api.ChatMessageType; @Data @Builder public class QueuedMessage { + @NonNull private final ChatMessageType type; private final String value; private String name; From e18652f517e0f49d6a7b6d98875eacd9e1e783e0 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 May 2019 19:59:11 -0400 Subject: [PATCH 2/3] party plugin: add partyinfo debug command --- .../client/plugins/party/PartyPlugin.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java index b824f17157..2d7bddc3a6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java @@ -37,6 +37,7 @@ import java.util.Map; import java.util.UUID; import javax.annotation.Nullable; import javax.inject.Inject; +import javax.inject.Named; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; @@ -48,6 +49,7 @@ import net.runelite.api.Skill; import net.runelite.api.SoundEffectID; import net.runelite.api.Tile; import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.CommandExecuted; import net.runelite.api.events.FocusChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.MenuOptionClicked; @@ -120,6 +122,10 @@ public class PartyPlugin extends Plugin implements KeyListener @Inject private ChatMessageManager chatMessageManager; + @Inject + @Named("developerMode") + boolean developerMode; + @Getter private final Map partyDataMap = Collections.synchronizedMap(new HashMap<>()); @@ -448,6 +454,23 @@ public class PartyPlugin extends Plugin implements KeyListener worldMapManager.removeIf(PartyWorldMapPoint.class::isInstance); } + @Subscribe + public void onCommandExecuted(CommandExecuted commandExecuted) + { + if (!developerMode || !commandExecuted.getCommand().equals("partyinfo")) + { + return; + } + + chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE).value("Party " + party.getPartyId()).build()); + chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE).value("Local Party " + party.getLocalPartyId()).build()); + chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE).value("Local ID " + party.getLocalMember().getMemberId()).build()); + for (PartyMember partyMember : party.getMembers()) + { + chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE).value(" " + partyMember.getName() + " " + partyMember.getMemberId()).build()); + } + } + @Nullable PartyData getPartyData(final UUID uuid) { From 7e6476ce6702acd7ea3d496657d5d4e7a46434f2 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 May 2019 19:59:51 -0400 Subject: [PATCH 3/3] party service: check joins are for the current party The server can resume party membership on handshake to parties other than the current client party (eg. if the client is restarted or for any other reason the current party changes). This desyncs otherwise if the joins aren't checked to be in the current party. --- .../net/runelite/http/api/ws/messages/party/UserJoin.java | 1 + .../src/main/java/net/runelite/client/ws/PartyService.java | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserJoin.java b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserJoin.java index 81abe76827..7f940e8060 100644 --- a/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserJoin.java +++ b/http-api/src/main/java/net/runelite/http/api/ws/messages/party/UserJoin.java @@ -34,5 +34,6 @@ import net.runelite.http.api.ws.WebsocketMessage; public class UserJoin extends WebsocketMessage { private final UUID memberId; + private final UUID partyId; private final String name; } diff --git a/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java b/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java index 47e9c18148..caec527320 100644 --- a/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java +++ b/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java @@ -114,6 +114,13 @@ public class PartyService @Subscribe public void onUserJoin(final UserJoin message) { + if (!partyId.equals(message.getPartyId())) + { + // This can happen when a session is resumed server side after the client party + // changes when disconnected. + return; + } + final PartyMember partyMember = new PartyMember(message.getMemberId(), message.getName()); members.add(partyMember);