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

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,763
2,588
Это не столько клео, сколько ассемблерная вставка.
Причем сам листинг скорее всего автогенерируемый, потому что странная логика в нескольких моментах, да и в целом можно
было уже все написать на ассемблере чтоб не перекидывать значения между CLEO и хуком.

Было:

Код:
8B 46 14          mov     eax, [esi+14h]
8B CE             mov     ecx, esi
50                push    eax
E8 A2 5D 03 00    call    CVehicle::DoVehicleLights(CMatrix &,uint)

Стало:

ASP.net:
B8 [patch_point]   mov    eax, [patch_point]
FF E0              jmp    eax

C:
//
// указатель на текущее авто для которого рисовать неон
// или нулевой если неон не нужен
// в CLEO это была 0@
//
static void* active_vehicle;

//
// временная переменная со стека потока CLEO, которая зачем-то вместо стека используется
// хранит в себе указатель на авто, который игра обрабатывает и используется для вычисления флага draw on buildings
// в CLEO это была 2@
//
static void* tmp; // 2@

//
// цвета (0 - 128)
// в CLEO это была 6@
static unsigned int color_blue; // 6@
// в CLEO это была 5@
static unsigned int color_green; // 5@
// в CLEO это была 4@
static unsigned int color_red; // 4@

//
// переменная, которая используется для хранения размера модели
// в CLEO это была 8@
static float dimension_corner_b_x;

//
// временная переменная со стека потока CLEO, которая зачем-то вместо стека используется
// в CLEO это была 7@
static float tmp_dimension;

//
// переменная, которая используется для хранения размера модели
// в CLEO это была 9@
static float dimension_corner_b_y;


extern __declspec(naked) void patch_point(/* CVehicle* vehicle<esi> */) {
    __asm {
        /* 00: A1 00 00 00 00 */   mov eax, dword ptr active_vehicle
        /* 05: 3B F0 */            cmp esi, eax
        /* 07: 75 47 */            jnz short store_shadow
        /* 09: 89 F0 */            mov eax, esi
        /* 0B: A3 00 00 00 00 */   mov dword ptr tmp, eax
        /* 10: 0F 94 C0 */         setz al
        /* 13: 50 */               push eax
        /* 14: 6A 00 */            push 0
        /* 16: 68 00 00 80 3F */   push 3F800000h
        /* 1B: 6A 00 */            push 0
        /* 1D: 68 00 00 00 40 */   push 40000000h
        /* 22: A1 00 00 00 00 */   mov eax, dword ptr color_blue
        /* 27: 50 */               push eax
        /* 28: A1 00 00 00 00 */   mov eax, dword ptr color_green
        /* 2D: 50 */               push eax
        /* 2E: A1 00 00 00 00 */   mov eax, dword ptr color_red
        /* 33: 50 */               push eax
        /* 34: 68 FF 00 00 00 */   push 0FFh
        /* 39: 8B 46 14 */         mov eax, [esi+14h]
        /* 3C: D9 40 04 */         fld dword ptr [eax+4]
        /* 3F: B8 00 00 00 00 */   mov eax, dword ptr dimension_corner_b_x
        /* 44: D8 08 */            fmul dword ptr [eax]
        /* 46: B8 00 00 00 00 */   mov eax, dword ptr tmp_dimension
        /* 4B: D9 18 */            fstp dword ptr [eax]
        /* 4D: 8B 00 */            mov eax, [eax]
        /* 4F: 50 */               push eax
        /* 50:  */    store_shadow:
        /* 50: A1 00 00 00 00 */   mov eax, dword ptr active_vehicle
        /* 55: 3B F0 */            cmp esi, eax
        /* 57: 75 65 */            jnz short call_default
        /* 59: 8B 46 14 */         mov eax, [esi+14h]
        /* 5C: D9 40 00 */         fld dword ptr [eax+0]
        /* 5F: B8 00 00 00 00 */   mov eax, dimension_corner_b_x
        /* 64: D8 08 */            fmul dword ptr [eax]
        /* 66: B8 00 00 00 00 */   mov eax, tmp_dimension
        /* 6B: D9 18 */            fstp dword ptr [eax]
        /* 6D: 8B 00 */            mov eax, [eax]
        /* 6F: 50 */               push eax
        /* 70: 8B 46 14 */         mov eax, [esi+14h]
        /* 73: D9 40 14 */         fld dword ptr [eax+14h]
        /* 76: B8 00 00 00 00 */   mov eax, dimension_corner_b_y
        /* 7B: D8 08 */            fmul dword ptr [eax]
        /* 7D: B8 00 00 00 00 */   mov eax, tmp_dimension
        /* 82: D9 18 */            fstp dword ptr [eax]
        /* 84: 8B 00 */            mov eax, [eax]
        /* 86: 50 */               push eax
        /* 87: 8B 46 14 */         mov eax, [esi+14h]
        /* 8A: D9 40 10 */         fld dword ptr [eax+10h]
        /* 8D: B8 00 00 00 00 */   mov eax, dimension_corner_b_y
        /* 92: D8 08 */            fmul dword ptr [eax]
        /* 94: B8 00 00 00 00 */   mov eax, tmp_dimension
        /* 99: D9 18 */            fstp dword ptr [eax]
        /* 9B: 8B 00 */            mov eax, [eax]
        /* 9D: 50 */               push eax
        /* 9E: 8B 46 14 */         mov eax, [esi+14h]
        /* A1: 83 C0 30 */         add eax, 30h
        /* A4: 50 */               push eax
        /* A5: A1 F4 03 C4 00 */   mov eax, ds:0C403F4h
        /* AA: 50 */               push eax
        /* AB: 6A 02 */            push 2
        /* AD: B8 90 73 70 00 */   mov eax, 707390h
        /* B2: FF D0 */            call eax
        /* B4: 83 C4 40 */         add esp, 40h
        /* B7: A1 00 00 00 00 */   mov eax, dword ptr tmp
        /* BC: 89 C6 */            mov esi, eax
        /* BE: */     call_default:
        /* BE: 8B 46 14 */         mov eax, [esi+14h]
        /* C1: 89 F1 */            mov ecx, esi
        /* C3: 50 */               push eax
        /* C4: B8 60 1A 6E 00 */   mov eax, 6E1A60h
        /* C9: FF D0 */            call eax
        /* CB: B8 BE BC 6A 00 */   mov eax, 6ABCBEh
        /* D0: FF E0 */            jmp eax
    }
}

C++:
static void alternate_patch_point(/* CVehicle* vehicle<esi> */) {
    if (vehicle == active_vehicle) {
        // m_pMatrix:     CAutomobile -> CVehicle -> CPhysical -> CEntity -> CPlaceable -> CMatrixLink
        CShadows::StoreShadowToBeRendered(
            2,                                                       // type
            (void*)0xC403F4,                                         // texture (gpShadowExplosionTex)
            &vehicle->m_pMatrix->pos,                                // pos
            vehicle->m_pMatrix->up.x    * dimension_corner_b_y,      // x1
            vehicle->m_pMatrix->up.y    * dimension_corner_b_y,      // y1
            vehicle->m_pMatrix->right.x * dimension_corner_b_x,      // x2
            vehicle->m_pMatrix->right.y * dimension_corner_b_x,      // y2
            255,                                                     // intensity
            color_red,                                               // r
            color_green,                                             // g
            color_blue,                                              // b
            2.0f,                                                    // distance
            0,                                                       // draw on water
            1.0f,                                                    // scale
            0x0,                                                     // shadow data
            1                                                        // draw on buildings
        );
    }
 
    CVehicle::DoVehicleLights(vehicle, vehicle->m_pMatrix);
 
    // прыжок на 0x6ABCBE
}

P.S. мог где-то проебаться, названия из plugin sdk, и безусловно это прототип и нужно нормальный код с константами, векторами, и отсутствием магических чисел
Еще раз спасибо за помощь. Попробовал вот такой код. Сама функция отрабатывает без ошибок (по крайней мере, когда вектор пустой xD). Но вот после выхода, я так понимаю, где-то ломается asm код.
C++:
Plugin::Plugin()
{
    memwrapper::write_memory<std::uint8_t>(0x6ABCB3, 0xB8);
    memwrapper::write_memory<std::uintptr_t>(0x6ABCB4, reinterpret_cast<std::uintptr_t>(&LightHooked));
    memwrapper::write_memory<std::uint16_t>(0x6ABCB8, 0xE0FF);
}



void Plugin::LightHooked(CVehicle* vehicle) {
    std::cout << "vehicle " << vehicle << std::endl;

    for (auto parseVehicle : PLUGIN.vehicles)
    {
        if (parseVehicle->handle == vehicle)
        {
            int dimension_corner_b_y = 1;
            int dimension_corner_b_x = 1;
          
            // m_pMatrix:     CAutomobile -> CVehicle -> CPhysical -> CEntity -> CPlaceable -> CMatrixLink 
            CShadows::StoreShadowToBeRendered(
                2,                                                      // type
                (RwTexture*)0xC403F4,                                   // texture (gpShadowExplosionTex)
                &vehicle->m_matrix->pos,                                // pos
                vehicle->m_matrix->up.x    * dimension_corner_b_y,      // x1
                vehicle->m_matrix->up.y    * dimension_corner_b_y,      // y1
                vehicle->m_matrix->right.x * dimension_corner_b_x,      // x2
                vehicle->m_matrix->right.y * dimension_corner_b_x,      // y2
                255,                                                    // intensity
                parseVehicle->rgb.r,                                    // r
                parseVehicle->rgb.g,                                    // g
                parseVehicle->rgb.b,                                    // b
                2.0f,                                                   // distance
                0,                                                      // draw on water
                1.0f,                                                   // scale
                0x0,                                                    // shadow data
                1                                                       // draw on buildings
            );

            vehicle->DoVehicleLights(*vehicle->m_matrix, 1);
            // прыжок на 0x6ABCBE
        }
    }

    std::cout << "AFTER PROCESSING " << vehicle << std::endl;

  
__asm {
        // Эпилог
        mov esp, ebp
        pop ebp
        // Возврат в функцию
        mov ecx, 0x6ABCBE
        jmp ecx
    }
}

1710943191747.png
 

Vintik

Через тернии к звёздам
Проверенный
1,521
995
Еще раз спасибо за помощь. Попробовал вот такой код. Сама функция отрабатывает без ошибок (по крайней мере, когда вектор пустой xD). Но вот после выхода, я так понимаю, где-то ломается asm код.
C++:
Plugin::Plugin()
{
    memwrapper::write_memory<std::uint8_t>(0x6ABCB3, 0xB8);
    memwrapper::write_memory<std::uintptr_t>(0x6ABCB4, reinterpret_cast<std::uintptr_t>(&LightHooked));
    memwrapper::write_memory<std::uint16_t>(0x6ABCB8, 0xE0FF);
}



void Plugin::LightHooked(CVehicle* vehicle) {
    std::cout << "vehicle " << vehicle << std::endl;

    for (auto parseVehicle : PLUGIN.vehicles)
    {
        if (parseVehicle->handle == vehicle)
        {
            int dimension_corner_b_y = 1;
            int dimension_corner_b_x = 1;
       
            // m_pMatrix:     CAutomobile -> CVehicle -> CPhysical -> CEntity -> CPlaceable -> CMatrixLink
            CShadows::StoreShadowToBeRendered(
                2,                                                      // type
                (RwTexture*)0xC403F4,                                   // texture (gpShadowExplosionTex)
                &vehicle->m_matrix->pos,                                // pos
                vehicle->m_matrix->up.x    * dimension_corner_b_y,      // x1
                vehicle->m_matrix->up.y    * dimension_corner_b_y,      // y1
                vehicle->m_matrix->right.x * dimension_corner_b_x,      // x2
                vehicle->m_matrix->right.y * dimension_corner_b_x,      // y2
                255,                                                    // intensity
                parseVehicle->rgb.r,                                    // r
                parseVehicle->rgb.g,                                    // g
                parseVehicle->rgb.b,                                    // b
                2.0f,                                                   // distance
                0,                                                      // draw on water
                1.0f,                                                   // scale
                0x0,                                                    // shadow data
                1                                                       // draw on buildings
            );

            vehicle->DoVehicleLights(*vehicle->m_matrix, 1);
            // прыжок на 0x6ABCBE
        }
    }

    std::cout << "AFTER PROCESSING " << vehicle << std::endl;

 
__asm {
        // Эпилог
        mov esp, ebp
        pop ebp
        // Возврат в функцию
        mov ecx, 0x6ABCBE
        jmp ecx
    }
}

У меня возникло аж несколько вопросов.
1. Зачем ты прыгаешь так?
C++:
mov eax, 0x11223344 // b8 44 33 22 11
jmp eax // ff e0
Если можно использовать прыжок напрямую (и это будет занимать 5 байтов вместо 7)?
C++:
jmp 0x11223344 // e9 40 33 22 11
Типа, если это обход какого-то античита - тогда ладно. Но просто так зачем усложнять жизнь?
2. У тебя в твоей реализации заменён такой код (первые 7 байтов):
C++:
mov eax, [esi+14h] // 8B 46 14
mov ecx, esi // 8B CE
push eax // 50
call CVehicle::DoVehicleLights(CMatrix &,uint) // E8 A2 5D 03 00
А ты в эпилоге вместо этого выполняешь такое:
C++:
mov esp, ebp // 89 ec
pop ebp // 5d
Понятное дело, что у тебя всё ломается...
3. Ты, когда прыгаешь назад, заменяешь регистр EAX из-за твоего странного метода прыжка. Он может использоваться где-то в функции... И конкретно в этой функции он запихивается в стек (push eax) для вызова функции, поэтому этот регистр нужен. Вероятно, это и ломает код.

Раньше тут был код, но я понял, что он не сработает.
Скинь в Cheat Engine функцию чуть выше и чуть ниже, чтобы я понимал, где и как ты хочешь поставить хук.
 
  • Нравится
Реакции: whyega52

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,763
2,588
У меня возникло аж несколько вопросов.
1. Зачем ты прыгаешь так?
C++:
mov eax, 0x11223344 // b8 44 33 22 11
jmp eax // ff e0
Если можно использовать прыжок напрямую (и это будет занимать 5 байтов вместо 7)?
C++:
jmp 0x11223344 // e9 40 33 22 11
Типа, если это обход какого-то античита - тогда ладно. Но просто так зачем усложнять жизнь?
2. У тебя в твоей реализации заменён такой код (первые 7 байтов):
C++:
mov eax, [esi+14h] // 8B 46 14
mov ecx, esi // 8B CE
push eax // 50
call CVehicle::DoVehicleLights(CMatrix &,uint) // E8 A2 5D 03 00
А ты в эпилоге вместо этого выполняешь такое:
C++:
mov esp, ebp // 89 ec
pop ebp // 5d
Понятное дело, что у тебя всё ломается...
3. Ты, когда прыгаешь назад, заменяешь регистр EAX из-за твоего странного метода прыжка. Он может использоваться где-то в функции... И конкретно в этой функции он запихивается в стек (push eax) для вызова функции, поэтому этот регистр нужен. Вероятно, это и ломает код.

Раньше тут был код, но я понял, что он не сработает.
Скинь в Cheat Engine функцию чуть выше и чуть ниже, чтобы я понимал, где и как ты хочешь поставить хук.
чет я немного еблан, вместо того, чтобы дрочиться самостоятельно с листингом, можно было поставить call хук на вызов CVehicle::DoVehicleLights через какую-нибудь либу хуков (у меня kthook)
C++:
// header
using VehicleDoVehicleLights_t = void(__thiscall*)(CVehicle* vehicle, CMatrix* matrix, std::uint32_t flags);
kthook::kthook_simple<VehicleDoVehicleLights_t>(VehicleDoVehicleLightsHook);
static void __fastcall VehicleDoVehicleLightsHooked(const decltype(VehicleDoVehicleLightsHook)& hook, CVehicle* vehicle, CMatrix* matrix, std::uint32_t flags);


// code
VehicleDoVehicleLightsHook.set_dest(0x6ABCB9);
VehicleDoVehicleLightsHook.set_cb(&VehicleDoVehicleLightsHooked);
VehicleDoVehicleLightsHook.install();


void __fastcall VehicleDoVehicleLightsHooked(const decltype(VehicleDoVehicleLightsHook)& hook, CVehicle* vehicle, CMatrix* matrix, std::uint32_t flags)
{
    CShadows::StoreShadowToBeRendered(
        2,
        (RwTexture*)0xC403F4,
        &vehicle->m_matrix->pos,
        vehicle->m_matrix->up.x,
        vehicle->m_matrix->up.y,
        vehicle->m_matrix->right.x,
        vehicle->m_matrix->right.y,
        50,
        0,
        0,
        128,
        1.0f,
        0,
        1.0f,
        0x0,
        1
    );
    

    hook.get_trampoline()(vehicle, matrix, flags);
}
 

Ninklosd

Новичок
12
0
Код:
{$CLEO .cs}

wait 8500



while true
wait 0

if
0256:   player $PLAYER_ACTOR defined
then
    0A8D: 29@ = read_memory 0xB74490 size 4 virtual_protect 0
    29@ += 0x4
    0A8D: 29@ = read_memory 29@ size 4 virtual_protect 0
    for 30@ = 0 to 35584 step 0x100
        0A8D: 31@ = read_memory 29@ size 1 virtual_protect 0
        000A: 29@ += 0x1
        if and
        0029: 31@ >= 0x00
        001B: 0x80 > 31@                     
        then
            005A: 31@ += 30@
            if and
            803B:   31@ == $PLAYER_ACTOR
            056D:   actor 31@ defined // not my ped
            then
                if and
                8118:   actor 31@ dead
                02CB:   actor 31@ bounding_sphere_visible
                then
                    /*0AB1: @SAMPGetPlayerIDByActorHandle 1 _ActorHandle 31@ _Returned: ID 28@
                    0AB1: @IsPlayerConnected 1 ID 28@
                    0AB1: @GetPlayerNameByID 1 ID 28@ _Returned: Name 27@*/
                    0AB1: call_scm_func @GET_BONE_POS 2 FROM_ACTOR 31@ BONE 6 _STORE_TO 0@ 1@ 2@  // HEAD
                    0AB1: call_scm_func @getScreenXYFrom3DCoords 3 3D_coords_X 0@ Y 1@ Z 2@ store_screen_X_to 3@ Y_to 4@
                    5@ = Actor.Health(31@)
                    0093: 5@ = integer 5@ to_float
                    //0AB1: call_scm_func @drawNumber 6 coords_X 3@ coords_Y 4@ value 5@ R 255 G 255 B 255
                    0AB1: call_scm_func @drawBar 9 coords_X 3@ coords_Y 4@ value 5@ size X 12.0 Y 1.5 thickness 2.0 RGB 255 0 0
                    03F0: enable_text_draw 1
                end
            end
        end
    end
end

end
:drawNumber
//0AB1: call_scm_func @drawNumber 6 coords_X 0@ coords_Y 1@ value 2@ R 3@ G 4@ B 5@
0349: set_text_draw_font 1
0342: set_text_draw_centered 1
033F: set_text_draw_letter_size 0.3 0.9
081C: draw_text_outline 1 RGBA 0 0 0 255
0340: set_text_draw_RGBA 3@ 4@ 5@ 255
045A: draw_text_1number 0@ 1@ GXT 'NUMBER' number 2@  // ~1~
0AB2: ret 0

:IsPlayerConnected
{
    IF 0AB1: @IsPlayerConnected 1 ID 0@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    0AB1: @get_samp_version_id 0 _returned: ID 17@ 
    IF 17@ > 0
    THEN
        IF 17@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0F8 // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3CD // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x18 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x10B0 // SAMP_IS_PLAYER_CONNECTED_OFFSET
        END
        IF 17@ == 2 // 0.3.7 R2
        THEN
            0A8E: 30@ = 31@ + 0x21A100 // SAMP_INFO_OFFSET   
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3C5 // SAMP_PPOOLS_OFFSET           
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET           
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x10B0 // SAMP_IS_PLAYER_CONNECTED_OFFSET
        END
        
        IF 17@ == 3 // 0.3.DL
        THEN
            0A8E: 30@ = 31@ + 0x2ACA24 // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x10B0 // SAMP_IS_PLAYER_CONNECTED_OFFSET
        END
        
        IF 17@ == 4 // 0.3.7 R3
        THEN
            0A8E: 30@ = 31@ + 0x26E8DC // SAMP_INFO_OFFSET     
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET           
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET           
            0A8D: 30@ = readMem 30@ sz 4 vp 0
          
            0A8E: 29@ = 31@ + 0x10B0 // SAMP_IS_PLAYER_CONNECTED_OFFSET
        END
        
        IF 17@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET   
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x10B0 // SAMP_IS_PLAYER_CONNECTED_OFFSET 
        END
        
        IF 17@ == 6 // 0.3.7 R4 - v2
        THEN
            0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET   
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x10B0 // SAMP_IS_PLAYER_CONNECTED_OFFSET
        END
        
        IF 17@ == 7 // 0.3.7 R5
        THEN
            0A8E: 30@ = 31@ + 0x26EB94 // SAMP_INFO_OFFSET   
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x10B0 // SAMP_IS_PLAYER_CONNECTED_OFFSET
        END
        
        0AA8: call_function_method 29@ struct 30@ num_params 1 pop 0 ID 0@ _Returned: Name 28@
        IF 28@ > 0
        THEN 0485:  RETURN_TRUE
        ELSE 059A:  RETURN_FALSE
        END
        
    END
END
0AB2: ret 0
:GetPlayerNameByID
{
    0AB1: @GetPlayerNameByID 1 ID 0@ _Returned: Name 31@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    0AB1: @get_samp_version_id 0 _returned: ID 17@
    IF 17@ > 0
    THEN
        IF 17@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0F8 // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3CD // SAMP_PPOOLS_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x18 // SAMP_PPOOL_PLAYER_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x13CE0 // SAMP_GET_PLAYER_NAME_OFFSET
        END
        IF 17@ == 2 // 0.3.7 R2
        THEN
            0A8E: 30@ = 31@ + 0x21A100 // SAMP_INFO_OFFSET   
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3C5 // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x13DA0 // SAMP_GET_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 3 // 0.3.DL
        THEN
            0A8E: 30@ = 31@ + 0x2ACA24 // SAMP_INFO_OFFSET
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET       
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x170D0 // SAMP_GET_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 4 // 0.3.7 R3
        THEN
            0A8E: 30@ = 31@ + 0x26E8DC // SAMP_INFO_OFFSET   
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET           
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET           
            0A8D: 30@ = readMem 30@ sz 4 vp 0
        
            0A8E: 29@ = 31@ + 0x16F00 // SAMP_GET_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x17570 // SAMP_GET_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 6 // 0.3.7 R4 - v2
        THEN
            0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x175C0 // SAMP_GET_PLAYER_NAME_OFFSET
        END
      
        IF 17@ == 7 // 0.3.7 R5
        THEN
            0A8E: 30@ = 31@ + 0x26EB94 // SAMP_INFO_OFFSET 
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x3DE // SAMP_PPOOLS_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
            30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET         
            0A8D: 30@ = readMem 30@ sz 4 vp 0
      
            0A8E: 29@ = 31@ + 0x175C0 // SAMP_GET_PLAYER_NAME_OFFSET
        END
      
        0AA8: call_function_method 29@ struct 30@ num_params 1 pop 0 ID 0@ _Returned: Name 28@
        IF 28@ > 0
        THEN 0485:  RETURN_TRUE
        ELSE 059A:  RETURN_FALSE
        END
      
    END
END
0AB2: ret 1 28@

:SAMPGetPlayerIDByActorHandle
{
    0.3.DL
    IF 0AB1: @SAMPGetPlayerIDByActorHandle 1 _ActorHandle 0@ _Returned: ID 31@
}
IF 0AA2: 31@ = loadlib "samp.dll" // GET_SAMP_BASE
THEN
    31@ += 0x2ACA24 // SAMP_INFO_OFFSET[0]
    0A8D: 31@ = read_memory 31@ size 4 virtual_protect 0 // SAMP_INFO
    IF 31@ > 0
    THEN
        31@ += 0x3DE // SAMP_POOLS_OFFSET[0]
        0A8D: 31@ = read_memory 31@ size 4 virtual_protect 0 // SAMP_POOLS_OFFSET
        IF 31@ > 0
        THEN
            31@ += 0x8 // PLAYER_POOLS_OFFSET[0]
            0A8D: 31@ = read_memory 31@ size 4 virtual_protect 0 // PLAYER_POOLS
            IF 31@ > 0
            THEN
                IF 003B: 0@ == $PLAYER_ACTOR // COMPARE_HANDLE_WHICH_WAS_GIVEN
                THEN
                    0A8E: 30@ = 31@ + 0x0 // LOCAL_PLAYER_ID_OFFSET[0]
                    0A8D: 28@ = read_memory 30@ size 2 virtual_protect 0 // LOCAL_PLAYER_ID
                    0AB2: RET 1 28@
                ELSE
                    0A8E: 29@ = 31@ + 0x22 // MAX_PLAYER_ID_STREAMED_ONLY_OFFSET[0]
                    0A8D: 29@ = read_memory 29@ size 4 virtual_protect 0 // MAX_PLAYER_ID_STREAMED_ONLY
                    FOR 28@ = 0 TO 29@ // FROM "0" TO "MAX_PLAYER_ID_STREAMED_ONLY"
                        27@ = 0x4 // SAVE VARIABLE "27@" AS DIGIT "4"
                        006A: 27@ *= 28@ // 4 * ID
                        0A8E: 26@ = 31@ + 0x26 // SAVE TO NEW "26@" VARIABLE "PLAYER_POOLS" + "REMOTE_PLAYER_OFFSET[0]"
                        005A: 26@ += 27@ // REMOTE_PLAYER_OFFSET + 4 * ID
                        0A8D: 26@ = read_memory 26@ size 4 virtual_protect 0 // REMOTE_PLAYER
                        IF 26@ > 0
                        THEN
                            26@ += 0x8 // PLAYER_DATA_OFFSET[0]
                            0A8D: 26@ = read_memory 26@ size 4 virtual_protect 0 // PLAYER_DATA
                            IF 26@ > 0
                            THEN
                                26@ += 0x4 // SAMP_ACTOR_OFFSET[0]
                                0A8D: 26@ = read_memory 26@ size 4 virtual_protect 0 // SAMP_ACTOR
                                IF 26@ > 0
                                THEN
                                    26@ += 0x44 // GTA_PED_HANDLE_OFFSET[0]
                                    0A8D: 26@ = read_memory 26@ size 4 virtual_protect 0 // GTA_PED_HANDLE
                                    IF 26@ > 0
                                    THEN
                                        IF 003B: 0@ == 26@ // COMPARE_HANDLE_WHICH_WAS_GIVEN
                                        THEN
                                            0485: RETURN_TRUE
                                            0AB2: RET 1 28@
                                        END
                                    END
                                END
                            END
                        END
                    END
                END
            END
        END
    END
END
059A: RETURN_FALSE
0AB2: RET 0
:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: ID 0@ 
30@ = 0
IF 0AA2: 31@ = "samp.dll" // IF and SET
THEN
    31@ += 0x128
    0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
    IF 29@ == 0x5542F47A
    THEN // 0.3.7 R1
        30@ = 1
    END
    
    IF 29@ == 0x59C30C94
    THEN // 0.3.7 R2
        30@ = 2
    END
    
    IF 29@ == 0x5A6A3130
    THEN // 0.3.DL
        30@ = 3
    END
    31@ -= 8 // reading samp.dll + 0x120
    0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
    IF 29@ == 0x5C0B4243
    THEN // 0.3.7 R3
        30@ = 4
    END 
    
    IF 29@ == 0x5DD606CD
    THEN // 0.3.7 R4
        30@ = 5
    END
    IF 29@ == 0x6094ACAB
    THEN // 0.3.7 R4 - v2
        30@ = 6
    END
    IF 29@ == 0x6372C39E
    THEN // 0.3.7 R5
        30@ = 7
    END
END
0AB2: ret 1 30@

: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@

:getScreenXYFrom3DCoords
0AC7: 14@ = var 0@ offset
0AC7: 15@ = var 3@ offset
0AC7: 16@ = var 6@ offset
0AC7: 17@ = var 9@ offset
0AA5: call 0x70CE30 num_params 6 pop 6 {18@ 18@} 0 0 17@ 16@ 15@ 14@
0007: 12@ = 640.0
0007: 13@ = 448.0
0A8D: 14@ = read_memory 0xC17044 size 4 virtual_protect 0
0A8D: 15@ = read_memory 0xC17048 size 4 virtual_protect 0
0093: 14@ = integer 14@ to_float
0093: 15@ = integer 15@ to_float
0073: 12@ /= 14@
0073: 13@ /= 15@
006B: 3@ *= 12@
006B: 4@ *= 13@
0AB2: ret 2 3@ 4@

:drawBar
13@ = 100
0073: 13@ /= 3@ // (float)
0073: 2@ /= 13@ // (float)
0087: 11@ = 3@ // (float)
0087: 12@ = 4@ // (float)
005B: 11@ += 5@  // (float)
005B: 12@ += 5@  // (float)   
038E: draw_box_position 0@ 1@ size 11@ 12@ RGBA 0 0 0 255
038E: draw_box_position 0@ 1@ size 3@ 4@ RGBA 6@ 7@ 8@ 255
0087: 10@ = 2@ // (float)
0017: 10@ /= 2.0
0017: 3@ /= 2.0
005B: 0@ += 10@  // (float)
0063: 0@ -= 3@  // (float)
038E: draw_box_position 0@ 1@ size 2@ 4@ RGBA 255 0 0 255
0AB2: ret 0
help me fix display of drawbar not correctly like this
image.png
 

Parazitas

Известный
20
9
Greetings to all. There is a code that, in theory, should produce text from the chat structure, but the output I get is just an offset, which I have no idea how to read...
Code:
{$CLEO .cs}

0000: NOP

WAIT 3000

WHILE TRUE
WAIT 0

IF 0256: player $PLAYER_CHAR defined
    THEN  
        0AC8: 1@ = allocate_memory_size 1024
        0AC8: 2@ = allocate_memory_size 1024
        0AB1: @getChatString 2 SampVersionID 4 ChatID 99 _Returned: Text 1@ PrefixText 2@ Color 3@ PrefixColor 4@      
        0AC8: 5@ = allocate_memory_size 1024
        0AB1: @DeleteColorCodeFromText 2 text 1@ memory_to_store_characters_as_text 5@              
    END  
END


:getChatString
{
    0AC8: 1@ = allocate_memory_size 1024
    0AC8: 2@ = allocate_memory_size 1024
    0AB1: @getChatString 2 SampVersionID 0@ ChatID 99 _Returned: Text 1@ PrefixText 2@ Color 3@ PrefixColor 4@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    IF NOT 0@ < 1
    THEN
        IF 0@ == 1 // 0.3.7 R1
        THEN
            31@ += 0x21A0E4 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            1@ *= 0xFC
            005A: 31@ += 1@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
        IF 0@ == 2 // 0.3.7 R2
        THEN
            31@ += 0x21A0EC // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            1@ *= 0xFC
            005A: 31@ += 1@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END

        IF 0@ == 3 // 0.3.DL
        THEN
            31@ += 0x2ACA10 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            1@ *= 0xFC
            005A: 31@ += 1@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END

        IF 0@ == 4 // 0.3.7 R3
        THEN
            31@ += 0x26E8C8 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            1@ *= 0xFC
            005A: 31@ += 1@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END

        IF 0@ == 5 // 0.3.7 R4
        THEN
            31@ += 0x26E9F8 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            1@ *= 0xFC
            005A: 31@ += 1@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
   
        IF 0@ == 6 // 0.3.7 R4 - v2
        THEN
            31@ += 0x26E9F8 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            1@ *= 0xFC
            005A: 31@ += 1@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
    END
    0AA3: 31@
END
0AB2: ret 4 30@ 29@ 27@ 24@

Previously, when I read text from Raknet, I used opcode 0BE8

Code:
0BE7: raknet 20@ = bit_stream_read 15@ type BS_TYPE_INT //Line size
alloc 21@2048

if and
8029: not 20@ >= 2048
0029: 20@ >= 1
then

0C11: memset destination 21@ value 0 size 2048
0BE8: raknet bit_stream 15@ read_array 21@ size 20@ //String

I haven’t found a method for reading text from a structure, does anyone have any thoughts?
Код:
{$CLEO .cs}

0000:

REPEAT
IF 8256: player $PLAYER_CHAR defined
THEN 0A93: end_custom_thread
END
WAIT 1500
UNTIL 0256: player $PLAYER_CHAR defined  

WHILE TRUE
WAIT 0

IF 0256: player $PLAYER_CHAR defined
THEN
    0AC8: 31@ = allocate_memory_size 144
    0AC8: 30@ = allocate_memory_size 144
    0AB1: @getChatString 1 ChatID 99 _Returned: Text 31@ PrefixText 30@ Color 29@ PrefixColor 28@
    0AC8: 27@ = allocate_memory_size 144
    0AB1: @DeleteColorCodes 2 text 31@ memory_to_store_characters_as_text 27@
     //DoSomething...
    0AC9: free_allocated_memory 31@
    0AC9: free_allocated_memory 30@
    0AC9: free_allocated_memory 27@
END

END
        
:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: ID 0@  
30@ = 0
IF 0AA2: 31@ = "samp.dll" // IF and SET
THEN
    31@ += 0x128
    0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
    IF 29@ == 0x5542F47A
    THEN // 0.3.7 R1
        30@ = 1
    END
    
    IF 29@ == 0x59C30C94
    THEN // 0.3.7 R2
        30@ = 2
    END
    
    IF 29@ == 0x5A6A3130
    THEN // 0.3.DL
        30@ = 3
    END
    31@ -= 8 // reading samp.dll + 0x120
    0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
    IF 29@ == 0x5C0B4243
    THEN // 0.3.7 R3 
        30@ = 4
    END  
    
    IF 29@ == 0x5DD606CD
    THEN // 0.3.7 R4
        30@ = 5
    END
    IF 29@ == 0x6094ACAB
    THEN // 0.3.7 R4 - v2
        30@ = 6
    END 
    IF 29@ == 0x6372C39E
    THEN // 0.3.7 R5
        30@ = 7
    END 
END
0AB2: ret 1 30@        

:DeleteColorCodes
{
    0AB1: @DeleteColorCodes 2 text 0@ memory_to_store_characters_as_text 1@
    In: 0@ = text
    Out: 1@ = pointer to memory where characters will be stored as text 

}
5@ = FALSE // inbracket
0AB1: @strlenA 1 string 0@ _length 31@
    for 30@ = 0 to 31@
        0085: 29@ = 0@ // copy pointer
        005A: 29@ += 30@ // add offset make loop
        0A8D: 28@ = read_memory 29@ size 1 virtual_protect 1 // 28@ is the ascii number representing character
        if 28@ == 123
        then 5@ = TRUE // inbracket
        end
 
        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 1@ size 1 value 28@ virtual_protect 1
            1@ += 1 // move to next address
        END
 
        if 28@ == 125
        then 5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 1@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:StrlenA
// 0AB1: @StrlenA 1 String 0@ _Returned: Length 1@
0A8D: 26@ = readmem 0x8580DC sz 4 vp 0 // 0x8580DC - KERNEL32.lstrlenA
0AA7: strlen_addr 26@ num_params 1 pop 0 string 0@ _returned_length 25@
0AB2: ret 1 25@ 

:getChatString
{
    0AC8: 0@ = allocate_memory_size 1024
    0AC8: 1@ = allocate_memory_size 1024
    0AB1: @getChatString 1 ChatID 99 _Returned: Text 0@ PrefixText 1@ Color 2@ PrefixColor 3@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    0AB1: @get_samp_version_id 0 _returned: ID 17@ 
    IF 17@ > 0
    THEN
        IF 17@ == 1 // 0.3.7 R1
        THEN 
            31@ += 0x21A0E4 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            0@ *= 0xFC
            005A: 31@ += 0@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
        IF 17@ == 2 // 0.3.7 R2
        THEN
            31@ += 0x21A0EC // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            0@ *= 0xFC
            005A: 31@ += 0@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
        
        IF 17@ == 3 // 0.3.DL
        THEN
            31@ += 0x2ACA10 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            0@ *= 0xFC
            005A: 31@ += 0@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
        
        IF 17@ == 4 // 0.3.7 R3 
        THEN
            31@ += 0x26E8C8 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            0@ *= 0xFC
            005A: 31@ += 0@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
        
        IF 17@ == 5 // 0.3.7 R4
        THEN
            31@ += 0x26E9F8 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            0@ *= 0xFC
            005A: 31@ += 0@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
        
        IF 17@ == 6 // 0.3.7 R4 - v2
        THEN
            31@ += 0x26E9F8 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            0@ *= 0xFC
            005A: 31@ += 0@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
        
        IF 17@ == 7 // 0.3.7 R5
        THEN
            31@ += 0x26EB80 // SAMP_CHAT_INFO_OFFSET
            0A8D: 31@ readMem 31@ sz 4 vp 0
            31@ += 0x132
            0@ *= 0xFC
            005A: 31@ += 0@
            0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
            0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
            0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
            0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
            0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
            0A8D: 25@ readMem 26@ sz 1 vp 0
            IF NOT 25@ > 0
            THEN 24@ = 0
            ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
            END
        END
        0AA3: 31@
    END
END
0AB2: ret 4 30@ 29@ 27@ 24@

:Chatmsg
/*
     0AC8: 0@ = allocate_memory_size 1024
     0AD3: 0@ = format "{FFFFFF}Auto Accept: {00FF00}ON"
     0AB1: @Chatmsg 2 text 0@ color -1
     0AC9: free_allocated_memory 0@
*/
IF 0AA2: 31@ = "samp.dll"
THEN
    0AB1: @get_samp_version_id 0 _Returned: ID 17@
    IF NOT 17@ < 1
    THEN
        IF 17@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0E4 // SAMP_CHAT_INFO_OFFSET (R1)
            0A8D: 30@ = readMem 30@ sz 4 vp 0 // pChat;
            0A8E: 29@ = 31@ + 0x64010 // FUNC_ADDTOCHATWND (R1)
        END

        IF 17@ == 2 // 0.3.7 R2
        THEN
            0A8E: 30@ = 31@ + 0x21A0EC // SAMP_CHAT_INFO_OFFSET (R2)
            0A8D: 30@ = readMem 30@ sz 4 vp 0 // pChat;
            0A8E: 29@ = 31@ + 0x640E0 // FUNC_ADDTOCHATWND (R2)
        END

        IF 17@ == 3 // 0.3.DL
        THEN
            0A8E: 30@ = 31@ + 0x2ACA10 // SAMP_CHAT_INFO_OFFSET (DL)
            0A8D: 30@ = readMem 30@ sz 4 vp 0 // pChat;
            0A8E: 29@ = 31@ + 0x67650 // FUNC_ADDTOCHATWND (DL)
        END

        IF 17@ == 4 // 0.3.7 R3
        THEN
            0A8E: 30@ = 31@ + 0x26E8C8 // SAMP_CHAT_INFO_OFFSET (R3)
            0A8D: 30@ = readMem 30@ sz 4 vp 0 // pChat;
            0A8E: 29@ = 31@ + 0x67460 // FUNC_ADDTOCHATWND (R3)
        END

        IF 17@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26E9F8 // SAMP_CHAT_INFO_OFFSET (R4)
            0A8D: 30@ = readMem 30@ sz 4 vp 0 // pChat;
            0A8E: 29@ = 31@ + 0x67BA0 // FUNC_ADDTOCHATWND (R4) 699D0
        END
      
        IF 17@ == 6 // 0.3.7 R4 - v2
        THEN
            0A8E: 30@ = 31@ + 0x26E9F8 // SAMP_CHAT_INFO_OFFSET (R4)
            0A8D: 30@ = readMem 30@ sz 4 vp 0 // pChat;
            0A8E: 29@ = 31@ + 0x67BE0 // FUNC_ADDTOCHATWND (R4)
        END
        
        IF 17@ == 7 // 0.3.7 R5
        THEN
            0A8E: 30@ = 31@ + 0x26EB80 // SAMP_CHAT_INFO_OFFSET (R4)
            0A8D: 30@ = readMem 30@ sz 4 vp 0 // pChat;
            0A8E: 29@ = 31@ + 0x67BE0 // FUNC_ADDTOCHATWND (R4)
        END
                
        IF 1@ == -1
        THEN 1@ = 0xFFFFFFFF
        END
        0AA6: call 29@ struct 30@ num_params 5 pop 0 params 0 1@ 0 0@ 8
    END
END
0AB2: 0
 
  • Нравится
Реакции: Lobber

Davidasme

Новичок
5
0
i see pro here :) hey guys can anyone please help me i need script command console as samp has you typing and enter i try everything no luck its for single player gta sa not samp i hope i am at right place thanks in advance
 
D

deleted-user-222200

Гость

Davidasme

Новичок
5
0
yea this type command prompt but sampfuncs i dont think it will work and idk how to make use of it i mean how to get output command

can you help me ? dont need all stuff just command that i ytpe should out as string done :)
 
Последнее редактирование:

D3.Pheonix

🎹
Модератор
2,867
1,640
yea this type command prompt but sampfuncs i dont think it will work and idk how to make use of it i mean how to get output command

can you help me ? dont need all stuff just command that i ytpe should out as string done :)
Proposed the idea to the developers of Cleo. Cleo 5 is currently being developed, maybe this functionality will be added

If you accidentally created a topic in the Cleo thread, then it’s probably better for you to order such functionality.
I don't think it's that easy to do.
 

0x73616D

Активный
140
42
  • Нравится
Реакции: MrGrendi

srk

Новичок
2
0
я изменил тут цвет, и сохранил в игру не заходит
 

Вложения

  • Check List by Bili Djin.cs
    37.9 KB · Просмотры: 3
  • Bug
Реакции: D3.Pheonix

IliaUAAA

Новичок
1
1
Приветствую,делаю мод CLEO для Гта Са, начал учить с нуля клео и луа,работаю в Sanny Builder 4 ,при компиляции скрипта и закида в папку КЛЕО в игре ничего н происходит при например
TEXT:
0735:   is_keyboard_key_pressed 49
И дальше идет опкод с текстхайд, также и jf есть,но вот при заходе в игру в настройках игры снизу в углу пишет CLEO 4.3..... 1 Скрипт загружен,то есть тот самый,но вот при нажатии кнопки 1 ничего не происходит,я к чему - может ли это быть из-за Билдера или версии cleo? Кроме как из сайта gtavicecity ни один клео не работает,все крашат игру.
 
  • Нравится
Реакции: FANAT.FANATA