Jump to content


Работа с очередями на примере голосового информатора


  • Please log in to reply
No replies to this topic

#1 SOb Zemlja

SOb Zemlja

    Активный участник

  • Главные администраторы
  • PipPipPipPip
  • 801 posts
  • Пол:М
  • Откуда:Россия, Москва
  • Основной цех:Строители
  • Второй цех:Скриптеры
  • SL Status: 

Posted 19.04.09 - 17:27

Задача: при прохождении пользователем определённого места, запустить голосовой информатор (рассказать что-то через медиа-канал на парселе).
Мы не хотим заставлять пользователя ждать, пока сообщение начнёт вещаться с начала. Поэтому делаем не через музыкальный канал.
Мы хотим чтобы второй пришедший на парсел пользователь тоже мог прослушать сообщение, поэтому будем запускать медиа скриптом длякаждого пришедшего пользователя.

Самый простой вариант: детектим автаров сенсором и запускаем медиа.
Но при каждом вызове сенсора, он будет возвращать не новых аватаров, а всех. Т.о. медиа будет перезапускаться у всех, кто пришел на парсел.
Значит строим очередь и заносим в неё тех, для кого мы уже запускали медиа.
Т.к. запуск медиа не моментальный процесс (~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;
	}
}





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users