#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)
}