хочу сделать музыку в авто, но чтобы и слышали люди рядом, как проезжаешь (как на аризоне), поможете реализовать?
[ Pawn ]
radio car
#2
Отправлено 24 января 2023 - 21:32

BALLUN (24 января 2023 - 19:42) писал:
хочу сделать музыку в авто, но чтобы и слышали люди рядом, как проезжаешь (как на аризоне), поможете реализовать?
Хз как на аризоне, ибо в самп не играю. Но, исходя описанного можно замутить цикл, перебирая всех игроков, проверяя, есть ли они в стриме у определённого игрока и тогда уж, если так есть, то проигрывать музыку, сохраненную в переменной игрока. Ну или если нужна прям дистанция конкретная между игроками, то тогда также цикл, но уже стоит проверять n игрока, на какой дистанции к игроку он находится, используя IsPlayerInRangeOfPoint(n игрока, дистанция, позиция). Логику работы расписал. Сейчас немного занят, если тебе не предоставят готовый вариант, то я позже закину
Сообщение отредактировал Perdolinka: 24 января 2023 - 21:33
#3
Отправлено 24 января 2023 - 22:11

new bool: pSoundCar[MAX_PLAYERS] = {false, false, ...}; new ptd_timer[MAX_PLAYERS]; #if defined music_car_pos #undef music_car_pos #endif #define music_car_pos 50.0 CMD:radio(playerid) { if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, -1, !"Вы должны находиться за местом водителя в автомобиле!"); if(pSoundCar[playerid] == true) { DeletePVar(playerid, "MusicInCar"); return SendClientMessage(playerid, -1, !"Вы успешно выключили радио!"); } //Пример любой музыки: pSoundCar[playerid] = true; SetPVarString(playerid, "MusicInCar","ссылка"); return ptd_timer[playerid] = SetTimerEx("Music", 1000, true, "i", playerid); } @__Music(playerid) { new Float:x, Float:y, Float:z; new Float:target_x, Float:target_y, Float:target_z; GetPlayerPos(playerid, x,y,z); for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++) { if(pSoundCar[i] == true) continue; GetPlayerPos(i, target_x, target_y, target_z); if(!IsPlayerInRangeOfPoint(i, music_car_pos , x,y,z) { StopAudioStreamForPlayer(i); break; } else { new music_string[40]; GetPVarString(playerid, "Music", music_string, sizeof music_string); PlayAudioStreamForPlayer(i, music_string, x,y,z, music_car_pos , true); break; } } return true; }Возможно не будет работать, не проверял
Сообщение отредактировал 21th year: 24 января 2023 - 22:53
#4
Отправлено 24 января 2023 - 22:36

21th year (24 января 2023 - 22:11) писал:
Нажмите сюда, чтобы прочитать это сообщение. [Показать]
Pa4enka Pawn Compiler v1.0.1 log.
(13) error 029: invalid expression, assumed zero
(41) error 029: invalid expression, assumed zero
(41) error 008: must be a constant expression; assumed zero
(41) error 001: expected token: ",", but found ";"
(41) fatal error 107: too many error messages on one line
#8
Отправлено 24 января 2023 - 22:50

Pa4enka Pawn Compiler v1.0.1 log.
(13) error 029: invalid expression, assumed zero
upd: not errors.
(13) error 029: invalid expression, assumed zero
upd: not errors.
Сообщение отредактировал Pa4enka: 24 января 2023 - 22:56
#9
Отправлено 25 января 2023 - 11:58

#if !defined MAX_AUDIO_STREAM_LEN #define MAX_AUDIO_STREAM_LEN (40) #endif #if !defined INVALID_TIMER_ID #define INVALID_TIMER_ID (-1) #endif #if !defined GetPlayerSecondTimerID #define GetPlayerSecondTimerID(%0) g_player_second_timer[%0] #endif #if !defined SetPlayerSecondTimerID #define SetPlayerSecondTimerID(%0,%1) g_player_second_timer[%0] = %1 #endif new g_player_second_timer[MAX_PLAYERS] = {INVALID_TIMER_ID, ...}; new g_player_audio_stream[MAX_PLAYERS][MAX_AUDIO_STREAM_LEN] = {{EOS, ...}, ...}; stock IsTimerValid(timerid) return (timerid != INVALID_TIMER_ID); stock IsStreamLenValid(const stream[MAX_AUDIO_STREAM_LEN]) { if((strlen(stream) >= MAX_AUDIO_STREAM_LEN) || (sizeof stream != sizeof g_player_audio_stream[])) return 0; return 1; } stock GetPlayerAudioStream(playerid, const stream[MAX_AUDIO_STREAM_LEN], size = sizeof stream) { if(size != sizeof g_player_audio_stream[]) return 0; format ( stream, size, "%s", g_player_audio_stream[playerid] ); if(strlen(stream) == strlen(g_player_audio_stream[playerid])) return 1; } stock SetPlayerAudioStream(playerid, const stream[MAX_AUDIO_STREAM_LEN]) { if(!IsStreamLenValid(stream)) return 0; format ( g_player_audio_stream[playerid], sizeof g_player_audio_stream[], "%s", stream ); if(strlen(g_player_audio_stream[playerid]) == strlen(stream)) return PlayAudioStreamForPlayer(playerid, stream); } stock SetPlayerAudioStreamEx(playerid, const stream[MAX_AUDIO_STREAM_LEN]) { if(IsForeachRepresent()) { foreach(new idx : Player) { if(!IsPlayerStreamedIn(idx, playerid)) continue; if(SetPlayerAudioStream(idx, buffer) != 0) SendClientMessage(idx, "Вы вошли в зону проигрывания"); } } else { for(new idx, size = GetPlayerPoolSize(); idx <= size; idx ++) { if(!IsPlayerStreamedIn(idx, playerid)) continue; if(SetPlayerAudioStream(idx, buffer) != 0) SendClientMessage(idx, "Вы вошли в зону проигрывания"); } } return 1; } stock IsPlayerAudioStreamValid(playerid) { new buffer[sizeof g_player_audio_stream[]]; if(GetPlayerAudioStream(playerid, buffer) != 0) return 1; return 0; } stock StopPlayerAudioStream(playerid, bool: is_owner = true) { new result = SetPlayerAudioStream(playerid, EOS); if(result) { StopAudioStreamForPlayer(playerid); SendClientMessage ( playerid, -1, is_owner ? ("Вы успешно остановили потоковую передачу") : ("Игрок, инициировавший потоковую передачу, завершил её") ); return result; } stock IsForeachRepresent() { #if defined foreach return 1; #else return 0; #endif } stock IsPlayerAudioStreamEqualTo(playerid, const stream[MAX_AUDIO_STREAM_LEN]) { new buffer[sizeof g_player_audio_stream[]]; GetPlayerAudioStream(playerid, buffer); return (!strcmp(buffer, stream)); } stock GetCountOfPlayersByStream(const stream[MAX_AUDIO_STREAM_LEN]) { new count; if(IsForeachRepresent()) { foreach(new idx : Player) { if(!IsPlayerAudioStreamEqualTo(idx, stream)) continue; count ++; } } else { for(new idx, size = GetPlayerPoolSize(); idx <= size; idx ++) { if(!IsPlayerAudioStreamEqualTo(idx, stream)) continue; count ++; } } return count; } stock StopPlayerAudioStreamByStream(const stream[MAX_AUDIO_STREAM_LEN], count) { new count_ex; if(IsForeachRepresent()) { foreach(new idx : Player) { if(!IsPlayerAudioStreamEqualTo(idx, stream)) continue; StopPlayerAudioStream(playerid, false); count_ex ++; if(count_ex == count) break; } } else { for(new idx, size = GetPlayerPoolSize(); idx <= size; idx ++) { if(!IsPlayerAudioStreamEqualTo(idx, stream)) continue; StopPlayerAudioStream(playerid, false); count_ex ++; if(count_ex == count) break; } } return (count_ex == count); } stock SendStopAudioStreamMessage(playerid, result, count) { new fmt_str[] = { "Вы остановили потоковую"\ " передачу для %s(%d игроков)" }, result_str[sizeof fmt_str + (- 2 + 4) + (- 2 + 3)]; format ( result_str, sizeof result_str, fmt_str, result ? ("всех") : ("не всех"), count ); return SendClientMessage(playerid, -1, result_str); } @__OnPlayerStopAudioStream(playerid); @__OnPlayerStopAudioStream(playerid) { new buffer[sizeof g_player_audio_stream[]]; GetPlayerAudioStream(playerid, buffer); StopPlayerAudioStream(playerid); if(buffer[0] != EOS) { new count = GetCountOfPlayersByStream(buffer), result = StopPlayerAudioStreamByStream(buffer, count); return SendStopAudioStreamMessage(playerid, result, count); } return 1; } cmd:play(playerid, const params[]) { if(IsPlayerAudioStreamValid(playerid)) return @__OnPlayerStopAudioStream(playerid); if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, -1, "Вы должны находиться в ТС"); extract params -> new stream[40]; else return SendClientMessage(playerid, -1, "play [stream]"); if(!strlen(stream)) return SendClientMessage(playerid, -1, "Вы ничего не ввели"); /* example stream: https://zalupen123.com/xueta123.mp3 */ if(SetPlayerAudioStream(playerid, stream) != 0) return SendClientMessage(playerid, -1, "Поток успешно установлен"); return 1; } stock InitPlayerSecondTimer(playerid) { new timerid = SetTimerEx ( "@__OnPlayerSecondTimer", 1_000, 1, "d", playerid ); return SetPlayerSecondTimerID(playerid, timerid); } stock KillPlayerSecondTimer(playerid) { new timerid = GetPlayerSecondTimerID(playerid); if(IsTimerValid(timerid)) return KillTimer(timerid); return 1; } public OnPlayerConnect(playerid) { InitPlayerSecondTimer(playerid); return 1; } public OnPlayerDisconnect(playerid, reason) { KillPlayerSecondTimer(playerid); return 1; } @__OnPlayerSecondTimer(playerid); @__OnPlayerSecondTimer(playerid) { if(IsPlayerAudioStreamValid(playerid)) { new buffer[sizeof g_player_audio_stream[]]; GetPlayerAudioStream(playerid, buffer); SetPlayerAudioStreamEx(playerid, buffer); } return 1; }

#10
Отправлено 25 января 2023 - 16:00

А почему-бы не использовать динамические зоны стримера? Их же можно прикреплять к игроку/объекту/транспорту и ловить все входы через OnPlayerEnterDynamicArea. Так-же можно использовать итераторы foreach:
Я думаю иметь streamer и foreach и писать дубликаты их реализаций не очень хорошая идея)
#define FOREACH_I_PlayerPlayersStream 1 foreach(new i:PlayerPlayersStream[playerid]) { }
Я думаю иметь streamer и foreach и писать дубликаты их реализаций не очень хорошая идея)
Сообщение отредактировал punkochel: 25 января 2023 - 16:01