Дистанционная передача команд

Тип статьи:
Авторская

Здравствуйте, дорогие друзья.

В прошлом месяце ко мне обратились три человека с элементарным как мне казалось вопросом, как можно сделать например хад, через который можно управлять внешними объектами. Или как сделать панель управления (кнопки), которую можно поставить в отдельном месте и через нее тоже управлять внешними объектами, например их двигать. Или как сделать так, чтобы командами через чат управлять внешними объектами, или элементами одежды.

По сути эти три вопроса одинаковые и имеют одно решение.

Команды дистанционно можно передавать через канал. Мы начнем с того, что попробуем передавать команды для начала через канал № 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.

Если мы пишем одну из этих команд в чат – объект реагирует и меняет цвет.

Нет комментариев. Ваш будет первым!
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.