- •8.1 Основные сведения 154
- •Предметные указатели по функциям (поиск и навигация) Предметный указатель по функциям Обливиона
- •Предметный указатель по консольным функциям
- •1. Предисловие к первому изданию
- •Немного о скриптах
- •Предпосылки для написания нового учебника - osfm
- •Реализация проекта osfm
- •Состав учебника osfm v1.2
- •Полезные ссылки на obse
- •Источники информации и проект
- •О нашей команде
- •Благодарности
- •И в заключение...
- •2. Введение
- •2.1 Как использовать это руководство.
- •2.2 Что такое скрипт?
- •2.3 Что могут скрипты?
- •2.4 Чего не могут скрипты?
- •2.5 Основные отличия в скриптинге tes 3 и tes 4
- •3. Обучающий курс
- •3.1 С чего начинать?
- •3.2 Редактор скриптов (Edit Scripts)
- •3.2.1 Основные сведения.
- •3.2.2 Пункт меню Script.
- •3.2.3 Пункт главного меню Edit.
- •3.2.4 Пункт главного меню Help.
- •3.2.5 Панель инструментов.
- •3.3 Назначение и главная цель вашего скрипта
- •3.4 Ваш первый скрипт
- •4. Основы скриптинга
- •4.1 Общая информация
- •4.2 Типы скриптов
- •4.2.1 Общие сведения о типах скриптов.
- •Локальные скрипты.
- •Нелокальные скрипты.
- •Именованные скрипты.
- •Объектные скрипты.
- •Квестовые скрипты.
- •Скрипты для магических эффектов.
- •Результирующие скрипты.
- •4.2.2 Как часто обрабатываются скрипты (Script Processing)
- •4.3 Команды (Commands)
- •4.3.1 Общие сведения о командах (Commands)
- •4.3.2 Команда Scriptname (название скрипта)
- •4.3.3 Команды объявления переменных (Declaring variables)
- •4.3.4 Команды Begin (начало блока) и End (конец блока)
- •4.3.5 Типы выполняемых блоков (BlockTypes).
- •GameMode
- •MenuMode
- •OnActivate
- •OnActorEquip
- •OnActorUnequip
- •OnAlarm
- •OnAlarmVictim
- •OnDeath
- •OnEquip
- •OnHitWith
- •OnKnockout
- •OnMagicEffectHit
- •OnMurder
- •OnPackageChange
- •OnPackageDone
- •OnPackageStart
- •OnReset
- •OnStartCombat
- •OnTrigger
- •OnTriggerActor
- •OnTriggerMob
- •OnUnequip
- •ScriptEffectFinish
- •ScriptEffectStart
- •ScriptEffectUpdate
- •4.3.6 Команда "." (точка - UseReference)
- •4.3.7 Команда Set (установить)
- •4.3.8 Команда Return (возврат)
- •4.3.9 Конструкция из команд If, ElseIf, Else, EndIf.
- •Синтаксис команд If, ElseIf, Else, EndIf
- •Операторы сравнения
- •Объединение сравнений
- •Сравнения и выражения
- •Примечания
- •4.4 Переменные (Variables)
- •4.4.1 Классификация переменных
- •Переменные
- •Классификация
- •4.4.2 Глобальные переменные (Globals)
- •Описание свойств диалогового окна Globals:
- •Глобальные переменные, обрабатываемые Oblivion.Exe:
- •Глобальные переменные, обрабатываемые в скриптах и диалогах:
- •Глобальная переменная pcVampire.
- •4.4.3 Специальные переменные (Special variables)
- •Специальные глобальные переменные:
- •Игровые месяцы:
- •4.4.4 Локальные переменные с особыми функциями:
- •4.4.5 Типы переменных
- •4.4.6 Целочисленные короткие переменные (Variable types: shortint)
- •4.4.7 Целочисленные длинные переменные (Variable types: longint)
- •4.4.8 Вещественные переменные (Variable types: floating point)
- •5. Ваш второй скрипт
- •5.1 Содержание
- •4.4.9 Переменные для хранения копий (Reference variable)
- •5.2 Введение
- •5.3 Информация о написании скриптов в Oblivion Что такое скрипт?
- •Что могут скрипты?
- •Чего не могут скрипты
- •5.4 Учебник скриптов: до написания кода.
- •Начинаем!
- •Окно редактирования скриптов
- •Что мы хотим?
- •Написание скрипта
- •5.5 Учебник скриптов: первые строки. Называем скрипт
- •Команды "Begin" и "End"
- •Выдача текстового сообщения и получение ответа от игрока.
- •Как выполняются объектные скрипты
- •5.6 Учебник скриптов: первый тест Сохранение и подготовка модификации.
- •Скрипт в игре
- •5.7 Учебник скриптов: выбор игрока, ошибки и исправления. Выбор игроком варианта ответа
- •Первые ошибки и исправления
- •5.8 Учебник скриптов: добавляем ловушку.
- •5.9 Как узнать больше.
- •5.10 Заключительные строки.
- •6. Функции в tes 4
- •6.1 Что такое функция? (Function)
- •6.2 Типы функций (Function Types)
- •6.3 Работа функций с копиями объектов
- •6.4 Описание функций tes 4 Oblivion
- •Activate
- •AddAchievement
- •AddFlames
- •AddItem
- •AddScriptPackage
- •AddSpell
- •AddTopic
- •AdvancePcLevel ( advLevel )
- •AdvancePcSkill ( advSkill)
- •CloseCurrentOblivionGate
- •CloseOblivionGate
- •CompleteQuest
- •CreateFullActorCopy
- •DeleteFullActorCopy
- •Disable
- •DisableLinkedPathPoints
- •DisablePlayerControls
- •DispelAllSpells
- •DuplicateAllItems
- •DuplicateNpcStats
- •EnableFastTravel
- •EnableLinkedPathPoints
- •EnablePlayerControls
- •EquipItem
- •EssentialDeathReload
- •EvaluatePackage ( evp)
- •ForceActorValue ( ForseAv )
- •ForceCloseOblivionGate
- •ForceFlee
- •ForceTakeCover
- •ForceWeather
- •Id погоды для консольного использования (Console iDs):
- •GetActionRef
- •GetActorValue (GetAv)
- •GetAlarmed
- •GetAmountSoldStolen
- •GetAngle
- •GetArmorRating
- •GetArmorRatingUpperBody
- •GetAttacked
- •GetBarterGold
- •GetBaseActorValue (GetBaseAv)
- •GetButtonPressed
- •GetClassDefaultMatch
- •GetClothingValue
- •GetCombatTarget
- •GetContainer
- •GetCrime
- •GetCrimeGold
- •GetCrimeKnown
- •GetCurrentAiPackage
- •GetCurrentAiProcedure
- •GetCurrentTime
- •GetCurrentWeatherPercent
- •GetDayOfWeek
- •GetDead
- •GetDeadCount
- •GetDestroyed
- •GetDetected
- •GetDetectionLevel
- •GetDisabled
- •GetDisease
- •GetDisposition
- •GetDistance
- •GetDoorDefaultOpen
- •GetEquipped
- •GetFactionRank
- •GetFactionRankDifference
- •GetFactionReaction
- •GetFatiguePercentage
- •GetForceRun
- •GetForceSneak
- •GetFriendHit
- •GetFurnitureMarkerId
- •GetGameSetting ( getGs )
- •GetGlobalValue
- •GetGold
- •GetHeadingAngle
- •GetIdleDoneOnce
- •GetIgnoreFriendlyHits
- •GetInCell
- •GetInCellParam
- •GetInFaction
- •GetInSameCell
- •GetInWorldSpace
- •GetInvestmentGold
- •GetIsAlerted
- •GetIsClass
- •GetIsClassDefault
- •GetIsCreature
- •GetIsCurrentPackage
- •GetIsCurrentWeather
- •GetIsGhost
- •GetIsId
- •GetIsSex
- •GetIsUsedItem
- •GetIsUsedItemType
- •GetItemCount
- •GetKnockedState
- •GetLevel
- •GetLockLevel
- •GetPcExpelled
- •GetPcFactionAttack
- •GetPcFactionMurder
- •GetPcFactionSteal
- •GetPcFactionSubmitAuthority
- •GetPcFame
- •GetPcInFaction
- •GetPcInfamy
- •GetPcIsClass
- •GetPcIsRace
- •GetPcIsSex
- •GetPcMiscStat
- •GetQuestVariable
- •GetRandomPercent
- •GetRestrained
- •GetScale
- •GetScriptVariable
- •GetSecondsPassed
- •GetSelf
- •GetShouldAttack
- •GetSitting
- •GetSleeping
- •GetStage
- •GetStageDone
- •GetStartingAngle
- •GetStartingPos
- •GetTalkedToPc
- •GetTalkedToPcParam
- •GetTimeDead
- •GetTotalPersuasionNumber
- •GetTrespassWarningLevel
- •GetUnconscious
- •GetUsedItemActivate
- •GetUsedItemLevel
- •GetVampire
- •GetWalkSpeed
- •GetWeaponAnimType
- •GetWeaponSkillType
- •GetWindSpeed
- •GoToJail
- •HasFlames
- •HasMagicEffect
- •HasVampireFed
- •IsActionRef
- •IsActor
- •IsActorAVictim
- •IsActorDetected
- •IsActorEvil
- •IsCloudy
- •IsContinuingPackagePcNear
- •IsCurrentFurnitureObj
- •IsCurrentFurnitureRef
- •IsEssential
- •IsFacingUp
- •IsGuard
- •IsHorseStolen
- •IsIdlePlaying
- •IsLeftUp
- •IsOwner
- •IsPlayersLastRiddenHorse
- •IsPleasant
- •IsRaining
- •IsRidingHorse
- •IsRunning
- •IsShieldOut
- •IsSneaking
- •IsSnowing
- •IsSpellTarget
- •IsSwimming
- •IsTalking
- •IsTimePassing
- •KillAllActors
- •LoopGroup
- •MenuMode (Function)
- •Message
- •MessageBox
- •ModActorValue
- •ModAmountSoldStolen
- •ModBarterGold
- •ModCrimeGold
- •ModDisposition
- •ModFactionRank
- •ModFactionReaction
- •ModPcAttribute
- •ModPcFame
- •ModPcInfamy
- •ModPcMiscStat
- •ModPcSkill
- •ModScale
- •MoveToMarker
- •PayFine
- •PayFineThief
- •PickIdle
- •PlaceAtMe
- •PlayBink
- •PlayGroup
- •PlayMagicEffectVisuals
- •PlayMagicShaderVisuals
- •PlaySound
- •PlaySound3d
- •PositionCell
- •PositionWorld
- •PreloadMagicEffect
- •RefreshTopicList
- •ReleaseWeatherOverride
- •RemoveAllItems
- •RemoveFlames
- •RemoveItem
- •RemoveMe
- •RemoveScriptPackage
- •RemoveSpell
- •Resurrect
- •SameFaction
- •ScriptEffectElapsedSeconds
- •SelectPlayerSpell
- •SendTrespassAlarm
- •SetActorAlpha
- •SetActorFullName
- •SetActorRefraction
- •SetActorValue
- •SetAlert
- •SetAllReachable
- •SetAllVisible
- •SetAngle
- •SetAtStart
- •SetBarterGold
- •SetCellFullName
- •SetCellOwnership
- •SetCellPublicFlag
- •SetClass
- •SetCombatStyle
- •SetCrimeGold
- •SetDestroyed
- •SetDoorDefaultOpen
- •SetEssential
- •SetFactionRank
- •SetFactionReaction
- •SetForceRun
- •SetForceSneak
- •SetGhost
- •SetIgnoreFriendlyHits
- •SetInCharGen
- •SetInvestmentGold
- •SetItemValue
- •SetLevel
- •SetNoAvoidance
- •SetNoRumors
- •SetOpenState
- •SetOwnership
- •SetPcExpelled
- •SetPcFactionAttack
- •SetPcFactionMurder
- •SetPcFactionSteal
- •SetPcFactionSubmitAuthority
- •SetPcFame
- •SetPcInfamy
- •SetPcSleepHours
- •SetPackDuration
- •SetQuestObject
- •SetRestrained
- •SetRigidBodyMass
- •SetScale
- •SetSceneIsComplex
- •SetShowQuestItems
- •SetSize
- •SetStage
- •SetUnconscious
- •SetWeather
- •ShowRaceMenu
- •ShowSpellMaking
- •SkipAnim
- •StartCombat
- •StartConversation
- •StartQuest
- •StopCombat
- •StopCombatAlarmOnActor
- •StopLook
- •StopMagicEffectVisuals
- •StopMagicShaderVisuals
- •StopQuest
- •StopWaiting
- •StreamMusic
- •ToggleActorsAi
- •TrapUpdate
- •TriggerHitShader
- •UnequipItem
- •VampireFeed
- •WakeUpPc
- •WhichServiceMenu
- •7. Console Functions
- •7.1 Общие сведения.
- •7.2 Полный перечень консольных функций.
- •7.3 Описания консольных функций (Console functions)
- •FlushNonPersistActors (Flush)
- •FreezeRenderAccumulation (fra)
- •OutputMemStats (oms)
- •PickRefById (prid)
- •PlayerSpellBook (psb)
- •PrintAiList (Pai)
- •PrintHdrParam (php)
- •PrintNpcDialog (pDialog)
- •PurgeCellBuffers (pcb)
- •SetCameraFov (fov)
- •SetClipDist
- •Отрицательные числа
- •Interior Cell Buffer: [int] (буфер интерьеров)
- •14 И выше…
- •8.1 Основные сведения
- •8.2 Различия в версиях.
- •8.3 Установка obse:
- •8.4 Диагностика и проблемы
- •8.5 Типы скриптовых функций obse
- •9. Заключение.
- •Дерзайте и да пребудет с вами удача!
Что мы хотим?
Перед тем, как мы приступим к написанию нашего учебного скрипта, мы сначала должны решить, что мы хотим, чтобы он делал! Для этого учебника мы собираемся создать: Шкаф с Загадкой: шкаф загадывает загадку и открывается только в случае правильного ответа. Если игрок отвечает неправильно – срабатывает ловушка и ранит игрока, а шкаф остается закрытым. Это довольно сложное задание, но мы будем выполнять его шаг за шагом и в конце станет очевидно, что не все так страшно.
Написание скрипта
После открытия скриптового окна, нажмите Script -> New.... Вы должны заметить, что Тип Скрипта – "Объект", что нам как раз и нужно. Нажмите в главном окне, которое из серого теперь стало белым. Здесь вы будете писать скрипт.
5.5 Учебник скриптов: первые строки. Называем скрипт
Сначала мы должны назвать скрипт. Каждый скрипт должен начинаться с его названия. В окне редактора, пожалуйста, напечатайте
-
ScriptName RiddleChestScript
Отметьте, что ни пробелов, ни подчеркиваний в названии нет. Название скрипта должно состоять из одного слова, так что использовать пробелы нельзя. Также Oblivion игнорирует подчеркивание в алфавитном списке скриптов; вы можете использовать подчеркивание, чтобы сделать название более понятным для себя, но вы не увидите его, когда позже откроете скрипт. (Дополнительная информация: Oblivion допускает так называемый эффект наложения в скриптах TES, когда вы заменяете полное имя команды его сокращенной версией. Для примера: "ScriptName" становится "scn", или "ForceActorValue" становится "ForceAV". Мы не будем использовать эффект наложения в данном учебнике, но не удивляйтесь, если увидите подобное в других скриптах.) Помните, что скрипты TES не чувствительны к регистру; вы могли бы написать "scriptname" или "ScriptnamE", как угодно. Попробуйте сохранить свой скрипт, используя кнопку «Сохранить» на панели задач. Ничего очевидного не случится, но если вы нажмете на кнопку «Открыть», то сможете увидеть название вашего скрипта в перечне скриптов Oblivion. Нажмите на «X» в верхнем правом углу окна выбора скриптов, чтобы закрыть его и вернуться в окно редактирования. RiddleChestScript сейчас самый короткий скрипт в Oblivion, но он ничего не делает. Давайте это исправим.
Команды "Begin" и "End"
Команды "Begin" и "End" определяют начало и конец блоков скрипта – отдельных участков кода, которые будут выполняться при определенных условиях. Например, "Begin GameMode" определят начало выдачи текстового блока, который будет запускаться в каждом фрейме до тех пор, пока игрок не откроет меню. Для наших целей нам нужен тип-блок "OnActivate": он запустится только тогда, когда наш шкаф будет активирован (утомительно отвечать на загадку в каждом фрейме или всякий раз, как NPC умрет, обе этих вариации возможны с использованием других вариантов типов блоков Begin!). Нажмите два раза Enter, чтобы переместить курсор вниз, и отредактируйте свой скрипт, чтобы он выглядел вот так:
-
ScriptName RiddleChestScript Begin OnActivate ; Здесь мы напечатаем, что случится, когда шкаф будет открыт End
Опять нажмите "Сохранить". Скрипт все еще ничего не делает, но, по крайней мере, теперь мы определили условия, при которых он будет работать. Также здесь нужно отметить пару вещей. Первое - мы закрыли текущий блок перед тем, как начали новый – это не так важно, когда в скрипте один блок, но как только скрипт станет более сложным, нам понадобятся составные блоки. Выражаясь в более технических терминах – блоки Begin/End не вкладываемые.
Вторая вещь, которую надо отметить, это точка с запятой ";" на линии 4. Точка с запятой отмечает остальную часть строки как комментарий. Все напечатанное после точки с запятой на этой строке при компилировании скрипта будет проигнорировано. Комментарии используются, чтобы объяснить код, это поможет вам и другим быстро понять, что происходит в скрипте на определенных строках. Если вы хотите написать более чем одну строку с комментарием, то точку с запятой нужно ставить в начале каждой строки.
