Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скрипты Morrowind.doc
Скачиваний:
92
Добавлен:
29.10.2018
Размер:
2.81 Mб
Скачать

Установка позиции (другой путь, чтобы сгенерировать движение)

SetPos, axis, float_enum_pos (float_var with Tribunal/Bloodmoon)

SetPos, z, 477

Object_ID -> SetPos X, 466

Эта функция (в отличие от функций move и moveworld) работают с актерами, включая игрока. Оси — x, y, или z. Значение типа float устанавливает позицию вызывающего актера в это значение. Она всегда зависит от локальных координат той ячейки, где находятся объекты. Примечание: С Трибуналом эта функция может принимать переменные в качестве значений, но только для текущих ячеек. Это важно для экстерьеров, вы не можете двигать объекты на огромные расстояния, точка назначения должна быть ячейкой игрока плюс окружающие ее ячейки (Информация с форумов / Srikandi). Также отметьте, что объекты можно поставить в любую позицию (и никаких столкновений замечено не будет), то актеры проверяются на столкновения и могут подвинутся, чтобы избежать их (может быть использовано для обнаружения столкновений).

Пример: Этот скрипт создан для плавающих ящиков в канализации Морнхолда (Трибунал). Он показывает, как SetPos и SetAngle можно использовать вместо MoveWorld и Rotate, чтобы производить покачивающееся движение:

begin floatAboveStartHeight

float timer

float swingTime

float startAngle

float startHeight

float currangle

float xvalue

float zvalue

float zoffset

float tmpoffset

float weightoffset

float waterlevel

short reset

short initialized

if ( initialized == 0 ); Эта секция сохраняет стартовую высоту и положение направление объекта

set startAngle to GetAngle, X

set startHeight to GetPos, Z

set swingTime to 1

set initialized to 1

endif

if ( MenuMode == 0 )

set waterlevel to GetWaterLevel

if ( waterlevel > startHeight )

if ( timer == 0 )

if ( reset == 0 )

set timer to Random 100

set timer to timer / 4

endif

endif

set timer to ( timer + GetSecondsPassed )

set currangle to GetAngle X

; Здесь устанавливается значение для движения и вращения, в зависимости от частоты кадров:

set xvalue to 10 * GetSecondsPassed

set zvalue to 5 * GetSecondsPassed

; ящик движется по своей оси x:

; вращается вверх

if ( timer < swingTime )

set currangle to currangle + xvalue

SetAngle X currangle

set zoffset to zoffset + zvalue

; вращается вниз

elseif ( timer < (swingTime * 3) )

set currangle to currangle - xvalue

SetAngle X currangle

set zoffset to zoffset - zvalue

; снова вверх

elseif (timer < (swingTime * 4 ) )

set currangle to currangle + xvalue

SetAngle X currangle

set zoffset to zoffset + zvalue

; сброс timer в 0

else

set timer to 0

set reset to 1

set zoffset to 0

SetAngle, x, startangle

endif

set tmpoffset to waterlevel

set tmpoffset to tmpoffset + zoffset

; Ящик качается вверх и вниз

SetPos Z tmpoffset

Else ; уровень воды нормальный

SetAngle, X, startAngle

SetPos Z startHeight

endif

endif

end

Позиционирование объектов в мире или во внутренних ячейках

Position, float_enum_x, float_enum_y, float_enum_z, float_enum_zRot (для внешних)(float принимаютсяс дополнениями)

PositionCell, float_enum_x, float_enum_y, float_enum_z, float_enum_zRot, “cellID(для внутренних / внешних ячеек) (float принимаются с дополнениями)

position –23515, -15355, 3355, 90

Player -> position –23515, -15355, 3355, 90

"Actor_ID" -> PositionCell, -254, 475, -376, 360, "Balmora, Council Club"

Классическое приложение этой функции — кольцо телепортации, перемещающее игрока в нужное место. Однако ее можно использовать и для перемещения NPC или объектов в новое место. Заметьте, что эта функция принимает в качестве аргументов только ранее установленные значения (не переменные). (Возможно, что Трибунал исправил это), но:

Position/PositionCell может принимать переменные типа float, но они должным быть ЛОКАЛЬНЫМИ21! (информация от Indigo Rage)

Z_Rot устанавливается не в градусах (0-360°) а в минутах (1° = 60 min): так что, если хотите повернуть кого-то на восток, пишите 5400. На юг - 10800. Запад - 16200.

Примечание: Также следует знать, что использование PositionCell в диалогах не надежно, и может вызывать вылеты. Беседка использует StartScript, чтобы запустить глобальный скрипт, а он, в свою очередь, запускает телепортацию. (Информация с форумов / Emma). Также не следует использовать эту функцию на предметах в инвентаре игрока, иначе Морр вылетит22 (Информация с форумов / Nigedo).

Пример: Простое кольцо телепортации выглядит так:

Begin TeleportScript

; Присоединяем скрипт к, например, кольцу

short status

short button

short OnPCEquip

if ( MenuMode == 1 )

return

endif

if ( OnPCEquip == 1 )

Set Status to 10

Set OnPCEquip to 0

Endif

If ( status == 10 ); Показать меню

MessageBox "Телепоритировать меня в", "Балмору", "Вивек", "Отмена"

Set Status to 20

Elseif ( status == 20 ); ждем ответа

Set button to GetButtonPressed

If ( button == -1 ) ; нет ответа

Return

Elseif ( button == 0 ); выбрана Балмора

Player -> PositionCell -21278, -17613, 534, 0, "Balmora (-3, -3)"

Elseif ( button == 1 ); выбран Вивек

Player -> Position 29872, -82108, 578, 180

Elseif ( button >= 2 ) ; выбрана отмена

Set status to 0

Endif

Endif

End

Заметьте, что оба места назначения — внешние ячейки, для них можно использовать разные функции. Если вы попытаетесь перенестись в небезопасное место (внутрь объекта или в пустоту), вы будете мгновенно помещены в ближайшее безопасное место. При помощи этих функций вы также можете перемещать NPC или объекты.