Счётчик

Статус
В этой теме нельзя размещать новые ответы.

_RosE_

Новичок
Автор темы
26
0
Здравствуйте! Помогите, пожалуйста, сделать счётчик, по такому типу:
Я ввёл команду и нажал enter, к примеру команда "/test", после чего в определённую переменую написало +1, ввёл команду ещё раз, ещё +1 (в итоге уже в переменной число 2)
Потом, чтобы я ввёл команду /check к примеру, и она вывела то число, которое было в переменной, в данном случае 2.
 

asdzxcjqwe

¯\_(ツ)_/¯
Друг
621
704
PHP:
#NoEnv
#Include %A_ScriptDir%\samp-udf.ahk
goto main


; ##########################
; ##### local commands #####
; ##########################

cmd_test:
    myvar++
    addChatMessageEx(0xFFFFFF, "К переменной myvar прибавлена единица, сейчас myvar = " myvar)
return

cmd_check:
    addChatMessageEx(0xFFFFFF, "myvar = " myvar)
return

cmd_setvar:
    if(!strlen(param1))
        addChatMessageEx(0xffffff, "Используйте: " param0 " [значение]  {afafaf}(задать произвольное значение переменной myvar)")
    else
    {
        myvar := param1
        addChatMessageEx(0xFFFFFF, "myvar задано значение " myvar)
    }
return




; #######################
; ##### main thread #####
; #######################

main:
myvar := 0

; ### cmdproc ###
commands := []
Loop, read, % A_ScriptFullPath
{
    if(RegExMatch(A_LoopReadLine, "^cmd_(.*):", match))
        commands.insert(match1)
}
while(true)
{
    if(!IsSAMPAvailable())
        continue
    for cid, cname in commands
    {
        if(!isClientCommand(cname))
            addClientCommand(cname, -1)
        if(isInChat() && (GetKeyState("Esc", "P") || GetKeyState("F6", "P")))
            writeMemory(hGTA, dwSAMP + 0x12D8F8, 0, 256, "byte")
        if(!IsSAMPAvailable() || isInChat())
            continue
        chat := readString(hGTA, dwSAMP + 0x12D8F8, 256)
        cmd := StrSplit(chat, A_Space)
        if(cmd[1] == "/" cname)
        {
            loop 20
                i := A_Index - 1, param%i% := cmd[A_Index]
            writeMemory(hGTA, dwSAMP + 0x12D8F8, 0, 256, "byte")
            gosub % "cmd_" cname
        }
    }
}




; #####################
; ##### functions #####
; #####################

addClientCommand(name, func := -1)
{
    if !checkHandles() or !strlen(name) or strlen(name) > 32
        return false
    if isClientCommand(name)
    {
        addChatMessageEx(0xdd0000, "command " name " already exists")
        return false
    }
    if(func == -1)
        func := readDWORD(hGTA, dwSAMP + 0x65679)
    dwChatInfo := readDWORD(hGTA, dwSAMP + 0x21A0E8)
    dwNames := dwChatInfo + 0x24C
    dwPointers := dwChatInfo + 0xC
    dwCount := dwChatInfo + 0x14DC
    count := readMem(hGTA, dwCount, 1, "byte")
    loop 144
    {
        cmd := readString(hGTA, dwNames + (0x21 * (A_Index - 1)), 32)
        if strlen(cmd)
            continue
        count++
        writeString(hGTA, dwNames + (0x21 * (A_Index - 1)), name)
        writeMemory(hGTA, dwPointers + (4 * (A_Index - 1)), func, 4, "UInt")
        writeMemory(hGTA, dwCount, count, 1, "byte")
        return name
    }
    addChatMessageEx(0xdd0000, "CMDPROC is overloaded (too many commands)")
    return false
}

isClientCommand(name)
{
    if !checkHandles() or !strlen(name) or strlen(name) > 32
        return false
    dwAddress := readDWORD(hGTA, dwSAMP + 0x21A0E8) + 0x24C
    loop 144
    {
        cmd := readString(hGTA, dwAddress + (0x21 * (A_Index - 1)), 0x21)
        if format("{:L}", name) == format("{:L}", cmd)
            return true
    }
    return false
}

strrest(cmd, n)
{
    str := ""
    for k, v in cmd
    {
        if(k > n)
            str := str "" v " "
    }
    return SubStr(str, 1, -1)
}
 
Последнее редактирование:
  • Нравится
Реакции: _RosE_

_RosE_

Новичок
Автор темы
26
0
PHP:
#NoEnv
#Include %A_ScriptDir%\samp-udf.ahk
goto main


; ##########################
; ##### local commands #####
; ##########################

cmd_test:
    myvar++
    addChatMessageEx(0xFFFFFF, "К переменной myvar прибавлена единица, сейчас myvar = " myvar)
return

cmd_check:
    addChatMessageEx(0xFFFFFF, "myvar = " myvar)
return

cmd_setvar:
    if(!strlen(param1))
        addChatMessageEx(0xffffff, "Используйте: " param0 " [значение]  {afafaf}(задать произвольное значение переменной myvar)")
    else
    {
        myvar := param1
        addChatMessageEx(0xFFFFFF, "myvar задано значение " myvar)
    }
return




; #######################
; ##### main thread #####
; #######################

main:
myvar := 0

; ### cmdproc ###
commands := []
Loop, read, % A_ScriptFullPath
{
    if(RegExMatch(A_LoopReadLine, "^cmd_(.*):", match))
        commands.insert(match1)
}
while(true)
{
    if(!IsSAMPAvailable())
        continue
    for cid, cname in commands
    {
        if(!isClientCommand(cname))
            addClientCommand(cname, -1)
        if(isInChat() && (GetKeyState("Esc", "P") || GetKeyState("F6", "P")))
            writeMemory(hGTA, dwSAMP + 0x12D8F8, 0, 256, "byte")
        if(!IsSAMPAvailable() || isInChat())
            continue
        chat := readString(hGTA, dwSAMP + 0x12D8F8, 256)
        cmd := StrSplit(chat, A_Space)
        if(cmd[1] == "/" cname)
        {
            loop 20
                i := A_Index - 1, param%i% := cmd[A_Index]
            writeMemory(hGTA, dwSAMP + 0x12D8F8, 0, 256, "byte")
            gosub % "cmd_" cname
        }
    }
}




; #####################
; ##### functions #####
; #####################

addClientCommand(name, func := -1)
{
    if !checkHandles() or !strlen(name) or strlen(name) > 32
        return false
    if isClientCommand(name)
    {
        addChatMessageEx(0xdd0000, "command " name " already exists")
        return false
    }
    if(func == -1)
        func := readDWORD(hGTA, dwSAMP + 0x65679)
    dwChatInfo := readDWORD(hGTA, dwSAMP + 0x21A0E8)
    dwNames := dwChatInfo + 0x24C
    dwPointers := dwChatInfo + 0xC
    dwCount := dwChatInfo + 0x14DC
    count := readMem(hGTA, dwCount, 1, "byte")
    loop 144
    {
        cmd := readString(hGTA, dwNames + (0x21 * (A_Index - 1)), 32)
        if strlen(cmd)
            continue
        count++
        writeString(hGTA, dwNames + (0x21 * (A_Index - 1)), name)
        writeMemory(hGTA, dwPointers + (4 * (A_Index - 1)), func, 4, "UInt")
        writeMemory(hGTA, dwCount, count, 1, "byte")
        return name
    }
    addChatMessageEx(0xdd0000, "CMDPROC is overloaded (too many commands)")
    return false
}

isClientCommand(name)
{
    if !checkHandles() or !strlen(name) or strlen(name) > 32
        return false
    dwAddress := readDWORD(hGTA, dwSAMP + 0x21A0E8) + 0x24C
    loop 144
    {
        cmd := readString(hGTA, dwAddress + (0x21 * (A_Index - 1)), 0x21)
        if format("{:L}", name) == format("{:L}", cmd)
            return true
    }
    return false
}
Спасибо, всё работает. Но есть одна проблема, AHK перекрыл стандартную команду сервера :-[
Я как бы пишу /test [id игрок] [текст] ничего не происходит, но check +1 делается
 
Последнее редактирование:

asdzxcjqwe

¯\_(ツ)_/¯
Друг
621
704
AHK перекрыл стандартную команду сервера
ты ничего не говорил о сервере... команды регистрируются как локальные и не отправляются серверу

эту строку (52):
PHP:
        if(!isClientCommand(cname))
заменить на эту:
PHP:
        if(!isClientCommand(cname) || format("{:L}", cname) == "test")
тогда команда "test" (указывать без слеша "/") не зарегистрируется в клиенте и будет отправляться серверу

если слишком сложно, то можешь использовать другой командник, на см видел такой (автор неизвестен):
Код:
global SAMP_CLIENT_CMDS                           := Object()
global SAMP_CLIENT_CMDS_COUNT            :=0
global ADDR_SAMP_COMMAND                     := 0x12D8F8

addClientChatCommand(cmd_string, exec_func, cmd_error) {
local cmd
cmd := Object()
cmd.cmd := cmd_string
cmd.func := exec_func
cmd.error := cmd_error
SAMP_CLIENT_CMDS_COUNT++
SAMP_CLIENT_CMDS[SAMP_CLIENT_CMDS_COUNT] := cmd
SetTimer, is_CLIENT_CMD, 25
is_CLIENT_CMD:
COM := readString(hGTA, dwSAMP + ADDR_SAMP_COMMAND, 256)
for CMD in SAMP_CLIENT_CMDS
{
checkHandles()
    if (RegExMatch(COM,"^"+SAMP_CLIENT_CMDS[CMD].cmd)) and (getChatLineEx() = SAMP_CLIENT_CMDS[CMD].error)
    {
  ;setChatLine(0,"DEBUG: " COM) ;Debug
  removeChatLine(0) ; вызывает задержку -> можно заменить на setChatLine
  writeString(hGTA, dwSAMP + ADDR_SAMP_COMMAND, "")
  params := StrSplit(COM, A_Space)
  SAMP_CLIENT_CMDS[CMD].params := params
  gosub % SAMP_CLIENT_CMDS[CMD].func
    }
}
return
}

Код:
addClientChatCommand("/cmd1","cmd1", "Неизвестная команда.")
addClientChatCommand("/cmd2","cmd2", "Неизвестная команда.")
return

cmd1:
addChatMessage("Команда #1 работает!")
addChatMessage("Первый параметр: " SAMP_CLIENT_CMDS[1].params[2])
addChatMessage("Второй параметр: " SAMP_CLIENT_CMDS[1].params[3])
return

cmd2:
addChatMessage("Команда #2 работает!")
addChatMessage("Всего передано параметров: " SAMP_CLIENT_CMDS[2].params.MaxIndex()-1)
return

есть еще командники от demy и tumkin, которые тоже отправляют свои команды серверу

Ах да, всё куда проще, чем описал выше:

PHP:
cmd_test:
    myvar++
    addChatMessageEx(0xFFFFFF, "К переменной myvar прибавлена единица, сейчас myvar = " myvar)
    sendchat("/test " param1 " " strrest(cmd, 2))
return

; # к функциям добавить
strrest(cmd, n)
{
    str := ""
    for k, v in cmd
    {
        if(k > n)
            str := str "" v " "
    }
    return SubStr(str, 1, -1)
}
 
Последнее редактирование модератором:
  • Нравится
Реакции: _RosE_

_RosE_

Новичок
Автор темы
26
0
Ах да, всё куда проще, чем описал выше:

PHP:
cmd_test:
    myvar++
    addChatMessageEx(0xFFFFFF, "К переменной myvar прибавлена единица, сейчас myvar = " myvar)
    sendchat("/test " param1 " " strrest(cmd, 2))
return

; # к функциям добавить
strrest(cmd, n)
{
    str := ""
    for k, v in cmd
    {
        if(k > n)
            str := str "" v " "
    }
    return SubStr(str, 1, -1)
}
Большое спасибо, очень помог.
 

RTD

Нестандартное звание
Модератор
391
414
PHP:
#NoEnv
#Include %A_ScriptDir%\samp-udf.ahk
goto main


; ##########################
; ##### local commands #####
; ##########################

cmd_test:
    myvar++
    addChatMessageEx(0xFFFFFF, "К переменной myvar прибавлена единица, сейчас myvar = " myvar)
return

cmd_check:
    addChatMessageEx(0xFFFFFF, "myvar = " myvar)
return

cmd_setvar:
    if(!strlen(param1))
        addChatMessageEx(0xffffff, "Используйте: " param0 " [значение]  {afafaf}(задать произвольное значение переменной myvar)")
    else
    {
        myvar := param1
        addChatMessageEx(0xFFFFFF, "myvar задано значение " myvar)
    }
return




; #######################
; ##### main thread #####
; #######################

main:
myvar := 0

; ### cmdproc ###
commands := []
Loop, read, % A_ScriptFullPath
{
    if(RegExMatch(A_LoopReadLine, "^cmd_(.*):", match))
        commands.insert(match1)
}
while(true)
{
    if(!IsSAMPAvailable())
        continue
    for cid, cname in commands
    {
        if(!isClientCommand(cname))
            addClientCommand(cname, -1)
        if(isInChat() && (GetKeyState("Esc", "P") || GetKeyState("F6", "P")))
            writeMemory(hGTA, dwSAMP + 0x12D8F8, 0, 256, "byte")
        if(!IsSAMPAvailable() || isInChat())
            continue
        chat := readString(hGTA, dwSAMP + 0x12D8F8, 256)
        cmd := StrSplit(chat, A_Space)
        if(cmd[1] == "/" cname)
        {
            loop 20
                i := A_Index - 1, param%i% := cmd[A_Index]
            writeMemory(hGTA, dwSAMP + 0x12D8F8, 0, 256, "byte")
            gosub % "cmd_" cname
        }
    }
}




; #####################
; ##### functions #####
; #####################

addClientCommand(name, func := -1)
{
    if !checkHandles() or !strlen(name) or strlen(name) > 32
        return false
    if isClientCommand(name)
    {
        addChatMessageEx(0xdd0000, "command " name " already exists")
        return false
    }
    if(func == -1)
        func := readDWORD(hGTA, dwSAMP + 0x65679)
    dwChatInfo := readDWORD(hGTA, dwSAMP + 0x21A0E8)
    dwNames := dwChatInfo + 0x24C
    dwPointers := dwChatInfo + 0xC
    dwCount := dwChatInfo + 0x14DC
    count := readMem(hGTA, dwCount, 1, "byte")
    loop 144
    {
        cmd := readString(hGTA, dwNames + (0x21 * (A_Index - 1)), 32)
        if strlen(cmd)
            continue
        count++
        writeString(hGTA, dwNames + (0x21 * (A_Index - 1)), name)
        writeMemory(hGTA, dwPointers + (4 * (A_Index - 1)), func, 4, "UInt")
        writeMemory(hGTA, dwCount, count, 1, "byte")
        return name
    }
    addChatMessageEx(0xdd0000, "CMDPROC is overloaded (too many commands)")
    return false
}

isClientCommand(name)
{
    if !checkHandles() or !strlen(name) or strlen(name) > 32
        return false
    dwAddress := readDWORD(hGTA, dwSAMP + 0x21A0E8) + 0x24C
    loop 144
    {
        cmd := readString(hGTA, dwAddress + (0x21 * (A_Index - 1)), 0x21)
        if format("{:L}", name) == format("{:L}", cmd)
            return true
    }
    return false
}

strrest(cmd, n)
{
    str := ""
    for k, v in cmd
    {
        if(k > n)
            str := str "" v " "
    }
    return SubStr(str, 1, -1)
}
Ничесе у тебя функи, а ты молчишь))
 
Статус
В этой теме нельзя размещать новые ответы.