Форум Pawn.Wiki - Воплоти мечту в реальность!: radio car - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Pawn ]
radio car

#1
Пользователь офлайн   BALLUN 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
хочу сделать музыку в авто, но чтобы и слышали люди рядом, как проезжаешь (как на аризоне), поможете реализовать?
0

#2
Пользователь офлайн   Perdolinka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияBALLUN (24 января 2023 - 19:42) писал:

хочу сделать музыку в авто, но чтобы и слышали люди рядом, как проезжаешь (как на аризоне), поможете реализовать?

Хз как на аризоне, ибо в самп не играю. Но, исходя описанного можно замутить цикл, перебирая всех игроков, проверяя, есть ли они в стриме у определённого игрока и тогда уж, если так есть, то проигрывать музыку, сохраненную в переменной игрока. Ну или если нужна прям дистанция конкретная между игроками, то тогда также цикл, но уже стоит проверять n игрока, на какой дистанции к игроку он находится, используя IsPlayerInRangeOfPoint(n игрока, дистанция, позиция). Логику работы расписал. Сейчас немного занят, если тебе не предоставят готовый вариант, то я позже закину

Сообщение отредактировал Perdolinka: 24 января 2023 - 21:33

0

#3
Пользователь офлайн   21th year 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
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

0

#4
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщения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
0

#5
Пользователь офлайн   21th year 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (24 января 2023 - 22:36) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Кинь 41 плиз
0

#6
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщения21th year (24 января 2023 - 22:40) писал:

Кинь 41 плиз

GetPVarString(playerid, "Music", music_string, sizeof music_string);
0

#7
Пользователь офлайн   21th year 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (24 января 2023 - 22:47) писал:

GetPVarString(playerid, "Music", music_string, sizeof music_string);

исправил
upd x2

Сообщение отредактировал 21th year: 24 января 2023 - 22:52

0

#8
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Pa4enka Pawn Compiler v1.0.1 log.

(13) error 029: invalid expression, assumed zero

upd: not errors.

Сообщение отредактировал Pa4enka: 24 января 2023 - 22:56

0

#9
Пользователь офлайн   Perdolinka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
#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;
}


:biggrin:
2

#10
Пользователь офлайн   punkochel 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
А почему-бы не использовать динамические зоны стримера? Их же можно прикреплять к игроку/объекту/транспорту и ловить все входы через OnPlayerEnterDynamicArea. Так-же можно использовать итераторы foreach:
#define FOREACH_I_PlayerPlayersStream 1
foreach(new i:PlayerPlayersStream[playerid]) {

}


Я думаю иметь streamer и foreach и писать дубликаты их реализаций не очень хорошая идея)

Сообщение отредактировал punkochel: 25 января 2023 - 16:01

1

Поделиться темой:


  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика