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

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

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

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

Мануал Онлайн радио в машине и снаружи

br∪no

Умник
Online-радио в машине и снаружи в пределах 8 метров.
Снаружи радио играет относительно координат автомобиля, поэтому громкость будет становится меньше по мере отдаления от тс.

Используется динамическая зона которую закрепляем за транспортом, благодаря чему не используем циклов и таймеров в коде.

Запуск радио: /play


! Дистанцию в 8 метров можно изменить на большую, но тогда больше вероятность, что ваше радио будет перебивать другая машина с включенным радио поблизости.

C++:
const
  RADIO_MAX_LENGTH_URL = 128,
  RADIO_MAX_LENGTH_GENRE = 14,
  RADIO_MAX_LENGTH_NAME = 24;

enum e_CAR_RADIO { station, STREAMER_TAG_AREA:dyn_area }
enum e_RADIO { name[RADIO_MAX_LENGTH_NAME], genre[RADIO_MAX_LENGTH_GENRE], url[RADIO_MAX_LENGTH_URL] }

new radioStation[][e_RADIO] = {
  {"", "", ""},
  {"Vega", "Рок", "http://stream.vegaradio.ru:8000/;?type=http&nocache=46965"},
  {"Chocolate", "Кавер-радио","http://choco.hostingradio.ru:10010/fm"}
};

new vehicleRadio[MAX_VEHICLES][e_CAR_RADIO];

CMD:stop(playerid) {
  if(!IsPlayerInAnyVehicle(playerid)  && GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    return 1;
  new vehicleID = GetPlayerVehicleID(playerid);
  if(vehicleRadio[vehicleID][station]) {
    vehicleRadio[vehicleID][station] = 0;
    StopAudioStreamForPlayer(playerid);
    DestroyDynamicArea(vehicleRadio[vehicleID][dyn_area]);
    return SendClientMessage(playerid, -1, "Ты отключил радио в машине!");
  } else SendClientMessage(playerid, -1, "В машине не включено радио!");


  return 1;
}
CMD:play(playerid, params[]) {

  if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
    return 1;


  new str[42 + (RADIO_MAX_LENGTH_NAME + RADIO_MAX_LENGTH_GENRE + RADIO_MAX_LENGTH_URL) * sizeof radioStation - 1];

  extract params -> new select_station; else {
    for(new r = 1; r < sizeof radioStation; r++)
      format(str, sizeof str, "%s{ffffff}ID '%d': Радио '%s' Жанр: %s\n", str, r, radioStation[r][name], radioStation[r][genre]);

    format(str, sizeof str, "%s\n\nИспользуй: /play [ID станции]", str);
    return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, #Радио, str, #Принять, #);
  }

  if(select_station > sizeof radioStation || 0 == select_station)
    return SendClientMessage(playerid, -1, "Неверный ID радио!");

  new vehicleID = GetPlayerVehicleID(playerid);

  vehicleRadio[vehicleID][station] = select_station;

  if(!vehicleRadio[vehicleID][dyn_area]) {
    new Float:X, Float:Y, Float:Z;
    GetVehiclePos(vehicleID, X, Y, Z);

    vehicleRadio[vehicleID][dyn_area] = CreateDynamicSphere(X, Y, Z, 8.0);
    AttachDynamicAreaToVehicle(vehicleRadio[vehicleID][dyn_area], vehicleID);
  }


  //
  PlayAudioStreamForPlayer(playerid, radioStation[vehicleRadio[vehicleID][station]][url]);
  //

  format(str, sizeof str, "Вы выбрали радиостанцию {daae1b}%s (%s)", radioStation[station][name], radioStation[station][genre]);
  return SendClientMessage(playerid, -1, str);
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
  if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER) {
    new vehicleID = GetPlayerVehicleID(playerid);
    if(vehicleRadio[vehicleID][station]) {
      StopAudioStreamForPlayer(playerid);
      PlayAudioStreamForPlayer(playerid, radioStation[vehicleRadio[vehicleID][station]][url]);
    }
  }
  return 1;
}


public OnPlayerEnterDynamicArea(playerid, STREAMER_TAG_AREA:areaid) {
    new vehicleID = Streamer_GetIntData(STREAMER_TYPE_AREA, areaid, E_STREAMER_ATTACHED_VEHICLE);

    if (!IsPlayerInAnyVehicle(playerid) && vehicleID != INVALID_VEHICLE_ID) {
        if(0 == vehicleRadio[vehicleID][station])
          return 1;

        new Float:X, Float:Y, Float:Z;
        //
        StopAudioStreamForPlayer(playerid);
        //
        GetVehiclePos(vehicleID, X, Y, Z);
        PlayAudioStreamForPlayer(playerid, radioStation[vehicleRadio[vehicleID][station]][url], X, Y, Z, 8.0, 1);
    }
    return 1;
}

public OnPlayerLeaveDynamicArea(playerid, STREAMER_TAG_AREA:areaid) {

    new vehicleID = Streamer_GetIntData(STREAMER_TYPE_AREA, areaid, E_STREAMER_ATTACHED_VEHICLE);
    if (vehicleID != INVALID_VEHICLE_ID && vehicleRadio[vehicleID][station]) {
        StopAudioStreamForPlayer(playerid);
    }
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
  if(vehicleRadio[vehicleid][dyn_area])
    DestroyDynamicArea(vehicleRadio[vehicleid][dyn_area]);

  return 1;
}
public OnVehicleDeath(vehicleid, killerid)
{
  if(vehicleRadio[vehicleid][dyn_area])
    DestroyDynamicArea(vehicleRadio[vehicleid][dyn_area]);

  return 1;
}
Не тестировал с другими игроками, если будет неправильное срабатывание - пишите, исправлю.
Автор: бруно
 
Последнее редактирование:
Сверху Снизу