Add private message input event and add !kc to chatcommands for private messages
This commit is contained in:
@@ -70,4 +70,9 @@ public final class ScriptID
|
|||||||
* because you need an op listener attached to it for it to work
|
* because you need an op listener attached to it for it to work
|
||||||
*/
|
*/
|
||||||
public static final int NULL = 10003;
|
public static final int NULL = 10003;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a private message.
|
||||||
|
*/
|
||||||
|
public static final int PRIVMSG = 10004;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,8 +25,11 @@
|
|||||||
package net.runelite.client.chat;
|
package net.runelite.client.chat;
|
||||||
|
|
||||||
import net.runelite.client.events.ChatboxInput;
|
import net.runelite.client.events.ChatboxInput;
|
||||||
|
import net.runelite.client.events.PrivateMessageInput;
|
||||||
|
|
||||||
public interface ChatboxInputListener
|
public interface ChatboxInputListener
|
||||||
{
|
{
|
||||||
boolean onChatboxInput(ChatboxInput chatboxInput);
|
boolean onChatboxInput(ChatboxInput chatboxInput);
|
||||||
|
|
||||||
|
boolean onPrivateMessageInput(PrivateMessageInput privateMessageInput);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import net.runelite.api.events.CommandExecuted;
|
|||||||
import net.runelite.api.events.ScriptCallbackEvent;
|
import net.runelite.api.events.ScriptCallbackEvent;
|
||||||
import net.runelite.client.callback.ClientThread;
|
import net.runelite.client.callback.ClientThread;
|
||||||
import net.runelite.client.events.ChatboxInput;
|
import net.runelite.client.events.ChatboxInput;
|
||||||
|
import net.runelite.client.events.PrivateMessageInput;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Singleton
|
@Singleton
|
||||||
@@ -48,6 +49,7 @@ public class CommandManager
|
|||||||
{
|
{
|
||||||
private static final String RUNELITE_COMMAND = "runeliteCommand";
|
private static final String RUNELITE_COMMAND = "runeliteCommand";
|
||||||
private static final String CHATBOX_INPUT = "chatboxInput";
|
private static final String CHATBOX_INPUT = "chatboxInput";
|
||||||
|
private static final String PRIVMATE_MESSAGE = "privateMessage";
|
||||||
|
|
||||||
private final Provider<Client> clientProvider;
|
private final Provider<Client> clientProvider;
|
||||||
private final EventBus eventBus;
|
private final EventBus eventBus;
|
||||||
@@ -90,6 +92,9 @@ public class CommandManager
|
|||||||
case CHATBOX_INPUT:
|
case CHATBOX_INPUT:
|
||||||
handleInput(event);
|
handleInput(event);
|
||||||
break;
|
break;
|
||||||
|
case PRIVMATE_MESSAGE:
|
||||||
|
handlePrivateMessage(event);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,6 +161,48 @@ public class CommandManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handlePrivateMessage(ScriptCallbackEvent event)
|
||||||
|
{
|
||||||
|
Client client = clientProvider.get();
|
||||||
|
final String[] stringStack = client.getStringStack();
|
||||||
|
final int[] intStack = client.getIntStack();
|
||||||
|
int stringStackCount = client.getStringStackSize();
|
||||||
|
int intStackCount = client.getIntStackSize();
|
||||||
|
|
||||||
|
final String target = stringStack[stringStackCount - 2];
|
||||||
|
final String message = stringStack[stringStackCount - 1];
|
||||||
|
|
||||||
|
PrivateMessageInput privateMessageInput = new PrivateMessageInput(target, message)
|
||||||
|
{
|
||||||
|
private boolean resumed;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resume()
|
||||||
|
{
|
||||||
|
if (resumed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resumed = true;
|
||||||
|
|
||||||
|
ClientThread clientThread = clientThreadProvider.get();
|
||||||
|
clientThread.invokeLater(() -> sendPrivmsg(target, message));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
boolean stop = false;
|
||||||
|
for (ChatboxInputListener chatboxInputListener : chatboxInputListenerList)
|
||||||
|
{
|
||||||
|
stop |= chatboxInputListener.onPrivateMessageInput(privateMessageInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stop)
|
||||||
|
{
|
||||||
|
intStack[intStackCount - 1] = 1;
|
||||||
|
client.setStringStackSize(stringStackCount - 2); // remove both target and message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void sendChatboxInput(int chatType, String input)
|
private void sendChatboxInput(int chatType, String input)
|
||||||
{
|
{
|
||||||
Client client = clientProvider.get();
|
Client client = clientProvider.get();
|
||||||
@@ -169,4 +216,10 @@ public class CommandManager
|
|||||||
sending = false;
|
sending = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sendPrivmsg(String target, String message)
|
||||||
|
{
|
||||||
|
Client client = clientProvider.get();
|
||||||
|
client.runScript(ScriptID.PRIVMSG, target, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, Adam <Adam@sigterm.info>
|
||||||
|
* 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.events;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public abstract class PrivateMessageInput
|
||||||
|
{
|
||||||
|
private final String target;
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
public abstract void resume();
|
||||||
|
}
|
||||||
@@ -56,6 +56,7 @@ import net.runelite.client.chat.ChatboxInputListener;
|
|||||||
import net.runelite.client.chat.CommandManager;
|
import net.runelite.client.chat.CommandManager;
|
||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
import net.runelite.client.events.ChatboxInput;
|
import net.runelite.client.events.ChatboxInput;
|
||||||
|
import net.runelite.client.events.PrivateMessageInput;
|
||||||
import net.runelite.client.game.ItemManager;
|
import net.runelite.client.game.ItemManager;
|
||||||
import net.runelite.client.input.KeyManager;
|
import net.runelite.client.input.KeyManager;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
@@ -356,6 +357,45 @@ public class ChatCommandsPlugin extends Plugin implements ChatboxInputListener
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPrivateMessageInput(PrivateMessageInput privateMessageInput)
|
||||||
|
{
|
||||||
|
final String message = privateMessageInput.getMessage();
|
||||||
|
if (!message.startsWith("!kc "))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx = message.indexOf(' ');
|
||||||
|
final String boss = longBossName(message.substring(idx + 1));
|
||||||
|
|
||||||
|
final int kc = getKc(boss);
|
||||||
|
if (kc <= 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String playerName = client.getLocalPlayer().getName();
|
||||||
|
|
||||||
|
executor.execute(() ->
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
killCountClient.submit(playerName, boss, kc);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
log.warn("unable to submit killcount", ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
privateMessageInput.resume();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private void killCountLookup(ChatMessageType type, SetMessage setMessage, String search)
|
private void killCountLookup(ChatMessageType type, SetMessage setMessage, String search)
|
||||||
{
|
{
|
||||||
final String player;
|
final String player;
|
||||||
|
|||||||
1
runelite-scripts/scripts/PrivateMessage.hash
Normal file
1
runelite-scripts/scripts/PrivateMessage.hash
Normal file
@@ -0,0 +1 @@
|
|||||||
|
36262759CFFFD94A6495B6BFA9B86C859921C5CE0340E465B1878461417A2470
|
||||||
280
runelite-scripts/scripts/PrivateMessage.rs2asm
Normal file
280
runelite-scripts/scripts/PrivateMessage.rs2asm
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
.id 681
|
||||||
|
.int_stack_count 0
|
||||||
|
.string_stack_count 0
|
||||||
|
.int_var_count 2
|
||||||
|
.string_var_count 1
|
||||||
|
get_varc 5
|
||||||
|
load_int 14
|
||||||
|
if_icmpeq LABEL4
|
||||||
|
jump LABEL7
|
||||||
|
LABEL4:
|
||||||
|
load_int 1
|
||||||
|
put_varc 66
|
||||||
|
return
|
||||||
|
LABEL7:
|
||||||
|
load_int -1
|
||||||
|
istore 0
|
||||||
|
load_string ""
|
||||||
|
sstore 0
|
||||||
|
get_varc_string 22
|
||||||
|
string_length
|
||||||
|
istore 1
|
||||||
|
iload 1
|
||||||
|
load_int 0
|
||||||
|
if_icmpgt LABEL18
|
||||||
|
jump LABEL193
|
||||||
|
LABEL18:
|
||||||
|
get_varc 5
|
||||||
|
switch
|
||||||
|
1: LABEL21
|
||||||
|
2: LABEL44
|
||||||
|
3: LABEL44
|
||||||
|
4: LABEL23
|
||||||
|
5: LABEL23
|
||||||
|
6: LABEL44
|
||||||
|
7: LABEL110
|
||||||
|
8: LABEL114
|
||||||
|
9: LABEL120
|
||||||
|
10: LABEL123
|
||||||
|
11: LABEL185
|
||||||
|
12: LABEL142
|
||||||
|
13: LABEL160
|
||||||
|
15: LABEL120
|
||||||
|
16: LABEL190
|
||||||
|
jump LABEL192
|
||||||
|
LABEL21:
|
||||||
|
return
|
||||||
|
jump LABEL192
|
||||||
|
LABEL23:
|
||||||
|
get_ignorecount
|
||||||
|
load_int 0
|
||||||
|
if_icmplt LABEL27
|
||||||
|
jump LABEL30
|
||||||
|
LABEL27:
|
||||||
|
load_string "Unable to update ignore list - system busy."
|
||||||
|
send_game_message
|
||||||
|
jump LABEL43
|
||||||
|
LABEL30:
|
||||||
|
get_varc 5
|
||||||
|
load_int 4
|
||||||
|
if_icmpeq LABEL34
|
||||||
|
jump LABEL37
|
||||||
|
LABEL34:
|
||||||
|
get_varc_string 22
|
||||||
|
add_ignore
|
||||||
|
jump LABEL43
|
||||||
|
LABEL37:
|
||||||
|
get_varc 5
|
||||||
|
load_int 5
|
||||||
|
if_icmpeq LABEL41
|
||||||
|
jump LABEL43
|
||||||
|
LABEL41:
|
||||||
|
get_varc_string 22
|
||||||
|
remove_ignore
|
||||||
|
LABEL43:
|
||||||
|
jump LABEL192
|
||||||
|
LABEL44:
|
||||||
|
get_friendcount
|
||||||
|
load_int 0
|
||||||
|
if_icmplt LABEL48
|
||||||
|
jump LABEL51
|
||||||
|
LABEL48:
|
||||||
|
load_string "Unable to complete action - system busy."
|
||||||
|
send_game_message
|
||||||
|
jump LABEL109
|
||||||
|
LABEL51:
|
||||||
|
get_varc 5
|
||||||
|
load_int 2
|
||||||
|
if_icmpeq LABEL55
|
||||||
|
jump LABEL58
|
||||||
|
LABEL55:
|
||||||
|
get_varc_string 22
|
||||||
|
add_friend
|
||||||
|
jump LABEL109
|
||||||
|
LABEL58:
|
||||||
|
get_varc 5
|
||||||
|
load_int 3
|
||||||
|
if_icmpeq LABEL62
|
||||||
|
jump LABEL65
|
||||||
|
LABEL62:
|
||||||
|
get_varc_string 22
|
||||||
|
remove_friend
|
||||||
|
jump LABEL109
|
||||||
|
LABEL65:
|
||||||
|
get_varc 5
|
||||||
|
load_int 6
|
||||||
|
if_icmpeq LABEL69
|
||||||
|
jump LABEL109
|
||||||
|
LABEL69:
|
||||||
|
get_varc 203
|
||||||
|
load_int 0
|
||||||
|
if_icmpeq LABEL76
|
||||||
|
get_varc 203
|
||||||
|
load_int -1
|
||||||
|
if_icmpeq LABEL76
|
||||||
|
jump LABEL82
|
||||||
|
LABEL76:
|
||||||
|
load_int 1
|
||||||
|
load_int 1
|
||||||
|
invoke 299
|
||||||
|
load_string "You must set a name before you can chat."
|
||||||
|
send_game_message
|
||||||
|
return
|
||||||
|
LABEL82:
|
||||||
|
5005
|
||||||
|
load_int 2
|
||||||
|
if_icmpeq LABEL86
|
||||||
|
jump LABEL97
|
||||||
|
LABEL86:
|
||||||
|
5000
|
||||||
|
load_int 1
|
||||||
|
5016
|
||||||
|
chatfilter_update
|
||||||
|
invoke 178
|
||||||
|
invoke 553
|
||||||
|
istore 0
|
||||||
|
iload 0
|
||||||
|
invoke 84
|
||||||
|
iload 0
|
||||||
|
invoke 89
|
||||||
|
LABEL97:
|
||||||
|
get_varbit 4394
|
||||||
|
load_int 1
|
||||||
|
if_icmpeq LABEL101
|
||||||
|
jump LABEL104
|
||||||
|
LABEL101:
|
||||||
|
get_varc_string 23
|
||||||
|
remove_friend
|
||||||
|
jump LABEL107
|
||||||
|
LABEL104:
|
||||||
|
get_varc_string 23
|
||||||
|
get_varc_string 22
|
||||||
|
load_string "privateMessage" ; load event name
|
||||||
|
load_int 0 ; whether or not to skip
|
||||||
|
runelite_callback ; invoke callback
|
||||||
|
load_int 1
|
||||||
|
if_icmpeq LABEL107 ; if skipped, do not message
|
||||||
|
privmsg
|
||||||
|
LABEL107:
|
||||||
|
get_gamecycle
|
||||||
|
put_varc 61
|
||||||
|
LABEL109:
|
||||||
|
jump LABEL192
|
||||||
|
LABEL110:
|
||||||
|
get_varc_string 22
|
||||||
|
invoke 212
|
||||||
|
numeric_input
|
||||||
|
jump LABEL192
|
||||||
|
LABEL114:
|
||||||
|
get_varc_string 22
|
||||||
|
string_remove_html
|
||||||
|
put_varc_string 128
|
||||||
|
get_varc_string 22
|
||||||
|
string_input_1
|
||||||
|
jump LABEL192
|
||||||
|
LABEL120:
|
||||||
|
get_varc_string 22
|
||||||
|
string_input_2
|
||||||
|
jump LABEL192
|
||||||
|
LABEL123:
|
||||||
|
get_varc 203
|
||||||
|
load_int 0
|
||||||
|
if_icmpeq LABEL130
|
||||||
|
get_varc 203
|
||||||
|
load_int -1
|
||||||
|
if_icmpeq LABEL130
|
||||||
|
jump LABEL136
|
||||||
|
LABEL130:
|
||||||
|
load_int 1
|
||||||
|
load_int 1
|
||||||
|
invoke 299
|
||||||
|
load_string "You must set a name before you can chat."
|
||||||
|
send_game_message
|
||||||
|
return
|
||||||
|
LABEL136:
|
||||||
|
get_varc_string 22
|
||||||
|
string_remove_html
|
||||||
|
put_varc_string 129
|
||||||
|
get_varc_string 22
|
||||||
|
join_clanchat
|
||||||
|
jump LABEL192
|
||||||
|
LABEL142:
|
||||||
|
iload 1
|
||||||
|
load_int 10
|
||||||
|
if_icmpgt LABEL146
|
||||||
|
jump LABEL152
|
||||||
|
LABEL146:
|
||||||
|
get_varc_string 22
|
||||||
|
load_int 0
|
||||||
|
load_int 9
|
||||||
|
string_substring
|
||||||
|
sstore 0
|
||||||
|
jump LABEL154
|
||||||
|
LABEL152:
|
||||||
|
get_varc_string 22
|
||||||
|
sstore 0
|
||||||
|
LABEL154:
|
||||||
|
sload 0
|
||||||
|
tolowercase
|
||||||
|
5021
|
||||||
|
invoke 553
|
||||||
|
invoke 84
|
||||||
|
jump LABEL192
|
||||||
|
LABEL160:
|
||||||
|
get_varc 203
|
||||||
|
load_int 0
|
||||||
|
if_icmpeq LABEL167
|
||||||
|
get_varc 203
|
||||||
|
load_int -1
|
||||||
|
if_icmpeq LABEL167
|
||||||
|
jump LABEL173
|
||||||
|
LABEL167:
|
||||||
|
load_int 1
|
||||||
|
load_int 1
|
||||||
|
invoke 299
|
||||||
|
load_string "You must set a name before you can chat."
|
||||||
|
send_game_message
|
||||||
|
return
|
||||||
|
LABEL173:
|
||||||
|
get_varc_string 22
|
||||||
|
load_int 0
|
||||||
|
put_varc 62
|
||||||
|
put_varc_string 28
|
||||||
|
invoke 95
|
||||||
|
load_int 552
|
||||||
|
load_int -2147483645
|
||||||
|
load_int 1
|
||||||
|
load_string "I1"
|
||||||
|
load_int 10616843
|
||||||
|
widget_put_render_listener_widget
|
||||||
|
jump LABEL192
|
||||||
|
LABEL185:
|
||||||
|
load_int 0
|
||||||
|
load_int 1
|
||||||
|
invoke 299
|
||||||
|
return
|
||||||
|
jump LABEL192
|
||||||
|
LABEL190:
|
||||||
|
get_varc_string 22
|
||||||
|
invoke 2061
|
||||||
|
LABEL192:
|
||||||
|
jump LABEL199
|
||||||
|
LABEL193:
|
||||||
|
get_varc 5
|
||||||
|
switch
|
||||||
|
16: LABEL198
|
||||||
|
7: LABEL196
|
||||||
|
8: LABEL196
|
||||||
|
9: LABEL196
|
||||||
|
15: LABEL196
|
||||||
|
jump LABEL199
|
||||||
|
LABEL196:
|
||||||
|
return
|
||||||
|
jump LABEL199
|
||||||
|
LABEL198:
|
||||||
|
return
|
||||||
|
LABEL199:
|
||||||
|
load_int 1
|
||||||
|
load_int 1
|
||||||
|
invoke 299
|
||||||
|
return
|
||||||
34
runelite-scripts/scripts/SendPrivateMessage.rs2asm
Normal file
34
runelite-scripts/scripts/SendPrivateMessage.rs2asm
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
; Copyright (c) 2018 Adam <Adam@sigterm.info>
|
||||||
|
; 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.
|
||||||
|
|
||||||
|
.id 10004
|
||||||
|
.int_stack_count 0
|
||||||
|
.string_stack_count 2
|
||||||
|
.int_var_count 0
|
||||||
|
.string_var_count 2
|
||||||
|
|
||||||
|
; Send a private message
|
||||||
|
sload 0
|
||||||
|
sload 1
|
||||||
|
privmsg
|
||||||
|
return
|
||||||
Reference in New Issue
Block a user