Часто бывает так: приходишь куда-нибудь, включаешь местное радио (медиа), а там играет нечто приятное, слух ублажающее и душу бередящее. И хочется, ох как хочется узнать, что же это такое играет, какое радио, откуда берется, но... Злой и противный аватар, хозяин земли, подло скрыл ссылку на поток, чтобы никому не досталось, чтобы приходили к нему и только к нему слушать и наслаждаться.
Наверняка же каждый бывал в подобной ситуации, не так ли?
К счастью, по недосмотру или умыслу какому программистов «Linden Lab» есть возможность восстановить попранную справедливость и узнать-таки вожделенный адрес столь волнующего радио. Я даже предложу вам пару способов на выбор - простой и, если он по какой-либо причине не сработает, чуть более сложный, самую малость.
Итак, открываем свойства земли, свойства аудио и - видим знакомую картину.
Теперь берем и нажимаем секретную комбинацию клавиш: Ctrl-Alt-V. Прошу обратить внимание, что эта комбинация сработает только в том случае, если у вас включено advanced-menu¹ (это видно по верхнему меню клиента, там должен быть пункт «Advanced»). Рядом должен появиться пункт «Admin» - значит, все получилось и можно открыть снова свойства земли, вкладку аудио и скопировать открывшийся URL аудиопотока себе.
Вообще включение отображения административных функций клиента даёт ряд дополнительных возможностей, но об этом как-нибудь в другой раз. Если вдруг решите поисследовать их самостоятельно, сразу хочу предупредить, что очень большое количество вновь открывшихся функций работать не будут - для этого нужно иметь фамилию Linden или, на худой конец, быть симовладельцем.
Если по какой-то причине фокус с админскими опциями у вас не получился (может быть, клиент так себя повел, вмешалась третья липовая сила или инопланетяне из космоса хорошо защитили свой аудиопоток от любопытных читателей моего блога - всякое может случиться), то есть немного более сложный способ получить желаемое. Для этого служит другая комбинация клавиш, не менее волшебная.
Жмём Ctrl-Shift-4 и на экране появляется окошко, чуть более, чем полностью набитое чудовищной абракадаброй, которая с приличной скоростью проносится перед глазами.
Теперь не зевайте - тыкайте мышом в кнопку запуска проигрывания музыки и сразу ищите строчки, похожие на те, что я заботливо выделил для вас приятной глазу зелёной рамочкой. Это и есть адрес искомого радиопотока. Скопировать, к сожалению, адрес не удастся, поэтому придется быстренько его куда-нибудь переписать вручную.
Все, теперь можно той же комбинацией клавиш отключить это пугающее окно, вернув экран в привычный глазу вид, глубоко вздохнуть и использовать полученный адрес по своему усмотрению. Я, к примеру, скармливаю их известному плееру. Кстати, звучат там радиопотоки не в пример лучше.
Listen and enjoy!
—
¹ Advanced-menu в большинстве клиентов включается комбинацией клавиш Ctrl-Shift-Alt-D
воскресенье, 27 марта 2011 г.
суббота, 26 марта 2011 г.
Разбираем старый хлам (скрипт-кладовщик)
Вы давно вдумчиво заглядывали в свой инвентарь?
Я периодически заглядываю и ужас меня берет ледяными пальцами за самое естество. Ведь чем больше объектов лежит у нас в инвентаре, тем большие лаги это вызывает. Почему так происходит, позвольте не объяснять в рамках данной статьи - это отдельная «наука» о хранении предметов в SL в принципе... Сегодня мы просто попытаемся как-то систематизировать и даже заархивировать то барахло, которое нам жалко выбросить, но и место оно занимает, собирая виртуальную пыль.
Ни для кого не секрет, что можно создать банальный кубик и в его инвентарь напихать довольно много всяческих причиндалов: скины, текстуры, скрипты и т.п. В общем все, что может лежать в инвентаре, может быть сохранено в кубике. Таким образом, имея некоторое количество предметов в инвентаре, можно заменить их на один, поместив их все в его инвентарь.
Допустим, мы разложили это все по кубикам и у нас полный порядок в этом вопросе. Но как потом разобраться, по прошествии времени, что где лежит, в каком количестве? Да, конечно, мы будем называть наши кубики-коробки должным образом, но это зачастую малоинформативно по той простой причине, что приходится сильно обобщать.
Например, ящик с оружием, который называется... «Weapons». Внезапно, не правда ли? ;) Или вот они, коробочки наши, стоят, а где и что - нужно нажать Ctrl-3, ткнуть каждую мышом, чтобы хотя бы прочитать, как они называются.
Давайте упростим себе жизнь, используя скрипты - кровь этого нарисованного мира.
Итак, что же должен уметь наш скрипт? Как минимум, он должен уметь:
Для этого нам в основном понадобятся следующие функции встроенного скриптового языка LSL:
Конечно, я буду использовать в примере несколько большее количество функций, но это скорее для эстетики, можно обойтись и без них, упростив отдельные конструкции.
Итак, сделаем для начала, чтобы наша коробочка могла при помощи всплывающего текста обозначать своё название. Для этого определяем пользовательскую функцию setName() и будем потом её вызывать, когда нам понадобится изменить надпись.
Теперь нужно научить нашу коробку подсчитывать, какое количество объектов есть у нее в инвентаре, а также следить за тем, не изменилось ли их количество, ну и сообщать нам при помощи всё того же всплывающего текста. Для этого мы несколько модернизируем нашу функцию.
Обратите внимание - мы вычитаем из содержимого переменной objNum единичку. Это сделано для того, чтобы корректно отображать количество инвентаря, ведь наш управляющий скрипт по сути также является объектом инвентаря, но как бы «не считается».
Если мы что-то добавляем или удаляем из инвентаря объекта, то происходит событие changed(), которым мы воспользуемся для вызова нашей пользовательской функции и пересчета количества содержимого инвентаря.
Для проверки добавим в инвентарь нашей коробки какой-нибудь объект, произойдет событие, которое вызовет определённую ранее функцию и она отобразит корректные данные. Хочу обратить внимание на то, что возвращаемое событием число является битовым полем, из которого при помощи оператора ветвления мы вычисляем бит нужного нам события - изменения инвентаря.
К сожалению, нет события, которое бы отслеживало изменение такого параметра, как смена имени объекта. Но мы обойдем это ограничение, что называется, «малой кровью» - не важно, когда изменилось имя, важно, чтобы при следующем доставании этой коробки имя отображалось корректно.
Для этого воспользуемся событием on_rez(), возникающим всегда, когда вы что-то достаёте из своего «кармана» и кладете на землю. Нужно лишь просто при возникновении этого события еще раз вызвать нашу функцию setName() ;)
Иными словами, вы меняете название коробки в её свойствах, кладёте ее «в карман», а когда в следующий раз достанете, то подписана она будет уже тем именем, которое вы ей дали.
Ну вот, нам осталась самая малось - научить коробку сообщать выдавать список своего содержимого и распаковываться автоматически красивой папочкой. Сделать это можно разными способами, но мы сделаем это красиво при помощи милого голубого меню, хорошо знакомого всем аватарам.
Мы использовали событие touch(), возникающее каждый раз, когда кто-то ткнет мышом в объект. Из данных, возвращаемых этим событием мы получаем ключ кликнувшего аватара и сравниваем с ключем владельца коробки. Если все совпадает, выдаем владельцу менюшку.
И здесь хочу обратить внимание на конструкцию с использованием события timer(). При вызове меню мы инициализируем обратный отсчет времени, равный 30 секундам и начинаем слушать канал чата. Когда 30 секунд истекают, мы сообщаем об этом владельцу коробки и перестаем слушать чат. Делается это для того, чтобы снизить нагрузку на сим и, как следствие, уменьшить лаги, которых и без того хватает в избытке от гламурных кис с их АО'шками и любителей всевозможных псевдозащитных гаджетов.
Ещё один немаловажный момент - переменные, содержащие номер канала и его идентификатор должны быть определены, как глобальные, поскольку используются в разных местах скрипта и не должны потерять своих значений.
И вот она, финишная прямая - осталось дописать обработчики кнопок меню. Начнем с выдачи списка предметов. Для этого определим еще одну функцию, которую назовем... Да чего мудрствовать лукаво, мы же не Ed7v Resident с его cunt'овской философией - пусть функция называется listInventory().
Мы также не включаем в список содержимого коробки наш управляющий скрипт, кроме того, эта функция уже не тихо сама с собою что-то делает, а имеет тип и возвращает значение в соответствии со своим типом, в данном случае массив со списком.
Возвращаемся к обработчику меню - здесь нам поможет событие listen(), происходящее каждый раз, когда кто-то или что-то говорит в чат, причем, без разницы, на каком канале. При условии, что мы вообще слушаем чат (а мы его слушаем 30 секунд после вызова меню, помним об этом).
Послушали, поняли, что говорят нам и говорит тот, кого нужно слушать, распознали, какую кнопку нажали и - ответили нужным действием, пока что прочитали в приват владельцу коробки её содержимое. Вообще давать служебную информацию в личку владедельцу - правило хорошего тона. Когда объекты загаживают чат флудом есть путь неверный и ведет на тёмную сторону Силы, помните об этом.
Всё, играем коду, выходим на прямой - обрабатываем распаковку в красивую папочку буквально одной волшебной функцией.
И вуаля! Содержимое коробки у нас снова в инвентаре целиком и полностью, за исключением управляющего скрипта.
Вот, собственно, всё, что я хотел сегодня показать и рассказать. Описанный скрипт же можно изготовить самостоятельно, руководствуясь этой статьёй, либо приобрести всего за L$150 на маркетплейсе, ибо вещь полезная и в хозяйстве сгодится если не любому, то каждому.
Я периодически заглядываю и ужас меня берет ледяными пальцами за самое естество. Ведь чем больше объектов лежит у нас в инвентаре, тем большие лаги это вызывает. Почему так происходит, позвольте не объяснять в рамках данной статьи - это отдельная «наука» о хранении предметов в SL в принципе... Сегодня мы просто попытаемся как-то систематизировать и даже заархивировать то барахло, которое нам жалко выбросить, но и место оно занимает, собирая виртуальную пыль.
Ни для кого не секрет, что можно создать банальный кубик и в его инвентарь напихать довольно много всяческих причиндалов: скины, текстуры, скрипты и т.п. В общем все, что может лежать в инвентаре, может быть сохранено в кубике. Таким образом, имея некоторое количество предметов в инвентаре, можно заменить их на один, поместив их все в его инвентарь.
Допустим, мы разложили это все по кубикам и у нас полный порядок в этом вопросе. Но как потом разобраться, по прошествии времени, что где лежит, в каком количестве? Да, конечно, мы будем называть наши кубики-коробки должным образом, но это зачастую малоинформативно по той простой причине, что приходится сильно обобщать.
Например, ящик с оружием, который называется... «Weapons». Внезапно, не правда ли? ;) Или вот они, коробочки наши, стоят, а где и что - нужно нажать Ctrl-3, ткнуть каждую мышом, чтобы хотя бы прочитать, как они называются.
Давайте упростим себе жизнь, используя скрипты - кровь этого нарисованного мира.
Итак, что же должен уметь наш скрипт? Как минимум, он должен уметь:
- Динамически отображать название коробки in-world
- Динамически же отображать количество содержимого
- Выдавать список своего содержимого владельцу
- Самостоятельно распаковываться в инвентарь в случае необходимости
Для этого нам в основном понадобятся следующие функции встроенного скриптового языка LSL:
- llSetText()
- llGetObjectName()
- llGetInventoryNumber()
- llDialog()
- llListen()
- llListenRemove()
- llSetTimerEvent()
- llDetectedKey()
- llGetOwner()
- llOwnerSay()
- llGetScriptName()
- llGiveInventoryList()
Конечно, я буду использовать в примере несколько большее количество функций, но это скорее для эстетики, можно обойтись и без них, упростив отдельные конструкции.
Итак, сделаем для начала, чтобы наша коробочка могла при помощи всплывающего текста обозначать своё название. Для этого определяем пользовательскую функцию setName() и будем потом её вызывать, когда нам понадобится изменить надпись.
Теперь нужно научить нашу коробку подсчитывать, какое количество объектов есть у нее в инвентаре, а также следить за тем, не изменилось ли их количество, ну и сообщать нам при помощи всё того же всплывающего текста. Для этого мы несколько модернизируем нашу функцию.
Обратите внимание - мы вычитаем из содержимого переменной objNum единичку. Это сделано для того, чтобы корректно отображать количество инвентаря, ведь наш управляющий скрипт по сути также является объектом инвентаря, но как бы «не считается».
Если мы что-то добавляем или удаляем из инвентаря объекта, то происходит событие changed(), которым мы воспользуемся для вызова нашей пользовательской функции и пересчета количества содержимого инвентаря.
Для проверки добавим в инвентарь нашей коробки какой-нибудь объект, произойдет событие, которое вызовет определённую ранее функцию и она отобразит корректные данные. Хочу обратить внимание на то, что возвращаемое событием число является битовым полем, из которого при помощи оператора ветвления мы вычисляем бит нужного нам события - изменения инвентаря.
К сожалению, нет события, которое бы отслеживало изменение такого параметра, как смена имени объекта. Но мы обойдем это ограничение, что называется, «малой кровью» - не важно, когда изменилось имя, важно, чтобы при следующем доставании этой коробки имя отображалось корректно.
Для этого воспользуемся событием on_rez(), возникающим всегда, когда вы что-то достаёте из своего «кармана» и кладете на землю. Нужно лишь просто при возникновении этого события еще раз вызвать нашу функцию setName() ;)
Иными словами, вы меняете название коробки в её свойствах, кладёте ее «в карман», а когда в следующий раз достанете, то подписана она будет уже тем именем, которое вы ей дали.
Ну вот, нам осталась самая малось - научить коробку сообщать выдавать список своего содержимого и распаковываться автоматически красивой папочкой. Сделать это можно разными способами, но мы сделаем это красиво при помощи милого голубого меню, хорошо знакомого всем аватарам.
Мы использовали событие touch(), возникающее каждый раз, когда кто-то ткнет мышом в объект. Из данных, возвращаемых этим событием мы получаем ключ кликнувшего аватара и сравниваем с ключем владельца коробки. Если все совпадает, выдаем владельцу менюшку.
И здесь хочу обратить внимание на конструкцию с использованием события timer(). При вызове меню мы инициализируем обратный отсчет времени, равный 30 секундам и начинаем слушать канал чата. Когда 30 секунд истекают, мы сообщаем об этом владельцу коробки и перестаем слушать чат. Делается это для того, чтобы снизить нагрузку на сим и, как следствие, уменьшить лаги, которых и без того хватает в избытке от гламурных кис с их АО'шками и любителей всевозможных псевдозащитных гаджетов.
Ещё один немаловажный момент - переменные, содержащие номер канала и его идентификатор должны быть определены, как глобальные, поскольку используются в разных местах скрипта и не должны потерять своих значений.
И вот она, финишная прямая - осталось дописать обработчики кнопок меню. Начнем с выдачи списка предметов. Для этого определим еще одну функцию, которую назовем... Да чего мудрствовать лукаво, мы же не Ed7v Resident с его cunt'овской философией - пусть функция называется listInventory().
Мы также не включаем в список содержимого коробки наш управляющий скрипт, кроме того, эта функция уже не тихо сама с собою что-то делает, а имеет тип и возвращает значение в соответствии со своим типом, в данном случае массив со списком.
Возвращаемся к обработчику меню - здесь нам поможет событие listen(), происходящее каждый раз, когда кто-то или что-то говорит в чат, причем, без разницы, на каком канале. При условии, что мы вообще слушаем чат (а мы его слушаем 30 секунд после вызова меню, помним об этом).
Послушали, поняли, что говорят нам и говорит тот, кого нужно слушать, распознали, какую кнопку нажали и - ответили нужным действием, пока что прочитали в приват владельцу коробки её содержимое. Вообще давать служебную информацию в личку владедельцу - правило хорошего тона. Когда объекты загаживают чат флудом есть путь неверный и ведет на тёмную сторону Силы, помните об этом.
Всё, играем коду, выходим на прямой - обрабатываем распаковку в красивую папочку буквально одной волшебной функцией.
И вуаля! Содержимое коробки у нас снова в инвентаре целиком и полностью, за исключением управляющего скрипта.
Вот, собственно, всё, что я хотел сегодня показать и рассказать. Описанный скрипт же можно изготовить самостоятельно, руководствуясь этой статьёй, либо приобрести всего за L$150 на маркетплейсе, ибо вещь полезная и в хозяйстве сгодится если не любому, то каждому.
Подписаться на:
Сообщения (Atom)