Types of Sign Check and Sources , etc...

mdang291

New member
Joined
Jun 1, 2021
Messages
1
Reaction score
0
Location
Hanoi, Vietnam
Can you make a /sighcheck in Lawless Roleplay ? It apears 9 pictures and shoud click the right picture and click verify button ? Thank you so much . And have a nice day !!!!!!!!!!
 

Visitor

New member
Joined
Apr 28, 2018
Messages
2
Reaction score
0
Sign Check - Dialog

Source samp 0.3.7 R*- 0.3.DL:
PHP:
{$CLEO .cs}

0000:

wait 8500

0AC8: 4@ = allocate_memory_size 260
0AD3: 4@ = format "Sign check"

WHILE TRUE
WAIT 0

IF
0256:   player $PLAYER_CHAR defined
THEN
    0AB1: @get_samp_version_id 0 _Returned: ID 1@
    IF
    0AB1: @isDialogOpen 1 SampVersionID 1@
    THEN
        IF
        0AB1: @GetDialogCaption 1 SampVersionID 1@ _Return: caption 2@
        THEN
            0AC8: 3@ = allocate_memory_size 260
            0AB1: @DeleteColorCodeFromText 4 text 2@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 3@
            IF
            0AB1: @IfTextContains 2 String1 3@ String2 4@ _returned: Text 5@
            THEN
                IF
                0AB1: @GetDialogText 1 SampVersionID 1@ _Returned: text 6@
                THEN
                    0AC8: 7@ = allocate_memory_size 260
                    0AB1: @DeleteColorCodeFromText 4 text 6@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 7@
                    0AC8: 8@ = allocate_memory_size 260
                    0AB1: @get_digits_to_print param_count 2 text 7@ memory_to_store_digits_as_text 8@
                    0AB1: @SetDialogInputEditBoxText 2 SampVersionID 1@ text 8@
                    0209: 9@ = random_int_in_ranges 1000 2000 // generate random time - protect from admin detection
                    wait 9@ // normal people can't react instant , so that why we need add timer
                    0AB1: @CloseCurrentDialogWithButton 2 SampVersionID 1@ Button 1 // 1 = Left , 0 = Right
                END
            END
        END
    END
END

END

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:isDialogOpen
// 0AB1: @isDialogOpen 1 SampVersionID 0@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN     
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN     
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN     
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN     
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN     
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 2@ = readMem 2@ sz 4 vp 0
0A8E: 2@ = 2@ + 0x28
0A8D: 2@ = readMem 2@ sz 4 vp 0
IF 2@ == 1
THEN
    0485: dialog_open
ELSE
    059A: dialog_closed
END
0AB2: ret 0

:GetDialogCaption
// 0AB1: @GetDialogCaption 1 SampVersionID 0@ _Returned: caption 1@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN     
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN     
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN     
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN     
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN     
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 4@ = readMem 2@ sz 4 vp 0
0A8E: 5@ = 4@ + 0x28 //DialogOpenOffset
0A8D: 5@ = readMem 5@ sz 4 vp 0
IF 5@ == 1 // Dialog open
THEN
    0A8E: 3@ = 4@ + 0x40 //DialogCaptionOffset
    0485: dialog_open
    0AB2: ret 1 3@
ELSE
    059A:  dialog closed
END
0AB2: ret 0

:GetDialogText
// 0AB1: @GetDialogText 1 SampVersionID 0@ _Returned: text 1@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN     
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN     
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN     
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN     
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN     
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 4@ = readMem 2@ sz 4 vp 0
0A8E: 5@ = 4@ + 0x28 //DialogOpenOffset
0A8D: 5@ = readMem 5@ sz 4 vp 0
if 5@ == 1 // Dialog active
then
    0A8E: 6@ = 4@ + 0x2C //DialogTypeOffset
    0A8D: 6@ = readMem 6@ sz 4 vp 0
    if or
    6@ == 0 // DIALOG_STYLE_MSGBOX
    6@ == 1 // DIALOG_STYLE_INPUT
    6@ == 3 // DIALOG_STYLE_PASSWORD
    then
        0A8E: 7@ = 4@ + 0x34 // DialogTextOffset
        0A8D: 7@ = readMem 7@ sz 4 vp 0
        0485: dialog_open
        0AB2: ret 1 7@
    else 059A:  dialog closed
    end
end
0AB2: ret 0


:get_digits_to_print
{
    0@ = text
    1@ = pointer to memory where digits will be stored as text
}
0AB1: @strlen 1 string 0@ _return: 31@
    for 30@ = 0 to 31@
        0085: 29@ = 0@ // copy pointer
        005A: 29@ += 30@  // add offset (as the loop progresses it becomes pointers to first-last character)
        0A8D: 28@ = read_memory 29@ size 1 virtual_protect 1 // 28@ is the ascii number representing character
        if and
        28@ >= 0x30 // '0'
        28@ <= 0x39 // '9'
        then
        0A8C: write_memory 1@ size 1 value 28@ virtual_protect 1
        1@ += 1 // move to next address
        end
    end
0A8C: write_memory 1@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:SetDialogInputEditBoxText
// 0AB1: @SetDialogInputEditBoxText 2 SampVersionID 0@ text 1@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 3@ = 2@ + 0x21A0B8            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x80F60 // CDXUTEditBox::SetText
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
         0A8E: 3@ = 2@ + 0x21A0C0            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x81000 // CDXUTEditBox::SetText
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x2AC9E0            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x85000 // CDXUTEditBox::SetText
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 3@ = 2@ + 0x26E898            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x84E70 // CDXUTEditBox::SetText
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 3@ = 2@ + 0x26E9C8            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x855B0 // CDXUTEditBox::SetText
    END
    // CDXUTEditBox::SetText takes 2 params
    // 1 - pointer to zero terminated string
    // 2 - bool, if text is to be selected or not

    0AA8: call_function_method 5@ struct 4@ num_params 2 pop 0 _bSelected 0 _pszText 1@ _retVal 6@
END
0AB2: 0

:CloseCurrentDialogWithButton
// 0AB1: @CloseCurrentDialogWithButton 2 SampVersionID 0@ Button 1 // 1 = Left , 0 = Right
IF 0AA2: 10@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 11@ = 10@ + 0x21A0B8 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6C040 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
        0A8E: 11@ = 10@ + 0x21A0C0 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6C0F0 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 3 // 0.3.DL
    THEN
        0A8E: 11@ = 10@ + 0x2AC9E0 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x700D0 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 11@ = 10@ + 0x26E898 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6FF40 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 11@ = 10@ + 0x26E9C8 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x70660 //SAMP_DIALOG_CLOSE
    END

    0AA8: call_function_method 11@ struct 12@ num_params 1 pop 0 Button 1@ _retVal 6@
END
0AB2: 0

:IfTextContains
//0AB1: @IfTextContains 2 String1 0@ String2 1@
0AB1: @strlen 1 string 0@ _length 31@
0AB1: @strlen 1 string 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text
}
5@ = FALSE // inbracket
0AB1: @strlen 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:strlen
// 0AB1: @strlen 1 string 1@ _return: size 3@
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@


Sign Check - Chat

Source samp 0.3.7 R*- 0.3.DL:
PHP:
{$CLEO .cs}

0000: NOP

wait 8500

0AC8: 3@ = allocate_memory_size 260
0AD3: 3@ = "Type /signcheck"   // Check / find text

0AC8: 5@ = allocate_memory_size 260
0AD3: 5@ "/signcheck"   // CMD

while true
wait 0

if
0256:   player $PLAYER_CHAR defined
then
    0AB1: @get_samp_version_id 0 _Returned: ID 0@
    for 30@ = 95 to 99
        0AC8: 1@ = allocate_memory_size 260
        0AB1: @getChatEntryText 2 SampVersionID 0@ ChatLineID 30@  _Returned: text 1@
        0AC8: 2@ = allocate_memory_size 260
        0AB1: @DeleteColorCodeFromText 4 text 1@ FirstCharacter 123 SecondCharacter 125 memory_to_store_characters_as_text 2@
        if  
        0AB1: @IfTextContains 2 String1 2@ String2 3@ _returned: text 4@
        then
            0AB1: @SEND_CMD 2 SampVersionID 0@ text 5@
            wait 10000 // anti spam
        end
    end
end

end

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:GetChatEntryText
{
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatEntryText 2 SampVersionID 0@ ChatLineID 99  _Returned: text 1@
}
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN     
        0A8E: 3@ = 2@ + 0x21A0E4
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN     
        0A8E: 3@ = 2@ + 0x21A0EC
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x2ACA10
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN      
        0A8E: 3@ = 2@ + 0x26E8C8
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN     
        0A8E: 3@ = 2@ + 0x26E9F8
    END
    0A8D: 2@ readMem 3@ sz 4 vp 0
    2@ += 0x132
    1@ *= 0xFC
    005A: 2@ += 1@
    2@ += 0x20
    0AA3: 2@
END
0AB2: ret 1 2@

:IfTextContains
{
    0@ - the main text
    1@ - piece of text to be found within the main text
}
0AB1: @strlen 1 strPtr 0@ _length 31@
0AB1: @strlen 1 strPtr 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text

}
5@ = FALSE // inbracket
0AB1: @strlen 1 string 0@ _return: 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:strlen
{
    Example: 0AB1: @strlen 1 string 1@ _return: 3@
    In: 0@ - text;
    Out: 1@ - size;
}
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@

:SEND_CMD
// 0AB1: @SEND_CMD 2 SampVersionID 0@ text 3@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN     
        0A8E: 3@ = 2@ + 0x65C60
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN     
        0A8E: 3@ = 2@ + 0x65D30
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x69340
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN      
        0A8E: 3@ = 2@ + 0x69190
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN     
        0A8E: 3@ = 2@ + 0x698C0
    END
    0AA5: call 3@ num_param 1 pop 0 1@
END
0AB2: 0


Sign Check - Chat 2

Source samp 0.3.7 R*- 0.3.DL:
PHP:
{$CLEO .cs}

0000: NOP

wait 8500

while true
wait 0

if
0256:   player $PLAYER_CHAR defined
then
    0AB1: @get_samp_version_id 0 _Returned: ID 0@
    for 30@ = 95 to 99
        0AC8: 1@ = allocate_memory_size 260
        0AB1: @getChatEntryText 2 SampVersionID 0@ ChatLineID 30@  _Returned: text 1@
        0AC8: 2@ = allocate_memory_size 260
        0AB1: @DeleteColorCodeFromText 4 text 1@ FirstCharacter 123 SecondCharacter 125 memory_to_store_characters_as_text 2@
        0AC8: 3@ = allocate_memory_size 260
        0AD3: 3@ = "/signcheck"   // Check / find text
        if  
        0AB1: @IfTextContains 2 String1 2@ String2 3@ _returned: text 4@
        then
            0AC8: 6@ = allocate_memory_size 260
            0AB1: @get_digits_to_print param_count 2 text 2@ memory_to_store_digits_as_text 6@
            0AC8: 5@ = allocate_memory_size 260
            0AD3: 5@ "/signcheck %s" 6@   // CMD
            0AB1: @SEND_CMD 2 SampVersionID 0@ text 5@
            wait 10000 // anti spam
        end
    end
end

end

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:GetChatEntryText
{
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatEntryText 2 SampVersionID 0@ ChatLineID 99  _Returned: text 1@
}
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN     
        0A8E: 3@ = 2@ + 0x21A0E4
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN     
        0A8E: 3@ = 2@ + 0x21A0EC
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x2ACA10
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN      
        0A8E: 3@ = 2@ + 0x26E8C8
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN     
        0A8E: 3@ = 2@ + 0x26E9F8
    END
    0A8D: 2@ readMem 3@ sz 4 vp 0
    2@ += 0x132
    1@ *= 0xFC
    005A: 2@ += 1@
    2@ += 0x20
    0AA3: 2@
END
0AB2: ret 1 2@

:IfTextContains
{
    0@ - the main text
    1@ - piece of text to be found within the main text
}
0AB1: @strlen 1 strPtr 0@ _length 31@
0AB1: @strlen 1 strPtr 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text

}
5@ = FALSE // inbracket
0AB1: @strlen 1 string 0@ _return: 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:get_digits_to_print
{
    0@ = text
    1@ = pointer to memory where digits will be stored as text
}
0AB1: @strlen 1 string 0@ _return: 31@
    for 30@ = 0 to 31@
        0085: 29@ = 0@ // copy pointer
        005A: 29@ += 30@  // add offset (as the loop progresses it becomes pointers to first-last character)
        0A8D: 28@ = read_memory 29@ size 1 virtual_protect 1 // 28@ is the ascii number representing character
        if and
        28@ >= 0x30 // '0'
        28@ <= 0x39 // '9'
        then
        0A8C: write_memory 1@ size 1 value 28@ virtual_protect 1
        1@ += 1 // move to next address
        end
    end
0A8C: write_memory 1@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:strlen
{
    Example: 0AB1: @strlen 1 string 1@ _return: 3@
    In: 0@ - text;
    Out: 1@ - size;
}
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@

:SEND_CMD
// 0AB1: @SEND_CMD 2 SampVersionID 0@ text 3@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN     
        0A8E: 3@ = 2@ + 0x65C60
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN     
        0A8E: 3@ = 2@ + 0x65D30
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x69340
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN      
        0A8E: 3@ = 2@ + 0x69190
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN     
        0A8E: 3@ = 2@ + 0x698C0
    END
    0AA5: call 3@ num_param 1 pop 0 1@
END
0AB2: 0


Etc...

PHP:
{$CLEO .cs}

0000:

wait 8500

0AC8: 4@ = allocate_memory_size 260
0AD3: 4@ = format "Drug Production"

WHILE TRUE
WAIT 0

IF
0256:   player $PLAYER_CHAR defined
THEN
    0AB1: @get_samp_version_id 0 _Returned: ID 1@
    IF
    0AB1: @isDialogOpen 1 SampVersionID 1@
    THEN
        IF
        0AB1: @GetDialogCaption 1 SampVersionID 1@ _Return: caption 2@
        THEN
            0AC8: 3@ = allocate_memory_size 260
            0AB1: @DeleteColorCodeFromText 4 text 2@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 3@
            IF
            0AB1: @IfTextContains 2 String1 3@ String2 4@ _returned: Text 5@
            THEN
                IF
                0AB1: @GetDialogText 1 SampVersionID 1@ _Returned: text 6@
                THEN
                    0AC8: 7@ = allocate_memory_size 260
                    0AB1: @DeleteColorCodeFromText 4 text 6@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 7@
                    0AB1: @GetLastCharacters 2 String 7@ Characters 11 rnt 8@
                    0AB1: @SetDialogInputEditBoxText 2 SampVersionID 1@ text 8@
                    0209: 9@ = random_int_in_ranges 1000 2000 // generate random time - protect from admin detection
                    wait 9@ // normal people can't react instant , so that why we need add timer
                    0AB1: @CloseCurrentDialogWithButton 2 SampVersionID 1@ Button 1 // 1 = Left , 0 = Right
                END
            END
        END
    END
END

END

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:isDialogOpen
// 0AB1: @isDialogOpen 1 SampVersionID 0@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN       
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN       
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN       
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN       
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN       
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 2@ = readMem 2@ sz 4 vp 0
0A8E: 2@ = 2@ + 0x28
0A8D: 2@ = readMem 2@ sz 4 vp 0
IF 2@ == 1
THEN
    0485: dialog_open
ELSE
    059A: dialog_closed
END
0AB2: ret 0

:GetDialogCaption
// 0AB1: @GetDialogCaption 1 SampVersionID 0@ _Returned: caption 1@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN       
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN       
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN       
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN       
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN       
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 4@ = readMem 2@ sz 4 vp 0
0A8E: 5@ = 4@ + 0x28 //DialogOpenOffset
0A8D: 5@ = readMem 5@ sz 4 vp 0
IF 5@ == 1 // Dialog open
THEN
    0A8E: 3@ = 4@ + 0x40 //DialogCaptionOffset
    0485: dialog_open
    0AB2: ret 1 3@
ELSE
    059A:  dialog closed
END
0AB2: ret 0

:GetDialogText
// 0AB1: @GetDialogText 1 SampVersionID 0@ _Returned: text 1@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN       
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN       
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN       
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN       
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN       
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 4@ = readMem 2@ sz 4 vp 0
0A8E: 5@ = 4@ + 0x28 //DialogOpenOffset
0A8D: 5@ = readMem 5@ sz 4 vp 0
if 5@ == 1 // Dialog active
then
    0A8E: 6@ = 4@ + 0x2C //DialogTypeOffset
    0A8D: 6@ = readMem 6@ sz 4 vp 0
    if or
    6@ == 0 // DIALOG_STYLE_MSGBOX
    6@ == 1 // DIALOG_STYLE_INPUT
    6@ == 3 // DIALOG_STYLE_PASSWORD
    then
        0A8E: 7@ = 4@ + 0x34 // DialogTextOffset
        0A8D: 7@ = readMem 7@ sz 4 vp 0
        0485: dialog_open
        0AB2: ret 1 7@
    else 059A:  dialog closed
    end
end
0AB2: ret 0


:SetDialogInputEditBoxText
// 0AB1: @SetDialogInputEditBoxText 2 SampVersionID 0@ text 1@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 3@ = 2@ + 0x21A0B8            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x80F60 // CDXUTEditBox::SetText
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
         0A8E: 3@ = 2@ + 0x21A0C0            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x81000 // CDXUTEditBox::SetText
    END

    IF 0@ == 3 // 0.3.DL
    THEN       
        0A8E: 3@ = 2@ + 0x2AC9E0            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x85000 // CDXUTEditBox::SetText
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 3@ = 2@ + 0x26E898            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x84E70 // CDXUTEditBox::SetText
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 3@ = 2@ + 0x26E9C8            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x855B0 // CDXUTEditBox::SetText
    END
    // CDXUTEditBox::SetText takes 2 params
    // 1 - pointer to zero terminated string
    // 2 - bool, if text is to be selected or not

    0AA8: call_function_method 5@ struct 4@ num_params 2 pop 0 _bSelected 0 _pszText 1@ _retVal 6@
END
0AB2: 0

:CloseCurrentDialogWithButton
// 0AB1: @CloseCurrentDialogWithButton 2 SampVersionID 0@ Button 1 // 1 = Left , 0 = Right
IF 0AA2: 10@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 11@ = 10@ + 0x21A0B8 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6C040 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
        0A8E: 11@ = 10@ + 0x21A0C0 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6C0F0 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 3 // 0.3.DL
    THEN
        0A8E: 11@ = 10@ + 0x2AC9E0 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x700D0 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 11@ = 10@ + 0x26E898 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6FF40 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 11@ = 10@ + 0x26E9C8 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x70660 //SAMP_DIALOG_CLOSE
    END

    0AA8: call_function_method 11@ struct 12@ num_params 1 pop 0 Button 1@ _retVal 6@
END
0AB2: 0

:IfTextContains
//0AB1: @IfTextContains 2 String1 0@ String2 1@
0AB1: @strlen 1 string 0@ _length 31@
0AB1: @strlen 1 string 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text
}
5@ = FALSE // inbracket
0AB1: @strlen 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:GetLastCharacters
{
    0AB1: @GetLastCharacters 2 String 0@ Characters 5 rnt 1@
}
0AB1: @strlen 1 String 0@ Lenght 2@
0062: 2@ -= 1@
005A: 0@ += 2@
0AB2: ret 1 0@

:strlen
// 0AB1: @strlen 1 string 1@ _return: size 3@
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@


! Make Sure you have right settings !

------------------------------

What about the paycheck with exactly the one you shared but first with 'Sign Check - Chat ' and then 'Sign Check - Dialog '. The server HZRP requires you to first do 'Sign Check - Chat ' and then 'Sign Check - Dialog ' at the same time everyhour. If ı add two of them, will it work ?
 

Jik ke

Active member
Joined
Jun 2, 2021
Messages
43
Reaction score
2
Location
America
Sign Check - Dialog

Source samp 0.3.7 R*- 0.3.DL:
PHP:
{$CLEO .cs}

0000:

wait 8500

0AC8: 4@ = allocate_memory_size 260
0AD3: 4@ = format "Sign check"

WHILE TRUE
WAIT 0

IF
0256:   player $PLAYER_CHAR defined
THEN
    0AB1: @get_samp_version_id 0 _Returned: ID 1@
    IF
    0AB1: @isDialogOpen 1 SampVersionID 1@
    THEN
        IF
        0AB1: @GetDialogCaption 1 SampVersionID 1@ _Return: caption 2@
        THEN
            0AC8: 3@ = allocate_memory_size 260
            0AB1: @DeleteColorCodeFromText 4 text 2@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 3@
            IF
            0AB1: @IfTextContains 2 String1 3@ String2 4@ _returned: Text 5@
            THEN
                IF
                0AB1: @GetDialogText 1 SampVersionID 1@ _Returned: text 6@
                THEN
                    0AC8: 7@ = allocate_memory_size 260
                    0AB1: @DeleteColorCodeFromText 4 text 6@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 7@
                    0AC8: 8@ = allocate_memory_size 260
                    0AB1: @get_digits_to_print param_count 2 text 7@ memory_to_store_digits_as_text 8@
                    0AB1: @SetDialogInputEditBoxText 2 SampVersionID 1@ text 8@
                    0209: 9@ = random_int_in_ranges 1000 2000 // generate random time - protect from admin detection
                    wait 9@ // normal people can't react instant , so that why we need add timer
                    0AB1: @CloseCurrentDialogWithButton 2 SampVersionID 1@ Button 1 // 1 = Left , 0 = Right
                END
            END
        END
    END
END

END

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:isDialogOpen
// 0AB1: @isDialogOpen 1 SampVersionID 0@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN     
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN     
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN     
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN     
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN     
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 2@ = readMem 2@ sz 4 vp 0
0A8E: 2@ = 2@ + 0x28
0A8D: 2@ = readMem 2@ sz 4 vp 0
IF 2@ == 1
THEN
    0485: dialog_open
ELSE
    059A: dialog_closed
END
0AB2: ret 0

:GetDialogCaption
// 0AB1: @GetDialogCaption 1 SampVersionID 0@ _Returned: caption 1@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN     
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN     
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN     
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN     
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN     
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 4@ = readMem 2@ sz 4 vp 0
0A8E: 5@ = 4@ + 0x28 //DialogOpenOffset
0A8D: 5@ = readMem 5@ sz 4 vp 0
IF 5@ == 1 // Dialog open
THEN
    0A8E: 3@ = 4@ + 0x40 //DialogCaptionOffset
    0485: dialog_open
    0AB2: ret 1 3@
ELSE
    059A:  dialog closed
END
0AB2: ret 0

:GetDialogText
// 0AB1: @GetDialogText 1 SampVersionID 0@ _Returned: text 1@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN     
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN     
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN     
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN     
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN     
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 4@ = readMem 2@ sz 4 vp 0
0A8E: 5@ = 4@ + 0x28 //DialogOpenOffset
0A8D: 5@ = readMem 5@ sz 4 vp 0
if 5@ == 1 // Dialog active
then
    0A8E: 6@ = 4@ + 0x2C //DialogTypeOffset
    0A8D: 6@ = readMem 6@ sz 4 vp 0
    if or
    6@ == 0 // DIALOG_STYLE_MSGBOX
    6@ == 1 // DIALOG_STYLE_INPUT
    6@ == 3 // DIALOG_STYLE_PASSWORD
    then
        0A8E: 7@ = 4@ + 0x34 // DialogTextOffset
        0A8D: 7@ = readMem 7@ sz 4 vp 0
        0485: dialog_open
        0AB2: ret 1 7@
    else 059A:  dialog closed
    end
end
0AB2: ret 0


:get_digits_to_print
{
    0@ = text
    1@ = pointer to memory where digits will be stored as text
}
0AB1: @strlen 1 string 0@ _return: 31@
    for 30@ = 0 to 31@
        0085: 29@ = 0@ // copy pointer
        005A: 29@ += 30@  // add offset (as the loop progresses it becomes pointers to first-last character)
        0A8D: 28@ = read_memory 29@ size 1 virtual_protect 1 // 28@ is the ascii number representing character
        if and
        28@ >= 0x30 // '0'
        28@ <= 0x39 // '9'
        then
        0A8C: write_memory 1@ size 1 value 28@ virtual_protect 1
        1@ += 1 // move to next address
        end
    end
0A8C: write_memory 1@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:SetDialogInputEditBoxText
// 0AB1: @SetDialogInputEditBoxText 2 SampVersionID 0@ text 1@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 3@ = 2@ + 0x21A0B8            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x80F60 // CDXUTEditBox::SetText
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
         0A8E: 3@ = 2@ + 0x21A0C0            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x81000 // CDXUTEditBox::SetText
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x2AC9E0            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x85000 // CDXUTEditBox::SetText
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 3@ = 2@ + 0x26E898            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x84E70 // CDXUTEditBox::SetText
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 3@ = 2@ + 0x26E9C8            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x855B0 // CDXUTEditBox::SetText
    END
    // CDXUTEditBox::SetText takes 2 params
    // 1 - pointer to zero terminated string
    // 2 - bool, if text is to be selected or not

    0AA8: call_function_method 5@ struct 4@ num_params 2 pop 0 _bSelected 0 _pszText 1@ _retVal 6@
END
0AB2: 0

:CloseCurrentDialogWithButton
// 0AB1: @CloseCurrentDialogWithButton 2 SampVersionID 0@ Button 1 // 1 = Left , 0 = Right
IF 0AA2: 10@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 11@ = 10@ + 0x21A0B8 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6C040 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
        0A8E: 11@ = 10@ + 0x21A0C0 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6C0F0 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 3 // 0.3.DL
    THEN
        0A8E: 11@ = 10@ + 0x2AC9E0 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x700D0 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 11@ = 10@ + 0x26E898 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6FF40 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 11@ = 10@ + 0x26E9C8 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x70660 //SAMP_DIALOG_CLOSE
    END

    0AA8: call_function_method 11@ struct 12@ num_params 1 pop 0 Button 1@ _retVal 6@
END
0AB2: 0

:IfTextContains
//0AB1: @IfTextContains 2 String1 0@ String2 1@
0AB1: @strlen 1 string 0@ _length 31@
0AB1: @strlen 1 string 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text
}
5@ = FALSE // inbracket
0AB1: @strlen 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:strlen
// 0AB1: @strlen 1 string 1@ _return: size 3@
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@


Sign Check - Chat

Source samp 0.3.7 R*- 0.3.DL:
PHP:
{$CLEO .cs}

0000: NOP

wait 8500

0AC8: 3@ = allocate_memory_size 260
0AD3: 3@ = "Type /signcheck"   // Check / find text

0AC8: 5@ = allocate_memory_size 260
0AD3: 5@ "/signcheck"   // CMD

while true
wait 0

if
0256:   player $PLAYER_CHAR defined
then
    0AB1: @get_samp_version_id 0 _Returned: ID 0@
    for 30@ = 95 to 99
        0AC8: 1@ = allocate_memory_size 260
        0AB1: @getChatEntryText 2 SampVersionID 0@ ChatLineID 30@  _Returned: text 1@
        0AC8: 2@ = allocate_memory_size 260
        0AB1: @DeleteColorCodeFromText 4 text 1@ FirstCharacter 123 SecondCharacter 125 memory_to_store_characters_as_text 2@
        if  
        0AB1: @IfTextContains 2 String1 2@ String2 3@ _returned: text 4@
        then
            0AB1: @SEND_CMD 2 SampVersionID 0@ text 5@
            wait 10000 // anti spam
        end
    end
end

end

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:GetChatEntryText
{
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatEntryText 2 SampVersionID 0@ ChatLineID 99  _Returned: text 1@
}
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN     
        0A8E: 3@ = 2@ + 0x21A0E4
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN     
        0A8E: 3@ = 2@ + 0x21A0EC
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x2ACA10
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN      
        0A8E: 3@ = 2@ + 0x26E8C8
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN     
        0A8E: 3@ = 2@ + 0x26E9F8
    END
    0A8D: 2@ readMem 3@ sz 4 vp 0
    2@ += 0x132
    1@ *= 0xFC
    005A: 2@ += 1@
    2@ += 0x20
    0AA3: 2@
END
0AB2: ret 1 2@

:IfTextContains
{
    0@ - the main text
    1@ - piece of text to be found within the main text
}
0AB1: @strlen 1 strPtr 0@ _length 31@
0AB1: @strlen 1 strPtr 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text

}
5@ = FALSE // inbracket
0AB1: @strlen 1 string 0@ _return: 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:strlen
{
    Example: 0AB1: @strlen 1 string 1@ _return: 3@
    In: 0@ - text;
    Out: 1@ - size;
}
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@

:SEND_CMD
// 0AB1: @SEND_CMD 2 SampVersionID 0@ text 3@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN     
        0A8E: 3@ = 2@ + 0x65C60
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN     
        0A8E: 3@ = 2@ + 0x65D30
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x69340
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN      
        0A8E: 3@ = 2@ + 0x69190
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN     
        0A8E: 3@ = 2@ + 0x698C0
    END
    0AA5: call 3@ num_param 1 pop 0 1@
END
0AB2: 0


Sign Check - Chat 2

Source samp 0.3.7 R*- 0.3.DL:
PHP:
{$CLEO .cs}

0000: NOP

wait 8500

while true
wait 0

if
0256:   player $PLAYER_CHAR defined
then
    0AB1: @get_samp_version_id 0 _Returned: ID 0@
    for 30@ = 95 to 99
        0AC8: 1@ = allocate_memory_size 260
        0AB1: @getChatEntryText 2 SampVersionID 0@ ChatLineID 30@  _Returned: text 1@
        0AC8: 2@ = allocate_memory_size 260
        0AB1: @DeleteColorCodeFromText 4 text 1@ FirstCharacter 123 SecondCharacter 125 memory_to_store_characters_as_text 2@
        0AC8: 3@ = allocate_memory_size 260
        0AD3: 3@ = "/signcheck"   // Check / find text
        if  
        0AB1: @IfTextContains 2 String1 2@ String2 3@ _returned: text 4@
        then
            0AC8: 6@ = allocate_memory_size 260
            0AB1: @get_digits_to_print param_count 2 text 2@ memory_to_store_digits_as_text 6@
            0AC8: 5@ = allocate_memory_size 260
            0AD3: 5@ "/signcheck %s" 6@   // CMD
            0AB1: @SEND_CMD 2 SampVersionID 0@ text 5@
            wait 10000 // anti spam
        end
    end
end

end

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:GetChatEntryText
{
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatEntryText 2 SampVersionID 0@ ChatLineID 99  _Returned: text 1@
}
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN     
        0A8E: 3@ = 2@ + 0x21A0E4
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN     
        0A8E: 3@ = 2@ + 0x21A0EC
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x2ACA10
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN      
        0A8E: 3@ = 2@ + 0x26E8C8
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN     
        0A8E: 3@ = 2@ + 0x26E9F8
    END
    0A8D: 2@ readMem 3@ sz 4 vp 0
    2@ += 0x132
    1@ *= 0xFC
    005A: 2@ += 1@
    2@ += 0x20
    0AA3: 2@
END
0AB2: ret 1 2@

:IfTextContains
{
    0@ - the main text
    1@ - piece of text to be found within the main text
}
0AB1: @strlen 1 strPtr 0@ _length 31@
0AB1: @strlen 1 strPtr 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text

}
5@ = FALSE // inbracket
0AB1: @strlen 1 string 0@ _return: 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:get_digits_to_print
{
    0@ = text
    1@ = pointer to memory where digits will be stored as text
}
0AB1: @strlen 1 string 0@ _return: 31@
    for 30@ = 0 to 31@
        0085: 29@ = 0@ // copy pointer
        005A: 29@ += 30@  // add offset (as the loop progresses it becomes pointers to first-last character)
        0A8D: 28@ = read_memory 29@ size 1 virtual_protect 1 // 28@ is the ascii number representing character
        if and
        28@ >= 0x30 // '0'
        28@ <= 0x39 // '9'
        then
        0A8C: write_memory 1@ size 1 value 28@ virtual_protect 1
        1@ += 1 // move to next address
        end
    end
0A8C: write_memory 1@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:strlen
{
    Example: 0AB1: @strlen 1 string 1@ _return: 3@
    In: 0@ - text;
    Out: 1@ - size;
}
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@

:SEND_CMD
// 0AB1: @SEND_CMD 2 SampVersionID 0@ text 3@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN     
        0A8E: 3@ = 2@ + 0x65C60
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN     
        0A8E: 3@ = 2@ + 0x65D30
    END

    IF 0@ == 3 // 0.3.DL
    THEN     
        0A8E: 3@ = 2@ + 0x69340
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN      
        0A8E: 3@ = 2@ + 0x69190
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN     
        0A8E: 3@ = 2@ + 0x698C0
    END
    0AA5: call 3@ num_param 1 pop 0 1@
END
0AB2: 0


Etc...

PHP:
{$CLEO .cs}

0000:

wait 8500

0AC8: 4@ = allocate_memory_size 260
0AD3: 4@ = format "Drug Production"

WHILE TRUE
WAIT 0

IF
0256:   player $PLAYER_CHAR defined
THEN
    0AB1: @get_samp_version_id 0 _Returned: ID 1@
    IF
    0AB1: @isDialogOpen 1 SampVersionID 1@
    THEN
        IF
        0AB1: @GetDialogCaption 1 SampVersionID 1@ _Return: caption 2@
        THEN
            0AC8: 3@ = allocate_memory_size 260
            0AB1: @DeleteColorCodeFromText 4 text 2@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 3@
            IF
            0AB1: @IfTextContains 2 String1 3@ String2 4@ _returned: Text 5@
            THEN
                IF
                0AB1: @GetDialogText 1 SampVersionID 1@ _Returned: text 6@
                THEN
                    0AC8: 7@ = allocate_memory_size 260
                    0AB1: @DeleteColorCodeFromText 4 text 6@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 7@
                    0AB1: @GetLastCharacters 2 String 7@ Characters 11 rnt 8@
                    0AB1: @SetDialogInputEditBoxText 2 SampVersionID 1@ text 8@
                    0209: 9@ = random_int_in_ranges 1000 2000 // generate random time - protect from admin detection
                    wait 9@ // normal people can't react instant , so that why we need add timer
                    0AB1: @CloseCurrentDialogWithButton 2 SampVersionID 1@ Button 1 // 1 = Left , 0 = Right
                END
            END
        END
    END
END

END

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:isDialogOpen
// 0AB1: @isDialogOpen 1 SampVersionID 0@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN       
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN       
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN       
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN       
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN       
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 2@ = readMem 2@ sz 4 vp 0
0A8E: 2@ = 2@ + 0x28
0A8D: 2@ = readMem 2@ sz 4 vp 0
IF 2@ == 1
THEN
    0485: dialog_open
ELSE
    059A: dialog_closed
END
0AB2: ret 0

:GetDialogCaption
// 0AB1: @GetDialogCaption 1 SampVersionID 0@ _Returned: caption 1@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN       
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN       
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN       
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN       
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN       
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 4@ = readMem 2@ sz 4 vp 0
0A8E: 5@ = 4@ + 0x28 //DialogOpenOffset
0A8D: 5@ = readMem 5@ sz 4 vp 0
IF 5@ == 1 // Dialog open
THEN
    0A8E: 3@ = 4@ + 0x40 //DialogCaptionOffset
    0485: dialog_open
    0AB2: ret 1 3@
ELSE
    059A:  dialog closed
END
0AB2: ret 0

:GetDialogText
// 0AB1: @GetDialogText 1 SampVersionID 0@ _Returned: text 1@
0AA2: 1@ = "samp.dll"
IF 0@ == 1 // 0.3.7 R1
THEN       
    0A8E: 2@ = 1@ + 0x21A0B8
END
IF 0@ == 2 // 0.3.7 R2
THEN       
    0A8E: 2@ = 1@ + 0x21A0C0
END

IF 0@ == 3 // 0.3.DL
THEN       
    0A8E: 2@ = 1@ + 0x2AC9E0
END

IF 0@ == 4 // 0.3.7 R3
THEN       
    0A8E: 2@ = 1@ + 0x26E898
END

IF 0@ == 5 // 0.3.7 R4
THEN       
    0A8E: 2@ = 1@ + 0x26E9C8
END
0A8D: 4@ = readMem 2@ sz 4 vp 0
0A8E: 5@ = 4@ + 0x28 //DialogOpenOffset
0A8D: 5@ = readMem 5@ sz 4 vp 0
if 5@ == 1 // Dialog active
then
    0A8E: 6@ = 4@ + 0x2C //DialogTypeOffset
    0A8D: 6@ = readMem 6@ sz 4 vp 0
    if or
    6@ == 0 // DIALOG_STYLE_MSGBOX
    6@ == 1 // DIALOG_STYLE_INPUT
    6@ == 3 // DIALOG_STYLE_PASSWORD
    then
        0A8E: 7@ = 4@ + 0x34 // DialogTextOffset
        0A8D: 7@ = readMem 7@ sz 4 vp 0
        0485: dialog_open
        0AB2: ret 1 7@
    else 059A:  dialog closed
    end
end
0AB2: ret 0


:SetDialogInputEditBoxText
// 0AB1: @SetDialogInputEditBoxText 2 SampVersionID 0@ text 1@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 3@ = 2@ + 0x21A0B8            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x80F60 // CDXUTEditBox::SetText
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
         0A8E: 3@ = 2@ + 0x21A0C0            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x81000 // CDXUTEditBox::SetText
    END

    IF 0@ == 3 // 0.3.DL
    THEN       
        0A8E: 3@ = 2@ + 0x2AC9E0            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x85000 // CDXUTEditBox::SetText
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 3@ = 2@ + 0x26E898            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x84E70 // CDXUTEditBox::SetText
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 3@ = 2@ + 0x26E9C8            // SAMP_DIALOG_INFO_OFFSET
        0A8D: 3@ = readMem 3@ sz 4 vp 0     // pDialog;
        0A8E: 4@ = 3@ + 0x24                // pDialog->pEditBox;
        0A8D: 4@ = readMem 4@ sz 4 vp 0     // pEditBox;

        0A8E: 5@ = 2@ + 0x855B0 // CDXUTEditBox::SetText
    END
    // CDXUTEditBox::SetText takes 2 params
    // 1 - pointer to zero terminated string
    // 2 - bool, if text is to be selected or not

    0AA8: call_function_method 5@ struct 4@ num_params 2 pop 0 _bSelected 0 _pszText 1@ _retVal 6@
END
0AB2: 0

:CloseCurrentDialogWithButton
// 0AB1: @CloseCurrentDialogWithButton 2 SampVersionID 0@ Button 1 // 1 = Left , 0 = Right
IF 0AA2: 10@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 11@ = 10@ + 0x21A0B8 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6C040 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
        0A8E: 11@ = 10@ + 0x21A0C0 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6C0F0 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 3 // 0.3.DL
    THEN
        0A8E: 11@ = 10@ + 0x2AC9E0 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x700D0 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 11@ = 10@ + 0x26E898 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x6FF40 //SAMP_DIALOG_CLOSE
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 11@ = 10@ + 0x26E9C8 // SAMP_DIALOG_INFO_OFFSET
        0A8D: 12@ = readMem 11@ sz 4 vp 0
        0A8E: 11@ = 10@ + 0x70660 //SAMP_DIALOG_CLOSE
    END

    0AA8: call_function_method 11@ struct 12@ num_params 1 pop 0 Button 1@ _retVal 6@
END
0AB2: 0

:IfTextContains
//0AB1: @IfTextContains 2 String1 0@ String2 1@
0AB1: @strlen 1 string 0@ _length 31@
0AB1: @strlen 1 string 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text
}
5@ = FALSE // inbracket
0AB1: @strlen 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:GetLastCharacters
{
    0AB1: @GetLastCharacters 2 String 0@ Characters 5 rnt 1@
}
0AB1: @strlen 1 String 0@ Lenght 2@
0062: 2@ -= 1@
005A: 0@ += 2@
0AB2: ret 1 0@

:strlen
// 0AB1: @strlen 1 string 1@ _return: size 3@
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@


! Make Sure you have right settings !
Hi, can you help me with a similar cleo? cleo is active when there is a chat line: "Who is going to give me 100000$ --> secret number + secret number - secret number + secret number = ?" then it will automatically calculate the result and automatically chat out the calculated number (question mark), samp 0.3dl
 

Parazitas

God
Joined
Jan 2, 2017
Messages
3,104
Solutions
5
Reaction score
882
Location
Lithuania
Hi, can you help me with a similar cleo? cleo is active when there is a chat line: "Who is going to give me 100000$ --> secret number + secret number - secret number + secret number = ?" then it will automatically calculate the result and automatically chat out the calculated number (question mark), samp 0.3dl
Any
Pic??
 

Parazitas

God
Joined
Jan 2, 2017
Messages
3,104
Solutions
5
Reaction score
882
Location
Lithuania
I have some more pictures
PHP:
{$CLEO .cs}

0000: 
                                        
wait 8500

while true
wait 0

if 0256:   player $PLAYER_CHAR defined
then
    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@
    0AC8: 4@ = allocate_memory_size 1024
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 123 SecondCharacter 125  memory_to_store_characters_as_text 4@
    0AC8: 5@ = allocate_memory_size 1024
    0AD3: 5@ = format "tra loi dung" 
    if 0AB1: @IfTextContains 2 String1 4@ String2 5@ _returned: Text 6@
    then
        0AC8: 7@ = allocate_memory_size 1024
        0AD3: 7@ = format "__>" 
        if 0AB1: @IfTextContains 2 String1 6@ String2 7@ _returned: Text 8@
        then
            if 0AD4: $NOT_USED = scan_string 8@ format "__> %d + %d - %d + %d = ?" 9@ 10@ 11@ 12@
            then
                005A: 9@ += 10@  // (int)
                005A: 11@ += 12@  // (int)
                0062: 9@ -= 11@  // (int)
                0AD1: "ANSWER: %d" 1337 9@
            end
        end
    end
end

end

:getChatString
{
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatString 1 ChatID 99 _Returned: Text 0@ PrefixText 1@ Color 2@ PrefixColor 3@
    0.3.DL
}
IF 0AA2: 31@ = "samp.dll"
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
    0AA3: 31@
END
0AB2: ret 4 30@ 29@ 27@ 24@

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text
}
5@ = FALSE // inbracket
0AB1: @strlen 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:IfTextContains
//0AB1: @IfTextContains 2 String1 0@ String2 1@ _Returned: Text 2@
0AB1: @strlen 1 string 0@ _length 31@
0AB1: @strlen 1 string 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:strlen
// 0AB1: @strlen 1 string 1@ _return: size 3@
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@
 

Jancox

New member
Joined
May 10, 2021
Messages
3
Reaction score
1
Location
Indonesia
how do I edit auto /signcheck to auto /event join when the admins create an event and the ahk auto type /event join?
 

whatthefork111

New member
Joined
Jul 7, 2021
Messages
3
Reaction score
2
Location
IDN
Sign Check - Chat

Source samp 0.3.7 R*- 0.3.DL:
PHP:
{$CLEO .cs}

0000: NOP

wait 8500

while true
wait 0

if 0256:   player $PLAYER_CHAR defined
then
    0AB1: @get_samp_version_id 0 _Returned: ID 0@
    for 1@ = 95 to 99
        0AC8: 2@ = allocate_memory_size 1024
        0AC8: 3@ = allocate_memory_size 1024
        0AB1: @getChatString 2 SampVersionID 0@ ChatID 1@ _Returned: Text 2@ PrefixText 3@ Color 4@ PrefixColor 5@
        0AC8: 6@ = allocate_memory_size 1024
        0AB1: @DeleteColorCodeFromText 4 text 2@ FirstCharacter 123 SecondCharacter 125 memory_to_store_characters_as_text 6@
        0AC8: 7@ = allocate_memory_size 1024
        0AD3: 7@ = "Type /signcheck"   // Check / find text
        if 0AB1: @IfTextContains 2 String1 6@ String2 7@ _returned: text 8@
        then
            0AC8: 9@ = allocate_memory_size 1024
            0AD3: 9@ "/signcheck"   // CMD
            0AB1: @SEND_CMD 2 SampVersionID 0@ Text 9@
            wait 10000 // anti spam
        end
    end
end

end

:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: id 0@
30@ = 0
IF 0AA2: 31@ = load_library "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
END
0AB2: ret 1 30@

:getChatString
{
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatString 2 SampVersionID 1 ChatID 99 _Returned: Text 0@ PrefixText 1@ Color 2@ PrefixColor 3@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    IF NOT 0@ < 1
    THEN
        IF 0@ == 1 // 0.3.7 R1
        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@ == 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
    END
    0AA3: 31@
END
0AB2: ret 4 30@ 29@ 27@ 24@

:IfTextContains
{
    0@ - the main text
    1@ - piece of text to be found within the main text
}
0AB1: @strlen 1 strPtr 0@ _length 31@
0AB1: @strlen 1 strPtr 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:DeleteColorCodeFromText
{
    0AB1: @DeleteColorCodeFromText 4 text 0@ FirstCharacter 91 SecondCharacter 93  memory_to_store_characters_as_text 1@
    In: 0@ = text , FirstCharacter , SecondCharacter
    Out: 1@ = pointer to memory where characters will be stored as text

}
5@ = FALSE // inbracket
0AB1: @strlen 1 string 0@ _return: 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
        003B:   28@ == 1@  // (int)
        then
            5@ = TRUE // inbracket
        end

        if
        5@ == FALSE // inbracket
        THEN
            0A8C: write_memory 3@ size 1 value 28@ virtual_protect 1
            3@ += 1 // move to next address
        END

        if
        003B:   28@ == 2@  // (int)
        then
            5@ = FALSE // inbracket
        end
    end
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1 // null-termination
0AB2: ret 0

:strlen
{
    Example: 0AB1: @strlen 1 string 1@ _return: 3@
    In: 0@ - text;
    Out: 1@ - size;
}
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@

:SEND_CMD
// 0AB1: @SEND_CMD 2 SampVersionID 0@ Text 3@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF NOT 0@ < 0
    THEN
        IF 0@ == 1 // 0.3.7 R1
        THEN     
            0A8E: 3@ = 2@ + 0x65C60
            0AA5: call 3@ num_param 1 pop 0 1@
        END
        IF 0@ == 2 // 0.3.7 R2
        THEN     
            0A8E: 3@ = 2@ + 0x65D30
            0AA5: call 3@ num_param 1 pop 0 1@
        END
   
        IF 0@ == 3 // 0.3.DL
        THEN     
            0A8E: 3@ = 2@ + 0x69340
            0AA5: call 3@ num_param 1 pop 0 1@
        END
   
        IF 0@ == 4 // 0.3.7 R3
        THEN      
            0A8E: 3@ = 2@ + 0x69190
            0AA5: call 3@ num_param 1 pop 0 1@
        END
   
        IF 0@ == 5 // 0.3.7 R4
        THEN     
            0A8E: 3@ = 2@ + 0x698C0
            0AA5: call 3@ num_param 1 pop 0 1@
        END
    END
END
0AB2: 0

Hi, first and foremost, your sources have without a doubt helped me a lot, but is it possible to make this script togglable with maybe Numpad Insert? I have tried to implement from many different scripts, but well, let's just say I'm not a programmer since it failed miserably...
 

Parazitas

God
Joined
Jan 2, 2017
Messages
3,104
Solutions
5
Reaction score
882
Location
Lithuania
Hi, first and foremost, your sources have without a doubt helped me a lot, but is it possible to make this script togglable with maybe Numpad Insert? I have tried to implement from many different scripts, but well, let's just say I'm not a programmer since it failed miserably...

It is old source mate..., server keep updating systems..
 

whatthefork111

New member
Joined
Jul 7, 2021
Messages
3
Reaction score
2
Location
IDN
It is old source mate..., server keep updating systems..
Ahh, sorry I should have been more specific. Truth be told, I'm actually using your source as a base for an automatic join event script, the mentioned source still works as of now (minus being togglable). Since I use it on an RP server it can be quite bad if I accidentally joined an event while I'm in the middle of a situation.

Here's an example:
PFBMnbx.jpg
 
Last edited:

dphome

Well-known member
Joined
Mar 21, 2020
Messages
456
Solutions
9
Reaction score
165
Location
Poland
It's for SAMP 0.3.DL, and I think IT WORKS!! Thank you very much, I presume you missed this part since it gives out an error otherwise, but after I include it BOOM it works, my respect, it works perfectly!
Code:
:strlen
{
    Example: 0AB1: @strlen 1 string 1@ _return: 3@
    In: 0@ - text;
    Out: 1@ - size;
}
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@
No problem :D I added strlen
Code:
{$CLEO .cs}

0000: NOP

wait 8500

30@ = true {autostart}

while true
wait 0

if
0ADC:   test_cheat "JOIN"
then
    if
    30@ == false
    then
        30@ = true
        0AD1: "~w~Event Join ~g~Enable" 1337
    else
        30@ = false
        0AD1: "~w~Event Join ~r~Disable" 1337
    end
end

if and
30@ == true
0256:   player $PLAYER_CHAR defined
then
    wait 250
    0AC8: 0@ = allocate_memory_size 1024
    0AC8: 1@ = allocate_memory_size 1024
    0AB1: @getChatString 2 SampVersionID 3 ChatID 99 _Returned: Text 0@ PrefixText 1@ Color 2@ PrefixColor 3@
    0AC8: 4@ = allocate_memory_size 1024
    0AD3: 4@ = "to participate in the event"                        
    if
    0AB1: @IfTextContains 2 String1 0@ String2 4@ _returned: Text 5@
    then
        wait 1500
        0AC8: 6@ = allocate_memory_size 1024
        0AD3: 6@ "/event join"
        0AB1: @SEND_CMD 2 SampVersionID 3 text 6@
        wait 10000                             
    end
    end
end        

end

:getChatString
{
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatString 2 SampVersionID 1 ChatID 99 _Returned: Text 0@ PrefixText 1@ Color 2@ PrefixColor 3@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    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@ == 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
    0AA3: 31@
END
0AB2: ret 4 30@ 29@ 27@ 24@

:IfTextContains
//0AB1: @IfTextContains 2 String1 0@ String2 1@
0AB1: @strlen 1 string 0@ _length 31@
0AB1: @strlen 1 string 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:SEND_CMD
// 0AB1: @SEND_CMD 2 SampVersionID 1 Command: 7@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN  
        0A8E: 3@ = 2@ + 0x65C60
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN  
        0A8E: 3@ = 2@ + 0x65D30
    END

    IF 0@ == 3 // 0.3.DL
    THEN  
        0A8E: 3@ = 2@ + 0x69340
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN   
        0A8E: 3@ = 2@ + 0x69190
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN  
        0A8E: 3@ = 2@ + 0x698C0
    END
    0AA5: call 3@ num_param 1 pop 0 1@
END
0AB2: 0


:strlen
{
    Example: 0AB1: @strlen 1 string 1@ _return: 3@
    In: 0@ - text;
    Out: 1@ - size;
}
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@
 
Last edited:

whatthefork111

New member
Joined
Jul 7, 2021
Messages
3
Reaction score
2
Location
IDN
SA:MP Version?
Code:
{$CLEO .cs}

0000: NOP

wait 8500

30@ = true {autostart}

while true
wait 0

if
0ADC:   test_cheat "JOIN"
then
    if
    30@ == false
    then
        30@ = true
        0AD1: "~w~Event Join ~g~Enable" 1337
    else
        30@ = false
        0AD1: "~w~Event Join ~r~Disable" 1337
    end
end

if and
30@ == true
0256:   player $PLAYER_CHAR defined
then
    wait 250
    0AC8: 0@ = allocate_memory_size 1024
    0AC8: 1@ = allocate_memory_size 1024
    0AB1: @getChatString 2 SampVersionID 3{1=0.3.7-R1|3=0.3.DL-R1} ChatID 99 _Returned: Text 0@ PrefixText 1@ Color 2@ PrefixColor 3@ 
    0AC8: 4@ = allocate_memory_size 1024
    0AD3: 4@ = "to participate in the event"                          
    if
    0AB1: @IfTextContains 2 String1 0@ String2 4@ _returned: Text 5@
    then
        wait 1500
        0AC8: 6@ = allocate_memory_size 1024
        0AD3: 6@ "/event join"
        0AB1: @SEND_CMD 2 SampVersionID 3{1=0.3.7-R1|3=0.3.DL-R1} text 6@
        wait 10000                               
    end
    end
end          

end

:getChatString
{
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatString 2 SampVersionID 1 ChatID 99 _Returned: Text 0@ PrefixText 1@ Color 2@ PrefixColor 3@
}
IF 0AA2: 31@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    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@ == 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
    0AA3: 31@
END
0AB2: ret 4 30@ 29@ 27@ 24@

:IfTextContains
//0AB1: @IfTextContains 2 String1 0@ String2 1@
0AB1: @strlen 1 string 0@ _length 31@
0AB1: @strlen 1 string 1@ _length 30@

//initial length check (the phrase can't be longer than the main text)
if 001D:   30@ > 31@  // (int)
then
059A:  return_false
0AB2: ret 1 0
end

31@ -= 1
26@ = 0 // counter of the same chars in a row
for 29@ = 0 to 31@ // for each char of the main text  (29@ = index)
    0085: 24@ = 0@ // (int)
    005A: 24@ += 29@  // (int)
    0A8D: 28@ = read_memory 24@ size 1 virtual_protect 0

    0085: 23@ = 1@ // (int)
    005A: 23@ += 26@  // (int)
    0A8D: 27@ = read_memory 23@ size 1 virtual_protect 0

    if 003B:   28@ == 27@  // (int)
    then
    26@++
        if 002D:   26@ >= 30@  // (int)
        then
        0485:  return_true
        0062: 24@ -= 30@  // (int)
        24@ += 1
        0AB2: ret 1 24@
        end
    else
        if 26@ > 0
        then
        29@-- //check the same char again and assume it's the begining of the string but only if there was matching parts before (otherwise it would go back all the time and make infinite loop)
        end
    26@ = 0
    end
end

059A:  return_false
0AB2: ret 1 0

:SEND_CMD
// 0AB1: @SEND_CMD 2 SampVersionID 1 Command: 7@
IF 0AA2: 2@ = "samp.dll"
THEN
    IF 0@ == 1 // 0.3.7 R1
    THEN    
        0A8E: 3@ = 2@ + 0x65C60
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN    
        0A8E: 3@ = 2@ + 0x65D30
    END

    IF 0@ == 3 // 0.3.DL
    THEN    
        0A8E: 3@ = 2@ + 0x69340
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN     
        0A8E: 3@ = 2@ + 0x69190
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN    
        0A8E: 3@ = 2@ + 0x698C0
    END
    0AA5: call 3@ num_param 1 pop 0 1@
END
0AB2: 0

It's for SAMP 0.3.DL, and I think IT WORKS!! Thank you very much, I presume you missed this part since it gives out an error otherwise, but after I include it BOOM it works, my respect, it works perfectly!
Code:
:strlen
{
    Example: 0AB1: @strlen 1 string 1@ _return: 3@
    In: 0@ - text;
    Out: 1@ - size;
}
for 1@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    if not 2@ == 0
    jf break
    0@ += 1
end
0AB2: ret 1 1@
 
Top