:registerClientCommand
{
Credits:
Parazitas - UGBASE
kawa_operand - BlastHack
ajom - UGBASE
Usage:
0AC8: 31@ = allocate_memory_size 1024
0AD3: 31@ = string_format "vr"
0AC7: 30@ = var 30@ pointer
0AC7: 29@ = var 29@ pointer
0AB1: @registerClientCommand 3 _CommandName 31@ _TogglingVar 30@ _ParamsPtrToVar 29@
30@ = 0 // default disabled
29@ = 0 // null ptr
Note:
The Reference Pointers passed at _TogglingVar and _ParamPtrToVar are required to be treated as ReadOnly. Which means that the value of those two Reference Pointers should not be manually overwritten/changed.
I am having a problem with opcode 0AB1, it permanently writes on the main thread's local variables. Maybe its because I directly writes on the passed variable's memory pointer. An example case:
Passing _ParamPtrToVar = 31@ , _TogglingVar = 30@
Opcode 0AB1 31@ == Main Thread's 31@
Opcode 0AB1 30@ == Main Thread's 30@
Thats why I decided to use global variables since they aren't that exposed on scripts.
}
CONST
// WARNING:
// Do not use Local Variables
// Do not recycle/use the three variables on any operation inside the script because these variables will always be used by this function and doesn't override outside the function. I promise you that even if you replace this with a local variable, It will cause overwriting mistakes that will mess the operation
// You can Replace any of these variables into any UNIQUE GLOBAL VARIABLES
VAR1 = $2AFD
VAR2 = $2BEC
VAR3 = $2CDE
VAR4 = $2DCB
VAR5 = $2EBF
VAR6 = $2FAA
END
IF 0AA2: VAR4 = "samp.dll"
THEN
// ~~~~~~~~~~~~~ Create a New Callback Structure
{
51 // push ecx
56 // push esi
8B 74 24 0C // mov esi, [esp+0Ch]
89 34 25 11 11 11 11 // mov [11111111], esi // later: [11111111] becomes 1@
83 35 11 11 11 11 01 // xor [11111111], 01 // later: [11111111] becomes 2@
5E // pop esi
59 // pop ecx
C3 // retn
}
// Avoid using local variables by saving the values inside a global variables
008A: VAR1 = 0@
008A: VAR2 = 2@
008A: VAR3 = 1@
//
0AC8: VAR5 = allocate_memory_size 23 // undeleteable memory region
0084: VAR6 = VAR5
0A8C: write_memory VAR6 size 4 value 0x748B5651 virtual_protect 1
VAR6 += 4
0A8C: write_memory VAR6 size 4 value 0x34890C24 virtual_protect 1
VAR6 += 4
0A8C: write_memory VAR6 size 1 value 0x25 virtual_protect 1
VAR6++
// 0A8C: write_memory VAR2 size 4 value 0 virtual_protect 0 // null string // NOT WORKING due to this function's varibles overriding
0A8C: write_memory VAR6 size 4 value VAR2 virtual_protect 1
VAR6 += 4
0A8C: write_memory VAR6 size 2 value 0x3583 virtual_protect 1
VAR6 += 2
// 0A8C: write_memory VAR3 size 4 value 0 virtual_protect 0 // Zeroing TogglingVar // NOT WORKING due to this function's varibles overriding
0A8C: write_memory VAR6 size 4 value VAR3 virtual_protect 1
VAR6 += 4
0A8C: write_memory VAR6 size 4 value 0xC3595E01 virtual_protect 1
// ~~~~~~~~~~~~~ now callback struct VAR5 is ready
0AB1: @get_samp_version_id 0 _returned: ID 17@
IF 17@ > 0
THEN
IF 17@ == 1 // 0.3.7 R1
THEN
0A8E: VAR6 = VAR4 + 0x21A0E8 // SAMP_CHAT_INPUT_INFO_OFFSET
0A8D: VAR6 = read_memory VAR6 size 4 virtual_protect 1
VAR4 += 0x65AD0 // SAMP_REGISTER_CLIENT_CMD_OFFSET
END
IF 17@ == 2 // 0.3.7 R2
THEN
0A8E: VAR6 = VAR4 + 0x21A0F0 // SAMP_CHAT_INPUT_INFO_OFFSET
0A8D: VAR6 = read_memory VAR6 size 4 virtual_protect 1
VAR4 += 0x65BA0 // SAMP_REGISTER_CLIENT_CMD_OFFSET
END
IF 17@ == 3 // 0.3.DL
THEN
0A8E: VAR6 = VAR4 + 0x2ACA14 // SAMP_CHAT_INPUT_INFO_OFFSET
0A8D: VAR6 = read_memory VAR6 size 4 virtual_protect 1
VAR4 += 0x691B0 // SAMP_REGISTER_CLIENT_CMD_OFFSET
END
IF 17@ == 4 // 0.3.7 R3
THEN
0A8E: VAR6 = VAR4 + 0x26E8CC // SAMP_CHAT_INPUT_INFO_OFFSET
0A8D: VAR6 = read_memory VAR6 size 4 virtual_protect 1
VAR4 += 0x69000 // SAMP_REGISTER_CLIENT_CMD_OFFSET
END
IF 17@ == 5 // 0.3.7 R4
THEN
0A8E: VAR6 = VAR4 + 0x26E9FC // SAMP_CHAT_INPUT_INFO_OFFSET
0A8D: VAR6 = read_memory VAR6 size 4 virtual_protect 1
VAR4 += 0x69730 // SAMP_REGISTER_CLIENT_CMD_OFFSET
END
IF 17@ == 6 // 0.3.7 R4 - v2
THEN
0A8E: VAR6 = VAR4 + 0x26E9FC // SAMP_CHAT_INPUT_INFO_OFFSET
0A8D: VAR6 = read_memory VAR6 size 4 virtual_protect 1
VAR4 += 0x69770 // SAMP_REGISTER_CLIENT_CMD_OFFSET
END
IF 17@ == 7 // 0.3.7 R5
THEN
0A8E: VAR6 = VAR4 + 0x26EB84 // SAMP_CHAT_INPUT_INFO_OFFSET
0A8D: VAR6 = read_memory VAR6 size 4 virtual_protect 1
VAR4 += 0x69770 // SAMP_REGISTER_CLIENT_CMD_OFFSET
END
0AA6: call_method VAR4 struct VAR6 num_params 2 pop 0 VAR5 VAR1
END
END
0AB2: ret 0