Дистанционная передача команд
Здравствуйте, дорогие друзья.
В прошлом месяце ко мне обратились три человека с элементарным как мне казалось вопросом, как можно сделать например хад, через который можно управлять внешними объектами. Или как сделать панель управления (кнопки), которую можно поставить в отдельном месте и через нее тоже управлять внешними объектами, например их двигать. Или как сделать так, чтобы командами через чат управлять внешними объектами, или элементами одежды.
По сути эти три вопроса одинаковые и имеют одно решение.
Команды дистанционно можно передавать через канал. Мы начнем с того, что попробуем передавать команды для начала через канал № 0, т.е. через обычный общий чат. Чтобы это сделать, мы должны просто написать в чат нашу команду. Но это только половина, другая половина заключается в том, что объект, с которым мы хотим произвести какие либо изменения должен услышать нашу команду из чата, интерпретировать ее (понять, что это за команда) и выполнить ряд действий, которые вы определите для этой команды.
Каким образом заставить скрипт слушать команды из нулевого канала (команды из чата) ?
Для этого существует функция llListen(), которая принимает ряд аргументов.
listen( integer channel, string name, key id, string message )
где:
• integer channel – Номер канала, который будет прослушивается
• string name – Имя объекта или аватара, который будет прослушиваться. (Если хотите чтобы прослушивались обьекты и аватары с любыми именами, ставьте “”.
• key id – UUID группы, аватара или объекта, который будет прослушиваться. (Если хотите чтобы прослушивались обьекты и аватары с любым UUID, ставьте “”.
• string message – Текст сообщения, который будет прослушиваться. (Если хотите чтобы прослушивался любой текст, ставьте “”.
В нашем случае функция должна выглядеть так:
llListen(0, "", "", "");
Ну для начала, давайте создадим глобальную числовую переменную, integer listen_handle;
В ней будет хранится дескриптор (указатель адреса) обращения к процессу прослушивания. Адрес процесса нужен для того, чтобы к этому процессу можно было обратиться с целью например его остановить. Но это для справки, особо внимание на это можно не заострять.
Итак:
integer listen_handle;
default
{
state_entry()
{
listen_handle = llListen(0, "", "", "");
}
}
Мы запустили процесс прослушивания чата, но как нам теперь считывать поступающие команды? Дело в том, что после запуска процесса прослушивания, мы можем использовать новое событие, которое выглядит вот так:
listen( integer channel, string name, key id, string message )
{
}
Это событие происходит каждый раз, когда кто-то или что-то отправляет сообщение в общий чат. И оно возвращает номер канала, имя отправителя сообщения, UUID отправителя сообщения и собственно текст самого сообщения.
Давайте проверим, так ли это ?
integer listen_handle;
default
{
state_entry()
{
listen_handle = llListen(0, "", "", "");
}
listen( integer channel, string name, key id, string message )
{
llSay(0, message);
}
}
Если мы вставим это в наш объект, то каждый раз, когда кто-то будет писать в общий чат, объект будет слать в чат то же, что и было написано. То есть повторять все, что будет написано в чат.
Ну хорошо, у нас есть скрипт, который слушает чат, и принимает оттуда сообщения. Теперь нам нужно сделать так, чтобы эти сообщения он расценивал как команды, читая которые он выполнял определенные действия с нашим объектом.
Это сделать очень просто, воспользуемся условием.
if (message ==«RED» )
{
vector color = <1.0, 0.0, 0.0>;
llSetColor(color, ALL_SIDES);
}
else if (message ==«BLUE» )
{
vector color = <0.0, 0.0, 1.0>;
llSetColor(color, ALL_SIDES);
}
Теперь давайте совместим все это в один код:
integer listen_handle;
default
{
state_entry()
{
listen_handle = llListen(0, "", "", "");
}
listen( integer channel, string name, key id, string message )
{
if (message ==«RED» )
{
vector color = <1.0, 0.0, 0.0>;
llSetColor(color, ALL_SIDES);
}
else if (message ==«BLUE» )
{
vector color = <0.0, 0.0, 1.0>;
llSetColor(color, ALL_SIDES);
}
}
}
Что у нас получилось? У нас есть 2 команды, RED и BLUE.
Если мы пишем одну из этих команд в чат – объект реагирует и меняет цвет.