Другое Полезные сниппеты и SCM-функции

woksonal

Известный
Проверенный
268
146
Описание: открытие любых файлов

Пример:
открывает C:\test.exe
CLEO:
{$CLEO}
const
//nShowCmd
SW_HIDE = 0
SW_SHOWNORMAL = 1
SW_SHOWMINIMIZED = 2
SW_SHOWMAXIMIZED = 3
SW_MAXIMIZE = 3
SW_SHOWNOACTIVATE = 4
SW_SHOW = 5
SW_MINIMIZE = 6
SW_SHOWMINNOACTIVE = 7
SW_SHOWNA = 8
SW_RESTORE = 9
SW_SHOWDEFAULT = 10
end

0AA2: 0@ = load_library "shell32.dll"
0AA4: 1@ = get_proc_address "ShellExecuteA" library 0@
0A9F: 30@ = current_thread_pointer
0AB1: call_scm_func @__LabelToOffset 1 @FileName 2@ // 0AC6 in SF
0A8D: 30@ = read_memory 0xC97C1C size 4 virtual_protect 0 // handle SA
0AA7: call_function 1@ num_params 6 pop 0 SW_SHOWMINIMIZED 0x858B54 0x858B54 2@ 0 30@ 3@
0A93: end_custom_thread

:__LabelToOffset
if
    0@ == 0
then
    0AB2: ret 1 0
end
0A9F: 1@ = current_thread_pointer
1@ += 0x10
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // baseIP
0062: 1@ -= 0@ // label address
0AB2: ret 1 1@
:FileName
hex
"C:\test.exe" 00
end
 

DarkP1xel

Давай трезвого!
BH Team
3,520
4,385
Список функций для работы с радио.

Описание: Функция получает название радиостанции по ID .
CLEO:
0AA8: call_function_method {GetRadioStationName}0x4E9E10 struct {CAERadioTrackManager}0x8CB6F8 num_params 1 pop 0 | {ID}6 | {Result}0@ |

Описание: Функция получает ID текущей радиостанции.

CLEO:
0AA8: call_function_method {GetCurrentRadioStationID}0x4E83F0 struct {CAERadioTrackManager}0x8CB6F8 num_params 0 pop 0 || {Result}0@ |

Описание: Функция проверяет активно ли радио в ТС.

CLEO:
0AA8: call_function_method {IsVehicleRadioActive}0x4E9800 struct {CAERadioTrackManager}0x8CB6F8 num_params 0 pop 0 || {Result}0@ |

Описание: Функция проверяет включено ли радио.

CLEO:
0AA8: call_function_method {IsRadioOn}0x4E8350 struct {CAERadioTrackManager}0x8CB6F8 num_params 0 pop 0 || {Result}0@ |

Описание: Функция сбрасывает состояние радио.

CLEO:
0AA6: call_method {Reset}0x4E7F80 struct {CAERadioTrackManager}0x8CB6F8 num_params 0 pop 0 ||
 
  • Нравится
Реакции: Trofim

DarkP1xel

Давай трезвого!
BH Team
3,520
4,385
Описание: Получает количество использованной stream памяти в байтах.
CLEO:
0A8D: 0@ = read_memory 0x8E4CB4 size 4 virtual_protect TRUE
 

DarkP1xel

Давай трезвого!
BH Team
3,520
4,385
Описание: Получает 3D координаты указанного компонента ТС.
CLEO:
0AA6: call_method {GetComponentWorldPosition}0x6A2210 struct {cVehicle}25@ num_params 2 pop 0 | {pVector}25@v {iComponentID}1@ |
 

SR_team

like pancake
BH Team
3,814
3,859
Регистрация собственных опкодов из клео скриптов
CLEO:
:RegisterOpcode //0@ - opcode number, 1@ - opcode _stdcall function
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_RegisterOpcode@8" library 31@
0AC6: 1@ = label 1@ offset
0AA7: call_function 30@ num_params 2 pop 0 1@ 0@ 2@
ret 1 2@
CLEO:
{$CLEO}
wait 1000

call @RegisterOpcode 2 _Opcode 0x1111 _pFunc @Opcode_1111 0@
if 0@ <> 0
then
    hex
     1111 //вызываем наш новый опкод, который ничего не делает
    end // 1111: NOP
    msg "Opcode 1111: is registered" -1
end
0a93:

:RegisterOpcode //0@ - opcode number, 1@ - opcode _stdcall function
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_RegisterOpcode@8" library 31@
0AC6: 1@ = label 1@ offset
0AA7: call_function 30@ num_params 2 pop 0 1@ 0@ 2@
ret 1 2@

:Opcode_1111 //1111: NOP
hex
C3             //ret
end // asm

Регистрируем опкод инкримента значения по заданному адресу (нечто похожее на 000A: )

CLEO:
{$CLEO}
wait 1000
   
0AC7: 0@ = var 10@ offset //получаем указатель на переменную 10@. Вместо этого можно использовать другие адреса в качестве 0@, тут я взял переменную для наглядности
0AC6: 1@ = label @Opcode_1111 offset //получаем указатель на начало опкода
1@ += 2 //skip 50 A1 | пропускаем 2 байта
0A8C: write_memory 1@ size 4 value 0@ virtual_protect 1 //write 'read addr' | записываем адрес для чтения значения переменной
1@ += 7 //skip VAR_ADDR 40 89 05 | пропускаем еще 7 байт (итого 9 от начала файла)
0A8C: write_memory 1@ size 4 value 0@ virtual_protect 1 //write 'write addr' | записываем адрес для записи значения переменной
      
call @RegisterOpcode 2 _Opcode 0x1111 _pFunc @Opcode_1111 0@ //регистрируем опкод
if 0@ <> 0
then
    msg "Opcode 1111: is registered" -1

    msg "Var 10@ = %d" -1 10@
    hex
     1111 //вызывая опкод через HEX учитываем, что он пишется задом на перед, так опкод 0AF8 мы бы записали как F80A
    end // 1111: inc
    msg "Send opcode 1111. Now var 10@ = %d" -1 10@ //после вызова опкода 1111 переменная 10@ увеличилась на 1
end
0a93:

:RegisterOpcode //0@ - opcode number, 1@ - opcode _stdcall function
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_RegisterOpcode@8" library 31@
0AC6: 1@ = label 1@ offset
0AA7: call_function 30@ num_params 2 pop 0 1@ 0@ 2@
ret 1 2@

:Opcode_1111 //1111: inc
hex
50                    // push eax
A1 08000080           // mov eax,[80000008] { -2147483640 }
40                    // inc eax
89 05 08000080        // mov [80000008],eax { -2147483640 }
58                    // pop eax
C2 0400               // ret 4
end // asm

Здесь наш опкод делает тоже самое что и в предыдущем примере, но мы передаем в него параметры как в обычные опкоды

CLEO:
{$CLEO}
wait 1000

call @GetIntAddr 2 @Opcode_1112 3 //записываем адрес функции CLEO_GetIntOpcodeParam(pThread)
call @SetIntAddr 2 @Opcode_1112 11 //записываем адрес функции CLEO_SetIntOpcodeParam(pThread, INT)
call @RegisterOpcode 2 _Opcode 0x1112 _pFunc @Opcode_1112 0@ //регистрируем опкод

if 0@ <> 0
then            
    log "Opcode 1112: is registered" -1
    2@ = 8 //задаем 2@ некое начальное значение
    hex
     1211 030200 030700 // 1211 - опкод 1112, 030200 - переменная 2@, 030700 - переменная 7@
    end // 1112: 2@ 7@
    msg "1112: %d -> %d" -1 2@ 7@
end

while true
    wait 0
end

:RegisterOpcode //0@ - opcode number, 1@ - opcode _stdcall function
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_RegisterOpcode@8" library 31@
0AC6: 1@ = label 1@ offset
0AA7: call_function 30@ num_params 2 pop 0 1@ 0@ 2@
ret 1 2@

:GetIntAddr //0@ - opcode _stdcall function, 1@ - offset
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_GetIntOpcodeParam@4" library 31@
0AC6: 0@ = label 0@ offset
005A: 0@ += 1@  // (int)
call @asm_call 3 0@ 30@ 1
ret 0

:SetIntAddr //0@ - opcode _stdcall function, 1@ - offset
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_SetIntOpcodeParam@8" library 31@
0AC6: 0@ = label 0@ offset
005A: 0@ += 1@  // (int)
call @asm_call 3 0@ 30@ 1
ret 0

:asm_call
0062: 1@ -= 0@ // (int)
000E: 1@ -= 4
0A8C: write_memory 0@ size 4 value 1@ virtual_protect 2@
0AB2: ret 0

:Opcode_1112
hex
50                    // push eax      { сохраняем значение eax, которое было до вызова опкода }
51                    // push ecx      { при вызове опкода в ecx хранится указатель на pThread, передаем его в GetInf }
E8 6880257E           // call 80808080     { GetInt | читаем значение из первой переменной (2@ в примере) }
40                    // inc eax       { увеличиваем eax (функции возвращают результат в eax, по этому в eax у нас значение 2@) }
50                    // push eax      { передаем значение eax функции SetInt, что бы оно записалось в 7@ }
51                    // push ecx      { Опять передаем pThread, но теперь в SetInt }
E8 6080257E           // call 80808080     { SetInt | пишем значение во вторую переменную (7@ в примере) }
58                    // pop eax      { загружаем значение eax, которое было до вызова опкода }
C2 0400               // ret 0004      { выходим из функции и подтираем 4 байта (адрес возврата) }
end // asm

Как вы видите из примеров, я использую HEX вставки для вызова зарегистрированных опкодов, но это можно упростить. SB поддерживает такую запись:
CLEO:
{$OPCODE 0CCC=1,my_new_opcode %1d%}
тут мы объявляем опкод 0CCC, у которого 1 параметр. Таким образом, для первого примера запись будет иметь такой вид:
CLEO:
{$OPCODE 1111=0,NOP}
А для последнего примера такой:
CLEO:
{$OPCODE 1112=2,my_new_opcode %1d% %2d%}
Ну и коды с использованием директивы $OPCODE:
CLEO:
{$CLEO}
wait 1000

call @RegisterOpcode 2 _Opcode 0x1111 _pFunc @Opcode_1111 0@
{$OPCODE 1111=0,NOP}
if 0@ <> 0
then
    1111: NOP
    msg "Opcode 1111: is registered" -1
end
0a93:

:RegisterOpcode //0@ - opcode number, 1@ - opcode _stdcall function
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_RegisterOpcode@8" library 31@
0AC6: 1@ = label 1@ offset
0AA7: call_function 30@ num_params 2 pop 0 1@ 0@ 2@
ret 1 2@

:Opcode_1111 //1111: NOP
hex
C3             //ret
end // asm
CLEO:
{$CLEO}
wait 1000

call @GetIntAddr 2 @Opcode_1112 3 //записываем адрес функции CLEO_GetIntOpcodeParam(pThread)
call @SetIntAddr 2 @Opcode_1112 11 //записываем адрес функции CLEO_SetIntOpcodeParam(pThread, INT)
call @RegisterOpcode 2 _Opcode 0x1112 _pFunc @Opcode_1112 0@ //регистрируем опкод

{$OPCODE 1112=2,my_new_opcode %1d% %2d%}

if 0@ <> 0
then               
    log "Opcode 1112: is registered" -1 
    2@ = 8 //задаем 2@ некое начальное значение
    1112: my_new_opcode 2@ 7@
    msg "1112: %d -> %d" -1 2@ 7@
end

while true
    wait 0
end

:RegisterOpcode //0@ - opcode number, 1@ - opcode _stdcall function
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@ 
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_RegisterOpcode@8" library 31@ 
0AC6: 1@ = label 1@ offset
0AA7: call_function 30@ num_params 2 pop 0 1@ 0@ 2@
ret 1 2@

:GetIntAddr //0@ - opcode _stdcall function, 1@ - offset
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@ 
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_GetIntOpcodeParam@4" library 31@ 
0AC6: 0@ = label 0@ offset
005A: 0@ += 1@  // (int)
call @asm_call 3 0@ 30@ 1
ret 0 

:SetIntAddr //0@ - opcode _stdcall function, 1@ - offset
0AA2: 31@ = load_library "kernel32.dll" // IF and SET
0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@ 
0AA7: call_function 30@ num_params 1 pop 0 "CLEO.asi" 31@
0AA4: 30@ = get_proc_address "_CLEO_SetIntOpcodeParam@8" library 31@ 
0AC6: 0@ = label 0@ offset
005A: 0@ += 1@  // (int)
call @asm_call 3 0@ 30@ 1
ret 0

:asm_call
0062: 1@ -= 0@ // (int)
000E: 1@ -= 4
0A8C: write_memory 0@ size 4 value 1@ virtual_protect 2@
0AB2: ret 0

:Opcode_1112
hex
50                    // push eax      { сохраняем значение eax, которое было до вызова опкода }
51                    // push ecx      { при вызове опкода в ecx хранится указатель на pThread, передаем его в GetInf }
E8 6880257E           // call 80808080     { GetInt | читаем значение из первой переменной (2@ в примере) }
40                    // inc eax       { увеличиваем eax (функции возвращают результат в eax, по этому в eax у нас значение 2@) }
50                    // push eax      { передаем значение eax функции SetInt, что бы оно записалось в 7@ }
51                    // push ecx      { Опять передаем pThread, но теперь в SetInt }
E8 6080257E           // call 80808080     { SetInt | пишем значение во вторую переменную (7@ в примере) }
58                    // pop eax      { загружаем значение eax, которое было до вызова опкода }
C2 0400               // ret 0004      { выходим из функции и подтираем 4 байта (адрес возврата) }
end // asm
Второй пример тут не рассматриваю, потому что в нем я зашиваю параметры в опкод, но а вообще он будет иметь такой же вид как и первый пример.


P.S. Использование собственных опкодов в скрипте - это лучший способ защитить свой скрипт от воровства или разбора кода, т.к. не каждый кодер может осилить asm, более того после декомпиляции весь asm код будет представлен без комментариев в HEX виде (если компилировать без исходного кода), что еще сильнее усложнит анализ кода скрипта.
 
Последнее редактирование:
  • Нравится
Реакции: Сэнд

Opcode.eXe

Известный
84
110
CLEO:
IF
0AB1: @CLEO_4_1_INSTALLED 0
THEN
    0AF8: "You have the correct version for SAMP! CLEO 4.1" -1
ELSE
    0AF8: "Warning! You have the wrong version for SAMP! CLEO 4.3" -1 
END


//0AB1: @CLEO_4_1_INSTALLED
:CLEO_4_1_INSTALLED
IF
0A9A: 31@ = openfile "CLEO.asi" mode 0x72 
THEN
    0A9C: 30@ = file 31@ size
    IF
    30@ == 0x24800
    THEN 0485:  return_true
    ELSE 059A:  return_false
    END
    0A9B: closefile 31@
END
0AB2: 0

by me, if anyone has a better way post it!
 
  • Нравится
Реакции: Сэнд

DarkP1xel

Давай трезвого!
BH Team
3,520
4,385
CLEO:
IF
0AB1: @CLEO_4_1_INSTALLED 0
THEN
    0AF8: "You have the correct version for SAMP! CLEO 4.1" -1
ELSE
    0AF8: "Warning! You have the wrong version for SAMP! CLEO 4.3" -1
END


//0AB1: @CLEO_4_1_INSTALLED
:CLEO_4_1_INSTALLED
IF
0A9A: 31@ = openfile "CLEO.asi" mode 0x72
THEN
    0A9C: 30@ = file 31@ size
    IF
    30@ == 0x24800
    THEN 0485:  return_true
    ELSE 059A:  return_false
    END
    0A9B: closefile 31@
END
0AB2: 0

by me, if anyone has a better way post it!
CLEO:
:GetCLEOVer
0AA2: 25@ = load_library "CLEO.ASI"
0AA4: 26@ = get_proc_address "_CLEO_GetVersion@0" library 25@
0AA7: call_function 26@ num_params 0 pop 0 || {VersionTo}27@ |
0AA3: free_library 25@
0AB2: RET 1 | {VersionTo}27@ |
 
  • Нравится
Реакции: Opcode.eXe

hnnssy

knowname
Друг
2,601
2,375
CLEO:
IF
0AB1: @CLEO_4_1_INSTALLED 0
THEN
    0AF8: "You have the correct version for SAMP! CLEO 4.1" -1
ELSE
    0AF8: "Warning! You have the wrong version for SAMP! CLEO 4.3" -1
END


//0AB1: @CLEO_4_1_INSTALLED
:CLEO_4_1_INSTALLED
IF
0A9A: 31@ = openfile "CLEO.asi" mode 0x72
THEN
    0A9C: 30@ = file 31@ size
    IF
    30@ == 0x24800
    THEN 0485:  return_true
    ELSE 059A:  return_false
    END
    0A9B: closefile 31@
END
0AB2: 0

by me, if anyone has a better way post it!
CLEO:
:GetCLEOVer
0AA2: 25@ = load_library "CLEO.ASI"
0AA4: 26@ = get_proc_address "_CLEO_GetVersion@0" library 25@
0AA7: call_function 26@ num_params 0 pop 0 || {VersionTo}27@ |
0AA3: free_library 25@
0AB2: RET 1 | {VersionTo}27@ |
0C92: 0@ = get_cleo_library_version
 
  • Нравится
Реакции: Opcode.eXe

woksonal

Известный
Проверенный
268
146
Описание: устанавливает углы поворота кара по X Y Z в градусах
CLEO:
// call @SetCarAngle 4 {CarHandle}0@ {angleX}1@ {angleY}2@ {angleZ}3@
:SetCarAngle
3@ *= 0.01745329251994329576923690768489
2@ *= 0.01745329251994329576923690768489
1@ *= 0.01745329251994329576923690768489
0A97: 4@ = car 0@ struct
4@ += 0x14
0A8D: 4@ = read_memory 4@ size 4 virtual_protect 0
4@ += 48
0A8D: 5@ = read_memory 4@ size 4 virtual_protect 0
4@ += 4
0A8D: 6@ = read_memory 4@ size 4 virtual_protect 0
4@ += 4
0A8D: 7@ = read_memory 4@ size 4 virtual_protect 0
4@ -= 56
0AA6: call_method 0x59B120 struct 4@ num_params 3 pop 0 3@ 2@ 1@  // ZYX rad
4@ += 48
0A8C: write_memory 4@ size 4 value 5@ virtual_protect 0
4@ += 4
0A8C: write_memory 4@ size 4 value 6@ virtual_protect 0   
4@ += 4                                                    
0A8C: write_memory 4@ size 4 value 7@ virtual_protect 0
ret 0
 

Opcode.eXe

Известный
84
110
Input:
TargetPosition *@ *@ *@
TargetAimbotAnglesRadian X *@ Y *@
Output: float DynamicFieldOfView

used for gta sa aimbot to get fieldofview including distance fix.


CLEO:
0AB1: @GET_REAL_FOV 5 POSITION 29@ 28@ 27@ TARGETXY 23@ 24@ _TO 0@
:GET_REAL_FOV
068D: get_camera_position_to 9@ 10@ 11@
050A: 12@ = distance_between_XYZ 0@ 1@ 2@ and_XYZ 9@ 10@ 11@
0AB1: @GetYXCameraAngle 0 X 26@ Y 25@ // >Snippet also posted in this thread<
0063: 3@ -= 26@  // (float)
0063: 4@ -= 25@  // (float)
0C03: math 3@ = sine 3@ // (float)
0C03: math 4@ = sine 4@ // (float)
006B: 3@ *= 12@  // (float)
006B: 4@ *= 12@  // (float)
0C09: math 3@ = power_1337 3@ 2.0
0C09: math 4@ = power_1337 4@ 2.0
005B: 3@ += 4@  // (float)
01FB: 3@ = square_root 3@
0AB2: 1 3@
 
  • Нравится
Реакции: orJIenoK_iT

MelomanCool

Новичок
Проверенный
65
40
Описание: оператор стрелка "->"
Использование: см. пример
Последним параметром обязательно должен быть "-1"!

Код:
CLEO:
:Arrow
{
  Example: 0AB1: @Arrow 5 0@ -> stSAMPPools -> stPlayerPool -> szLocalPlayerName -1 ret 1@
  In: 0@ .. 30@ - params (0@ - structure pointer)
  Out: 0@ - structure field address
}
var
1@: array 30 of Integer
end

for 31@ = 0 to 29
  if 1@[31@] <> -1
  jf break
  0A8D: 0@ = read_memory 0@ size 4 virtual_protect 1
  005A: 0@ += 1@[31@]
end
0AB2: ret 1 0@

Пример:
CLEO:
{$CLEO .cs}
0000:

while not Player.Defined($PLAYER_ACTOR)
  wait 1000
end

// single-player check
0AA2: 30@ = load_library "kernel32.dll"
0AA4: 31@ = get_proc_address "GetModuleHandleA" library 30@
0AA7: call_function 31@ num_params 1 pop 0 "samp.dll" 31@
0AA3: free_library 30@
if 31@ == 0
then
  0A93: end_custom_thread
end

while not Samp.Available()
  wait 150
end

const
  stSAMPInfo = 0x21A0F8

  // stSAMPInfo
  stSAMPPools = 0x3CD

  // stSAMPPools
  stPlayerPool = 0x18

  // PlayerPool
  szLocalPlayerName = 0xA
end

while true
  wait 0
  0AA2: 0@ = "samp.dll" offset
  0@ += stSAMPInfo
  0AB1: @Arrow 5 0@ -> stSAMPPools -> stPlayerPool -> szLocalPlayerName -1 ret 1@
  0AD1: show_formatted_text_highpriority "%s" time 0 1@
end

:Arrow
{
  Example: 0AB1: @Arrow 5 0@ -> stSAMPPools -> stPlayerPool -> szLocalPlayerName -1 ret 1@
  In: 0@ .. 30@ - params (0@ - structure pointer)
  Out: 0@ - structure field address
}
var
1@: array 30 of Integer
end

for 31@ = 0 to 29
  if 1@[31@] <> -1
  jf break
  0A8D: 0@ = read_memory 0@ size 4 virtual_protect 1
  005A: 0@ += 1@[31@]
end
0AB2: ret 1 0@
 
Последнее редактирование:

DarkP1xel

Давай трезвого!
BH Team
3,520
4,385
Описание: Проверка на SA:MP без SAMPFuncs. Сначала проверяет, запущен SA:MP или Single Player. Если был запущен SA:MP, то проверяет, что структуры SA:MP'a были загружены и готовы к использованию. Иначе скрипт отключается.
Использование: -

Код/Пример:
CLEO:
{$CLEO}
IF 0050: _gosub @getSAMPBase // Получаем: HMODULE::SAMPBase (0@) и проверяем, что SA:MP запущен.
THEN

    REPEAT
    0001: 0
    UNTIL 0AB1: _call_scm_func @getStSAMP params 1 | {HMODULE::SAMPBase}0@ | {stSAMP}1@ | // Получаем структуру: stSAMP, а так же проверяем, что SA:MP загружен.

    // Тут код который должен будет выполниться после того как SA:MP полностью загрузится.
    /*

    ...
    0B78: _log "{%X}SAMPBase: %X | stSAMP: %X" {CLR}0xFFA500 {HMODULE::SAMPBase}0@ {stSAMP}1@
    ...

    */

    WHILE TRUE
    0001: 0
    0ACD: "~G~SAMP LOADED!" {MS}1
    END

END
0A93:

:getSAMPBase
0AA7: call_function {HMODULE::__stdcall::GetModuleHandleA}0x81E406 num_params 1 pop 0 | {LPCSTR::lpModuleName}"SAMP.DLL" | {HMODULE::SAMPBase}0@ |
0019:   {HMODULE::SAMPBase}0@ > {nullptr}0x0 // Записываем в текущий поток скрипта значение condResult для установки условия.
0051: _return

:getStSAMP
000A: {HMODULE::SAMPBase}0@ += {SAMP_INFO_OFFSET}0x21A0F8 // Смещение на SAMP_INFO_OFFSET.
0A8D: {stSAMP}0@ = read_memory 0@ size {PTR}4 virtual_protect TRUE // При считывание смещения на SAMP_INFO_OFFSET получаем структуру: stSAMP.
0019:   {stSAMP}0@ > {nullptr}0x0 // Записываем в текущий поток скрипта значение condResult для установки условия.
0AB2: _RET 1 | {stSAMP}0@ |
 
  • Нравится
Реакции: eiuhuth и romacaddy

DarkP1xel

Давай трезвого!
BH Team
3,520
4,385
Описание: Очистка всех переменных в текущем потоке без SAMPFuncs.
Использование: 0050: _gosub @cleanThreadVars

Код/Пример:
CLEO:
:cleanThreadVars
0A9F: {CScriptThread *}33@ = current_thread_pointer
000A: {CScriptThread *}33@ += { offsetof(CScriptThread, tls) }0x3C
0AA7: call_function {void *::__cdecl::_memset}0x82D4C0 num_params 3 pop 3 | {size_t::num}0x88 {int::value}0x0 {void *::ptr}33@ | {void *::ptr}33@ |
0051: _return