Точно так же, как и в случае с перемещением, описанным выше, вы можете вращать объекты вокруг их локальной или мировой оси и определять текущий угол поворота[23]:
Rotate, axis, angle/sec_enum
RotateWorld, axis, angle/sec_enum
Rotate, z, -30; вращать против часовой стрелки, 30° в секунду, вокруг оси z объекта
Object_ID -> Rotate, Y, 100
Оси – это X, Y или Z. Заметьте, что значение, которое вы задаете в функциях, это скорость вращения (не угол), так что если хотите повернуть объект на 90 градусов, то используйте SetAngle (для мгновенного поворота) или Rotate вместе с GetAngle, чтобы проверять насколько повернулся объект. Эти функции не могут быть использованы на актерах.
Установка углов
SetAngle, axis, float_enum_angle
SetAngle, z, 30
Object_ID -> Setangle, z, 25
Эта функция устанавливает у объекта определенный угол поворота. Оси — X, Y, или Z. Значение типа float устанавливает угол вращения (в градусах) вызывающего объекта в это значение. Она всегда зависит от локальных координат того, где находятся объекты.
Примечание: Для актеров см. функцию "Face, x, y". Судя по тестам в консоли, эта функция не воздействует на актеров. С трибуналом, она может принимать локальные переменные типа float в качестве значений, но только внутри текущих активных ячеек.
SetPos.
Функции размеров
GetScale(float)
SetScalenewScale_float
ModScalescaleChange_float
If (doonce == 0 )
Object_ID -> SetScale 0.1
Set doonce to 1
endif
Эти функции используются, чтобы установить или изменить размеры копии объекта. Любой размер должен быть между (не включительно) 0 и 10 (так что можно задавать его вне 0.5 и 2, что первоначально отрицалось Bethesda)(инфа от Mode Locrian). Скрипт выше может использоваться, чтобы обойти ограничение на размер, которое накладывает CS.
Примечание: Не следует вызывать SetScale каждый фрейм, особенно в экстерьерах и других медленных с точки зрения FPS ситуациях.
При загрузке игры размер сбросится в значение между 0.5 – 2. Потому не используйте однократных условий, а вызывайте функцию регулярно. Например, каждые 10 фреймов или проверяя текущий размер объекта функцией GetScale:
if ( GetScale != 5 ) SetScale, 5 endif
Также можно использовать стартовый скрипт Трибунала или Бладмуна. Он будет однократно проверять размеры объектов при загрузке игры[24] (Информация с форумов / JOG).
Пример:
Этот скрипт от Беседки показывает как увеличивать и уменьшать предмет.
Когда скрипт помещен на объект, активация копии объекта дает возможность игроку изменять ее размер.
Begin scalescript
short questionAsked
short button
float direction
float currscale
float tempscale
if ( MenuMode )
return
endif
if ( OnActivate == 1 )
if ( questionAsked == 0 )
MessageBox, "Сделать этот объект..." "...Больше" "...Меньше"
set questionAsked to 1
endif
endif
if ( questionAsked == 1 )
set button to GetButtonPressed
if ( button == -1 )
else
if ( button == 0 )
set direction to 1
elseif ( button == 1 )
set direction to –1
endif
set questionAsked to 0
set button to 0
endif
endif
if ( direction != 0 )
set tempscale to .3 * GetSecondsPassed
set tempscale to tempscale * direction
ModScale tempscale
set currscale to GetScale
if ( direction == -1 )
if ( currscale <= .5 )
set direction to 0
endif
else
if ( currscale >= 2 )
set direction to 0
endif
endif
endif
end scalescript
Определения локации, относительного положения и движения
Определение нахождения игрока в интерьере или в экстерьере
[no fix] GetInterior(returns Boolean/short)
If ( GetInterior == 1 )
Недокументированная функция! (Спасибо XP-Cagey и Killgore)
Эта функция возвращает 1, если текущая ячейка интерьер, и 0, если – экстерьер. Вот пример глобального скрипта от Killgore. Чтобы опробовать его, в консоли напечатайте "StartScript Outside_Check".
Begin Outside_Check
short doonce
if (MenuMode == 1)
Return
EndIf
if (doOnce == 0) ;если вы в новой ячейке ;или он только что начался
if ( GetInterior == 1 )
MessageBox "1: внутри"
elseif ( GetInterior == 0 )
MessageBox "0: снаружи"
else
MessageBox "где-то еще"
endif
set doOnce to 1
Return
endif
if (doOnce == 1)
if (CellChanged == 0) Return
else ;если игрок перемещается из ячейки в ячейку..
set doOnce to 2 ;скрипт ждет дополнительный фрейм
endif
Return
endif
if (doOnce == 2) ;затем начитнается снова и печатает
Функция GetPCCell тестирует присутствие игрока в определенной ячейке. Она возвращает 1, если игрок в определенной ячейке и 0, если нет. Поддерживается частичное совпадение, например GetPCCell, "Vivec" вернет “истину” для ячеек "Vivec", "Vivec, foreign quarter waistworks" и "Vivec, temple", и т.д.
Пример:
Этот маленький скрипт от Bethesda проверяет, покинул ли игрок определенное место и лишь после этого удаляет определенную вещь у NPC:
Begin DrothPost
if ( GetJournalIndex "MS_EstateSale" >= 70 )
if ( GetPCCell "Mournhold, Geon Auline's House" == 0 )
Эта функция возвращает расстояние (в единицах) от одного объекта до другого. По синтаксису это расстояние между вызывающим объектом (тем, к которому присоединен скрипт) и вызываемым объектом. Может использоваться для того, чтобы начинать атаку, производить другие действия или просто определить, где находится игрок для использования в скриптах.
Это фрагмент оригинального Морровиндовского скрипта:
; Из скрипта для NPC Ashamanu:
; Ashamanu даст журнальную запись 60, когда игрок близко
if ( GetDisabled != 1 )
if ( GetDistance Player <= 256 )
if ( GetDistance "guar_white_unique" <= 256 )
if ( GetJournalIndex "MS_WhiteGuar" <= 50 )
Journal "MS_WhiteGuar" 60
endif
endif
endif
endif
Ограничения:
GetDistance требует, чтобы объект, вызываемый как параметр, был помещен в игровой мир (в редакторе) и имел флаг references persist (или был NPC).
Учтите, что вы должны использовать эту функцию только с уникальным ID или там, где вы абсолютно уверены в существовании только одной копии ID – иначе игровой движок просто возьмет первую копию ID и выдаст дистанцию до нее, вероятнее всего, не до того объекта, который вы хотите. Так, скрипт, предупреждающий игрока о рыбе-убийце, когда она ближе 800 единиц, должен быть присоединен к рыбе-убийце, и проверять расстояние до игрока (который уникален), а не наоборот.
Если вы определяете расстояние до объекта, который движется с использованием функции Move или MoveWorld, GetDistance будет по-прежнему возвращать расстояние до оригинального местоположения объекта (того, которое установлено в редакторе). Используйте GetPos и старый добрый метод Пифагора (c2 = a2 + b2), чтобы определить текущее расстояние.