Вопросы по CLEO-скриптингу

LowerSIDES

Известный
9
4
Поможет кто?

Клео-переворот авто, нужно выпилить строчку с ремонтом авто и оставить только переворот и изменить клавишу активации на * на нумпаде!
CLEO:
// This file was decompiled using SASCM.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP

:NONAME_2
wait 0
if
   Player.Defined($PLAYER_CHAR)
if
   Actor.Driving($PLAYER_ACTOR)
else_jump @NONAME_2
1@ = Actor.CurrentCar($PLAYER_ACTOR)
0@ = 304543
if and
   Actor.InCar($PLAYER_ACTOR, 1@)
  &0(0@,1i) == 255
else_jump @NONAME_2
0A30: repair_car 1@
wait 0
if
01F4:   car 1@ flipped
else_jump @NONAME_137
07DB: set_car 1@ rotation_velocity_XYZ 0.0 1.0 0.0 through_center_of_mass
Car.RemoveReferences(1@)
jump @NONAME_2

:NONAME_137
wait 200
Car.RemoveReferences(1@)
jump @NONAME_2
 
  • Нравится
Реакции: Skelerll

Skelerll

Известный
154
8
Добавил проверку на то, в зоне прорисовки ли авто, и перестало вылетать

Хотя, если именно твой(или не твой) код, то вот:
CLEO:
{$CLEO}
0000:

REPEAT
wait 0
UNTIL 0AFA:  is_samp_available

WHILE TRUE
wait 0
    IF AND
    8B21:     samp is_chat_opened
    8B4C:  samp is_dialog_active -1
    0AB0:   key_pressed 106
    00DF:   actor $PLAYER_ACTOR driving
    THEN
        1@ = actor.CurrentCar($PLAYER_ACTOR)
        07DB: set_car 1@ rotation_velocity_XYZ 0.0 1.0 0.0 through_center_of_mass // Где 1.0 лучше поставь 1.5, чтобы чуть быстрее крутился
        Car.RemoveReferences(1@)
    END
END

Только что-то он у тебя плохо вертится, медленно. Поменяй 1.0 на 1.5, чтобы быстрее. Если не компилируется - скачай опкоды SF

Либо скачай внизу скомпилированный клео, я поменял 1.0 на 1.5, чтоб чуть быстрее.
Если вылетает игра или крашится, то скачай SAMPFUNCS 5.3.3.
Если какие-то еще проблемы - то явно только у тебя.
А, grandpafromghetto, и прошлый код был не мой, так что не надо ля-ля

Как остановить хук, а потом продолжить его работу? Например:
CLEO:
{$CLEO}
{$INCLUDE SF}
0000:

0C6A: 31@ = create_custom_thread_at_label @LABEL
0BE3: raknet setup_incoming_rpc_hook @iRPC

REPEAT
wait 0
UNTIL 0AFA:  is_samp_available

WHILE TRUE
wait 0
END

:LABEL
WHILE TRUE
wait 0
    IF /* если что-то там... */
    THEN
        /* Остановить поток iRPC */
        <code>
        /* Воспроизвести поток  iRPC*/
END

:iRPC
0BE5: raknet 9@ = get_hook_param 1
IF 9@ == 73
<code>
END
0BE0: raknet hook_ret TRUE
Ну или как-то так, главное, чтоб работало по принципу, который я выше описал
 

Вложения

  • CLEO.cs
    17.7 KB · Просмотры: 6
Последнее редактирование модератором:

Skelerll

Известный
154
8
Стандартными зарегистрированными средствами - никак. Можешь ставить проверку с помощью bool'евой переменной.
Типо вот так?
CLEO:
{$CLEO}
{$INCLUDE SF}
0000:

0C6A: 31@ = create_custom_thread_at_label @LABEL
0BE3: raknet setup_incoming_rpc_hook @iRPC

REPEAT
wait 0
UNTIL 0AFA:  is_samp_available

WHILE TRUE
wait 0
END

:LABEL
WHILE TRUE
wait 0
    IF /* если что-то там... */
    THEN
    10@ = 1
        <code>
    10@ = 0
    END
END

:iRPC
0BE5: raknet 9@ = get_hook_param 1
IF 9@ == 73
    IF 8039:   not 10@ == 1
    <code>
    END
END
0BE0: raknet hook_ret TRUE
 

DarkP1xel

Сила воли наше всё.
BH Team
3,637
5,027
Тип вот так:
CLEO:
{$CLEO}
HEX
    00 00
END

WHILE 8AFA: NOT SAMP_Loaded
    0001: 0
END
0BE3: raknet setup_incoming_rpc_hook @iRPC

WHILE TRUE
    0001: 0
    IF 0ADC:   test_cheat "123"
    THEN 0B12: 0@ = 0@ XOR 1
    END
END

:iRPC
IF 0039:   0@ == TRUE
THEN 0BE5: raknet 1@ = get_hook_param 1
    IF 0039:   1@ == {iRPC ID}73
    THEN // ...
    END
END
0BE0: raknet hook_ret TRUE
 
  • Нравится
Реакции: Skelerll

Kotovasya

Участник
85
13
Как в стринговой переменной, заменить все определенные символы (например все пробелы) на другие символы?
 

DarkP1xel

Сила воли наше всё.
BH Team
3,637
5,027
Как в стринговой переменной, заменить все определенные символы (например все пробелы) на другие символы?
Циклом for по строке до её размера и используя read/write memory опкоды получаешь/записываешь новое ASCII значение. Пробел - 32 (0x20).
 
  • Нравится
Реакции: Kotovasya

bereg101

Участник
55
0
Почему не работает кто понимает? Эта штук должна находить пикапы иконками 3790 19135 и брать их по ид используя другой клео скрипт, но
CLEO:
{$CLEO}
0000:

REPEAT
0001: 0
UNTIL 0AFA:
0BB9: samp 0@ = get_pickup_pool_ptr

WHILE TRUE
0001: 0

    FOR 1@ = 0 TO {MAX_PICKUPS}150 [STEP = 1]
        IF 0B51: samp 2@ = pickup_handle_by_id 1@
        THEN

        0A90: 2@ = 1@ * 20
        000A: 2@ += 61444
        000A: 2@ += 0@ // stPickup
        0A8D: 3@ = read_memory 2@ size 4 virtual_protect TRUE // iModelID

            IF or
            0039:   3@ == 3790  // ñþäà àéäè òûêâû è ïèêàïà 3790 - ðàêåòà    19135 - æåëòûé ïèêàï
            0039:   3@ == 19135
            THEN
            0AD3: 10@v = FORMAT "/spick %i" {ID}1@ // вот тут что то не так идет || эта команда из клео который берет пикапы на расстоянии 
            0C8F: samp process_chat_input 10@ 

            wait 1100

            END
        END
    END

END
 

Skelerll

Известный
154
8
Тип вот так:
CLEO:
{$CLEO}
HEX
    00 00
END

WHILE 8AFA: NOT SAMP_Loaded
    0001: 0
END
0BE3: raknet setup_incoming_rpc_hook @iRPC

WHILE TRUE
    0001: 0
    IF 0ADC:   test_cheat "123"
    THEN 0B12: 0@ = 0@ XOR 1
    END
END

:iRPC
IF 0039:   0@ == TRUE
THEN 0BE5: raknet 1@ = get_hook_param 1
    IF 0039:   1@ == {iRPC ID}73
    THEN // ...
    END
END
0BE0: raknet hook_ret TRUE
А если у меня два потока? Как перенести переменные из созданного потока в первый?
 
Последнее редактирование:

hnnssy

Известный
Друг
2,684
2,769
Почему не работает кто понимает? Эта штук должна находить пикапы иконками 3790 19135 и брать их по ид используя другой клео скрипт, но
CLEO:
{$CLEO}
0000:

REPEAT
0001: 0
UNTIL 0AFA:
0BB9: samp 0@ = get_pickup_pool_ptr

WHILE TRUE
0001: 0

    FOR 1@ = 0 TO {MAX_PICKUPS}150 [STEP = 1]
        IF 0B51: samp 2@ = pickup_handle_by_id 1@
        THEN

        0A90: 2@ = 1@ * 20
        000A: 2@ += 61444
        000A: 2@ += 0@ // stPickup
        0A8D: 3@ = read_memory 2@ size 4 virtual_protect TRUE // iModelID

            IF or
            0039:   3@ == 3790  // ñþäà àéäè òûêâû è ïèêàïà 3790 - ðàêåòà    19135 - æåëòûé ïèêàï
            0039:   3@ == 19135
            THEN
            0AD3: 10@v = FORMAT "/spick %i" {ID}1@ // вот тут что то не так идет || эта команда из клео который берет пикапы на расстоянии
            0C8F: samp process_chat_input 10@

            wait 1100

            END
        END
    END

END
0AD3: 10@v = FORMAT "/spick %i" 1@
alloc 10@ 16
memset 10@ 0x0 16
format 10@ "/spick %d" 1@

и, возможно, 0C8F не работает для команд с параметрами, но повторюсь - возможно
 

DarkP1xel

Сила воли наше всё.
BH Team
3,637
5,027
Можно подробней, если не сложно? А то для меня это темный лес...
Пример:
CLEO:
{$CLEO}
0AC6: 0@ = label @Buffer offset

WHILE TRUE
    0001: 0
    IF 0ADC:   test_cheat "1"
    THEN
        0AF8: samp add_message_to_chat "Было: %s" color 0xFFFFFF | {str}0@ |
        0C17: 1@ = strlen 0@
        FOR 2@ = 0 TO 1@ [STEP = 1]
            0A8E: 3@ = 0@ + 2@
            0A8D: 4@ = read_memory 3@ size 1 virtual_protect TRUE
            IF 0039:   4@ == {!}0x21
            THEN
                0A8C: write_memory 3@ size 1 value {.}0x2E virtual_protect TRUE
                0AF8: samp add_message_to_chat "Стало: %s" color 0xFFFFFF | {str}0@ |
                BREAK   
            END
        END   
    END
END

:Buffer
HEX
    "Hello World!" 00
END

Вот поместил в SCM функцию без SAMPFuncs:

CLEO:
0AB1: call_scm_func @ReplaceStringChar params 3 | {Str}0@ {CharToReplace}0x21 {NewChar}0x2E ||

:ReplaceStringChar
0AA7: call_function {__cdecl _strlen}0x826330 num_params 1 pop 1 | {const char *Str}0@ | {size_t}25@ |
FOR 26@ = 0 TO 25@ [STEP = 1]
    0A8E: 27@ = 0@ + 26@
    0A8D: 28@ = read_memory 27@ size 1 virtual_protect TRUE
    IF 003B:   28@ == 1@
    THEN 0A8C: write_memory 27@ size 1 value 2@ virtual_protect TRUE      
    END  
END
0AB2: ret 0 ||
 
Последнее редактирование:
  • Нравится
Реакции: Kotovasya

Kotovasya

Участник
85
13
CLEO:
0AB1: call_scm_func @ReplaceStringChar params 3 | {Str}0@ {CharToReplace}0x21 {NewChar}0x2E ||

:ReplaceStringChar
0AA7: call_function {__cdecl _strlen}0x826330 num_params 1 pop 1 | {const char *Str}0@ | {size_t}25@ |
FOR 26@ = 0 TO 25@ [STEP = 1]
    0A8E: 27@ = 0@ + 26@
    0A8D: 28@ = read_memory 27@ size 1 virtual_protect TRUE
    IF 003B:   28@ == 1@
    THEN 0A8C: write_memory 27@ size 1 value 2@ virtual_protect TRUE    
    END
END
0AB2: ret 0 ||
Предлагаю добавить в полезные scm функции, возможно еще кому-то пригодится:thank_you: