Home Random Page


CATEGORIES:

BiologyChemistryConstructionCultureEcologyEconomyElectronicsFinanceGeographyHistoryInformaticsLawMathematicsMechanicsMedicineOtherPedagogyPhilosophyPhysicsPolicyPsychologySociologySportTourism






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

Begin makethingsimple

 

short questionAsked

short button

float myX

float myY

float myZ

 

if ( MenuMode )

return

endif

 

if ( OnActivate == 1 )

if ( questionAsked == 0 )

MessageBox, "Создать новый..." "...Горшок" "...Ключ"

set questionAsked to 1

set myX to GetPos X

set myY to GetPos Y

set myZ to GetPos Z + 100

endif

endif

 

if ( questionAsked != 0 )

if ( questionAsked == 1 )

set button to GetButtonPressed

if ( button == -1 )

else

if ( button == 0 )

PlaceItem "Misc_pot_redware_01" myX myY myZ 45

elseif ( button == 1 )

PlaceItemCell "misc key" "key room" myX myY myZ 45

endif

set questionAsked to 0

set button to –1

endif

endif

endif

 

end

Вращение и углы

Bethesda использует и градусы, и минуты (1° градус = 60 минут) как единицы в функциях:

GetAngle [°] (-180 до 180 °)
Setangle [°]
Position [мин]
PositionCell [мин]
PlaceItem [мин]
PlaceItemCell [мин]
Rotate [ ° / секунды ]
RotateWorld [ ° / секунды ]

Вращение объектов

Точно так же, как и в случае с перемещением, описанным выше, вы можете вращать объекты вокруг их локальной или мировой оси и определять текущий угол поворота[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) ;затем начитнается снова и печатает

set doOnce to 0

Return

endif

 

End Outside_Check

Определения ячейки игрока

[no fix] GetPCCell, "Cell_ID" (returns Boolean/short)

 

if ( GetPCCell "Balmora" == 1 )

Set dream to 1

endif

 

Функция 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 )

"Geon Auline"->RemoveItem "silver dagger_droth_unique" 1

Journal MS_EstateSale 80

StopScript DrothPost

endif

endif

 

End DrothPost

Расстояние от одного объекта до другого

GetDistance, "ObjectID" (returns float)

"ObjectID1" -> GetDistance, "ObjectID2"

 

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

Это фрагмент оригинального Морровиндовского скрипта:

 

; Из скрипта для 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), чтобы определить текущее расстояние.

Определяем позицию и поворот объекта


Date: 0000-00-00; view: 675


<== previous page | next page ==>
Player -> Position 29872, -82108, 578, 180 13 page | Player -> Position 29872, -82108, 578, 180 15 page
doclecture.net - lectures - 2014-2024 year. Copyright infringement or personal data (0.013 sec.)