PHP Code:
#include <amxmodx>
#define NOT_SELECTED_SONG -1
new const PLUGIN[] = "Song Menu",
AUTHOR[] = "Your Name",
VERSION[]= "1.0";
enum _:SongData
{
szSongName[64],
szPath[64]
}
new g_iUserSongID[MAX_PLAYERS + 1];
new const g_szSongs[][SongData] =
{
//SONG NAME FOR MENU //SONG PATH FOR PRECACHE AND EMIT
{"First Song", "sounds/misc/song1.wav"}, // song id = 0
{"Second Song", "sounds/misc/song2.wav"}, // song id = 1
{"3th Song", "sounds/misc/song3.wav"}, // song id = 2
{"4h Song", "sounds/misc/song4.wav"}, // song id = 3... so on
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /menu", "cmdMenu");
register_clcmd("say_team /menu", "cmdMenu");
register_clcmd("say /emit", "emitSong");
register_clcmd("say_team /emit", "emitSong");
}
public plugin_precache()
{
for(new i; i < sizeof(g_szSongs); i++)
{
if(file_exists(g_szSongs[i][szPath]))
precache_generic(g_szSongs[i][szPath]); //WE USE PRECACHE_GENERIC TO AVOID REACHING OF 512 RESOURCE LIMIT
}
}
public client_authorized(id)
{
if(is_user_bot(id) || is_user_hltv(id))
return PLUGIN_CONTINUE;
//LET SET PLAYER SONG ID VARIABLE TO -1 SO HE MUST SELECT A SONG
g_iUserSongID[id] = NOT_SELECTED_SONG;
return PLUGIN_CONTINUE;
}
public cmdMenu(id)
{
new iMenu = menu_create("\r[SONGS]\w Playlist", "main_menu_handler");
for(new i; i < sizeof(g_szSongs); i++)
{
menu_additem(iMenu, g_szSongs[i][szSongName], g_szSongs[i][szPath]); //LET'S PARSE SONG PATH TO EMIT IT AFTER SELECT IT IN MENU
}
menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL);
if(is_user_connected(id))
menu_display(id, iMenu, 0, -1);
}
public main_menu_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new szParsedSongPath[64], szSong[64];
menu_item_getinfo(menu, item, _, szParsedSongPath, charsmax(szParsedSongPath), szSong, charsmax(szSong), _); //LET'S GET PARSED SONG PATH AND ITEM NAME FROM MENU
g_iUserSongID[id] = item; //MENU ITEM = SONG ID: THAT MEANS IF HE PRESS 1 AND SELECT FIRST SONG, THE SONG ID WILL BE 0
client_print(id, print_chat, "[SONGS] Your song is %s", szSong);
emit_sound(id, CHAN_AUTO, szParsedSongPath, VOL_NORM, ATTN_NORM, 0, PITCH_NORM); //LET'S EMIT THE SELECTED SONG
cmdMenu(id);
return PLUGIN_CONTINUE;
}
public emitSong(id)
{
static iSongID;
iSongID = g_iUserSongID[id] //LET'S GET PLAYER SONG ID IN A STATIC VARIABLE ASSUMING THAT FUNCTION IS USED FREQUENTLY
if(iSongID == NOT_SELECTED_SONG) //IF PLAYER HASN'T SELECTED A SONG HE CAN'T EMIT IT
{
client_print(id, print_chat, "[SONGS] You must select a song");
return PLUGIN_HANDLED;
}
emit_sound(id, CHAN_AUTO, g_szSongs[iSongID][szPath], VOL_NORM, ATTN_NORM, 0, PITCH_NORM); //LET'S EMIT THE PLAYER SONG USING THAT GLOBAL VARIABLE WHERE WE HAVE PLAYLIST
client_print(id, print_chat, "[SONGS] You emit song %s", g_szSongs[iSongID][szSongName]);
return PLUGIN_HANDLED;
}
i hope this will help you. i don't know if that plugin works or is what you need, but in emit_sound syntax at sample parameter you must put the song path that you want to emit. in the above code i was trying to show you how it should look.
and there already is a plugin that is doing a great job and get s updates when it needs:
https://forums.alliedmods.net/showthread.php?p=2117299