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

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


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

Привет всем!

Написал скрипт магического эффекта. Скрипт "прикреплен" к заклинанию, которое имеет 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 пользователей онлайн

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