Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Система онлайн-радио

oxygenium

Изучающий
Professional
Пользователь
Регистрация
5 Ноя 2013
Сообщения
957
Лучшие ответы
18
Репутация
445
Награды
3
Игрок садится в автомобиль и прописывает /radio, или что угодно на ваш выбор. Выбирает и включает радиостанцию. Все пассажиры, которые уже в машине, или которые садятся внутрь слышат эту же радиостанцию, которую слушает водитель.

Для начала создадим переменную для синхронизации радио между водителем и пассажирами. В ней будет хранится номер радиостанции.

C++:
new radioWave[MAX_VEHICLES];
Затем создадим массив с названиями радиостанций, жанрами и ссылками на аудиопоток.

C++:
enum RADIOSTATIONS
{
    name[24],
    url[128],
    genre[32]
}

new radio[][RADIOSTATIONS] = {
    { "Выключить радио", "", "" },
    { "181 Awesome 80's", "https://listen.181fm.com/181-awesome80s_128k.mp3", "Pop, 80's" },
    { "977 Hitsradio", "https://19763.live.streamtheworld.com/977_HITS.mp3", "Pop, Rock" },
    { "BigR", "https://bigrradio.cdnstream1.com/5181_128", "Pop, 70's, 80's" },
    { "2000FM", "https://bigrradio.cdnstream1.com/5104_128", "Rock, Hard-rock" },
    { "GrungeFM", "https://bigrradio.cdnstream1.com/5200_128", "Rock, Punk, Alternative" },
    { "977 Alternative", "https://19763.live.streamtheworld.com/977_ALTERN.mp3", "Alternative, Rock, Electro" },
    { "BeGoodRadio", "https://bigrradio.cdnstream1.com/5212_128 ", "Heavy-metal, Rock, 80's" },
    { "Power88", "https://ice7.securenetsystems.net/KCEP", "Hip-hop" },
    { "HotFM", "https://19493.live.streamtheworld.com/KVEGFMAAC.aac", "Hip-hop" },
    { "Miami Beach Radio", "https://streaming.radiostreamlive.com/miamibeachradio_devices", "Hip-hop, House, Pop" },
    { "Groovesalad", "https://ice3.somafm.com/groovesalad-128-mp3", "Chillout" },
    { "181 Chilled", "https://listen.181fm.com/181-chilled_128k.mp3 ", "Chillout" },
    { "Drone Zone", "https://ice.somafm.com/dronezone", "Ambient, Chillout" },
    { "Radio Paradise", "https://stream.radioparadise.com/aac-320 ", "Pop, Indie" },
    { "KCRW Music", "https://kcrw.streamguys1.com/kcrw_192k_mp3_e24_internet_radio ", "Alternative, Pop, Electro" },
    { "Indie Pop Rocks", "https://ice.somafm.com/indiepop ", "Alternative, Pop, Rock" },
    { "WFNX", "https://crystalout.surfernetwork.com:8001/WEQX_MP3 ", "Alternative, Rock" },
    { "Soma FM", "https://ice2.somafm.com/bagel-32-aac", "Indie, Rock, Alternative" },
    { "FellGood Folk", "https://edge1-b.exa.live365.net/a60822", "Country, Indie" }
};
Затем нам нужно создать переменную, которая бы хранила в себе весь список этих радиостанций в виде строки для отображения в диалоге.

C++:
new radiostring[600+1];
Теперь нам нужно записать в эту переменную все радиостанции. Сделаем мы это 1 раз, чтобы каждый раз при вызове диалога не пересоздавать переменные. Сделаем мы это в OnGameModeInit()

C++:
    new radiosinglestring[128];
    for(new i = sizeof(radio)-1; i != -1; --i)
    {
        format(radiosinglestring, sizeof(radiosinglestring), "\n%s\t%s", radio[i][name], radio[i][genre]);
        strins(radiostring, radiosinglestring, 0);
    }
    strins(radiostring, "Радиостанция\tЖанр", 0);
Тут мы циклом прошлись по массиву, и каждую ячейку записали в строку. Далее добавляйте в удобное для вас место (по команде, по кнопке и т.д.). Не забудьте поменять ID диалога на свой.

C++:
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) return ShowPlayerDialog(playerid, DIALOG_CAR_RADIO, DIALOG_STYLE_TABLIST_HEADERS, "Радио", radiostring,"Выбрать", "Отмена");
Предпоследнее, что нам нужно сделать - это добавить действия по диалогу, для этого в OnDialogResponse() вставляем следующее, не забываем менять ID диалога

C++:
if(dialogid == DIALOG_CAR_DADIO)
{
    if(response)
    {
        new playerState = GetPlayerState(playerid);
        if(playerState == PLAYER_STATE_DRIVER)
        {
            new vehicleid = GetPlayerVehicleID(playerid);
            if(listitem == 0)
            {
                SendClientMessage(playerid, -1, "Вы отключили радио");
                for(new i = GetPlayerPoolSize(); i != -1; --i)
                {
                    if(!IsPlayerConnected(i)) continue;
                    if(!IsPlayerInVehicle(i, vehicleid)) continue;
                    StopAudioStreamForPlayer(i);
                }
            }
            else
            {
                if(radioWave[vehicleid] == 0) { SendClientMessage(playerid, -1, "Вы включили радио"); }
                else { SendClientMessage(playerid, -1, "Вы сменили волну"); }
                for(new i = GetPlayerPoolSize(); i != -1; --i)
                {
                    if(!IsPlayerConnected(i)) continue;
                    if(!IsPlayerInVehicle(i, vehicleid)) continue;
                    PlayAudioStreamForPlayer(i, radio[listitem][url]);
                }
            }
            radioWave[vehicleid] = listitem;
        }
        else SendClientMessage(playerid, -1, "Вы должны быть в атомобиле");       
    }
}
Если игрок в автомобиле и включает какую-нибудь радиостанцию, циклом подбираются игроки, которые так же находятся в одной машине с игроком. По такому же принципу работает отключение радио. Так же номер радиостанции записывается в переменную radioWave[], которая поможет нам в дальнейшей синхронизации. Данная переменная будет закреплена за конкретным автомобилем. Когда игрок выходит из автомобиля, аудиострим прекращается. Когда он садится назад, мы берем номер радиостанции из этой переменной и включаем нужный аудиострим. Тот же принцип и с пассажирами. В OnPlayerStateChange() добавляем следующий код:

C++:
    if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
    {
        new vehicleid = GetPlayerVehicleID(playerid);
        if(radioWave[vehicleid] != 0) return PlayAudioStreamForPlayer(playerid, radio[radioWave[vehicleid]][url]);
    }
    if(oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) // Player entered a vehicle as a driver
    {
        StopAudioStreamForPlayer(playerid);
    }
На этом все. Систему вырезал со своего мода.
 
Последнее редактирование:
Сверху Снизу