Перейти к содержанию

Проблема со скриптом


Рекомендуемые сообщения

Привет всем!

Написал скрипт магического эффекта. Скрипт "прикреплен" к заклинанию, которое имеет Range "Self" и длительность "3".

Смысл в том, чтобы при кастовании заклинантя "на себя" определялись ссылки на ближайших СУЩЕСТВ, относящихся к типам "Нежить" и "Даедра". Заодно и определялась дистанция.

Заклинание кастуется "вручную" с произвольной частотой.

Размещены соответствующие "цели" на участке местности. Но скрипт, срабатывая, продолжает выдавать REF только первой обнаруженной с момента запуска цели. Даже при "кастовании" непосредственно возле второй цели, скрипт продолжает выдавать REF первой обнаруженной цели. Только иногда, после длительного (минуты 2-3) хождения вокруг второй (необнаруживаемой) цели, скрипт выдает ее REF.

Вот код, что мажет быть не так?

 

scn MyScriptName ;тип скрипта - магический эффект

 

ref RefCr

float DistRef

 

begin ScriptEffectStart ; расчет на то, что данный блок срабатывает 1 раз за фрейм

 

set RefCr to GetFirstRef 36

 

label 11

if RefCr != 0

set DistRef to RefCr.GetDistance Player

 

if RefCr.GetCreatureType == 2

Message “Обнаружена НЕЖИТЬ %i, Дистанция: %8,0f”, RefCr, DistRef

elseif RefCr.GetCreatureType == 1

Message “Обнаружен ДАЕДРА %i, Дистанция: %8,0f”, RefCr, DistRef

else

Message “Никого нет”

set RefCr == 0 ;на всякий случай "обнуляем" переменную

endif

 

Set RefCr to GetNextRef

goto 11

endif

end

 

По-моему, явных ошибок нет...

Если можно, проверьте код у себя!

Ссылка на комментарий
Поделиться на другие сайты

scn MyScriptName ;тип скрипта - магический эффект

ref RefCr
float DistRef

begin ScriptEffectStart ; расчет на то, что данный блок срабатывает 1 раз при старте заклинания

set RefCr to GetFirstRef 36 3

label 11
if (RefCr)
	set DistRef to RefCr.GetDistance Player

	if RefCr.GetCreatureType == 2
		MessageBox “Обнаружена НЕЖИТЬ %i, Дистанция: %8,0f”, RefCr, DistRef
	elseif RefCr.GetCreatureType == 1
		MessageBox “Обнаружен ДАЕДРА %i, Дистанция: %8,0f”, RefCr, DistRef
	else
		MessageBox “Никого нет”
	endif

	Set RefCr to [тут поставь ссылку на левый существующий объект в игре]
	Set RefCr to GetNextRef
	goto 11
endif

end

Изменено пользователем Visman
Ссылка на комментарий
Поделиться на другие сайты

scn MyScriptName ;тип скрипта - магический эффект

 

 

Вчера испытал. Работает. Спасибо!

Вот только дистанция не отображается в сообщении на экране. Выдает на экране значение переменной = "0".

Хотя, развивая скрипт, я поставил проверку по дальности: определение соответсвия REF типу существа только при дальности до REF<1000. Так она - работает.

Неясно (мне, по крайней мере) какой тип переменной соответсвует возвращаемому значению дистанции. На Wiki пишут, что дистанция возвращается в units, но о типе этого значения (short, long, float) - ни слова.

 

Кстати, у меня был вопрос и об очередности определения того или иного REF.

И в моем (ошибочном) и в твоем (рабочем) варианте скрипта очередность определения REF одного из двух контрольных Сreatures не менялась. вне зависимости от того, какое из этих Creatures было ближе к игроку. Хотя я излазил вркруг них все пространство, меняя позиции кастования заклинания.

Заметил и понял, что GetFirstRef выбирает приоритет в определении REF не по их "близости" к caster, а по их ЗНАЧЕНИЮ:

Существо Cr#1 имеет REF= 04008dfd => всегда определяется первым

Существо Cr#2 имеет REF= 04008dfe => всегда определяется вторым

 

так как dfd < dfe и, значит, dfd и есть FirstRef!

 

Так вот, проверка REF "на дальность от игрока" позволила решить стоящую задачу - обнаружение БЛИЖАЙШЕГО.

Ссылка на комментарий
Поделиться на другие сайты

Если просто нужно получить ближайшего, то достаточно сохранять параметры дальности и ссылку на предыдущий объект и сравнивать его дальность с текущим.

Если же нужно получить объекты в порядке удаления/приближения, то тут намного сложнее. Нужно создавать массивы и текущий объект сравнивать с элементами массива и вставлять текущий объект на определенную позицию массива. (Если нужно получать в результат ограниченное кол-во объектов в определенном порядке, то можно обойтись несколькими переменными без массива).

 

Ф-ии MessageBox наверное надо заменить на MessageBoxEx, т.к. ты используешь форматный вывод из OBSE, а не стандартный.

 

Дистанция возвращается как float.

Ссылка на комментарий
Поделиться на другие сайты

Если просто нужно получить ближайшего, то достаточно сохранять параметры дальности и ссылку на предыдущий объект и сравнивать его дальность с текущим.

Если же нужно получить объекты в порядке удаления/приближения, то тут намного сложнее. Нужно создавать массивы и текущий объект сравнивать с элементами массива и вставлять текущий объект на определенную позицию массива. (Если нужно получать в результат ограниченное кол-во объектов в определенном порядке, то можно обойтись несколькими переменными без массива).

 

Ф-ии MessageBox наверное надо заменить на MessageBoxEx, т.к. ты используешь форматный вывод из OBSE, а не стандартный.

 

Дистанция возвращается как float.

Спасибо за помощь !

А вот еще задачка :)

Имеем координаты Перса GetPos X (Y,Z).

Как определить координаты границы ячейки (ну, м.б., точки на границе) для того, чтобы понять, где относительно ячейки находится Перс?

Изменено пользователем Владимир_К
Ссылка на комментарий
Поделиться на другие сайты

Перво-наперво нужно определить, что перс находится на природе.

Каждая ячейка имеет сторону в 4096.

Т.е. 0-я ячейка по Х от 0 до 4096 и по Y от 0 до 4096.

(GetPos X) % 4096 - будет позиция внутри ячейки по координате X от 0 до 4095,(9)

Ссылка на комментарий
Поделиться на другие сайты

Перво-наперво нужно определить, что перс находится на природе.

Каждая ячейка имеет сторону в 4096.

Т.е. 0-я ячейка по Х от 0 до 4096 и по Y от 0 до 4096.

(GetPos X) % 4096 - будет позиция внутри ячейки по координате X от 0 до 4095,(9)

Логично

Ссылка на комментарий
Поделиться на другие сайты

Не хочется "засорять" форум новыми темами, поэтому спрошу здесь.

 

Мне нужно, чтобы "заспелленый" актер-цель медленнее двигался.

Изменить скорость удалось. Но, гад, продолжает резко поворачиваться в мою сторону.

Вопрос:

Какая характеристика актера влияет на его быстроту поворачивания в разные стороны (вокруг себя)?

Я считаю, что это - Agility. Но изменяю скриптом его величину - ничего не меняется.

Строчкой до этого идет изменение Speed - все нормально.

Может не Agility отвечает за то, как быстро поворачивается какой-нибудь Creatur?

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...