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

Тема в разделе "CLEO", создана пользователем MISTER_GONWIK, 17 май 2013.

  1. MelomanCool

    Проверенный

    Регистрация:
    19.03.2013
    Сообщения:
    66
    Симпатии:
    40
    Репутация:
    20
    Описание: оператор стрелка "->"
    Использование: см. пример
    Последним параметром обязательно должен быть "-1"!

    Код:
    
    :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 .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@
    
     
    Последние данные очков репутации:
    Dark_Knight: 3 Очки (Вполне, вполне) 25 июн 2016
    woksonal: 2 Очки (+) 28 июн 2016
    #121 MelomanCool, 25 июн 2016
    Последнее редактирование: 25 июн 2016
    SR_team и FYP нравится это.
  2. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.273
    Симпатии:
    1.420
    Репутация:
    344
    Описание: Проверка на SA:MP без SAMPFuncs. Сначала проверяет, запущен SA:MP или Single Player. Если был запущен SA:MP, то проверяет, что структуры SA:MP'a были загружены и готовы к использованию. Иначе скрипт отключается.
    Использование: -

    Код/Пример:
    
    {$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@ |
    
     
    romacaddy нравится это.
  3. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.273
    Симпатии:
    1.420
    Репутация:
    344
    Описание: Очистка всех переменных в текущем потоке без SAMPFuncs.
    Использование: 0050: _gosub @cleanThreadVars

    Код/Пример:
    :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
     
    romacaddy и p1cador нравится это.
  4. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.743
    Симпатии:
    1.782
    Репутация:
    455
    Сниплет позволяет вызывать локальные команды, которые были зарегистрированы сампом/скриптами/плагинами.

    0AC8: 0@ = allocate_memory_size 33 // 33 - max cmd length 
    0AC8: 1@ = allocate_memory_size 144 // 144 - max chat input
    
    0AD3: 0@ = format "fpslimit"
    0AD3: 1@ = format "90" 
    0AB1: call @execLocalCommand 2 0@ 1@         
    
    0AC9: free_allocated_memory 1@
    0AC9: free_allocated_memory 0@
    В данном коде переменная 0@ содержит название команды, а переменная 1@ содержит ее аргументы.

    :execLocalCommand // 0@ - pszCmdName 1@ - pszCmdArgs, no ret       
    0AB1: call @getCommandProc 1 0@ 2@
    0AA7: call_function 2@ num_params 1 pop 1 1@
    ret 0
    :getCommandProc // 0@ - pszCmdName, ret - pCMD
    /* getCmdProcByName
    * R2: 0x65B40
    * R1: 0x65A70
    */
    0AA2: 1@ = load_library "samp.dll"
    if 0AB1: call @is037R2 0
    then         
        1@ += 0x65B40
    else 
        1@ += 0x65A70         
    end 
    0AB1: call @getInputInfo 0 2@
    0AA8: call_function_method 1@ struct 2@ num_params 1 pop 0 0@ 3@
    ret 1 3@
    :getInputInfo // no args, ret - pInputInfo 
    /* InputInfo
    * R2: 0x21A0F0
    * R1: 0x21A0E8
    */
    0AA2: 0@ = load_library "samp.dll"
    if 0AB1: call @is037R2 0
    then         
        0@ += 0x21A0F0 
    else         
        0@ += 0x21A0E8
    end           
    0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
    0AB2: ret 1 0@
    :is037R2 // no args, no ret
    0AA2: 0@ = load_library "samp.dll"
    0A8E: 1@ = 0@ + 0x129 // check SAMP version
    0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
    if 2@ == 0x0C
    then         
        0AB2: ret 0 1     
    end
    0AB2: ret 0 0

    :execLocalCommand // 0@ - pszCmdName 1@ - pszCmdArgs, no ret       
    0AB1: call @getCommandProc 1 0@ 2@
    0AA7: call_function 2@ num_params 1 pop 1 1@
    ret 0
    
    :getCommandProc // 0@ - pszCmdName, ret - pCMD
    /* getCmdProcByName
    * R2: 0x65B40
    * R1: 0x65A70
    */
    0AA2: 1@ = load_library "samp.dll"
    if 0AB1: call @is037R2 0
    then         
        1@ += 0x65B40
    else 
        1@ += 0x65A70         
    end 
    0AB1: call @getInputInfo 0 2@
    0AA8: call_function_method 1@ struct 2@ num_params 1 pop 0 0@ 3@
    ret 1 3@
    
    :getInputInfo // no args, ret - pInputInfo 
    /* InputInfo
    * R2: 0x21A0F0
    * R1: 0x21A0E8
    */
    0AA2: 0@ = load_library "samp.dll"
    if 0AB1: call @is037R2 0
    then         
        0@ += 0x21A0F0 
    else         
        0@ += 0x21A0E8
    end           
    0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
    0AB2: ret 1 0@
    
    :is037R2 // no args, no ret
    0AA2: 0@ = load_library "samp.dll"
    0A8E: 1@ = 0@ + 0x129 // check SAMP version
    0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
    if 2@ == 0x0C
    then         
        0AB2: ret 0 1     
    end
    0AB2: ret 0 0
    {$CLEO}
    wait 1750
    
    0AC8: 0@ = allocate_memory_size 33 // 33 - max cmd length 
    0AC8: 1@ = allocate_memory_size 144 // 144 - max chat input
    0AD3: 0@ = format "fpslimit"
    
    0AD3: 1@ = format "90" 
    0AB1: call @execLocalCommand 2 0@ 1@         
    
    0AC9: free_allocated_memory 1@
    0AC9: free_allocated_memory 0@
    0A93: end_custom_thread
    
    :execLocalCommand // 0@ - pszCmdName 1@ - pszCmdArgs, no ret       
    0AB1: call @getCommandProc 1 0@ 2@
    0AA7: call_function 2@ num_params 1 pop 1 1@
    ret 0
    
    :getCommandProc // 0@ - pszCmdName, ret - pCMD
    /* getCmdProcByName
    * R2: 0x65B40
    * R1: 0x65A70
    */
    0AA2: 1@ = load_library "samp.dll"
    if 0AB1: call @is037R2 0
    then         
        1@ += 0x65B40
    else 
        1@ += 0x65A70         
    end 
    0AB1: call @getInputInfo 0 2@
    0AA8: call_function_method 1@ struct 2@ num_params 1 pop 0 0@ 3@
    ret 1 3@
    
    :getInputInfo // no args, ret - pInputInfo 
    /* InputInfo
    * R2: 0x21A0F0
    * R1: 0x21A0E8
    */
    0AA2: 0@ = load_library "samp.dll"
    if 0AB1: call @is037R2 0
    then         
        0@ += 0x21A0F0 
    else         
        0@ += 0x21A0E8
    end           
    0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
    0AB2: ret 1 0@
    
    :is037R2 // no args, no ret
    0AA2: 0@ = load_library "samp.dll"
    0A8E: 1@ = 0@ + 0x129 // check SAMP version
    0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
    if 2@ == 0x0C
    then         
        0AB2: ret 0 1     
    end
    0AB2: ret 0 0
     
    kraft1k, LaRossa и Ded_Fedot нравится это.