diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java index 5d294709b8..d106d6cab1 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -332,4 +332,23 @@ public final class ScriptID */ @ScriptArguments(integer = 4) public static final int WIKI_ICON_UPDATE = 3306; + + /** + * Builds a line in the chatbox when there is no username: prefix, such as + * a game or system message + */ + @ScriptArguments(integer = 11, string = 1) + public static final int CHATBOX_BUILD_LINE_WITHOUT_USER = 199; + + /** + * Builds a line in the chatbox when there is a username: prefix + */ + @ScriptArguments(integer = 11, string = 2) + public static final int CHATBOX_BUILD_LINE_WITH_USER = 203; + + /** + * Builds a line in the chatbox when it from a clan + */ + @ScriptArguments(integer = 14, string = 3) + public static final int CHATBOX_BUILD_LINE_WITH_CLAN = 4483; } \ No newline at end of file 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 855b69f4cb..17502740ed 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 @@ -196,12 +196,14 @@ public class ChatMessageManager { final String eventName = scriptCallbackEvent.getEventName(); + boolean wrap; switch (eventName) { - case "privateChatFrom": - case "privateChatTo": - case "privateChatSplitFrom": - case "privateChatSplitTo": + case "splitPrivChatUsernameColor": + wrap = false; + break; + case "privChatUsername": + wrap = true; break; default: return; @@ -216,10 +218,17 @@ public class ChatMessageManager final String[] stringStack = client.getStringStack(); final int stringStackSize = client.getStringStackSize(); - - // Stack is: To/From playername : - String toFrom = stringStack[stringStackSize - 3]; - stringStack[stringStackSize - 3] = ColorUtil.prependColorTag(toFrom, usernameColor); + + String fromToUsername = stringStack[stringStackSize - 1]; + if (wrap) + { + fromToUsername = ColorUtil.wrapWithColorTag(fromToUsername, usernameColor); + } + else + { + fromToUsername = ColorUtil.colorTag(usernameColor); + } + stringStack[stringStackSize - 1] = fromToUsername; } private static Color getDefaultColor(ChatMessageType type, boolean transparent) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java index f49a4be15f..1ab3510d7e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java @@ -36,7 +36,9 @@ import javax.inject.Inject; import lombok.Getter; import net.runelite.api.Client; import net.runelite.api.MessageNode; +import net.runelite.api.ScriptID; import net.runelite.api.Varbits; +import net.runelite.api.events.ScriptPreFired; import net.runelite.client.events.ConfigChanged; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.config.ConfigManager; @@ -62,6 +64,8 @@ public class TimestampPlugin extends Plugin @Getter private SimpleDateFormat formatter; + private MessageNode currentlyBuildingMessage = null; + @Provides public TimestampConfig provideConfig(final ConfigManager configManager) { @@ -90,32 +94,59 @@ public class TimestampPlugin extends Plugin } @Subscribe - public void onScriptCallbackEvent(ScriptCallbackEvent event) + private void onScriptCallbackEvent(ScriptCallbackEvent event) { - if (!event.getEventName().equals("addTimestamp")) + if (!"chatMessageBuilding".equals(event.getEventName())) { return; } - int[] intStack = client.getIntStack(); - int intStackSize = client.getIntStackSize(); + int uid = client.getIntStack()[client.getIntStackSize() - 1]; + currentlyBuildingMessage = client.getMessages().get(uid); + } + + @Subscribe + private void onScriptPreFired(ScriptPreFired ev) + { + int numStringArgs; + int messagePrefixArg = 0; + switch (ev.getScriptId()) + { + case ScriptID.CHATBOX_BUILD_LINE_WITHOUT_USER: + numStringArgs = 1; + break; + case ScriptID.CHATBOX_BUILD_LINE_WITH_USER: + numStringArgs = 2; + break; + case ScriptID.CHATBOX_BUILD_LINE_WITH_CLAN: + numStringArgs = 3; + break; + default: + return; + } + + if (currentlyBuildingMessage == null) + { + return; + } + + MessageNode messageNode = currentlyBuildingMessage; + currentlyBuildingMessage = null; String[] stringStack = client.getStringStack(); - int stringStackSize = client.getStringStackSize(); - - int messageId = intStack[intStackSize - 1]; - - MessageNode messageNode = client.getMessages().get(messageId); + int stringArgStart = client.getStringStackSize() - numStringArgs; String timestamp = generateTimestamp(messageNode.getTimestamp(), ZoneId.systemDefault()) + " "; - + Color timestampColour = getTimestampColour(); if (timestampColour != null) { timestamp = ColorUtil.wrapWithColorTag(timestamp, timestampColour); } - - stringStack[stringStackSize - 1] = timestamp; + + String segment = stringStack[stringArgStart + messagePrefixArg]; + segment = timestamp + segment; + stringStack[stringArgStart + messagePrefixArg] = segment; } private Color getTimestampColour() diff --git a/runelite-client/src/main/scripts/ChatBuilder.rs2asm b/runelite-client/src/main/scripts/ChatBuilder.rs2asm index d6d3c097b2..e2c2c23fd3 100644 --- a/runelite-client/src/main/scripts/ChatBuilder.rs2asm +++ b/runelite-client/src/main/scripts/ChatBuilder.rs2asm @@ -288,6 +288,10 @@ LABEL245: if_icmpeq LABEL256 jump LABEL1266 LABEL256: + iload 10 ; message uid + sconst "chatMessageBuilding" + runelite_callback + pop_int ; pop uid iload 11 switch 1: LABEL259 @@ -312,14 +316,9 @@ LABEL256: 91: LABEL280 jump LABEL928 LABEL259: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sload 12 sconst ":" - join_string 3 ; + 1 for timestamp + join_string 2 sload 1 sload 14 sconst "" @@ -339,14 +338,9 @@ LABEL259: istore 7 jump LABEL942 LABEL280: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sload 12 sconst ":" - join_string 3 ; + 1 for timestamp + join_string 2 sload 3 sload 14 sconst "" @@ -366,17 +360,12 @@ LABEL280: istore 7 jump LABEL942 LABEL301: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sconst "From " sload 12 sconst ":" - sconst "privateChatFrom" - runelite_callback ; for prepending color tags - join_string 4 ; + 1 for timestamp + join_string 3 + sconst "privChatUsername" + runelite_callback sload 2 sload 14 sconst "" @@ -396,15 +385,10 @@ LABEL301: istore 7 jump LABEL942 LABEL323: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sload 9 sload 14 sconst "" - join_string 4 ; + 1 for timestamp + join_string 3 iload 8 iload 9 iconst 10616888 @@ -420,15 +404,10 @@ LABEL323: istore 7 jump LABEL942 LABEL341: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sload 2 sload 14 sconst "" - join_string 4 ; + 1 for timestamp + join_string 3 iload 8 iload 9 iconst 10616888 @@ -461,17 +440,12 @@ LABEL362: LABEL373: jump LABEL942 LABEL374: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sconst "To " sload 12 sconst ":" - sconst "privateChatTo" - runelite_callback ; for chat recolors - join_string 4 ; + 1 for timestamp + join_string 3 + sconst "privChatUsername" + runelite_callback sload 2 sload 14 sconst "" @@ -529,11 +503,6 @@ LABEL414: istore 7 jump LABEL942 LABEL432: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sconst "[" sload 5 sload 13 @@ -541,7 +510,7 @@ LABEL432: sconst "] " sload 12 sconst ":" - join_string 8 ; + 1 for time stamp + join_string 7 sload 6 sload 14 sconst "" @@ -623,17 +592,12 @@ LABEL485: istore 7 jump LABEL548 LABEL515: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sconst "[" sload 7 sload 13 sconst "" sconst "]" - join_string 6 ; + 1 for timestamp + join_string 5 iconst -1 iconst 0 iconst 0 @@ -1003,13 +967,7 @@ LABEL845: LABEL864: jump LABEL942 LABEL865: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sload 14 - join_string 2 invoke 2066 istore 13 sstore 15 @@ -1077,13 +1035,7 @@ LABEL913: LABEL927: jump LABEL942 LABEL928: - iload 10 ; The id of the messageNode of the message being built - sconst "" - sconst "addTimestamp" - runelite_callback - pop_int ; pop message id sload 14 - join_string 2 ; prepend the timestamp iload 8 iload 9 iconst 10616888 diff --git a/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm b/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm index 96519f314c..6a13c2d8af 100644 --- a/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm +++ b/runelite-client/src/main/scripts/ChatSplitBuilder.rs2asm @@ -400,6 +400,10 @@ CHAT_FILTER: if_icmpeq LABEL356 ; Check if we are building this message jump LABEL530 LABEL356: + iload 12 ; message uid + sconst "chatMessageBuilding" + runelite_callback + pop_int iload 17 switch 3: LABEL359 @@ -409,19 +413,14 @@ LABEL356: jump LABEL446 LABEL359: iload 7 - iload 12 ; Load the id of the messageNode - sconst "" ; Push a container for the timestamp - sconst "addTimestamp" ; Push event name - runelite_callback ; Invoke callback - pop_int ; Pop the id of the messageNode sload 4 + sconst "splitPrivChatUsernameColor" + runelite_callback sconst "From " sload 1 sconst ":" - sconst "privateChatSplitFrom" - runelite_callback sconst "" - join_string 6 ; Add the timestamp to the message + join_string 5 sload 4 sload 0 sconst "" @@ -443,19 +442,14 @@ LABEL359: jump LABEL462 LABEL385: iload 7 - iload 12 ; Load the id of the messageNode - sconst "" ; Push container for the timestamp - sconst "addTimestamp" ; Push event name - runelite_callback ; Invoke callback - pop_int ; Pop the id of the messageNode sload 4 + sconst "splitPrivChatUsernameColor" + runelite_callback sconst "To " sload 1 sconst ":" - sconst "privateChatSplitTo" - runelite_callback sconst "" - join_string 6 ; Add the timestamp to the message + join_string 5 sload 4 sload 0 sconst "" @@ -477,15 +471,10 @@ LABEL385: jump LABEL462 LABEL411: iload 7 - iload 12 ; Load the id of the messageNode - sconst "" ; Push a container for the timestamp - sconst "addTimestamp" ; Push event name - runelite_callback ; Invoke callback - pop_int ; Pop the id of the messageNode - sload 4 ; Load the log in/out message + sload 4 sload 0 sconst "" - join_string 4 + join_string 3 iload 9 iload 10 iconst 10682368