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

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
Это не столько клео, сколько ассемблерная вставка.
Причем сам листинг скорее всего автогенерируемый, потому что странная логика в нескольких моментах, да и в целом можно
было уже все написать на ассемблере чтоб не перекидывать значения между 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,556
1,027
Еще раз спасибо за помощь. Попробовал вот такой код. Сама функция отрабатывает без ошибок (по крайней мере, когда вектор пустой 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,798
2,659
У меня возникло аж несколько вопросов.
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

Новичок
11
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

Новичок
11
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,868
1,647
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

Legacy_342

Новичок
10
0
Задаем вопросы как можно точнее, не стесняемся.

Немножко правил:
  1. Код за вас никто писать не будет. Если вам нужен работающий скрипт, изменить активацию и т.п. и т.д., то вам сюда: Помощь (http://blasthack.net/forums/110/);
  2. Без оскорблений;
  3. Используйте поиск, не повторяйте одни и те же вопросы;
  4. Спорим в личку, не засирайте тему, в ней и так уже 100+ страниц;
  5. Если у вас есть какой-то код по вашему вопросу(что-либо неправильно работает в нём), то лучше выложите его сразу и опишите проблему, чем мы будем играть в гадалки. И краш лог можете не прикладывать, он мало что даст;
Если вы прикладываете код, то прикрепляйте его так:

[code=cleo]
<ваш код>
[/code]


Частые вопросы:

Поищите здесь: opcodes - list | BlastHack — DEV_WIKI (https://www.blast.hk/wiki/opcodes:list) или https://gtagmodding.com/opcode-database/
Не нашли подходящей инфы - пишите сюда. Не смогли перевести с английского - подучите английский.
  1. Сначала выясните, что SAMPFUNCS работает(если вы используете его в коде, конечно же). Это можно проверить путем поиска SAMPFUNCS(.log) в папке SAMPFUNCS в папке игры(надеюсь Вы не запутались с папками :yes:). Если же SAMPFUNCS установлен и краш происходит именно из-за Вашего кода(хе-хе), то проверьте, что код соответствует конструкциям(на метках показывать не буду):
    CLEO:
    {$CLEO}
    
    0000: NOP
    
    repeat
        wait 400
    until 0AFA:  is_samp_available
    /* Или:
    while not SAMP.Available()
        wait 400
    end*/
    
    0BDE: pause_thread 0
    /* Или:
    while true
        wait 0
    end
    */
  2. Попробуйте узнать, где происходит неправильная работа, комментируя строчки, которые, по вашему мнению, могут вызывать краш. Это будет Вам в плюс, нежели Вы будете каждый раз писать сюда о своем методе краша собственного скрипта. Вы также можете выводить свою некоторую информацию в консоль SAMPFUNCS, чтобы узнать где происходит прерывание.
  3. Если же Вы не смогли узнать, где происходит падение, либо узнали где, но не понимаете, почему так, пишите вопрос, но приложив код. Как говорится: нет кода - иди к гадалке
С такими заявлениями, пожалуйста, обратитесь в раздел Помощь (https://www.blast.hk/forums/110/)
Похвастаться мы можем только нашей вики: tutorials - list | BlastHack — DEV_WIKI (https://www.blast.hk/wiki/tutorials:list). Там скудный набор, который мы можем дополнить по Вашим желаниям.
Также можно посмотреть ещё раздел CLEO: CLEO (https://www.blast.hk/forums/12/)

Перед тем, как задать вопросы, ознакомьтесь с предоставленной информацией и гайдами, если ответы на список вопросов выше Вам не помогли:
подчеркнутый текст является ссылкой и кликабелен
Ссылка на список гайдов
Ссылка на список различной информации

Этот подраздел будет дополняться, я надеюсь на это.
Пожалуйста, не дублируйте посты(п. 3). Если Вы нашли их [дублированные посты/одни и те же вопросы/похожие вопросы], напишите @legend2360 в ЛС и я добавлю их сюда. Вам(мне) же станет легче.

За несоблюдение этих условий таймаут в данной теме от 12 часов до 1 недели.ако

Задаем вопросы как можно точнее, не стесняемся.

Немножко правил:
  1. Код за вас никто писать не будет. Если вам нужен работающий скрипт, изменить активацию и т.п. и т.д., то вам сюда: Помощь (http://blasthack.net/forums/110/);
  2. Без оскорблений;
  3. Используйте поиск, не повторяйте одни и те же вопросы;
  4. Спорим в личку, не засирайте тему, в ней и так уже 100+ страниц;
  5. Если у вас есть какой-то код по вашему вопросу(что-либо неправильно работает в нём), то лучше выложите его сразу и опишите проблему, чем мы будем играть в гадалки. И краш лог можете не прикладывать, он мало что даст;
Если вы прикладываете код, то прикрепляйте его так:

[code=cleo]
<ваш код>
[/code]


Частые вопросы:

Поищите здесь: opcodes - list | BlastHack — DEV_WIKI (https://www.blast.hk/wiki/opcodes:list) или https://gtagmodding.com/opcode-database/
Не нашли подходящей инфы - пишите сюда. Не смогли перевести с английского - подучите английский.
  1. Сначала выясните, что SAMPFUNCS работает(если вы используете его в коде, конечно же). Это можно проверить путем поиска SAMPFUNCS(.log) в папке SAMPFUNCS в папке игры(надеюсь Вы не запутались с папками :yes:). Если же SAMPFUNCS установлен и краш происходит именно из-за Вашего кода(хе-хе), то проверьте, что код соответствует конструкциям(на метках показывать не буду):
    CLEO:
    {$CLEO}
    
    0000: NOP
    
    repeat
        wait 400
    until 0AFA:  is_samp_available
    /* Или:
    while not SAMP.Available()
        wait 400
    end*/
    
    0BDE: pause_thread 0
    /* Или:
    while true
        wait 0
    end
    */
  2. Попробуйте узнать, где происходит неправильная работа, комментируя строчки, которые, по вашему мнению, могут вызывать краш. Это будет Вам в плюс, нежели Вы будете каждый раз писать сюда о своем методе краша собственного скрипта. Вы также можете выводить свою некоторую информацию в консоль SAMPFUNCS, чтобы узнать где происходит прерывание.
  3. Если же Вы не смогли узнать, где происходит падение, либо узнали где, но не понимаете, почему так, пишите вопрос, но приложив код. Как говорится: нет кода - иди к гадалке
С такими заявлениями, пожалуйста, обратитесь в раздел Помощь (https://www.blast.hk/forums/110/)
Похвастаться мы можем только нашей вики: tutorials - list | BlastHack — DEV_WIKI (https://www.blast.hk/wiki/tutorials:list). Там скудный набор, который мы можем дополнить по Вашим желаниям.
Также можно посмотреть ещё раздел CLEO: CLEO (https://www.blast.hk/forums/12/)

Перед тем, как задать вопросы, ознакомьтесь с предоставленной информацией и гайдами, если ответы на список вопросов выше Вам не помогли:
подчеркнутый текст является ссылкой и кликабелен
Ссылка на список гайдов
Ссылка на список различной информации

Этот подраздел будет дополняться, я надеюсь на это.
Пожалуйста, не дублируйте посты(п. 3). Если Вы нашли их [дублированные посты/одни и те же вопросы/похожие вопросы], напишите @legend2360 в ЛС и я добавлю их сюда. Вам(мне) же станет легче.

За несоблюдение этих условий таймаут в данной теме от 12 часов до 1 недели.
всех приветствую, мне срочно нужно найти опкод, типа 'достигнул какой либо точки/координат'. Такие есть? Если да, то какой опкод?
 

Hedgehog Man

Участник
8
4
всех приветствую, мне срочно нужно найти опкод, типа 'достигнул какой либо точки/координат'. Такие есть? Если да, то какой опкод?
CLEO:
{$CLEO .cs}

0000: NOP

:Label2 // Делаем проверку на запуск сампа (её можно убрать)
0001: wait 0 ms
0AFA:  is_samp_available
004D: jump_if_false @Label2
0005: 0@ = 0.0  // Объявляем переменную X (float) с нужными позициями
0005: 1@ = 0.0  // Объявляем переменную Y (float)
0005: 2@ = 0.0  // Объявляем переменную Z (float)

:Label45 // Создаем цикл
0001: wait 0 ms
00D6: if
0B61:  samp is_local_player_spawned // Создаем проверку на то, что игрок на ногах заспавнился (либо проверку на любое другое состояние)
004D: jump_if_false @Label45
04C4: store_coords_to 3@ 4@ 5@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 0.0 // записываем координаты в 3@(x) 4@(y) 5@(z) переменные
00D6: if and
0045:   3@ == 0@ // (float) проверяем текущую позицию с нужной
0045:   4@ == 1@ // (float)
0045:   5@ == 2@ // (float)
004D: jump_if_false @Label45
0AF8: samp add_message_to_chat "Условие выполнено" color -1 // Выполнение кода в случае успеха после проверки
0002: jump @Label45

1731757634273.png
 
Последнее редактирование:
  • Нравится
Реакции: Legacy_342