CLEO Help Trigger sound by chat message

CLEO related

Invader666

Member
Joined
Jun 3, 2020
Messages
10
Reaction score
1
Location
-
Hello, i wanted a mod which triggers a sound whenever there is some text on chat like "SMS from xxx". I tried to make it but its not working. I dont know what im doing wrong here. Please help

Code:
{$CLEO .cs}
0000: NOP

/* this part requires sampfuncs
repeat
wait 50
until 0AFA: is_samp_structures_available
*/

repeat
wait 50
UNTIL 0AFA:  SAMP_IS_READY
 056D: actor $PLAYER_ACTOR defined
 
while true
if
WAIT 0
    0AC8: 0@ = allocate_memory_size 260   
    0B75: samp get_chat_string 99 text_to 0@ prefix_to 33@ color_to 33@ prefix_color_to 33@
    IF
    0AD4: 33@ = scan_string 0@ format "SMS from" 1@v // used: 1@,2@,3@,4@
    then
        0AAE: release_mp3 $hMP1               1@v
        0AAC: $hMP1 = load_audiostream "CLEO/music/Alert.MP3"
        0ABC: set_audiostream $hMP1 volume 1.0
        0AAD: set_mp3 $hMP1 perform_action 1 //0=stop, 1=play, 2=pause, 3=resume
        0AAF: 0@ = get_mp3_length $hMP1
        wait 1000
    end
    0AC9: free_allocated_memory 0@
end
 

Parazitas

God
Staff member
Joined
Jan 2, 2017
Messages
3,161
Solutions
5
Reaction score
894
Location
Lithuania
Working with any samp
PHP:
{$CLEO .cs}

0000:

REPEAT
WAIT 1000
0A8D: 0@ = readMem 0xC8D4C0 sz 4 vp 0
UNTIL 0@ == 9 // SAMP_IS_READY

0AB1: @get_samp_version_id 0 _returned: id 1@
03CF: load_wav 17802 as 1 // load sound

while true
wait 0

if 0256:   player $PLAYER_CHAR defined
then
    // Command
    0AB1: @GetLastSentTextFromChatBox 1 SampVersionID 1@ _Returned: Command 2@ Text 3@
    0AC8: 4@ = allocate_memory_size 1024
    0AD3: 4@ = format "/chatsound" // format command
    if 0AB1: @cmpString1andString2 2 String1 3@ String2 4@
    then
        0A8C: write_memory 3@ size 1 value 0 virtual_protect 0 // clear last sent text from chatbox aka - anti infinity checking..
        if 31@ == false
        then
            31@ = true
            0AC8: 5@ = allocate_memory_size 1024
            0AD3: 5@ = format "{FFFFFF}ChatSound: {00FF00}ON" // format chat message
            0AB1: @Chatmsg 3 SampVersionID 1@ text 5@ color 0xFF00FF00
        else
            31@ = false
            0AC8: 5@ = allocate_memory_size 1024
            0AD3: 5@ = format "{FFFFFF}ChatSound: {FF0000}OFF" // format chat message
            0AB1: @Chatmsg 3 SampVersionID 1@ text 5@ color 0xFFFF0000
        end
    end
    // end of command
 
   if 31@ == true // if code activated then..
   then
        0A8D: 12@ = readMem 0xBA6797 sz 1 vp 0 // read sound volume
      
        0AC8: 6@ = allocate_memory_size 1024
        0AC8: 7@ = allocate_memory_size 1024
        0AB1: @getChatString 2 SampVersionID 1@ ChatID 99 _Returned: Text 6@ PrefixText 7@ Color 8@ PrefixColor 9@
        0AC8: 10@ = allocate_memory_size 1024
        0AD3: 10@ = format "SMS from" // text from chat to check
        if 0AB1: @IfTextContains 2 String1 6@ String2 10@ _Returned: Text 11@
        then
            if 12@ < 28 // if sound volume is less than 28 than set volume to 28
            then
                0A8C: writeMem 0xBA6797 sz 1 vl 28 vp 0 // set sound volume: min - 0, max - 64
            end
            03D1: play_wav 1 // run sound
        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@

:GetLastSentTextFromChatBox
{
    0AB1: @GetLastSentTextFromChatBox 1 SampVersionID 5 _Returned: Command 0@ Text 1@
}
IF 0AA2: 31@ = "samp.dll"
THEN      
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 30@ = 31@ + 0x21A0B8 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
        0A8E: 30@ = 31@ + 0x21A0F0 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 3 // 0.3.DL
    THEN
        0A8E: 30@ = 31@ + 0x2ACA14 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 30@ = 31@ + 0x26E8CC // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 30@ = 31@ + 0x26E9FC // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END
END
0AB2: 2 29@ 28@

:cmpString1andString2
{
    Example: 0AB1: @cmpString1andString2 2 String1 1@ String2 2@
    In: 0@, 1@ - strings
    Out: result 0/1
}
for 7@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0 
    0A8D: 3@ = read_memory 1@ size 1 virtual_protect 0
    0@ += 1
    1@ += 1
    if 003B: 2@ == 3@
    jf break
    if and
    2@ == 0
    3@ == 0
    then
        0485: return_true
        ret 0
    end
end
059A: return_false
ret 0

:Chatmsg
{
    0AB1: @Chatmsg 3 SampVersionID 0@ text 1@ color 0xFF00FF00
}
IF 0AA2: 31@ = "samp.dll"
THEN
    IF NOT 0@ < 1
    THEN
        IF 0@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0E4            // SAMP_CHAT_INFO_OFFSET (R1)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x64010             // FUNC_ADDTOCHATWND (R1)
        END
  
        IF 0@ == 2 // 0.3.7 R2
        THEN
            0A8E: 30@ = 31@ + 0x21A0EC            // SAMP_CHAT_INFO_OFFSET (R2)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x640E0            // FUNC_ADDTOCHATWND (R2)
        END
  
        IF 0@ == 3 // 0.3.DL
        THEN
            0A8E: 30@ = 31@ + 0x2ACA10            // SAMP_CHAT_INFO_OFFSET (DL)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67650             // FUNC_ADDTOCHATWND (DL)
        END
  
        IF 0@ == 4 // 0.3.7 R3
        THEN
            0A8E: 30@ = 31@ + 0x26E8C8            // SAMP_CHAT_INFO_OFFSET (R3)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67460             // FUNC_ADDTOCHATWND (R3)
        END
  
        IF 0@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26E9F8            // SAMP_CHAT_INFO_OFFSET (R4)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67BA0             // FUNC_ADDTOCHATWND (R4)
        END
        
        0AA6: call 29@ struct 30@ num_params 5 pop 0 params 0 2@ 0 1@ 8
    END
END
0AB2: 0

:getChatString
{
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatString 2 SampVersionID 3 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@ += 0x21A0E4 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN
        31@ += 0x21A0EC // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
  
    IF 0@ == 3 // 0.3.DL
    THEN
        31@ += 0x2ACA10 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 4 // 0.3.7 R3
    THEN
        31@ += 0x26E8C8 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 5 // 0.3.7 R4
    THEN
        31@ += 0x26E9F8 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    0AA3: 31@
END
0AB2: ret 4 30@ 29@ 27@ 24@

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

Invader666

Member
Joined
Jun 3, 2020
Messages
10
Reaction score
1
Location
-
Working with any samp
PHP:
{$CLEO .cs}

0000:

REPEAT
WAIT 1000
0A8D: 0@ = readMem 0xC8D4C0 sz 4 vp 0
UNTIL 0@ == 9 // SAMP_IS_READY

0AB1: @get_samp_version_id 0 _returned: id 1@
03CF: load_wav 17802 as 1 // load sound

while true
wait 0

if 0256:   player $PLAYER_CHAR defined
then
    // Command
    0AB1: @GetLastSentTextFromChatBox 1 SampVersionID 1@ _Returned: Command 2@ Text 3@
    0AC8: 4@ = allocate_memory_size 1024
    0AD3: 4@ = format "/chatsound" // format command
    if 0AB1: @cmpString1andString2 2 String1 3@ String2 4@
    then
        0A8C: write_memory 3@ size 1 value 0 virtual_protect 0 // clear last sent text from chatbox aka - anti infinity checking..
        if 31@ == false
        then
            31@ = true
            0AC8: 5@ = allocate_memory_size 1024
            0AD3: 5@ = format "{FFFFFF}ChatSound: {00FF00}ON" // format chat message
            0AB1: @Chatmsg 3 SampVersionID 1@ text 5@ color 0xFF00FF00
        else
            31@ = false
            0AC8: 5@ = allocate_memory_size 1024
            0AD3: 5@ = format "{FFFFFF}ChatSound: {FF0000}OFF" // format chat message
            0AB1: @Chatmsg 3 SampVersionID 1@ text 5@ color 0xFFFF0000
        end
    end
    // end of command

   if 31@ == true // if code activated then..
   then
        0A8D: 12@ = readMem 0xBA6797 sz 1 vp 0 // read sound volume
    
        0AC8: 6@ = allocate_memory_size 1024
        0AC8: 7@ = allocate_memory_size 1024
        0AB1: @getChatString 2 SampVersionID 1@ ChatID 99 _Returned: Text 6@ PrefixText 7@ Color 8@ PrefixColor 9@
        0AC8: 10@ = allocate_memory_size 1024
        0AD3: 10@ = format "SMS from" // text from chat to check
        if 0AB1: @IfTextContains 2 String1 6@ String2 10@ _Returned: Text 11@
        then
            if 12@ < 28 // if sound volume is less than 28 than set volume to 28
            then
                0A8C: writeMem 0xBA6797 sz 1 vl 28 vp 0 // set sound volume: min - 0, max - 64
            end
            03D1: play_wav 1 // run sound
        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@

:GetLastSentTextFromChatBox
{
    0AB1: @GetLastSentTextFromChatBox 1 SampVersionID 5 _Returned: Command 0@ Text 1@
}
IF 0AA2: 31@ = "samp.dll"
THEN    
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 30@ = 31@ + 0x21A0B8 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
        0A8E: 30@ = 31@ + 0x21A0F0 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 3 // 0.3.DL
    THEN
        0A8E: 30@ = 31@ + 0x2ACA14 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 30@ = 31@ + 0x26E8CC // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 30@ = 31@ + 0x26E9FC // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END
END
0AB2: 2 29@ 28@

:cmpString1andString2
{
    Example: 0AB1: @cmpString1andString2 2 String1 1@ String2 2@
    In: 0@, 1@ - strings
    Out: result 0/1
}
for 7@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    0A8D: 3@ = read_memory 1@ size 1 virtual_protect 0
    0@ += 1
    1@ += 1
    if 003B: 2@ == 3@
    jf break
    if and
    2@ == 0
    3@ == 0
    then
        0485: return_true
        ret 0
    end
end
059A: return_false
ret 0

:Chatmsg
{
    0AB1: @Chatmsg 3 SampVersionID 0@ text 1@ color 0xFF00FF00
}
IF 0AA2: 31@ = "samp.dll"
THEN
    IF NOT 0@ < 1
    THEN
        IF 0@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0E4            // SAMP_CHAT_INFO_OFFSET (R1)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x64010             // FUNC_ADDTOCHATWND (R1)
        END

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

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

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

        IF 0@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26E9F8            // SAMP_CHAT_INFO_OFFSET (R4)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67BA0             // FUNC_ADDTOCHATWND (R4)
        END
      
        0AA6: call 29@ struct 30@ num_params 5 pop 0 params 0 2@ 0 1@ 8
    END
END
0AB2: 0

:getChatString
{
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatString 2 SampVersionID 3 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@ += 0x21A0E4 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN
        31@ += 0x21A0EC // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END

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

: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@
When i type /chatsound, it says unknown command, and doesnt work
 
Last edited:

Parazitas

God
Staff member
Joined
Jan 2, 2017
Messages
3,161
Solutions
5
Reaction score
894
Location
Lithuania
When i type /chatsound, it says unknown command, and doesnt work

I guess you use R1 , i put wrong pointer at R1
Here's fixed version:

PHP:
{$CLEO .cs}

0000:

REPEAT
WAIT 1000
0A8D: 0@ = readMem 0xC8D4C0 sz 4 vp 0
UNTIL 0@ == 9 // SAMP_IS_READY

0AB1: @get_samp_version_id 0 _returned: id 1@
03CF: load_wav 17802 as 1 // load sound

while true
wait 0

if 0256:   player $PLAYER_CHAR defined
then
    // Command
    0AB1: @GetLastSentTextFromChatBox 1 SampVersionID 1@ _Returned: Command 2@ Text 3@
    0AC8: 4@ = allocate_memory_size 1024
    0AD3: 4@ = format "/chatsound" // format command
    if 0AB1: @cmpString1andString2 2 String1 3@ String2 4@
    then
        0A8C: write_memory 3@ size 1 value 0 virtual_protect 0 // clear last sent text from chatbox aka - anti infinity checking..
        if 31@ == false
        then
            31@ = true
            0AC8: 5@ = allocate_memory_size 1024
            0AD3: 5@ = format "{FFFFFF}ChatSound: {00FF00}ON" // format chat message
            0AB1: @Chatmsg 3 SampVersionID 1@ text 5@ color 0xFF00FF00
        else
            31@ = false
            0AC8: 5@ = allocate_memory_size 1024
            0AD3: 5@ = format "{FFFFFF}ChatSound: {FF0000}OFF" // format chat message
            0AB1: @Chatmsg 3 SampVersionID 1@ text 5@ color 0xFFFF0000
        end
    end
    // end of command
 
   if 31@ == true // if code activated then..
   then
        0A8D: 12@ = readMem 0xBA6797 sz 1 vp 0 // read sound volume
      
        0AC8: 6@ = allocate_memory_size 1024
        0AC8: 7@ = allocate_memory_size 1024
        0AB1: @getChatString 2 SampVersionID 1@ ChatID 99 _Returned: Text 6@ PrefixText 7@ Color 8@ PrefixColor 9@
        0AC8: 10@ = allocate_memory_size 1024
        0AD3: 10@ = format "SMS from" // text from chat to check
        if 0AB1: @IfTextContains 2 String1 6@ String2 10@ _Returned: Text 11@
        then
            if 12@ < 28 // if sound volume is less than 28 than set volume to 28
            then
                0A8C: writeMem 0xBA6797 sz 1 vl 28 vp 0 // set sound volume: min - 0, max - 64
            end
            03D1: play_wav 1 // run sound
        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@

:GetLastSentTextFromChatBox
{
    0AB1: @GetLastSentTextFromChatBox 1 SampVersionID 5 _Returned: Command 0@ Text 1@
}
IF 0AA2: 31@ = "samp.dll"
THEN        
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 30@ = 31@ + 0x21A0E8 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END
 
    IF 0@ == 2 // 0.3.7 R2
    THEN
        0A8E: 30@ = 31@ + 0x21A0F0 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END
 
    IF 0@ == 3 // 0.3.DL
    THEN
        0A8E: 30@ = 31@ + 0x2ACA14 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END
 
    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 30@ = 31@ + 0x26E8CC // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END
 
    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 30@ = 31@ + 0x26E9FC // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END
END
0AB2: 2 29@ 28@

:cmpString1andString2
{
    Example: 0AB1: @cmpString1andString2 2 String1 1@ String2 2@
    In: 0@, 1@ - strings
    Out: result 0/1
}
for 7@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0 
    0A8D: 3@ = read_memory 1@ size 1 virtual_protect 0
    0@ += 1
    1@ += 1
    if 003B: 2@ == 3@
    jf break
    if and
    2@ == 0
    3@ == 0
    then
        0485: return_true
        ret 0
    end
end
059A: return_false
ret 0

:Chatmsg
{
    0AB1: @Chatmsg 3 SampVersionID 0@ text 1@ color 0xFF00FF00
}
IF 0AA2: 31@ = "samp.dll"
THEN
    IF NOT 0@ < 1
    THEN
        IF 0@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0E4            // SAMP_CHAT_INFO_OFFSET (R1)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x64010             // FUNC_ADDTOCHATWND (R1)
        END
  
        IF 0@ == 2 // 0.3.7 R2
        THEN
            0A8E: 30@ = 31@ + 0x21A0EC            // SAMP_CHAT_INFO_OFFSET (R2)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x640E0            // FUNC_ADDTOCHATWND (R2)
        END
  
        IF 0@ == 3 // 0.3.DL
        THEN
            0A8E: 30@ = 31@ + 0x2ACA10            // SAMP_CHAT_INFO_OFFSET (DL)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67650             // FUNC_ADDTOCHATWND (DL)
        END
  
        IF 0@ == 4 // 0.3.7 R3
        THEN
            0A8E: 30@ = 31@ + 0x26E8C8            // SAMP_CHAT_INFO_OFFSET (R3)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67460             // FUNC_ADDTOCHATWND (R3)
        END
  
        IF 0@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26E9F8            // SAMP_CHAT_INFO_OFFSET (R4)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67BA0             // FUNC_ADDTOCHATWND (R4)
        END
        
        0AA6: call 29@ struct 30@ num_params 5 pop 0 params 0 2@ 0 1@ 8
    END
END
0AB2: 0

:getChatString
{
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatString 2 SampVersionID 3 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@ += 0x21A0E4 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN
        31@ += 0x21A0EC // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
  
    IF 0@ == 3 // 0.3.DL
    THEN
        31@ += 0x2ACA10 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 4 // 0.3.7 R3
    THEN
        31@ += 0x26E8C8 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 5 // 0.3.7 R4
    THEN
        31@ += 0x26E9F8 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    0AA3: 31@
END
0AB2: ret 4 30@ 29@ 27@ 24@

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

Invader666

Member
Joined
Jun 3, 2020
Messages
10
Reaction score
1
Location
-
I guess you use R1 , i put wrong pointer at R1
Here's fixed version:

PHP:
{$CLEO .cs}

0000:

REPEAT
WAIT 1000
0A8D: 0@ = readMem 0xC8D4C0 sz 4 vp 0
UNTIL 0@ == 9 // SAMP_IS_READY

0AB1: @get_samp_version_id 0 _returned: id 1@
03CF: load_wav 17802 as 1 // load sound

while true
wait 0

if 0256:   player $PLAYER_CHAR defined
then
    // Command
    0AB1: @GetLastSentTextFromChatBox 1 SampVersionID 1@ _Returned: Command 2@ Text 3@
    0AC8: 4@ = allocate_memory_size 1024
    0AD3: 4@ = format "/chatsound" // format command
    if 0AB1: @cmpString1andString2 2 String1 3@ String2 4@
    then
        0A8C: write_memory 3@ size 1 value 0 virtual_protect 0 // clear last sent text from chatbox aka - anti infinity checking..
        if 31@ == false
        then
            31@ = true
            0AC8: 5@ = allocate_memory_size 1024
            0AD3: 5@ = format "{FFFFFF}ChatSound: {00FF00}ON" // format chat message
            0AB1: @Chatmsg 3 SampVersionID 1@ text 5@ color 0xFF00FF00
        else
            31@ = false
            0AC8: 5@ = allocate_memory_size 1024
            0AD3: 5@ = format "{FFFFFF}ChatSound: {FF0000}OFF" // format chat message
            0AB1: @Chatmsg 3 SampVersionID 1@ text 5@ color 0xFFFF0000
        end
    end
    // end of command

   if 31@ == true // if code activated then..
   then
        0A8D: 12@ = readMem 0xBA6797 sz 1 vp 0 // read sound volume
     
        0AC8: 6@ = allocate_memory_size 1024
        0AC8: 7@ = allocate_memory_size 1024
        0AB1: @getChatString 2 SampVersionID 1@ ChatID 99 _Returned: Text 6@ PrefixText 7@ Color 8@ PrefixColor 9@
        0AC8: 10@ = allocate_memory_size 1024
        0AD3: 10@ = format "SMS from" // text from chat to check
        if 0AB1: @IfTextContains 2 String1 6@ String2 10@ _Returned: Text 11@
        then
            if 12@ < 28 // if sound volume is less than 28 than set volume to 28
            then
                0A8C: writeMem 0xBA6797 sz 1 vl 28 vp 0 // set sound volume: min - 0, max - 64
            end
            03D1: play_wav 1 // run sound
        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@

:GetLastSentTextFromChatBox
{
    0AB1: @GetLastSentTextFromChatBox 1 SampVersionID 5 _Returned: Command 0@ Text 1@
}
IF 0AA2: 31@ = "samp.dll"
THEN       
    IF 0@ == 1 // 0.3.7 R1
    THEN
        0A8E: 30@ = 31@ + 0x21A0E8 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 2 // 0.3.7 R2
    THEN
        0A8E: 30@ = 31@ + 0x21A0F0 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 3 // 0.3.DL
    THEN
        0A8E: 30@ = 31@ + 0x2ACA14 // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 4 // 0.3.7 R3
    THEN
        0A8E: 30@ = 31@ + 0x26E8CC // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END

    IF 0@ == 5 // 0.3.7 R4
    THEN
        0A8E: 30@ = 31@ + 0x26E9FC // CHAT_INPUTBOX_OFFSET
        0A8D: 30@ = readMem 30@ sz 4 vp 0
        0A8E: 29@ = 30@ + 0x14E5 // COMMAND_OFFSET
        0A8E: 28@ = 30@ + 0x1565 // TEXT_OFFSET
    END
END
0AB2: 2 29@ 28@

:cmpString1andString2
{
    Example: 0AB1: @cmpString1andString2 2 String1 1@ String2 2@
    In: 0@, 1@ - strings
    Out: result 0/1
}
for 7@ = 0 to 1024
    0A8D: 2@ = read_memory 0@ size 1 virtual_protect 0
    0A8D: 3@ = read_memory 1@ size 1 virtual_protect 0
    0@ += 1
    1@ += 1
    if 003B: 2@ == 3@
    jf break
    if and
    2@ == 0
    3@ == 0
    then
        0485: return_true
        ret 0
    end
end
059A: return_false
ret 0

:Chatmsg
{
    0AB1: @Chatmsg 3 SampVersionID 0@ text 1@ color 0xFF00FF00
}
IF 0AA2: 31@ = "samp.dll"
THEN
    IF NOT 0@ < 1
    THEN
        IF 0@ == 1 // 0.3.7 R1
        THEN
            0A8E: 30@ = 31@ + 0x21A0E4            // SAMP_CHAT_INFO_OFFSET (R1)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x64010             // FUNC_ADDTOCHATWND (R1)
        END
 
        IF 0@ == 2 // 0.3.7 R2
        THEN
            0A8E: 30@ = 31@ + 0x21A0EC            // SAMP_CHAT_INFO_OFFSET (R2)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x640E0            // FUNC_ADDTOCHATWND (R2)
        END
 
        IF 0@ == 3 // 0.3.DL
        THEN
            0A8E: 30@ = 31@ + 0x2ACA10            // SAMP_CHAT_INFO_OFFSET (DL)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67650             // FUNC_ADDTOCHATWND (DL)
        END
 
        IF 0@ == 4 // 0.3.7 R3
        THEN
            0A8E: 30@ = 31@ + 0x26E8C8            // SAMP_CHAT_INFO_OFFSET (R3)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67460             // FUNC_ADDTOCHATWND (R3)
        END
 
        IF 0@ == 5 // 0.3.7 R4
        THEN
            0A8E: 30@ = 31@ + 0x26E9F8            // SAMP_CHAT_INFO_OFFSET (R4)
            0A8D: 30@ = readMem 30@ sz 4 vp 0     // pChat;
            0A8E: 29@ = 31@ + 0x67BA0             // FUNC_ADDTOCHATWND (R4)
        END
       
        0AA6: call 29@ struct 30@ num_params 5 pop 0 params 0 2@ 0 1@ 8
    END
END
0AB2: 0

:getChatString
{
    0AC8: 0@ = allocate_memory_size 260
    0AC8: 1@ = allocate_memory_size 260
    0AB1: @getChatString 2 SampVersionID 3 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@ += 0x21A0E4 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 2 // 0.3.7 R2
    THEN
        31@ += 0x21A0EC // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
 
    IF 0@ == 3 // 0.3.DL
    THEN
        31@ += 0x2ACA10 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 4 // 0.3.7 R3
    THEN
        31@ += 0x26E8C8 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    IF 0@ == 5 // 0.3.7 R4
    THEN
        31@ += 0x26E9F8 // SAMP_CHAT_INFO_OFFSET
        0A8D: 31@ readMem 31@ sz 4 vp 0
        31@ += 0x132
        1@ *= 0xFC
        005A: 31@ += 1@
        0A8E: 30@ = 31@ + 0x20 // CHAT_TEXT_OFFSET
        0A8E: 29@ = 31@ + 0x4 // CHAT_PREFIX_TEXT_OFFSET
        0A8E: 28@ = 31@ + 0xF4 // CHAT_COLOR_OFFSET
        0A8D: 27@ readMem 28@ sz 4 vp 0 // HEX Color
        0A8E: 26@ = 31@ + 0xF8 // CHAT_PREFIX_COLOR_OFFSET
        0A8D: 25@ readMem 26@ sz 1 vp 0
        IF NOT 25@ > 0
        THEN 24@ = 0
        ELSE 0A8D: 24@ readMem 26@ sz 4 vp 0
        END
    END
    0AA3: 31@
END
0AB2: ret 4 30@ 29@ 27@ 24@

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

It still doesn't work, it says "Unknown Command" when i type /chatsound. I use SA:MP 0.3.7-R2
 
Top