Jump to content


Object-to-object communication


  • Please log in to reply
12 replies to this topic

#1 BeckHan

BeckHan

    Новичок на форуме

  • Пользователи
  • PipPip
  • 5 posts
  • SL Status: 

Posted 10.02.09 - 13:04

У меня проблема.
Суть в следующем: есть ХУД, и есть объект, который общается с этим ХУДом. Косяк в том, что общение происходит со всеми одинаковыми ХУДами и объектами в радиусе действия.
Вопрос: как заставить объект общаться только с ХУДом хозяина?
BeckHan Ra

#2 Koshachii

Koshachii

    Участник

  • Пользователи
  • PipPipPip
  • 116 posts
  • SL Status: 

Posted 10.02.09 - 16:40

Не могу сейчас проверить. Попробуй проверять владельца объекта в слушателе:


listen(integer chan, string name, key id, string mes)
{
if(id == llGetOwnerKey(id))
...

#3 SOb Zemlja

SOb Zemlja

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

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

Posted 11.02.09 - 01:04

Не, вроде это что-то типа

llListen(1, "", llGetOwner(), "");


#4 djalex777

djalex777

    Новичок на форуме

  • Пользователи
  • PipPip
  • 41 posts
  • Пол:М
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 11.02.09 - 12:56

Можно как написал Sob запускать листен сразу слушающим только Ownera, а можно в теле события listen проверять соответствует ли ключ написавшего ключу владельца:
...
if(llGetOwnerKey(id)==llGetOwner())
{
...
}
...


#5 Amaro

Amaro

    Новичок на форуме

  • Пользователи
  • PipPip
  • 36 posts
  • Основной цех:Строители
  • Второй цех:Скриптеры
  • SL Status: 

Posted 20.02.09 - 13:25

View Postdjalex777, on 11.2.2009, 12:56, said:

Можно как написал Sob запускать листен сразу слушающим только Ownera, а можно в теле события listen проверять соответствует ли ключ написавшего ключу владельца:
...
if(llGetOwnerKey(id)==llGetOwner())
{
...
}
...

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

#6 djalex777

djalex777

    Новичок на форуме

  • Пользователи
  • PipPip
  • 41 posts
  • Пол:М
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 20.02.09 - 13:37

Amaro said:

...
в итоге другой пользователь имеет объект со скриптом, который считает овнером по-прежнему вас, а не своего действительного владельца, до тех пор, пока ему не сделают ресет. Так что или проверяйте овнера в листене, или обрабатывайте смену владельца =)
...
Не совсем так. Пишем в скрипте:
...
on_rez(integer start_param)
{
  if(start_param==0)llResetScript();
}
...
Теперь Reset происходит автоматически при, например, выкладывании объекта из инвентаря

#7 Amaro

Amaro

    Новичок на форуме

  • Пользователи
  • PipPip
  • 36 posts
  • Основной цех:Строители
  • Второй цех:Скриптеры
  • SL Status: 

Posted 20.02.09 - 13:40

View Postdjalex777, on 20.2.2009, 13:37, said:

Amaro said:

...
в итоге другой пользователь имеет объект со скриптом, который считает овнером по-прежнему вас, а не своего действительного владельца, до тех пор, пока ему не сделают ресет. Так что или проверяйте овнера в листене, или обрабатывайте смену владельца =)
...
Не совсем так. Пишем в скрипте:
...
on_rez(integer start_param)
{
  if(start_param==0)llResetScript();
}
...
Теперь Reset происходит автоматически при, например, выкладывании объекта из инвентаря

К сожалению, некоторые достаточно сложные скрипты народ умудряется создать таким образом, что они не переживают ресета =) Из популярных, для примера - Puppeteer, да и Builders Buddy грешит... Да и логически - ресет всего скрипта при резе не всегда оправдан.

#8 djalex777

djalex777

    Новичок на форуме

  • Пользователи
  • PipPip
  • 41 posts
  • Пол:М
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 20.02.09 - 13:52

Amaro said:

Да и логически - ресет всего скрипта при резе не всегда оправдан.
Хм... Запуск новой копии программы всегда должен начинать её заново. К примеру, исполняемый файл Windows. А вот если необходимо подгрузить какие-то данные (например уже вычисленные) просто подгружаем их.

#9 Amaro

Amaro

    Новичок на форуме

  • Пользователи
  • PipPip
  • 36 posts
  • Основной цех:Строители
  • Второй цех:Скриптеры
  • SL Status: 

Posted 20.02.09 - 14:10

View Postdjalex777, on 20.2.2009, 13:52, said:

Amaro said:

Да и логически - ресет всего скрипта при резе не всегда оправдан.
Хм... Запуск новой копии программы всегда должен начинать её заново. К примеру, исполняемый файл Windows. А вот если необходимо подгрузить какие-то данные (например уже вычисленные) просто подгружаем их.
Это если есть, откуда подгружать. И потом - вот, выгружаете вы на землю реззер для домика, щелкаете по нему, говорите - строй! Бадди, например, сделан так, что все части просто знают (в памяти скрипта, не сохраненные более нигде) - свои позиции относительно реззера. И вот он реззит крышу, говорит ей - лети! А она даже не едет, ибо отресетилась и забыла, куда же ей, бедной, надо было =) Просто случаи, как известно, разные бывают - у меня есть и скрипты, которые ресетятся при резе, и скрипты, которые не переживают ресета, и скрипты, которые надо сперва настравиать, потом дампить настройки в нотсы и нотсы складывать в инвентарь, чтобы эти скрипты ресетились, в случае чего, без проблем. Это ни о чем разговор, каждый метод имеет место быть, и каждый может быть применен в той или иной ситуации...

#10 alextmbv

alextmbv

    Молчун

  • Пользователи
  • Pip
  • 1 posts
  • Основной цех:Скриптеры
  • Второй цех:Модельеры

Posted 10.08.09 - 17:12

View PostAmaro, on 20.2.2009, 14:25, said:

View Postdjalex777, on 11.2.2009, 12:56, said:

Можно как написал Sob запускать листен сразу слушающим только Ownera, а можно в теле события listen проверять соответствует ли ключ написавшего ключу владельца:
...
if(llGetOwnerKey(id)==llGetOwner())
{
...
}
...

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

По моим наблюдениям, llGetOwner() показывает владельца СКРИПТА, а не предмета. Поэтому после передачи llGetOwner() будет выдавать key прежнего владельца. Поправьте меня, если не прав.
Поэтому надо или ресетить, или обрабатывать смену.

#11 Axon Dezno

Axon Dezno

    Участник

  • Писатели
  • PipPipPip
  • 217 posts
  • Пол:М
  • Основной цех:Строители
  • Второй цех:Художники
  • SL Status: 

Posted 10.08.09 - 21:52

llGetOwner() показывает владельца скрипта, но поскольку скрипт отдельно от объекта существовать не может, а в инвентаре аватара он "замораживается"...

То, что он после передачи показывает UUID предыдущего владельца - глюк. Лечится он только llResetScript() помещённым например в on_rez(integer x){}
X________________________________________________x

Хто хочет - ищет способ, хто не хочет - ищет причину.

#12 Mikhail Troncon

Mikhail Troncon

    Новичок на форуме

  • Пользователи
  • PipPip
  • 20 posts
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 04.09.09 - 14:22

View Postalextmbv, on 10.8.2009, 18:12, said:


По моим наблюдениям, llGetOwner() показывает владельца СКРИПТА, а не предмета. Поэтому после передачи llGetOwner() будет выдавать key прежнего владельца. Поправьте меня, если не прав.

View PostAxon Dezno, on 10.8.2009, 22:52, said:

llGetOwner() показывает владельца скрипта, но поскольку скрипт отдельно от объекта существовать не может, а в инвентаре аватара он "замораживается"...

llGetOwner() возвращает ID владельца объекта. http://lslwiki.net/l...akka=llGetOwner
Если скрипт не вложен в объект - скрипт является исключительно исходным кодом. Компиляция скрипта происходит в момент укладки в объект или вручную при открытии скрипта в объекте.

View Postalextmbv, on 10.8.2009, 18:12, said:


Поэтому надо или ресетить, или обрабатывать смену.

Обрабатывать смену владельца - это в on_rez обновлять все переменные и перестартовать все функции (типа llListen), завязанные на ID владельца? Есть еще способы?

View PostAxon Dezno, on 10.8.2009, 22:52, said:


То, что он после передачи показывает UUID предыдущего владельца - глюк. Лечится он только llResetScript() помещённым например в on_rez(integer x){}

А у кого-то llGetOwner реально выдавало ID предыдущего владельца? Просто интересно.

#13 Mikhail Troncon

Mikhail Troncon

    Новичок на форуме

  • Пользователи
  • PipPip
  • 20 posts
  • Основной цех:Скриптеры
  • Второй цех:Строители
  • SL Status: 

Posted 07.09.09 - 14:21

оказывается не только он_рез )
делается через эвент changed, по параметру CHANGED_OWNER

default {
	state_entry() {
		llSay(0, "hello");
	}
	
	changed(integer change) { // something changed
		if (change & CHANGED_OWNER) { 
		 
		// здесь перезапускаем все функции, зависящие от ID владельца.

		}
	}
}





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users