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

Митя Евгеньевич

Известный
293
120
1. someone edit the range of streams to kill in this cleo or decrypt it
2. why my game keep crashing when i load this cleo
CLEO IS NOT ENCRYPTED (????)
1. To increase the range of fire you need to edit this float value
1708245966597.png

2. Try to install "SannyBuilder Data" from SAMPFUNCS theme to the %SannyBuilder directory%/data/sa and recompile script
 

Ninklosd

Новичок
10
0
why i can't click spawn when active cheat, version 0.3dl


CLEO:
[/B]
{$CLEO .cs}

0000:

Wait 0

{ RPC 67 - setplayerarmweapons }
0AB1: @READ_SAMP_MEMORY 2 offset 0x18950 size 2 _Retruned: Value 0@

{ RPC 124 - toggleplayerspecting }
0AB1: @READ_SAMP_MEMORY 2 offset 0x1BE80 size 2 _Retruned: Value 1@

{ RPC 53 - Death }
0AB1: @READ_SAMP_MEMORY 2 offset 0x5660 size 2 _Retruned: Value 2@

{ RPC 113 - setplayerattachedobject }
0AB1: @READ_SAMP_MEMORY 2 offset 0x18A00 size 2 _Retruned: Value 3@

{ RPC 52 - SPAWN }
0AB1: @READ_SAMP_MEMORY 2 offset 0x3B20 size 2 _Retruned: Value 4@

{ RPC 52 - request SPAWN }
0AB1: @READ_SAMP_MEMORY 2 offset 0x3F40 size 2 _Retruned: Value 5@

{ RPC 52 - request class }
0AB1: @READ_SAMP_MEMORY 2 offset 0x5720 size 2 _Retruned: Value 6@


while true
wait 0
    if 
        0AB0: 113
    then
        wait 100   
        0470: 2@ = actor $PLAYER_ACTOR current_weapon 
        0114: set_actor $PLAYER_ACTOR weapon 2@ add_ammo 100
    end
    
    If 
        0AB0: 90 // Z key pressed
    then
        { RPC 67 - setplayerarmweapons }
        0AB1: @WRITE_SAMP_MEMORY 3 offset 0x18950 value 0xC390 size 2
        
        { RPC 124 - toggleplayerspecting }
        0AB1: @WRITE_SAMP_MEMORY 3 offset 0x1BE80 value 0xC390 size 2*/
        
        { RPC 53 - Death }
        0AB1: @WRITE_SAMP_MEMORY 3 offset 0x5660 value 0xC390 size 2
        
        { RPC 113 - setplayerattachedobject }
        0AB1: @WRITE_SAMP_MEMORY 3 offset 0x18A00 value 0xC390 size 2

        { RPC 52 - requestSPAWN }
        0AB1: @WRITE_SAMP_MEMORY 3 offset 0x3F40 value 0xC390 size 1
            
        
        { RPC 52 - SPAWN }
        0AB1: @WRITE_SAMP_MEMORY 3 offset 0x3B20 value 0xC390 size 1  
        
      end 
    
    

end

         
                                                                                                        
:WRITE_SAMP_MEMORY
{
0AB1: @WRITE_SAMP_MEMORY 3 offset 0x6310 value 0xC390 size 2
}
IF 0AA2: 10@ = "samp.dll"
THEN  
    0A8E: 11@ = 10@ + 0@ // SAMP_DIALOG_INFO_OFFSET
    0A8C: write_memory 11@ size 2@ value 1@ virtual_protect 1
END
0AB2: 0

:READ_SAMP_MEMORY
{
0AB1: @READ_SAMP_MEMORY 2 offset 0x615FB size 2 _Retruned: Value 0@
}
IF 0AA2: 10@ = "samp.dll"
THEN   
    0A8E: 11@ = 10@ + 0@ // SAMP_DIALOG_INFO_OFFSET
    0A8D: 12@ = read_memory 11@ size 1@ virtual_protect 1
END
0AB2: 1 12@
[B]
Someone please help me, i very need it, it so important with me.
 

why ega

РП игрок
Модератор
2,540
2,224
Есть вот такой скрипт:
CLEO:
{$CLEO .cs}

get_label_pointer 0@ = label @Noname_1187
write_memory 6995123 size 1 value 184 virtual_protect 1
write_memory 6995124 size 4 value 0@ virtual_protect 1
write_memory 6995128 size 2 value 57599 virtual_protect 1
0@ += 1
get_var_pointer 1@ = var 0@
write_memory 0@ size 4 value 1@ virtual_protect 0
get_var_pointer 1@ = var 2@
get_label_pointer 0@ = label @Noname_1198
0@ += 1
write_memory 0@ size 4 value 1@ virtual_protect 0
get_label_pointer 0@ = label @Noname_1370
0@ += 1
write_memory 0@ size 4 value 1@ virtual_protect 0
get_label_pointer 0@ = label @Noname_1221
get_var_pointer 1@ = var 6@
0@ += 1
write_memory 0@ size 4 value 1@ virtual_protect 0
get_var_pointer 1@ = var 5@
0@ += 6
write_memory 0@ size 4 value 1@ virtual_protect 0
get_var_pointer 1@ = var 4@
0@ += 6
write_memory 0@ size 4 value 1@ virtual_protect 0
get_label_pointer 0@ = label @Noname_1244
get_var_pointer 1@ = var 8@
0@ += 7
write_memory 0@ size 4 value 1@ virtual_protect 0
get_var_pointer 1@ = var 7@
0@ += 7
write_memory 0@ size 4 value 1@ virtual_protect 0
get_label_pointer 0@ = label @Noname_1276
get_var_pointer 1@ = var 8@
0@ += 7
write_memory 0@ size 4 value 1@ virtual_protect 0
get_var_pointer 1@ = var 7@
0@ += 7
write_memory 0@ size 4 value 1@ virtual_protect 0
get_label_pointer 0@ = label @Noname_1299
get_var_pointer 1@ = var 9@
0@ += 7
write_memory 0@ size 4 value 1@ virtual_protect 0
get_var_pointer 1@ = var 7@
0@ += 7
write_memory 0@ size 4 value 1@ virtual_protect 0
get_label_pointer 0@ = label @Noname_1322
get_var_pointer 1@ = var 9@
0@ += 7
write_memory 0@ size 4 value 1@ virtual_protect 0
get_var_pointer 1@ = var 7@
0@ += 7
write_memory 0@ size 4 value 1@ virtual_protect 0
get_label_pointer 0@ = label @Noname_1267
0@ += 1
get_var_pointer 1@ = var 0@
write_memory 0@ size 4 value 1@ virtual_protect 0
3@ = -1

:Noname_538
wait 0
if
  not Player.Defined($PLAYER_CHAR)
goto_if_false @Noname_565
goto @Noname_1111

:Noname_565
if and
  Actor.Driving($PLAYER_ACTOR)
  not is_char_on_any_bike $PLAYER_ACTOR
  not is_char_in_any_boat $PLAYER_ACTOR
  not is_char_in_flying_vehicle $PLAYER_ACTOR
  not is_char_in_any_train $PLAYER_ACTOR
goto_if_false @Noname_1053
10@ = Actor.CurrentCar($PLAYER_ACTOR)
if
  not is_int_lvar_equal_to_int_lvar 10@ == 3@
goto_if_false @Noname_650
set_lvar_int_to_lvar_int 3@ = 10@
0@ = 0
goto @Noname_1053

:Noname_650
if
  test_cheat "NEONRED"
goto_if_false @Noname_701
4@ = 128
5@ = 0
6@ = 0
gosub @Noname_1118

:Noname_701
if
  test_cheat "NEONBLUE"
goto_if_false @Noname_753
4@ = 0
5@ = 0
6@ = 128
gosub @Noname_1118

:Noname_753
if
  test_cheat "NEONGREEN"
goto_if_false @Noname_806
4@ = 0
5@ = 128
6@ = 0
gosub @Noname_1118

:Noname_806
if
  test_cheat "NEONWHITE"
goto_if_false @Noname_861
4@ = 128
5@ = 128
6@ = 128
gosub @Noname_1118

:Noname_861
if
  test_cheat "NEONYELLOW"
goto_if_false @Noname_916
4@ = 128
5@ = 128
6@ = 0
gosub @Noname_1118

:Noname_916
if
  test_cheat "NEONCYAN"
goto_if_false @Noname_969
4@ = 0
5@ = 128
6@ = 128
gosub @Noname_1118

:Noname_969
if
  test_cheat "NEONPURPLE"
goto_if_false @Noname_1024
4@ = 128
5@ = 0
6@ = 128
gosub @Noname_1118

:Noname_1024
if
  test_cheat "NEONOFF"
goto_if_false @Noname_1053
0@ = 0

:Noname_1053
if
  does_vehicle_exist 3@
goto_if_false @Noname_1104
if or
  Car.Wrecked(3@)
  is_car_upsidedown 3@
goto_if_false @Noname_1097
0@ = 0

:Noname_1097
goto @Noname_1111

:Noname_1104
0@ = 0

:Noname_1111
goto @Noname_538

:Noname_1118
set_lvar_int_to_lvar_int 3@ = 10@
31@ = Car.Model(3@)
get_model_dimensions 31@ dimensions_cornerA_to 31@ 30@ 29@ dimensions_cornerB_to 8@ 9@ 28@
8@ += 0.3
9@ += 0.3
get_vehicle_pointer 0@ = vehicle 3@
return

:Noname_1187
hex
 A1 00 00 00 00 3B F0 75 47 89 F0
end

:Noname_1198
hex
 A3 00 00 00 00 0F 94 C0 50 6A 00 68 00 00 80 3F
 6A 00 68 00 00 00 40
end

:Noname_1221
hex
 A1 00 00 00 00 50 A1 00 00 00 00 50 A1 00 00 00
 00 50 68 FF 00 00 00
end

:Noname_1244
hex
 8B 46 14 D9 40 04 B8 00 00 00 00 D8 08 B8 00 00
 00 00 D9 18 8B 00 50
end

:Noname_1267
hex
 A1 00 00 00 00 3B F0 75 65
end

:Noname_1276
hex
 8B 46 14 D9 40 00 B8 00 00 00 00 D8 08 B8 00 00
 00 00 D9 18 8B 00 50
end

:Noname_1299
hex
 8B 46 14 D9 40 14 B8 00 00 00 00 D8 08 B8 00 00
 00 00 D9 18 8B 00 50
end

:Noname_1322
hex
 8B 46 14 D9 40 10 B8 00 00 00 00 D8 08 B8 00 00
 00 00 D9 18 8B 00 50 8B 46 14 83 C0 30 50 A1 F4
 03 C4 00 50 6A 02 B8 90 73 70 00 FF D0 83 C4 40
end

:Noname_1370
hex
 A1 00 00 00 00 89 C6 8B 46 14 89 F1 50 B8 60 1A
 6E 00 FF D0 B8 BE BC 6A 00 FF E0
end
Большую часть кода интуитивно разобрал, а вот то, что за вакханалия в 3-59 строчке до конца не могу осознать. Кому не трудно, раскидайте молодому за клео, либо кинуть какой-то псевдокод на любом из более понятных языков (C++, Lua)

1710624984743.png
 

san0

Известный
Друг
411
267
Кому не трудно, раскидайте молодому за клео, либо кинуть какой-то псевдокод на любом из более понятных языков (C++, Lua)
Это не столько клео, сколько ассемблерная вставка.
Причем сам листинг скорее всего автогенерируемый, потому что странная логика в нескольких моментах, да и в целом можно
было уже все написать на ассемблере чтоб не перекидывать значения между 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, и безусловно это прототип и нужно нормальный код с константами, векторами, и отсутствием магических чисел
 

Lobber

Известный
178
57
Приветствую всех. Имеется код, который в теории должен выдавать из структуры чата текст, но на выходе я получаю просто оффсет, который без понятия как читать...
Код:
{$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@

Ранее, когда я читал текст из ракнета, использовал опкод 0BE8

Код:
0BE7: raknet 20@ = bit_stream_read 15@ type BS_TYPE_INT //Размер строки
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@ //Строка

Для чтения текста из структуры не нашел метода, есть у кого-то мысли?
 

why ega

РП игрок
Модератор
2,540
2,224
Это не столько клео, сколько ассемблерная вставка.
Причем сам листинг скорее всего автогенерируемый, потому что странная логика в нескольких моментах, да и в целом можно
было уже все написать на ассемблере чтоб не перекидывать значения между 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,456
908
Еще раз спасибо за помощь. Попробовал вот такой код. Сама функция отрабатывает без ошибок (по крайней мере, когда вектор пустой 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 функцию чуть выше и чуть ниже, чтобы я понимал, где и как ты хочешь поставить хук.
 
  • Нравится
Реакции: why ega

why ega

РП игрок
Модератор
2,540
2,224
У меня возникло аж несколько вопросов.
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

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

Известный
19
8
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