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

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

  1. Dark_Knight

    Dark_Knight Сралик Харчкишиев
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.063
    Лайки:
    552
    Репутация:
    178
    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
     
    #81
    Arkember нравится это.
  2. Opcode.eXe

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

    Регистрация:
    11.04.13
    Сообщения:
    86
    Лайки:
    90
    Репутация:
    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@

    Код (Text):
    //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.


    Код (Text):
    {$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
    #82
  3. gcode

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

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

    Код (PHP):
    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
    #83
    kraft1k, Lightkiller, Dragar и ещё 1-му нравится это.
  4. legend2360

    legend2360 Ух как люблю скобочки
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.024
    Лайки:
    678
    Репутация:
    418
    Описание:
    Возвращает дистанцию и ид ближайшего игрока.​

    Код:
    Код (Text):
    :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@

    Использование:
    Код (Text):
    {$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: Перезаписал функу, лучше так, чем через пул сампа :)
     
    #84
    Smile, PoccoJI и XyJluraH_J нравится это.
  5. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    Пемещение диалогов как окон windows
    Код (PHP):
    :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@
    Код (PHP):
    :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
     
    #85
    Smile, Arkember и Quned нравится это.
  6. Opcode.eXe

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

    Регистрация:
    11.04.13
    Сообщения:
    86
    Лайки:
    90
    Репутация:
    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:
    Код (Text):
    {$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:
    Код (Text):
    //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
    #86
    AWRage и XyJluraH_J нравится это.
  7. legend2360

    legend2360 Ух как люблю скобочки
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.024
    Лайки:
    678
    Репутация:
    418
    Описание:
    Ищет в зоне стрима пикап с указанной моделью, при существовании данного пикапа - возвращает его ид.​

    Код:
    Код (Text):
    :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

    Использование:
    Код (Text):
    {$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
     
    #87
    XyJluraH_J, fonarik и Dragar нравится это.
  8. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    Получение разрешения экрана:
    Код (Text):
    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@  
    Получение диагонали экрана:
    Код (Text):
    call @DisplayInch 0 1@
    :DisplayInch
    0A8D: 0@ = read_memory 0xC9C048 size 4 virtual_protect 0
    ret 1 0@
    Получение частоты обновления экрана в Mhz:
    Код (Text):
    call @DisplayRefresh 0 1@
    :DisplayRefresh
    0A8D: 0@ = read_memory 0xC9C070 size 4 virtual_protect 0
    ret 1 0@
    Проверка, что запущена игра в окне:
    Код (Text):
    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
    Последнее редактирование: 18 фев 2015
    Arkember, _Viktor_ и DarkP1xel нравится это.
  9. DubStep_

    Проверенный

    Регистрация:
    20.03.13
    Сообщения:
    295
    Лайки:
    55
    Репутация:
    28
    Установка позиции курсора

    Код (Text):
    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
    #89
    Избранный нравится это.
  10. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    Расширяем количество переменных, ну или что-то в этом роде.
    В доп. памяти можно хранить 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 переменная в которую надо загрузить инфу из буфера.
    Код (Text):
    :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
     
    #90
    Romelo, Gromble и DarkP1xel нравится это.
  11. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Выходит из текущего пользователя системы.

    Код (PHP):
    :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
     
    #91
    Smile и Arkember нравится это.
  12. Niko.

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

    Регистрация:
    03.03.15
    Сообщения:
    168
    Лайки:
    66
    Репутация:
    23
    Написать текст в чат 0.3.7:
    Код (Text):
    :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
    Пример:
    Код (Text):
    {$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:
    Код (Text):
    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@
    Пример:
    Код (Text):
    {$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
    Последнее редактирование: 8 май 2015
  13. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    С помощью этой функции можно отключить/включить возможность управлять мышкой и клавиатурой.

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

    Функция:
    Код (PHP):
    :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@
     
    #93
    AWRage нравится это.
  14. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    Переводит игру в оконный режим без рамки
    Код (Text):
    0ab1: call @SetWinMode 0

    :SetWinMode
    0A8C: 0xc9c060 4 0x1 1
    0A8C: 0xc9c070 4 0x0 1
    ret 0
     
    #94
  15. Mark91

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

    Регистрация:
    04.09.14
    Сообщения:
    24
    Лайки:
    2
    Репутация:
    4
    Код (Text):
    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.
     
    #95
  16. Opcode.eXe

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

    Регистрация:
    11.04.13
    Сообщения:
    86
    Лайки:
    90
    Репутация:
    51
    Sets a new position and size of the minimized gta_sa window handle.
    Код (Text):
    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
     
    #96
    DubStep_ нравится это.
  17. Mark91

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

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

    Код (Text):
    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
    Последнее редактирование: 28 май 2015
  18. Mark91

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

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

    Код (Text):
    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
    Последнее редактирование: 7 июн 2015
  19. Niko.

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

    Регистрация:
    03.03.15
    Сообщения:
    168
    Лайки:
    66
    Репутация:
    23
    SendOnFootFakePosition для 0.3.7

    Вызов:
    Код (Text):
    0AB1: call_scm_func @SendOnfootFakePosition 3 1@ 2@ 3@
    Функция:
    Код (Text):
    :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
     
    #99
  20. Mark91

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

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

    Код (Text):
    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
     
    #100
  21. Mark91

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

    Регистрация:
    04.09.14
    Сообщения:
    24
    Лайки:
    2
    Репутация:
    4
    SendFakeSpecSync 0.3.7

    Код (Text):
    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.
     
    #101
  22. Niko.

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

    Регистрация:
    03.03.15
    Сообщения:
    168
    Лайки:
    66
    Репутация:
    23
    Описание: проверяет на то что, оружие поменялось, а так же возвращает старое оружие и новое
    Использование: (как условие) 0AB1: call_scm_func @ChangedWeapon 0 OldWeapon 0@ NewWeapon 1@
    Код:
    Код (Text):
    :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@
    Пример:
    Код (Text):
    {$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@
     
    #102
  23. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Описание: Открывает дисковод ;D.
    Использование: 0AB1: call_scm_func @mciSendString 0

    Код (CLEO):
    :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

    Код (CLEO):
    :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
    #103
    kraft1k, mgmoldova, Smile и 2 другим нравится это.
  24. Niko.

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

    Регистрация:
    03.03.15
    Сообщения:
    168
    Лайки:
    66
    Репутация:
    23
    Описание: при нажатии определённых клавиш, изменяет нумерацию переменной. Если переменная становится больше указании (Maх), то переходит к нулю, а если меньше 0, то изменяет на максимальную. В общем в примере будет всё понятно :D
    Использование: (как условие) 0AB1: @List 4 KeyList_1 38 KeyList_2 40 KeyPressed 13 Max 1 Reply 0@ 1@
    Код:
    Код (CLEO):
    :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):
    {$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
    Последнее редактирование: 13 сен 2015
  25. SR_team

    SR_team BH Team
    BH Team

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

    Друг

    Регистрация:
    23.03.13
    Сообщения:
    1.510
    Лайки:
    916
    Репутация:
    155
    Удаляет указанное количество символов со строки из конца.
    Код (CLEO):
    :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
     
    #106
    4el0ve4ik, kraft1k, Niko. и ещё 1-му нравится это.
  27. FYP

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

    Регистрация:
    09.03.13
    Сообщения:
    788
    Лайки:
    1.624
    Репутация:
    674
    Описание: массив координат для самых маленьких.
    увидел такое убожество и не смог ничего с собой поделать:
    Код (CLEO):
    :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@ - индекс элемента массива
    Код:
    Код (CLEO):
    :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
    #107
    MelomanCool, Dark_Knight, DarkP1xel и 2 другим нравится это.
  28. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

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

    Код (CLEO):
    :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]
     
    #108
    geqeeral и Niko. нравится это.
  29. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

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

    Код (Unknown language):

    :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@ |
     
    Пример:

    Код (Unknown language):

    {$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
    #109
    mgmoldova, FYP, Fake-Cop и ещё 1-му нравится это.
  30. woksonal

    Проверенный

    Регистрация:
    31.05.13
    Сообщения:
    237
    Лайки:
    100
    Репутация:
    56
    Описание: открытие любых файлов

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

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Описание: Получаем FPS одним опкодом.

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

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Список функций для работы с радио.

    Описание: Функция получает название радиостанции по 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 ||
     
    #112
    Trofim нравится это.
  33. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Описание: Получает количество использованной stream памяти в байтах.
    Код (CLEO):
    0A8D: 0@ = read_memory 0x8E4CB4 size 4 virtual_protect TRUE
     
    #113
  34. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Описание: Получает 3D координаты указанного компонента ТС.
    Код (CLEO):
    0AA6: call_method {GetComponentWorldPosition}0x6A2210 struct {cVehicle}25@ num_params 2 pop 0 | {pVector}25@v {iComponentID}1@ |
     
    #114
  35. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.468
    Лайки:
    1.430
    Репутация:
    401
    Регистрация собственных опкодов из клео скриптов
    Код (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 виде (если компилировать без исходного кода), что еще сильнее усложнит анализ кода скрипта.
     
    #115
    Последнее редактирование: 10 апр 2016
    Smile нравится это.
  36. Opcode.eXe

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

    Регистрация:
    11.04.13
    Сообщения:
    86
    Лайки:
    90
    Репутация:
    51
    Код (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!
     
    #116
    Smile нравится это.
  37. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Код (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@ |
     
    #117
    Opcode.eXe нравится это.
  38. hnnssy

    Друг

    Регистрация:
    23.03.13
    Сообщения:
    1.510
    Лайки:
    916
    Репутация:
    155
    0C92: 0@ = get_cleo_library_version
     
    #118
    Opcode.eXe нравится это.
  39. DarkP1xel

    DarkP1xel Такой вот Незамысловатый ХАСЛ
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    1.743
    Лайки:
    1.045
    Репутация:
    286
    Он без сф хотел
     
    #119
    Opcode.eXe нравится это.
  40. woksonal

    Проверенный

    Регистрация:
    31.05.13
    Сообщения:
    237
    Лайки:
    100
    Репутация:
    56
    Описание: устанавливает углы поворота кара по 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
     
    #120
    FYP, AWRage, Opcode.eXe и 2 другим нравится это.