br∪no
Умник
Online-радио в машине и снаружи в пределах 8 метров.
Снаружи радио играет относительно координат автомобиля, поэтому громкость будет становится меньше по мере отдаления от тс.
Используется динамическая зона которую закрепляем за транспортом, благодаря чему не используем циклов и таймеров в коде.
Запуск радио: /play
! Дистанцию в 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;
}
Автор: бруноНе тестировал с другими игроками, если будет неправильное срабатывание - пишите, исправлю.
Последнее редактирование:
