Мы не хотим заставлять пользователя ждать, пока сообщение начнёт вещаться с начала. Поэтому делаем не через музыкальный канал.
Мы хотим чтобы второй пришедший на парсел пользователь тоже мог прослушать сообщение, поэтому будем запускать медиа скриптом длякаждого пришедшего пользователя.
Самый простой вариант: детектим автаров сенсором и запускаем медиа.
Но при каждом вызове сенсора, он будет возвращать не новых аватаров, а всех. Т.о. медиа будет перезапускаться у всех, кто пришел на парсел.
Значит строим очередь и заносим в неё тех, для кого мы уже запускали медиа.
Т.к. запуск медиа не моментальный процесс (~5сек. задержки скрипта * количество запусков), за это время на парсел может придти больше одного аватара. Значит вновь пришедших также нужно будет собрать в очередь. Эта очередь получится сравнением списка аватаров, который возвращает сенсор и списка тех, кто уже находится на парселе и слушает.
Общую очередь имеет смысл вынести в глобальную переменную, чтобы она не терялась между вызовами сенсора. Другие переменные сохранять не требуется.
Чтобы гарантированно запустить информатор, перед запуском выполним остановку воспроизведения, чего-бы там ни было.
list gListeners;
default
{
state_entry()
{
llSensorRepeat("", NULL_KEY, AGENT, 2, PI, 1);
}
sensor(integer total_number)
{
key listener;
list areHere;
list newListeners;
for(integer i; i < total_number; i++)
{
listener = llDetectedKey(i);
areHere += [(string)listener];
if(llListFindList(gListeners, [(string)listener]) != -1)
{
newListeners += [(string)listener];
}
}
integer newListenersLength = llGetListLength(newListeners);
for(integer j; j < newListenersLength; j++)
{
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AGENT, llList2Key(newListeners, j), PARCEL_MEDIA_COMMAND_STOP]);
llSleep(0.1);
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_AGENT, llList2Key(newListeners, j), PARCEL_MEDIA_COMMAND_PLAY]);
}
gListeners = areHere;
}
}









