Player -> Position 29872, -82108, 578, 180 13 page
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 или объекты.
Перемещение объекта в его оригинальную позицию
SetAtStart
SetAtStart
Object_ID -> SetAtStart
Эта функция сбрасывает объект в его оригинальную позицию, до любого движения или вращения, в ту, которая задана в редакторе. Для примера смотри скрипт с двигающейся платформой в главе “движения вдоль координат мира”. Смотри функцию Move для примера скрипта.
Эта функция помещает новую копию объекта "Object_ID" рядом с игроком. Функция позволяет задать направление появления объекта по отношению к положению игрока и дистанцию (в пунктах). Если это место небезопасно (в воздухе, в стене и т.д.), то объект будет помещен с другой стороны или прямо у игрока под ногами. (Опечатка: Спасибо Isildur и Esteban. Они указали, number_enum и distance_enum должны были стоять наоборот).
Функция PlaceAtMe работает так же, как PlaceAtPC только без привязки к игроку. Bloodmoon использует ее для создания атакующих в разных местах в зависимости от расстояния до игрока. Это позволяет симулировать большое количество оппонентов, которые как будто постепенно подходят к месту схватки.
;ЭТО СОЗДАЕТ ОХОТНИКА В ПОДХОДЯЩЕМ МЕСТЕ, УВЕЛИЧИВАЕТ СЧЕТЧИК И СБРАСЫВАЕТ ТАЙМЕР
[no fix] PlaceItemCell"object ID", "cellID", X, Y, Z, Zrot
Эти функции создают новые копии объектов. PlaceItem создаст объект "Object ID" в координатах (X, Y, Z) с вращением по оси Z равном Zrot в текущей локации. Z_Rot устанавливается не в градусах (0-360°) а в минутах (1° = 60 min): так что, если хотите повернуть кого-то на восток, пишите 5400. На юг - 10800. Запад - 16200.
Функция принимает локальные переменные типа float. PlaceItemCell делает тоже самое, но также позволяет указать ячейку, в которой будет создан предмет, включая внешние ячейки.
Это позволяет добавлять в мир предметы без предварительно расположения их в редакторе.
JOG прислал следующую инфу по PlaceItemCell:
Ну, когда я впервые попробовал PlaceitemCell, я подумал, что это очень хорошая функция, чтобы ставить предметы прямо в игре, без предварительной их установки в редакторе. Однако я скоро понял, что нельзя обращаться к таким объектам через скрипты (Например удалять их). Скрипт не будет компилироваться до тех пор, пока хотя бы одна копия объекта используется, и тогда удаление будет относиться к этому первому объекту, то есть все равно нужно использовать PositionCell.
(Примечание от GBG: это можно обойти, используя скрипт на самом объекте, тогда можно опустить стрелку в функции.)
DinkumThinkum добавил:
PlaceItemCell могла бы быть великолепной функцией для того, что я задумывал, пока я не обнаружил, что установленные таким образом NPC исчезают при сохранении и загрузке, если игрок не побывал в ячейке с ними.
(Примечание от GBG: этого можно избежать, если сделать установку NPC зависимой от нахождения игрока в ячейке. Я все равно думаю, что PlaceItem очень полезная функция.)
Пример:
При помещении этого скрипта на предмет, во время активирования предмета будет задан вопрос о типе объекта, а затем создан этот объект в 100 единицах над активированным предметом с углом вращения 45 градусов. Если выбран ключ, то ключ будет помещен в ячейку “key room”.