1

Тема: SAMP: Модификация обработчика команд

Здравствуйте, имеется следующий обработчик команд:


$~Enter::
if(!isInChat() || isDialogOpen())
     return
blockChatInput(), block := false
Sleep, 150
chat := readString(hGTA, dwSAMP + 0x12D8F8, 256)
s := StrSplit(chat)
if(s[1] == "/")
{
     cmd := StrSplit(chat, A_Space)
     if(cmd_label := isCommand(cmd[1]))
     {
          playerid := cmd[2], i := 0, block := true
          Loop, 20
          param%i% := cmd[i+1], i += 1
          unBlockChatInput()
          gosub, %cmd_label%
     }
}
unBlockChatInput()
if(!block && strlen(chat))
     Sendchat(chat)
return

strrest(cmd, n)
{
     str := ""
     for k, v in cmd
     {
          if(k > n)
               str := str "" v " "
     }
     return SubStr(str, 1, -1)
}

isCommand(string)
{
     Loop, Read, %A_ScriptName%
     if RegExMatch(A_LoopReadLine, "command\_(.*)\:", LName)
          if SubStr(string, 2) == LName1
          return SubStr(LName, 1, -1)
     return false
}

callCommand(string, params="")
{
     if(cmd_label := isCommand(string))
     {
          param0 := string, i := 1
          Loop, 20
          param%i% := params[i], i += 1
          gosub, %cmd_label%
     }
     return true
}

command_afk:
msgbox, режим AFK включен
return

Объясняю для тех, кто не знаком с SAMP. С помощью обработчика команд можно вместо хоткеев создавать команды, которые вводятся в игровой чат (нажимаете F6, вводите в чат /"команда" (напр. /afk) и нажимаете ентер). Если такая команда присутствует в скрипте, то выполняется какое-нибудь действие. Например: последние три строчки моего кода, это регистрация команды /afk. Теперь, если я введу в игровом чате /afk и нажму ентер (это принципиальное отличие от автозамены всеми любимой), то вылезет msgbox. Все работает замечательно, но возникла необходимость в качестве аргумента команде представить какую-нибудь переменную. Например:


Global m := "afk"

command_%m%:
msgbox, режим AFK включен
return

Но как вы уже догадались, мои попытки не увенчались успехом. Никакой известный мне способ вывода переменной сюда не помог. Но я подозреваю, что если как-нибудь изменить функцию isCommand(string) (в примере первом она есть), то можно будет выводить переменные в command. Обращаюсь к вам за помощью: как можно переделать функцию isCommand(string) или как вообще можно использовать переменную m (из второго примера), чтобы она работала в обработчике команд. Любые костыли устраивают, главное результат.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

2

Re: SAMP: Модификация обработчика команд

Хотя бы скажите что это невозможно, не молчите пожалуйста. Для тех, кто не из SAMP, если вы не понимаете системы, скажите, я объясню на пальцах. Мне очень нужна возможность вывода переменной в метку, потому я готов на это потратить сколько угодно времени.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3

Re: SAMP: Модификация обработчика команд

Сам все сделал, вот код:


$~Enter::
if(!isInChat() || isDialogOpen())
     return
blockChatInput(), block := false
Sleep, 150
chat := readString(hGTA, dwSAMP + 0x12D8F8, 256)
s := StrSplit(chat)
if(s[1] == "/")
{
     cmd := StrSplit(chat, A_Space)
	 com := "" . isCommand(cmd[1]) . ""
     if (com != "False") {
          playerid := cmd[2], i := 0, block := true
          Loop, 20
          param%i% := cmd[i+1], i += 1
          unBlockChatInput()
          gosub, %com%
     }
}
unBlockChatInput()
if(!block && strlen(chat))
     Sendchat(chat)
return


; #############################
; ########## ‘ункции ##########
; #############################

strrest(cmd, n)
{
     str := ""
     for k, v in cmd
     {
          if(k > n)
               str := str "" v " "
     }
     return SubStr(str, 1, -1)
}

isCommand(string)
{
	;msgbox, string = %string%
	Loop {
	 FileEncoding, UTF-8
     FileReadLine, line, C:\Users\Белочка\Desktop\config.ini, %A_Index%
		if ErrorLevel
		break
	 if RegExMatch(line, "Command(.*)=" . string . "", end_str)
	 break
	 }
		if (end_str != "") {
			m := "Command" . end_str1 . ""
		} else {
			m := "False"
		}
	Return %m%
}

callCommand(string, params="")
{
     if(cmd_label := isCommand(string))
     {
          param0 := string, i := 1
          Loop, 20
          param%i% := params[i], i += 1
          gosub, %cmd_label%
     }
     return true
}


; Тестовая среда

command3:
sendchat("3")
return

command1:
sendchat("1")
return

command2:
sendchat("2")
return

Config.ini


[Commands]
Command1=/gtest1
Command2=/gtest2
Command3=/gtest3
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

4

Re: SAMP: Модификация обработчика команд

belyankin12, какой-то странный вопрос. Так еще можно:

1::
x := 1
Return

2::
x := 2
Return

3::
Gosub,Label%x%
Return

Label1:
MsgBox, 1
return

Label2:
MsgBox, 2
return

5

Re: SAMP: Модификация обработчика команд

Не очень понял вопрос, но, возможно, это имеется в виду:

$~Enter::
if(!isInChat() || isDialogOpen())
     return
sleep 150
chat := readString(hGTA, dwSAMP + 0x12D8F8, 256)
if RegExMatch(chat, "^\/afk\s(\d+)$", id)
{
	if (id1==1)
	{
	;действия 1
	return
	}
	if (id1==2)
	{
	;действия 2
	return
	}
}
return