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

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

  1. Dark_Knight

    Dark_Knight РКН Тян на страже твоей анальной девственности.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.389
    Симпатии:
    689
    Репутация:
    204
    If you want to UrlDownloadToFile not cause freezes the game you need the fifth parameter to pass a pointer to it BindStatusCallback. (c) Google Translate
     
    unInstance нравится это.
  2. Opcode.eXe

    Opcode.eXe Известный пользователь

    Регистрация:
    11.04.2013
    Сообщения:
    86
    Симпатии:
    91
    Репутация:
    51
    This function will say the TEXT with a voice. You can set the language of the Voice too.

    Function:
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AD3: 0@ = "Hello this is an TEXT to VOICE"
    0AD3: 1@ = "en" // "de" - German, "ru" - russian" more on google ^^
    0AB1: @VOICE_SAY_TEXT 2 0@ LANGUAGE 1@
    0AC9: free_allocated_memory 0@
    0AC9: free_allocated_memory 1@

    //0AB1: @VOICE_SAY_TEXT 2 0@ LANGUAGE 1@
    :VOICE_SAY_TEXT
    IF
    0AAB:  file_exists "CLEO\downloads\voice.mp3"
    THEN
        0B00: delete_file "CLEO\downloads\voice.mp3"
    END     
    0AC8: 2@ = allocate_memory_size 260
    0ad3: 2@ = "http:%c%ctranslate.google.com/translate_tts?tl=%s&q=%s" 47 47 1@ 0@
    0D92: 3@ = download_query url 2@ local_file "voice.mp3"
    REPEAT
        WAIT 0     
        0D93: download_query 3@ get_state_to 4@ 
    UNTIL 4@ == 0
    0AAC: 4@ = load_audiostream "CLEO\downloads\voice.mp3"
    0AAD: set_mp3 4@ perform_action 1
    0AC0: audiostream 4@ loop 0
    0ABC: set_audiostream 4@ volume 1.0
    REPEAT
    WAIT 0 // by OpcodeXe
        0AB9: get_audio_stream_state 4@ store_to 5@
    UNTIL 5@ == -1
    0AAE: release_mp3 4@
    0AC9: free_allocated_memory 2@
    0AB2: 0
    Example:
    - Read CHAT when pressing R.


    {$CLEO .cs}
    0000:
    
    REPEAT
        WAIT 0
    UNTIL 0AFA:  SAMP_IS_READY
    
    WHILE TRUE
        WAIT 0
        IF
        0AB0: 82
        THEN
            0AC8: 0@ = allocate_memory_size 260
            0AC8: 1@ = allocate_memory_size 260
            0AB1: @GETCHATENTRYTEXT 1 ID 99 0@
            0AD3: 1@ = "en"
            0AB1: @VOICE_SAY_TEXT 2 0@ LANGUAGE 1@ 
            0AC9: free_allocated_memory 0@
            0AC9: free_allocated_memory 1@
        END
    END
    
    :getChatEntryText
    0AF7: samp 1@ = get_base
    1@ += 0x212A6C
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    1@ += 0x136
    0@ *= 0xFC
    005A: 1@ += 0@
    1@ += 0x1C
    0AB2: 1 1@
    
    //0AB1: @VOICE_SAY_TEXT 2 0@ LANGUAGE 1@
    :VOICE_SAY_TEXT
    IF
    0AAB:  file_exists "CLEO\downloads\voice.mp3"
    THEN
        0B00: delete_file "CLEO\downloads\voice.mp3"
    END     
    0AC8: 2@ = allocate_memory_size 260
    0ad3: 2@ = "http:%c%ctranslate.google.com/translate_tts?tl=%s&q=%s" 47 47 1@ 0@
    0D92: 3@ = download_query url 2@ local_file "voice.mp3"
    REPEAT
        WAIT 0     
        0D93: download_query 3@ get_state_to 4@ 
    UNTIL 4@ == 0
    0AAC: 4@ = load_audiostream "CLEO\downloads\voice.mp3"
    0AAD: set_mp3 4@ perform_action 1
    0AC0: audiostream 4@ loop 0
    0ABC: set_audiostream 4@ volume 1.0
    REPEAT
    WAIT 0 // by OpcodeXe
        0AB9: get_audio_stream_state 4@ store_to 5@
    UNTIL 5@ == -1
    0AAE: release_mp3 4@
    0AC9: free_allocated_memory 2@
    0AB2: 0
    
     
    Последние данные очков репутации:
    mgmoldova: 4 Очки (use this http://blasthack.net/threads/897/page-2#post-53096) 25 окт 2014
  3. gcode

    gcode нестандартное звание звание звание звание звани...
    Проверенный

    Регистрация:
    09.06.2013
    Сообщения:
    793
    Симпатии:
    392
    Репутация:
    361
    Замена встроенного опкода ходьбы (применяется в Botter). Цикл можно вынести за пределы функции, чтобы сделать её прерываемой.

    0AB1: call @char_goto 4 XYZ 1234.0 4321.0 1243.0 sprint true
     
    :char_goto
    repeat
        wait 0
        00A0: store_actor $PLAYER_ACTOR position_to 4@ 5@ 2@
        0063: 0@ -= 4@
        0063: 1@ -= 5@
        0604: get_Z_angle_for_point 0@ 1@ store_to 2@
        005B: 0@ += 4@
        005B: 1@ += 5@
        2@ *= 0.01745
        0A96: 4@ = actor $PLAYER_ACTOR struct
        4@ += 0x558
        0A8C: write_memory 4@ size 4 value 2@ virtual_protect 0
        0373: set_camera_directly_behind_player
        if
            3@ == false
        then
            4@ = 0xB73458
            4@ += 0x20
            0A8C: write_memory 4@ size 1 value 0 virtual_protect 0
            4@ = 0xB73458
            4@ += 0x3
            0A8C: write_memory 4@ size 1 value 255 virtual_protect 0
        else
            4@ = 0xB73458
            4@ += 0x20
            0A8C: write_memory 4@ size 1 value 255 virtual_protect 0
            4@ = 0xB73458
            4@ += 0x3
            0A8C: write_memory 4@ size 1 value 255 virtual_protect 0
        end
    until 00ED: actor $PLAYER_ACTOR 0 near_point 0@ 1@ radius 0.4 0.4 on_foot
    0AB2: ret 0
     
    Последние данные очков репутации:
    fonarik: 1 Очко (хорош) 27 окт 2014
    kraft1k, Lightkiller, Dragar и ещё 1-му нравится это.
  4. legend2360

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.366
    Симпатии:
    835
    Репутация:
    473
    Описание:
    Возвращает дистанцию и ид ближайшего игрока.​

    Код:
    :get_id_nearest_player
    // FOR ALL PEDS
    3@ = 1000.0 // Max. distance
    4@ = 0xFFFFFF // Nearest player handle / id
     
    0A8D: 0@ = read_memory 0xB74490 size 4 virtual_protect 0
    0@ += 4
    0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
    for 1@ = 0 to 35584 step 0x100
        0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
        0@++
        if and
            2@ >= 0x00
            2@ < 0x80
        then
            005A: 2@ += 1@
            if or
                003C: $PLAYER_ACTOR == 2@ // LOCAL_PLAYER == REMOTE_PLAYER
                856D: NOT actor 2@ defined // REMOTE PLAYER IS NOT DEFINED
            then continue
            end
         
            0AB1: call @distanceBetweenActor 1 remote_player_handle 2@ retr_dist_to 5@
            if 0025: 3@ > 5@ // Max. dist > cur.
            then
                0087: 3@ = 5@ // Max. dist = cur.
                0085: 4@ = 2@ // Save remote player handle
            end
        end
    end
     
    if 4@ = SAMP.GetSAMPPlayerIDByActorHandle(4@)
    then
        0485:  return_true
    else
        059A:  return_false
    end
    0AB2: ret 2 3@ 4@
     
    :distanceBetweenActor
    Actor.StorePos(0@, 1@, 2@, 3@)
    Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
    050A: 7@ = distance_between_XYZ 4@ 5@ 6@ and_XYZ 1@ 2@ 3@
    0AB2: ret 1 7@

    Использование:
    {$CLEO}
     
    0001: wait 0 ms
    0662: "by legend2360"
    0662: "BlastHack - cheating is art"
     
    while not SAMP.Available()
        wait 400
    end
     
    while true
        wait 0
        if 0AB1: call @get_id_nearest_player 0 retr_to fdist 0@ sid 1@
        then
            0AD1: show_formatted_text_highpriority "Player %d ; dist %.2f" 0 1@ 0@
        end
    end
    UPD 24.11: Перезаписал функу, лучше так, чем через пул сампа :)
     
    Сэнд, PoccoJI и XyJluraH_J нравится это.
  5. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.621
    Симпатии:
    1.579
    Репутация:
    421
    Пемещение диалогов как окон windows
    :DialogMove
    {Example:
    0ab1: call @DialogMove 2 dialogID 0@ keyMoveID 1@
    in: 0@ - dialog id for move; 1@ - key id for move
    out: none}
    0085: 9@ = 1@
    0B85: dialog 0@ get_position_to 1@ 2@ size_to 3@ 4@
    if 0ab1: call @TaskDialog 4 1@ 2@ 3@ 9@ ret_offset 7@ 8@
        then
        repeat
        wait 0
        0B5E: get_cursor_pos 5@ 6@
        0062: 5@ -= 7@
        0062: 6@ -= 8@
        0B84: dialog 0@ set_pos_XY 5@ 6@ size 3@ 4@
        until 8ab0: 9@
        0BA1: dialog 0@ set_minimized 0
        end
    ret 0
    :TaskDialog
    0085: 6@ = 3@
    0085: 4@ = 0@
    0085: 5@ = 1@
    005A: 4@ += 2@
    5@ += 15
    0B5E: get_cursor_pos 2@ 3@
    if and
    0ab0: 6@
    002D: 2@ >= 0@
    801D: 2@ <= 4@
    002D: 3@ >= 1@
    801D: 3@ <= 5@
        then
        0485:  return_true
        0062: 2@ -= 0@
        0062: 3@ -= 1@
        else
        059A:  return_false
        2@ = -1
        3@ = -1
        end
    ret 2 2@ 3@
    :DialogMove
    {Example:
    0ab1: call @DialogMove 2 dialogID 0@ keyMoveID 1@
    in: 0@ - dialog id for move; 1@ - key id for move
    out: none}
    0085: 9@ = 1@
    0B85: dialog 0@ get_position_to 1@ 2@ size_to 3@ 4@
    if 0ab1: call @TaskDialog 4 1@ 2@ 3@ 9@ ret_offset 7@ 8@
        then
        repeat
        wait 0
        0B5E: get_cursor_pos 5@ 6@
        0062: 5@ -= 7@
        0062: 6@ -= 8@
        0B84: dialog 0@ set_pos_XY 5@ 6@ size 3@ 4@
        call @DialogBorder 1 dialogID 0@
        until 8ab0: 9@
        0BA1: dialog 0@ set_minimized 0
    end
    ret 0
    :TaskDialog
    0085: 6@ = 3@
    0085: 4@ = 0@
    0085: 5@ = 1@
    005A: 4@ += 2@
    5@ += 15
    0B5E: get_cursor_pos 2@ 3@
    if and
    0ab0: 6@
    002D: 2@ >= 0@
    801D: 2@ <= 4@
    002D: 3@ >= 1@
    801D: 3@ <= 5@
        then
        0485: return_true
        0062: 2@ -= 0@
        0062: 3@ -= 1@
        else
        059A: return_false
        2@ = -1
        3@ = -1
        end
    ret 2 2@ 3@
    :DialogBorder
    0B85: dialog 0@ get_position_to 1@ 2@ size_to 3@ 4@
    0B5A: get_screen_resolution 5@ 6@
    0062: 5@ -= 3@
    0062: 6@ -= 4@
    if 1@ < 0
        then 1@ = 0
        end
    if 2@ < 0
        then 2@ = 0
        end
    if 001D: 1@ > 5@
        then 0085: 1@ = 5@
        end
    if 001D: 2@ > 6@
        then 0085: 2@ = 6@
        end
    0B84: dialog 0@ set_pos_XY 1@ 2@ size 3@ 4@
    ret 0
     
    Сэнд, unInstance и Quned нравится это.
  6. Opcode.eXe

    Opcode.eXe Известный пользователь

    Регистрация:
    11.04.2013
    Сообщения:
    86
    Симпатии:
    91
    Репутация:
    51
    Function:
    0AB1: @POSITION_TO_RADAR 7 XYZ 0.0 0.0 0.0 RADAR_POS 400 400 DISTANCE_MULTIPLIER 1.5 MAX_DISTANCE 300.0 _STORE_TO 1@ 2@

    This function converts 3D position to 2D Radar position like on the Minimap.
    You can make things like this:
    http://i.san-mp.de/i/26CEA9.webm
    Source:
    {$CLEO .cs}
    0000:
    REPEAT
        WAIT 0
    UNTIL 0AFA:  SAMP_IS_READY
    0B6D: 5@ = create_font "Arial" height 10 flags 0x4
    0BFC: SET_VAR "MadeByOpcodeXe" = 5@
     
     
    WHILE TRUE
        WAIT 0 
        FOR 31@ = 0 TO 1000
            IF
            0B23:  samp is_player_connected 31@
            THEN
                IF
                0B20: samp 30@ = actor_handle_by_samp_player_id 31@
                THEN
                    0AB1: @GET_BONE_POS 2 FROM_ACTOR $PLAYER_ACTOR BONE 6 _STORE_TO 5@ 6@ 7@  // HEAD 
                    04C4: store_coords_to 8@ 9@ 10@ from_actor 30@ with_offset 0.0 0.0 0.0                   
                    0B55: convert_3D_coords 5@ 6@ 7@ to_screen 5@ 6@
                    0AB1: @POSITION_TO_RADAR 7 XYZ 8@ 9@ 10@ RADAR_POS 5@ 6@ DISTANCE_MULTIPLIER 1.5 MAX_DISTANCE 300.0 _STORE_TO 13@ 14@
                    0B70: draw_polygon_pos 5@ 6@ size 7 7 corners 7 rotation 0 color 0xFFFFFFFF
                    0B70: draw_polygon_pos 13@ 14@ size 5 5 corners 5 rotation 90 color 0xFFFFFFFF                                     
                    0B36: samp 15@ = get_player_nickname 31@
                    0B37: samp 16@ = get_player_color 31@
                    0BFD: 5@ = get_global_var "MadeByOpcodeXe"
                    0B6B: 6@ = font 5@ draw_text 15@ length
                    0B6C: 7@ = font 5@ draw_height
                    7@ += 5
                    6@ /= 2
                    0062: 13@ -= 6@  // (int)
                    0062: 14@ -= 7@  // (int)
                    0B6F: render font 5@ draw_text 15@ pos 13@ 14@ color 16@
                END
            END
        END 
    END   
     
    //0AB1: @GET_BONE_POS 2 FROM_ACTOR $PLAYER_ACTOR BONE 6 _STORE_TO 1@ 2@ 3@  // HEAD   
    :GET_BONE_POS
    0085: 10@ = 0@ // (int)
    0085: 15@ = 1@ // (int)
    1@ = 0.0 // X offset
    2@ = 0.0 // Y offset {THX TO: WESSER}
    3@ = 0.0 // Z offset
    0A96: 0@ = actor 10@ struct
    0AC7: 4@ = var 1@ offset
    0AA6: call_method 0x5E01C0 struct 0@ num_params 3 pop 0 bIncludeAnim 1 iBoneID 15@ vOffset 4@ // CPed__getBonePositionWithOffset
    0AB2: retn 3 1@ 2@ 3@
    //0AB1: @POSITION_TO_RADAR 7 XYZ 0.0 0.0 0.0 RADAR_POS 400 400 DISTANCE_MULTIPLIER 1.5 MAX_DISTANCE 300.0 _STORE_TO 1@ 2@ 
    :POSITION_TO_RADAR
    04C4: 10@ 11@ 12@ = XYZ $PLAYER_ACTOR 0.0 0.0 0.0
    050A: 13@ = distance_between_XYZ 0@ 1@ 2@ and_XYZ 10@ 11@ 12@
    006B: 13@ *= 5@
    IF
    0025:  13@ > 6@
    THEN
    0087: 13@ = 6@ // (float)
    END 
    0AB1: @getZAngleBetweenPoints 4 from_XY 10@ 11@ and_XY 0@ 1@ store_to 14@ 
    14@ *= -1.0
    0AB1: @getCameraFacingAngle 0 15@
    005B: 14@ += 15@
    0093: 3@ = integer 3@ to_float
    0093: 4@ = integer 4@ to_float
    0AB1: @makeCordinate 6 3@ 4@ 0.0 Z_Angle 14@ 0.0 Distance 13@ STORE_TO 16@ 17@
    0092: 16@ = float 16@ to_integer
    0092: 17@ = float 17@ to_integer
    0AB2: 2 16@ 17@
    :makeCordinate
    3@ *= -1.0
    02F6: 6@ = sine 3@
    006B: 6@ *= 5@
    005B: 0@ += 6@
    02F7: 6@ = cosine 3@
    006B: 6@ *= 5@
    005B: 1@ += 6@
    02F7: 6@ = cosine 4@
    0073: 5@ /= 6@
    02F6: 6@ = sine 4@
    006B: 5@ *= 6@
    005B: 2@ += 5@
    0AB2: 2 0@ 1@
    :getCameraFacingAngle
    00A0: store_actor $PLAYER_ACTOR position_to 1@ 2@ 3@ 
    0AA6: call_method 0x514970 struct 0xB6F028 num_params 6 pop 0 0xA49994 0xA499A0 3@ 2@ 1@ 20.0
    0AB1: call_scm_func @getZAngleBetweenPoints 4 from_XY $13 $14 and_XY 1@ 2@ store_to 4@
    0AB2: 1 4@
    :getZAngleBetweenPoints
    0063: 0@ -= 2@
    0063: 1@ -= 3@
    0604: get_Z_angle_for_point 0@ 1@ store_to 4@
    0AB2: 1 4@
    Function code:
    //0AB1: @POSITION_TO_RADAR 7 XYZ 0.0 0.0 0.0 RADAR_POS 400 400 DISTANCE_MULTIPLIER 1.5 MAX_DISTANCE 300.0 _STORE_TO 1@ 2@ 
    :POSITION_TO_RADAR
    04C4: 10@ 11@ 12@ = XYZ $PLAYER_ACTOR 0.0 0.0 0.0
    050A: 13@ = distance_between_XYZ 0@ 1@ 2@ and_XYZ 10@ 11@ 12@
    006B: 13@ *= 5@
    IF
    0025:  13@ > 6@
    THEN
    0087: 13@ = 6@ // (float)
    END 
    0AB1: @getZAngleBetweenPoints 4 from_XY 10@ 11@ and_XY 0@ 1@ store_to 14@ 
    14@ *= -1.0
    0AB1: @getCameraFacingAngle 0 15@
    005B: 14@ += 15@
    0093: 3@ = integer 3@ to_float
    0093: 4@ = integer 4@ to_float
    0AB1: @makeCordinate 6 3@ 4@ 0.0 Z_Angle 14@ 0.0 Distance 13@ STORE_TO 16@ 17@
    0092: 16@ = float 16@ to_integer
    0092: 17@ = float 17@ to_integer
    0AB2: 2 16@ 17@
    :makeCordinate
    3@ *= -1.0
    02F6: 6@ = sine 3@
    006B: 6@ *= 5@
    005B: 0@ += 6@
    02F7: 6@ = cosine 3@
    006B: 6@ *= 5@
    005B: 1@ += 6@
    02F7: 6@ = cosine 4@
    0073: 5@ /= 6@
    02F6: 6@ = sine 4@
    006B: 5@ *= 6@
    005B: 2@ += 5@
    0AB2: 2 0@ 1@
    :getCameraFacingAngle
    00A0: store_actor $PLAYER_ACTOR position_to 1@ 2@ 3@ 
    0AA6: call_method 0x514970 struct 0xB6F028 num_params 6 pop 0 0xA49994 0xA499A0 3@ 2@ 1@ 20.0
    0AB1: call_scm_func @getZAngleBetweenPoints 4 from_XY $13 $14 and_XY 1@ 2@ store_to 4@
    0AB2: 1 4@
    :getZAngleBetweenPoints
    0063: 0@ -= 2@
    0063: 1@ -= 3@
    0604: get_Z_angle_for_point 0@ 1@ store_to 4@
    0AB2: 1 4@
     
    Последние данные очков репутации:
    SR_team: 4 Очки (Oh, I got your record when tested script: D) 3 дек 2014
    AWRage и XyJluraH_J нравится это.
  7. legend2360

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.366
    Симпатии:
    835
    Репутация:
    473
    Описание:
    Ищет в зоне стрима пикап с указанной моделью, при существовании данного пикапа - возвращает его ид.​

    Код:
    :getPickupIdByModel
    0BB9: samp 1@ = get_pickup_pool_ptr
    0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 // PickupsCount
    if 2@ > 0
    then
        0A8E: 2@ = 1@ + 0x4 // ul_GTA_PickupID
        0A8E: 3@ = 1@ + 0xF004 // stPickup
        for 4@ = 0 to 4095 step 1
            0A90: 5@ = 4@ * 4
            005A: 5@ += 2@
            0A8D: 5@ = read_memory 5@ size 4 virtual_protect 0
            if 5@ <> 0
            then
                0A90: 5@ = 4@ * 20
                005A: 5@ += 3@
                0A8D: 5@ = read_memory 5@ size 4 virtual_protect 0 // pickupModel
                if 003b: 5@ == 0@
                then
                    0485:  return_true
                    0AB2: ret 1 4@
                end
            end
        end
    end
    059A:  return_false
    0AB2: ret 1 -1

    Использование:
    {$CLEO}
     
    0001: wait 0 ms
     
    while not SAMP.Available()
        wait 400
    end
     
    0B34: samp register_client_command "gidpick" to_label @cmd
     
    0BDE: pause_thread 0
     
    :cmd
    0B35: samp 0@ = get_last_command_params
    0C1A: 1@ = atoi 0@
    if 0AB1: call_scm_func @getPickupIdByModel 1 model 1@ id_to 2@
    then
        0AF8: samp add_message_to_chat "PickupID %d, model %d" color -1 params 2@ 1@
    end
    0B43: samp cmd_ret
     
    XyJluraH_J, fonarik и Dragar нравится это.
  8. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.621
    Симпатии:
    1.579
    Репутация:
    421
    Получение разрешения экрана:
    call @GetResolution 0 1@ 2@
    :GetResolution
    0A8D: 0@ = read_memory 0xC9C040 size 4 virtual_protect 0 //X
    0A8D: 1@ = read_memory 0xC9C044 size 4 virtual_protect 0 //Y
    ret 2 0@ 1@  
    Получение диагонали экрана:
    call @DisplayInch 0 1@
    :DisplayInch
    0A8D: 0@ = read_memory 0xC9C048 size 4 virtual_protect 0
    ret 1 0@
    Получение частоты обновления экрана в Mhz:
    call @DisplayRefresh 0 1@
    :DisplayRefresh
    0A8D: 0@ = read_memory 0xC9C070 size 4 virtual_protect 0
    ret 1 0@
    Проверка, что запущена игра в окне:
    call @isWindowMode 0
    :isWindowMode
    0A8D: 0@ = read_memory 0xC9C060 size 4 virtual_protect 0
    if 0@ == 1
        then ret 0 1
    end
    ret 0 0
     
    #88 SR_team, 7 фев 2015
    Последнее редактирование: 18 фев 2015
    unInstance, _Viktor_ и DarkP1xel нравится это.
  9. DubStep_

    Проверенный

    Регистрация:
    20.03.2013
    Сообщения:
    295
    Симпатии:
    56
    Репутация:
    28
    Установка позиции курсора

    call @CursorSetPos 2 X: 200 Y: 240
    
    :CursorSetPos           
    { ex: call @CursorSetPos 2 200 240 }                    
    0AA2: 2@ = load_library "user32.dll"  
    0AA4: 3@ = get_proc_address "SetCursorPos" library 2@  
    0AA5: call 3@ num_params 2 pop 0 1@ 0@ 
    ret 0
     
    Последние данные очков репутации:
    Enjoy: 1 Очко (+сик заслужил) 16 фев 2015
    Избранный: 1 Очко (+) 13 янв 2016
    Избранный нравится это.
  10. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.621
    Симпатии:
    1.579
    Репутация:
    421
    Расширяем количество переменных, ну или что-то в этом роде.
    В доп. памяти можно хранить int, float, указатели. Строки хранить нельзя, если хотите хранить строки, то нужно увеличить размер каждой ячейки буфера (00 00 00 00 00) и изменить множитель. Сейчас множитель 5, он определяется числом байт 1 ячейки (00 - байт). Размер 1 переменной 4 байта, по этому в буфере каждая ячейка записана в 5 байт, что бы было разделение между ними.
    Число ячеек можно увеличить до бесконечности.

    Что бы сохранить переменную юзайте 0ab1: @sVar 2 _bufVar _fromVar, где _bufVar это ячейка в буфере, а _fromVar та переменная которую надо сохранить.
    Что бы загрузить переменную юзайте 0ab1: @gVar 1 _bufVar _toVar, где _bufVar так же ячейка в буфере, а _toVar переменная в которую надо загрузить инфу из буфера.
    :sVar
    //0ab1: @sVar 2 _bufVar _fromVar
    0AC6: 2@ = label @Buffer offset
    0@ *= 5
    005A: 2@ += 0@ // (int)
    0A8C: write_memory 2@ size 4 value 1@ virtual_protect 1
    ret 0  
    :gVar
    //0ab1: @gVar 1 _bufVar _toVar
    0AC6: 1@ = label @Buffer offset
    0@ *= 5
    005A: 1@ += 0@ // (int)
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 1
    ret 1 1@
    :Buffer
    hex
    00 00 00 00 00 //0
    00 00 00 00 00 //1
    00 00 00 00 00 //2
    00 00 00 00 00 //3
    00 00 00 00 00 //4
    00 00 00 00 00 //5
    00 00 00 00 00 //6
    00 00 00 00 00 //7
    00 00 00 00 00 //8
    00 00 00 00 00 //9
    00 00 00 00 00 //11
    00 00 00 00 00 //12
    00 00 00 00 00 //13
    00 00 00 00 00 //14
    00 00 00 00 00 //15
    00 00 00 00 00 //16
    00 00 00 00 00 //17
    00 00 00 00 00 //18
    00 00 00 00 00 //19
    00 00 00 00 00 //20
    00 00 00 00 00 //21
    00 00 00 00 00 //22
    00 00 00 00 00 //23
    00 00 00 00 00 //24
    00 00 00 00 00 //25
    00 00 00 00 00 //26
    00 00 00 00 00 //27
    00 00 00 00 00 //28
    00 00 00 00 00 //29
    00 00 00 00 00 //30
    00 00 00 00 00 //31
    00 00 00 00 00 //32
    end // hex
     
    Romelo, Gromble и DarkP1xel нравится это.
  11. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Выходит из текущего пользователя системы.

    :WindowsLogOff
    // 0AB1: call_scm_func @WindowsLogOff 0
    0AA2: 31@ = load_library "User32.DLL"
    0AA4: 30@ = get_proc_address "ExitWindowsEx" library 31@
    0AA5: call 30@ num_params 2 pop 0 0x0 0x0
    0AA3: free_library 31@
    0AB2: ret 0
     
    Сэнд и unInstance нравится это.
  12. Niko.

    Проверенный

    Регистрация:
    03.03.2015
    Сообщения:
    192
    Симпатии:
    87
    Репутация:
    33
    Написать текст в чат 0.3.7:
    
    :TextInChat
    // Example: 0AB1: call @TextInChat 1 text 0@
    0AA2: 31@ = load_library "kernel32.dll" // IF and SET
    0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@ // IF and SET
    0AA7: call_function 30@ num_params 1 pop 0 "samp.dll" 3@
    0A8E: 2@ = 3@ + 0x21A0E4
    0A8D: 1@ = read_memory 2@ size 4 virtual_protect 1
    0A8E: 2@ = 3@ + 0x64010
    0AA6: call_method 2@ struct 1@ num_params 5 pop 0 params 0 0xFFFFFFFF 0 0@ 8
    0AB2: ret 0
    
    Пример:
    
    {$CLEO}
    0000:
    
    while true
    wait 0
    0AC6: 0@ = label @text offset
    0AB1: call @TextInChat 1 text 0@
    wait 100
    end
    
    :text
    hex
    "qq," 20 "epta" 00
    end
    
    Отправить текст в чат 0.3.7:
    
    0AB1: call @GetSampBase 0 1@
    1@ += 0x57F0
    0AA5: call 1@ num_params 1 pop 0 "qq epta"
    
    :GetSampBase
    0AA2: 31@ = load_library "kernel32.dll" // IF and SET
    0AA4: 30@ = get_proc_address "GetModuleHandleA" library 31@ // IF and SET
    0AA7: call_function 30@ num_params 1 pop 0 "samp.dll" 0@
    0ab2: ret 1 0@
    
    Пример:
    
    {$CLEO}
    0000:
    
    while true
    wait 0
    0AB1: call @GetSampBase 0 1@
    1@ += 0x57F0
    0AA5: call 1@ num_params 1 pop 0 "qq, epta"
    wait 100
    end
    
     
    #92 Niko., 7 май 2015
    Последнее редактирование: 8 май 2015
  13. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    С помощью этой функции можно отключить/включить возможность управлять мышкой и клавиатурой.

    Использование:
    0AB1: call_scm_func @BlockInput 1 1 25@ | 1 - Отключить возможность управлять мышкой и клавиатурой. 0 - Включить.

    Функция:
    :BlockInput
    0AA2: 10@ = load_library "User32.DLL"
    0AA4: 11@ = get_proc_address "BlockInput" library 10@
    0AA7: call_function 11@ num_params 1 pop 0 0@ 25@
    0AA3: free_library 10@
    0AB2: ret 1 25@
     
    AWRage нравится это.
  14. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.621
    Симпатии:
    1.579
    Репутация:
    421
    Переводит игру в оконный режим без рамки
    0ab1: call @SetWinMode 0
    
    :SetWinMode
    0A8C: 0xc9c060 4 0x1 1
    0A8C: 0xc9c070 4 0x0 1
    ret 0
     
  15. Mark91

    Mark91 Пользователь

    Регистрация:
    04.09.2014
    Сообщения:
    24
    Симпатии:
    2
    Репутация:
    4
    
    call @SendInCarPosSync 3 1@ 2@ 3@
    
    :SendInCarPosSync                
    3@ = SAMP.GetSAMPPlayerIDByActorHandle($PLAYER_ACTOR)
    3 = SAMP.GetPlayerStruct @ (@ 3)
    3@ += 170
    0AC8: 4@ = allocate_memory_size 63
    0C10: memcpy destination 4@ source 3@ size 63
    0C0D: struct 4@ offset 24 size 4 = 0@
    0C0D: struct 4@ offset 28 size 4 = 1@
    0C0D: struct 4@ offset 32 size 4 = 2@
    0B3D: raknet 5@ = new_bit_stream
    RakNet.Write (5 @ 200, BS_TYPE_BYTE, 1)
    RakNet.Write(5@, 4@, BS_TYPE_ARRAY, 63)
    0B8B: raknet send bit_stream 5@                
    0B3E: raknet delete_bit_stream 5@
    0AC9: 4@
    0AB2: right 0
    
    Will send desired Incar Position Sync to the server.
     
  16. Opcode.eXe

    Opcode.eXe Известный пользователь

    Регистрация:
    11.04.2013
    Сообщения:
    86
    Симпатии:
    91
    Репутация:
    51
    Sets a new position and size of the minimized gta_sa window handle.
    
    0AB1: @SET_WINDOW_POS_AND_SIZE 4 pos_x 50 pos_y 40 width 400 width 400
    :SET_WINDOW_POS_AND_SIZE
    0A8D: 31@ = 0xC9C060 4 0
    IF
    31@ == TRUE
    THEN
      0AA2: 30@ = load_library "User32.dll"
      0AA4: 29@ = get_proc_address "MoveWindow" library 30@
      0A8D: 28@ = 0xC97C1C 4 0
      0AA7: call_function 29@ params 6 pop 0 TRUE 3@ 2@ 1@ 0@ 28@ 29@  
    END
    0AB2: 0
     
    DubStep_ нравится это.
  17. Mark91

    Mark91 Пользователь

    Регистрация:
    04.09.2014
    Сообщения:
    24
    Симпатии:
    2
    Репутация:
    4
    SendFakeBulletSync for 0.3.7

    
    call @SendFakeBulletSync 1 0@
    
    : SendFakeBulletSync
    0B20: samp 9@ = actor_handle_by_samp_player_id 0@
    0470: 16@ = $PLAYER_ACTOR
    Actor.StorePos($PLAYER_ACTOR, 10@ 11@ 12@)
    Actor.StorePos(9@, 13@ 14@ 15@)
    0AC8: 5@ = allocate_memory_size 40
    0C0D: struct 5@ offset 0 size 1 = 1 //type shot: 0 - in air, 1 - in player, 2 - in car
    0C0D: struct 5@ offset 1 size 2 = 0@ //player/car id (65535 for type 0)
    0C0D: struct 5@ offset 3 size 4 = 10@ //You X
    0C0D: struct 5@ offset 7 size 4 = 11@ //You Y
    0C0D: struct 5@ offset 11 size 4 = 12@ //You Z
    0C0D: struct 5@ offset 15 size 4 = 13@ //Target X
    0C0D: struct 5@ offset 19 size 4 = 14@ //Target Y
    0C0D: struct 5@ offset 23 size 4 = 15@ //Target Z
    0C0D: struct 5@ offset 39 size 1 = 16@ // weapon ID
    0C0D: struct 5@ offset 27 size 4 = 0.0 //Offset X
    0C0D: struct 5@ offset 31 size 4 = 0.0 //Offset Y
    0C0D: struct 5@ offset 35 size 4 = 0.5 //Offset Z. 0.5 will hit the head, make it 0.0 for the body
    0B3D: raknet 6@ = new_bit_stream
    0B40: raknet bit_stream 6@ write 206 type 0 size 1
    0B40: raknet bit_stream 6@ write 5@ type 5 size 40
    0B8B: raknet send bit_stream 6@
    0B3E: raknet delete_bit_stream 6@
    0AC9: free_allocated_memory 5@
    0AB2: right 0
    
    Will send fake bullet sync to the designated victim id and the victim will lose health if the sender has a weapon which can fire bullets, else if the sender doesn't have any weapons, then it will freeze the victim's movements i.e. he won't be able to move.
    --------------------------------------------------------------------------------------------------------------
    Will send feykovye bullets into the specified target and diminish life, if the weapon id id sent weapons fire bullets, otherwise it will just stun Player
     
    #97 Mark91, 28 май 2015
    Последнее редактирование: 28 май 2015
  18. Mark91

    Mark91 Пользователь

    Регистрация:
    04.09.2014
    Сообщения:
    24
    Симпатии:
    2
    Репутация:
    4
    SendIncarFakeSpeedSync for 0.3.7

    
    call @SendIncarFakeSpeedSync 4 1@ 2@ 3@ 4@  // 1@ 2@ 3@ are the positions and 4@ being the vehicle id
    
    : SendIncarFakeSpeedSync
    4@ = SAMP.GetSAMPPlayerIDByActorHandle($PLAYER_ACTOR)
    4 = SAMP.GetPlayerStruct @ (@ 4)
    4@ += 170
    0AC8: 5@ = allocate_memory_size 63
    0C10: memcpy destination 5@ source 4@ size 63
    0C0D: struct 5@ offset 36 size 4 = 6.0
    0C0D: struct 5@ offset 40 size 4 = 6.0 // lower the value if the server has a speed limit on vehicles
    0C0D: struct 5@ offset 44 size 4 = 6.0
    0B3D: raknet 6@ = new_bit_stream
    0B40: raknet bit_stream 6@ write 200 type 0 size 1
    0B40: raknet bit_stream 6@ write 5@ type 5 size 63
    0B42: raknet send bit_stream 6@ priority 1 reliability 7 ordering_channel 0
    0B3E: raknet delete_bit_stream 6@
    0AC9: free_allocated_memory 5@
    0AB2: right 0
    
    Useful for making CLEO hacks such as speedkicker/pizdarvanka and useful in servers where server kicks you for idling inside your vehicle, this will send fake speed and fool the server into thinking that you're driving the vehicle with some speed when you're simply sitting inside the car.
     
    #98 Mark91, 7 июн 2015
    Последнее редактирование: 7 июн 2015
  19. Niko.

    Проверенный

    Регистрация:
    03.03.2015
    Сообщения:
    192
    Симпатии:
    87
    Репутация:
    33
    SendOnFootFakePosition для 0.3.7

    Вызов:
    
    0AB1: call_scm_func @SendOnfootFakePosition 3 1@ 2@ 3@
    
    Функция:
    
    :SendOnFootFakePosition
    3@ = SAMP.GetSAMPPlayerIDByActorHandle($PLAYER_ACTOR) 
    3@ = SAMP.GetPlayerStruct(3@) 
    3@ += 109 
    0AC8: 4@ = allocate_memory_size 68
    0C10: memcpy destination 4@ source 3@ size 68 
    0C0D: struct 4@ offset 6 size 4 = 0@ 
    0C0D: struct 4@ offset 10 size 4 = 1@ 
    0C0D: struct 4@ offset 14 size 4 = 2@ 
    0B3D: raknet 5@ = new_bit_stream 
    0B40: raknet bit_stream 5@ write PACKET_PLAYER_SYNC type BS_TYPE_BYTE size 1 
    0B40: raknet bit_stream 5@ write 4@ type 5 size 68 
    0B42: raknet send bit_stream 5@ priority HIGH_PRIORITY reliability UNRELIABLE_SEQUENCED ordering_channel 0 
    0B3E: raknet delete_bit_stream 5@
    0AC9: free_allocated_memory 4@ 
    0ab2: 0 
    
     
  20. Mark91

    Mark91 Пользователь

    Регистрация:
    04.09.2014
    Сообщения:
    24
    Симпатии:
    2
    Репутация:
    4
    SendUnOccupiedVehicleSync for 0.3.7

    
    call @SendUnOccupiedVehicleSync 4 1@ 2@ 3@ 4@
    
    :SendUnOccupiedVehicleSync
    7@ = SAMP.GetSAMPVehicleIDByCarHandle(0@)
    Car.PutAt(0@, 1@, 2@, 3@)
    alloc 4@ 67 
    0C0D: struct 4@ offset 0 size 2 = 7@ 
    0C0D: struct 4@ offset 2 size 1 = 1 
    0C0D: struct 4@ offset 3 size 4 = -1.0 
    0C0D: struct 4@ offset 7 size 4 = -0.01 
    0C0D: struct 4@ offset 11 size 4 = 0.05 
    0C0D: struct 4@ offset 15 size 4 = 0.09 
    0C0D: struct 4@ offset 19 size 4 = -1.0 
    0C0D: struct 4@ offset 23 size 4 = 0.02 
    0C0D: struct 4@ offset 27 size 4 = 1@ 
    0C0D: struct 4@ offset 31 size 4 = 2@ 
    0C0D: struct 4@ offset 35 size 4 = 3@ 
    0C0D: struct 4@ offset 39 size 4 = 0.0 
    0C0D: struct 4@ offset 43 size 4 = 0.0 
    0C0D: struct 4@ offset 47 size 4 = 400.0 
    0C0D: struct 4@ offset 51 size 4 = 0.0 
    0C0D: struct 4@ offset 55 size 4 = 0.0 
    0C0D: struct 4@ offset 59 size 4 = 0.0 
    0C0D: struct 4@ offset 63 size 4 = 1000.0 
    5@ = RakNet.NewBitStream()
    BitStream.Write(5@, 209, BS_TYPE_BYTE, 1)
    BitStream.Write(5@, 4@, BS_TYPE_ARRAY, 67)
    RakNet.LiteSend(5@)
    RakNet.DeleteBitStream(5@)
    free 4@ 
    ret 0
    
     
  21. Mark91

    Mark91 Пользователь

    Регистрация:
    04.09.2014
    Сообщения:
    24
    Симпатии:
    2
    Репутация:
    4
    SendFakeSpecSync 0.3.7

    
    call @SendFakeSpecSync 3 0@ 1@ 2@
    
    :SendFakeSpecSync
    Actor.StorePos($PLAYER_ACTOR, 0@, 1@, 2@)
    alloc 3@ 18
    0C0D: struct 3@ offset 0 size 2 = 0 // sLeftRightKeys;
    0C0D: struct 3@ offset 2 size 2 = 0 // sUpDownKeys;
    0C0D: struct 3@ offset 4 size 2 = 0 // sKeys;
    0C0D: struct 3@ offset 6 size 4 = 0@ //fPosition[X];
    0C0D: struct 3@ offset 10 size 4 = 1@ // fPosition[Y];
    0C0D: struct 3@ offset 14 size 4 = 2@ //fPosition[Z];
    0B3D: raknet 4@ = new_bit_stream 
    0B40: raknet bit_stream 4@ write 212 type 0 size 1
    0B40: raknet bit_stream 4@ write 3@ type 5 size 18 
    0B8B: raknet send bit_stream 4@                 
    0B3E: raknet delete_bit_stream 4@
    free 3@
    ret 0
    
    Useful for trolling admins with your fake spectator mode.
     
  22. Niko.

    Проверенный

    Регистрация:
    03.03.2015
    Сообщения:
    192
    Симпатии:
    87
    Репутация:
    33
    Описание: проверяет на то что, оружие поменялось, а так же возвращает старое оружие и новое
    Использование: (как условие) 0AB1: call_scm_func @ChangedWeapon 0 OldWeapon 0@ NewWeapon 1@
    Код:
    
    :ChangedWeapon
    var
        0@ : int
        1@ : int
    end
    
    0470: 0@ = actor $PLAYER_ACTOR current_weapon
     
    repeat
    wait 0
    0470: 1@ = actor $PLAYER_ACTOR current_weapon
    until not 0@ == 1@
    
    0485:  return_true
    0AB2: ret 2 0@ 1@
    
    Пример:
    
    {$CLEO}
    0000:
    
    while not Samp.Available()
        wait 400
    end
    
    while true
        wait 0
      
        if 0AB1: call_scm_func @ChangedWeapon 0 OldWeapon 0@ NewWeapon 1@
        then
            0af8: "Old weapon: %d. New weapon: %d" -1 0@ 1@
        end
    end
    
    :ChangedWeapon
    var
        0@ : int
        1@ : int
    end
    
    0470: 0@ = actor $PLAYER_ACTOR current_weapon
      
    repeat
    wait 0
    0470: 1@ = actor $PLAYER_ACTOR current_weapon
    until not 0@ == 1@
    
    0485:  return_true
    0AB2: ret 2 0@ 1@
    
     
  23. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Описание: Открывает дисковод ;D.
    Использование: 0AB1: call_scm_func @mciSendString 0

    :mciSendString
    0AA2: 25@ = load_library "Winmm.DLL"
    0AA4: 26@ = get_proc_address "mciSendStringA" library 25@
    0AA7: call_function 26@ num_params 4 pop 0 0 0 0 "Set cdaudio door open wait" 27@
    0AA3: free_library 25@
    0AB2: ret 0
    Описание: Закрывает дисковод .
    Использование: 0AB1: call_scm_func @mciSendString 0

    :mciSendString
    0AA2: 25@ = load_library "Winmm.DLL"
    0AA4: 26@ = get_proc_address "mciSendStringA" library 25@
    0AA7: call_function 26@ num_params 4 pop 0 0 0 0 "Set cdaudio door closed wait" 27@
    0AA3: free_library 25@
    0AB2: ret 0
     
    Последние данные очков репутации:
    BlackKnigga: 1 Очко 10 янв 2016
    Сэнд: 1 Очко (буду людей пугать, спасибо) 6 фев 2016
    kraft1k, mgmoldova, Сэнд и 2 другим нравится это.
  24. Niko.

    Проверенный

    Регистрация:
    03.03.2015
    Сообщения:
    192
    Симпатии:
    87
    Репутация:
    33
    Описание: при нажатии определённых клавиш, изменяет нумерацию переменной. Если переменная становится больше указании (Maх), то переходит к нулю, а если меньше 0, то изменяет на максимальную. В общем в примере будет всё понятно :D
    Использование: (как условие) 0AB1: @List 4 KeyList_1 38 KeyList_2 40 KeyPressed 13 Max 1 Reply 0@ 1@
    Код:
    :List
    7@ = 0 // Reply
    
    0AC6: 5@ = label @Buffer offset
    0A8D: 6@ = read_memory 5@ size 1 virtual_protect 0
    
    if 0ab0: 0@
    then
        6@ += 1
        if 001D: 6@ > 3@
        then
            6@ = 0
        end
        0A8C: write_memory 5@ size 1 value 6@ virtual_protect 0
        7@ = 0
        0485:  return_true
        ret 2 6@ 7@
    end
    
    if 0ab0: 1@
    then
        6@ -= 1
        if 6@ < 0
        then
            0085: 6@ = 3@
        end
        0A8C: write_memory 5@ size 1 value 6@ virtual_protect 0
        7@ = 0
        0485:  return_true
        ret 2 6@ 7@
    end
    if 0ab0: 2@
    then
        7@ = 1
        0485:  return_true
        ret 2 6@ 7@   
    end
    
    059A:  return_false
    ret 2 -1 -1
    
    :Buffer
    hex
        00
    end
    Пример:
    
    {$CLEO}
    0000:
    
    while true
        wait 0
    
        if 0ADC: test_cheat "DGUN"
        then
            0B12: 0@ = 0@ XOR 1
        end
        if 0@ == 1
        then
            if 1@ == 0
            then
                print "AK-47" 1000
                if 2@ == 1
                then
                    Model.Load(#AK47)
                    01B2: give_actor $PLAYER_ACTOR weapon 30 ammo 1000
                    2@ = 0
                end
            end
            if 1@ == 1
            then
                print "M4" 1000
                if 2@ == 1
                then
                    Model.Load(#M4)
                    01B2: give_actor $PLAYER_ACTOR weapon 31 ammo 1000
                    2@ = 0
                end
            end
            if 1@ == 2
            then
                print "Minigun" 1000
                if 2@ == 1
                then
                    Model.Load(#MINIGUN)
                    01B2: give_actor $PLAYER_ACTOR weapon 38 ammo 1000
                    2@ = 0
                end
            end
            if call @List 4 KeyList_1 38 KeyList_2 40 KeyPressed 13 Max 2 Reply 1@ 2@
            then
                wait 100
            end
        end
    end
    
    :List
    7@ = 0 // Reply
    
    0AC6: 5@ = label @Buffer offset
    0A8D: 6@ = read_memory 5@ size 1 virtual_protect 0
    
    if 0ab0: 0@
    then
        6@ += 1
        if 001D: 6@ > 3@
        then
            6@ = 0
        end
        0A8C: write_memory 5@ size 1 value 6@ virtual_protect 0
        7@ = 0
        0485:  return_true
        ret 2 6@ 7@
    end
    
    if 0ab0: 1@
    then
        6@ -= 1
        if 6@ < 0
        then
            0085: 6@ = 3@
        end
        0A8C: write_memory 5@ size 1 value 6@ virtual_protect 0
        7@ = 0
        0485:  return_true
        ret 2 6@ 7@
    end
    if 0ab0: 2@
    then
        7@ = 1
        0485:  return_true
        ret 2 6@ 7@    
    end
    
    059A:  return_false
    ret 2 -1 -1
    
    :Buffer
    hex
        00
    end
    
     
    #104 Niko., 13 сен 2015
    Последнее редактирование: 13 сен 2015
  25. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.621
    Симпатии:
    1.579
    Репутация:
    421
    Извращенец.
    :GetNumber
    0062: 0@ -= 1@
    ret 0@
     
    Последние данные очков репутации:
    Niko.: 1 Очко (аххахахаха, у меня просто мышление странное) 18 сен 2015
    DarkP1xel нравится это.
  26. hnnssy

    Друг

    Регистрация:
    23.03.2013
    Сообщения:
    1.816
    Симпатии:
    1.107
    Репутация:
    187
    Удаляет указанное количество символов со строки из конца.
    
    :delete_last_chars_from_string
    // call @delete_last_chars_from_string call  2 0@ 5
    var
    0@: int
    1@: int
    2@: int
    end
    0C17: 2@ = strlen 0@
    2@ -= 1@
    0@ += 2@
    0C11: memset 0@ 0 1@
    ret 0
    
     
    4el0ve4ik, kraft1k, Niko. и ещё 1-му нравится это.
  27. FYP

    FYP админ какой-то

    Регистрация:
    09.03.2013
    Сообщения:
    1.055
    Симпатии:
    1.930
    Репутация:
    731
    Описание: массив координат для самых маленьких.
    увидел такое убожество и не смог ничего с собой поделать:
    
    :Noname_496
    {496} 0001: wait 0 ms
    {500} 00D6: if
    {504} 0039:  0@ == 0
    {511} 004D: jump_if_false @Noname_548
    {518} 0007: 1@ = 1833.0
    {528} 0007: 2@ = -1844.0
    {538} 0007: 3@ = 13.58
    
    :Noname_548
    {548} 00D6: if
    {552} 0039:  0@ == 1
    {559} 004D: jump_if_false @Noname_596
    {566} 0007: 1@ = 1836.0
    {576} 0007: 2@ = -1685.0
    {586} 0007: 3@ = 13.35
    
    :Noname_596
    {596} 00D6: if
    {600} 0039:  0@ == 2
    {607} 004D: jump_if_false @Noname_644
    {614} 0007: 1@ = 1845.92
    {624} 0007: 2@ = -1869.96
    {634} 0007: 3@ = 13.57
    
    :Noname_644
    {644} 00D6: if
    {648} 0039:  0@ == 3
    {655} 004D: jump_if_false @Noname_692
    {662} 0007: 1@ = 1930.0
    {672} 0007: 2@ = -1778.0
    {682} 0007: 3@ = 13.55
    
    :Noname_692
    {692} 00D6: if
    {696} 0039:  0@ == 4
    {703} 004D: jump_if_false @Noname_740
    {710} 0007: 1@ = 2311.29
    {720} 0007: 2@ = -1645.0
    {730} 0007: 3@ = 14.83
    
    :Noname_740
    {740} 00D6: if
    {744} 0039:  0@ == 5
    {751} 004D: jump_if_false @Noname_788
    {758} 0007: 1@ = 2267.13
    {768} 0007: 2@ = -1668.86
    {778} 0007: 3@ = 15.39
    
    :Noname_788
    {788} 00D6: if
    {792} 0039:  0@ == 6
    {799} 004D: jump_if_false @Noname_836
    {806} 0007: 1@ = 2247.0
    {816} 0007: 2@ = -1664.81
    {826} 0007: 3@ = 15.48
    
    :Noname_836
    {836} 00D6: if
    {840} 0039:  0@ == 7
    {847} 004D: jump_if_false @Noname_884
    {854} 0007: 1@ = 2230.0
    {864} 0007: 2@ = -1723.3
    {874} 0007: 3@ = 13.55
    
    :Noname_884
    {884} 00D6: if
    {888} 0039:  0@ == 8
    {895} 004D: jump_if_false @Noname_932
    {902} 0007: 1@ = 2290.33
    {912} 0007: 2@ = -1724.68
    {922} 0007: 3@ = 13.55
    
    :Noname_932
    {932} 00D6: if
    {936} 0039:  0@ == 9
    {943} 004D: jump_if_false @Noname_980
    {950} 0007: 1@ = 1036.73
    {960} 0007: 2@ = -1339.0
    {970} 0007: 3@ = 13.73
    
    :Noname_980
    {980} 00D6: if
    {984} 0039:  0@ == 10
    {991} 004D: jump_if_false @Noname_1028
    {998} 0007: 1@ = 1097.02
    {1008} 0007: 2@ = -1271.6
    {1018} 0007: 3@ = 13.54
    
    :Noname_1028
    {1028} 00D6: if
    {1032} 0039:  0@ == 11
    {1039} 004D: jump_if_false @Noname_1076
    {1046} 0007: 1@ = 1045.27
    {1056} 0007: 2@ = -1276.43
    {1066} 0007: 3@ = 13.55
    
    :Noname_1076
    {1076} 00D6: if
    {1080} 0039:  0@ == 12
    {1087} 004D: jump_if_false @Noname_1124
    {1094} 0007: 1@ = 926.75
    {1104} 0007: 2@ = -1353.1
    {1114} 0007: 3@ = 13.37
    
    :Noname_1124
    {1124} 00D6: if
    {1128} 0039:  0@ == 13
    {1135} 004D: jump_if_false @Noname_1172
    {1142} 0007: 1@ = 496.69
    {1152} 0007: 2@ = -1359.62
    {1162} 0007: 3@ = 16.72
    
    // ... ТУТ ЕЩЁ ПОЧТИ ДВЕ ТЫСЯЧИ СТРОК
    
    Использование: 0AB1: call @getCoords 1 id 0@ to 1@ 2@ 3@, где 0@ - индекс элемента массива
    Код:
    
    :getCoords // 0@ is id
    1@ = @coords
    0@ *= 20
    0062: 1@ -= 0@
    jump 1@
    
    :coords
    0AB2: ret 3 123.4 567.8 910.11
    0AB2: ret 3 14.88 1024.0 768.0
    0AB2: ret 3 0.1 2.3 4.5
    0AB2: ret 3 22.8 133.7 4659.50
    // ...
    
     
    Последние данные очков репутации:
    Dark_Knight: 3 Очки (Красава.) 27 сен 2015
    MelomanCool, Dark_Knight, DarkP1xel и 2 другим нравится это.
  28. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Описание: Функция позволяющая изменить название заданного окна. Чтобы получить текущее можно использовать функцию GetActiveWindow .
    Использование: 0AB1: call_scm_func @SetWindowTextA 2 HWND 0@ Name 1@
    Код:

    :SetWindowTextA
    0AA2: 25@ = load_library "User32.DLL"
    0AA4: 26@ = get_proc_address "SetWindowTextA" library 25@
    0AA7: call_function 26@ num_params 2 pop 0 1@ 0@ 27@ // 0@ - HWND | 1@ - lpString
    0AA3: free_library 25@
    0AB2: ret 0
    Результат:

    [​IMG]
     
    geqeeral и Niko. нравится это.
  29. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Описание: Функция создаёт окно в окне с указанным название, текстом и типом.
    Использование: 0AB1: /* [SP/MP] */ call_scm_func @SCM_MessageBox params 4 | hWnd 0@ lpText 1@ lpCaption 2@ uType 3@ | _errorCode 31@ |
    Код функции:

    
    
    :SCM_MessageBox // 0AB1: /* [SP/MP] */ call_scm_func @SCM_MessageBox params 4 | hWnd 0@ lpText 1@ lpCaption 2@ uType 3@ | _errorCode 31@ |
    0AA2: 25@ = load_library "User32.DLL"
    0AA4: 26@ = get_proc_address "MessageBoxA" library 25@
    0AA7: call_function 26@ num_params 4 pop FALSE | uType 3@ lpCaption 2@ lpText 1@ hWnd 0@ | _errorCode 27@ |
    0AA3: free_library 25@
    0AB2: RET 1 | _errorCode 27@ |
    
    
    Пример:

    
    
    {$CLEO}
    0AC6: 0@ = label @lpText offset
    0AC6: 1@ = label @lpCaption offset
    
    WHILE TRUE
    0001: WAIT FALSE
        IF 0ADC:   test_cheat "1"
        THEN
        0AB1: /* [SP/MP] */ call_scm_func @SCM_GetForegroundWindow params FALSE || HWND 2@ |
        0AB1: /* [SP/MP] */ call_scm_func @SCM_MessageBox params 4 | hWnd 2@ lpText 0@ lpCaption 1@ uType 0x00000000 | _errorCode 31@ |
        END
    END
    
    :SCM_GetForegroundWindow // 0AB1: /* [SP/MP] */ call_scm_func @SCM_GetForegroundWindow params FALSE || HWND 31@ |
    0AA2: 25@ = load_library "User32.DLL"
    0AA4: 26@ = get_proc_address "GetForegroundWindow" library 25@
    0AA7: call_function 26@ num_params 0 pop FALSE || HWND 27@ |
    0AA3: free_library 25@
    0AB2: RET 1 | HWND 27@ |
    
    :SCM_MessageBox // 0AB1: /* [SP/MP] */ call_scm_func @SCM_MessageBox params 4 | hWnd 0@ lpText 1@ lpCaption 2@ uType 3@ | _errorCode 31@ |
    0AA2: 25@ = load_library "User32.DLL"
    0AA4: 26@ = get_proc_address "MessageBoxA" library 25@
    0AA7: call_function 26@ num_params 4 pop FALSE | uType 3@ lpCaption 2@ lpText 1@ hWnd 0@ | _errorCode 27@ |
    0AA3: free_library 25@
    0AB2: RET 1 | _errorCode 27@ |
    
    :lpText
    HEX
        "MessageBox через CLEO :)" 0
    END
    
    :lpCaption
    HEX
        "iTz_XG4M3R #420" 0
    END
    
    


    Результат:

    [​IMG]
     
    Последние данные очков репутации:
    Vovich: 2 Очки (Теперь у тебя 2 очка) 20 янв 2016
    mgmoldova, FYP, Fake-Cop и ещё 1-му нравится это.
  30. woksonal

    Проверенный

    Регистрация:
    31.05.2013
    Сообщения:
    241
    Симпатии:
    115
    Репутация:
    57
    Описание: открытие любых файлов

    Пример:
    открывает C:\test.exe
    {$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
     
    KR3, mgmoldova, Fake-Cop и 2 другим нравится это.
  31. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Описание: Получаем FPS одним опкодом.

    0A8D: 0@ = read_memory 0xB7CB50 size 4 virtual_protect TRUE {float}
     
    woksonal, Сэнд, Niko. и ещё 1-му нравится это.
  32. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Список функций для работы с радио.

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

    0AA8: call_function_method {GetCurrentRadioStationID}0x4E83F0 struct {CAERadioTrackManager}0x8CB6F8 num_params 0 pop 0 || {Result}0@ |
    Описание: Функция проверяет активно ли радио в ТС.

    0AA8: call_function_method {IsVehicleRadioActive}0x4E9800 struct {CAERadioTrackManager}0x8CB6F8 num_params 0 pop 0 || {Result}0@ |
    Описание: Функция проверяет включено ли радио.

    0AA8: call_function_method {IsRadioOn}0x4E8350 struct {CAERadioTrackManager}0x8CB6F8 num_params 0 pop 0 || {Result}0@ |
    Описание: Функция сбрасывает состояние радио.

    0AA6: call_method {Reset}0x4E7F80 struct {CAERadioTrackManager}0x8CB6F8 num_params 0 pop 0 ||
     
    Trofim нравится это.
  33. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Описание: Получает количество использованной stream памяти в байтах.
    0A8D: 0@ = read_memory 0x8E4CB4 size 4 virtual_protect TRUE
     
  34. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Описание: Получает 3D координаты указанного компонента ТС.
    0AA6: call_method {GetComponentWorldPosition}0x6A2210 struct {cVehicle}25@ num_params 2 pop 0 | {pVector}25@v {iComponentID}1@ |
     
  35. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.621
    Симпатии:
    1.579
    Репутация:
    421
    Регистрация собственных опкодов из клео скриптов
    :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}
    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}
    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}
    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 поддерживает такую запись:
    {$OPCODE 0CCC=1,my_new_opcode %1d%}
    тут мы объявляем опкод 0CCC, у которого 1 параметр. Таким образом, для первого примера запись будет иметь такой вид:
    {$OPCODE 1111=0,NOP}
    А для последнего примера такой:
    {$OPCODE 1112=2,my_new_opcode %1d% %2d%}
    Ну и коды с использованием директивы $OPCODE:
    
    {$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}
    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 виде (если компилировать без исходного кода), что еще сильнее усложнит анализ кода скрипта.
     
    #115 SR_team, 8 мар 2016
    Последнее редактирование: 10 апр 2016
    Сэнд нравится это.
  36. Opcode.eXe

    Opcode.eXe Известный пользователь

    Регистрация:
    11.04.2013
    Сообщения:
    86
    Симпатии:
    91
    Репутация:
    51
    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!
     
    Сэнд нравится это.
  37. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    :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 нравится это.
  38. hnnssy

    Друг

    Регистрация:
    23.03.2013
    Сообщения:
    1.816
    Симпатии:
    1.107
    Репутация:
    187
    0C92: 0@ = get_cleo_library_version
     
    Opcode.eXe нравится это.
  39. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.118
    Симпатии:
    1.281
    Репутация:
    330
    Он без сф хотел
     
    Opcode.eXe нравится это.
  40. woksonal

    Проверенный

    Регистрация:
    31.05.2013
    Сообщения:
    241
    Симпатии:
    115
    Репутация:
    57
    Описание: устанавливает углы поворота кара по X Y Z в градусах
    // 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
     
    FYP, AWRage, Opcode.eXe и 2 другим нравится это.