OMOD 脚本

Oblivion Mod(OMod) Scripting 中文说明

读前须知:包括在< >内的参数为必须填写的,[ ]内的则为可选的。

如果你遇到笔者注等字符,则表示那是原obmm.chm文档所没有的文本,只是我在编辑时添加上的内容,不强制接受/采纳。

点击此处进入本文发布贴,有疑问的话可以在那边求助。

目录 · Contents

  1. 基础
  2. If <function> [...]
    1. IfNot <function> [...]
    2. If DialogYesNo <Message> [Title]
    3. If DataFileExists <FileName>
    4. If VersionGreaterThan <version>
    5. If VersionLessThan <version>
    6. If ScriptExtenderPresent
      1. If ScriptExtenderNewerThan <version>
    7. If GraphicsExtenderPresent
      1. If GraphicsExtenderNewerThan <version>
    8. If OblivionNewerThan <version>
    9. If Equal <arg1> <arg2>
      1. If GreaterThan <arg1> <arg2>
      2. If GreaterEqual <arg1> <arg2>
      3. If fGreaterThan <arg1> <arg2>
      4. If fGreaterEqual <arg1> <arg2>
  3. Select <Title> <Option1> [Option2] [...]
    1. SelectMany <Title> <Option1> [Option2] [...]
    2. SelectWithPreview <Title> <Option1> <ImagePath1> [Option2] [ImagePath2] [...]
    3. SelectManyWithPreview <Title> <Option1> <ImagePath1> [Option2] [ImagePath2] [...]
    4. SelectWithDescriptions <Title> <Option1> <Description1> [Option2] [Description2] [...]
    5. SelectManyWithDescriptions <Title> <Option1> <Description1> [Option2] [Description2] [...]
    6. SelectWithDescriptionsAndPreviews <Title> <Option1> <ImagePath1> <Description1> [Option2] [ImagePath2] [Description2] [...]
    7. SelectManyWithDescriptionsAndPreviews <Title> <Option1> <ImagePath1> <Description1> [Option2] [ImagePath2] [Description2]
  4. SelectVar <Variable>
    1. SelectString <String>
  5. For <function> <Variable> [...]
    1. For Count <Variable> <Start> <End> [Step]
    2. For Each DataFolder <Variable> <FolderPath> [RecurseSubfolders] [SearchString]
    3. For Each DataFile <Variable> <FolderPath> [RecurseSubfolders] [SearchString]
    4. For Each PluginFolder <Variable> <FolderPath> [RecurseSubfolders] [SearchString]
    5. For Each Plugin <Variable> <FolderPath> [RecurseSubfolders] [SearchString]
  6. Goto <label>
    1. Label <label>
  7. Return
  8. Message <Message> [Title]
    1. DisplayImage <Image File Path> [Title]
    2. DisplayText <Text File Path> [Title]
  9. LoadBefore <Plugin1> <Plugin2>
    1. LoadAfter <Plugin1> <Plugin2>
  10. UncheckESP <plugin>
  11. SetDeactivationWarning <plugin> <warning>
  12. ConflictsWith <ModName> [Comment] [Level]
    1. ConflictsWith <ModName> <MinMajorVersion> <MinMinorVersion> <MaxMajorVersion> <MaxMinorVersion> [Comment] [Level]
    2. ConflictsWithRegex <ModName> [Comment] [Level]
    3. ConflictsWithRegex <ModName> <MinMajorVersion> <MinMinorVersion> <MaxMajorVersion> <MaxMinorVersion> [Comment] [Level]
  13. DependsOn <ModName> [Comment]
    1. DependsOn <ModName> <MinMajorVersion> <MinMinorVersion> <MaxMajorVersion> <MaxMinorVersion> [Comment]
    2. DependsOnRegex <ModName> [Comment]
    3. DependsOnRegex <ModName> <MinMajorVersion> <MinMinorVersion> <MaxMajorVersion> <MaxMinorVersion> [Comment]
  14. DontInstallPlugin <FileName>
    1. DontInstallDataFile <FileName>
    2. InstallPlugin <FileName>
    3. InstallDataFile <FileName>
    4. DontInstallDataFolder <FolderName> [RecurseSubfolders]
    5. InstallDataFolder <FolderName> [RecurseSubfolders]
    6. DontInstallAnyPlugins
    7. DontInstallAnyDataFiles
    8. InstallAllPlugins
    9. InstallAllDataFiles
  15. CopyDataFile <CopyFrom> <CopyTo>
    1. CopyPlugin <CopyFrom> <CopyTo>
    2. CopyDataFolder <CopyFrom> <CopyTo> [RecurseSubfolders]
  16. PatchDataFile <NewFile> <FileToPatch> [Create]
    1. PatchPlugin <NewFile> <FileToPatch> [Create]
  17. 其他

基础

脚本区分大小写,所以书写的时候请确保大小写没出错。(文件名可以不区分大小写,但其他的都区分。)

每一行都可以看成是几个字符组成。如果一个函数的参数包括空格或者 , ,你必须使用 "" 把它包括了。逗号 , 实际上就等于空格,所以你可以使用他们作为分隔符。如果你想要函数的参数包含 " ,你必须用""把他包括,并在 " 前面加上 \ 。如果想要使用 \ 则需要用 \\ 代替。

如果想在脚本中添加注释,可以在前面加上 ; 。如果参数中出现了 ; ,依旧要记得用""包括。

另外,脚本中不区分分隔符与空格,更确切的说,脚本会自动将分隔符转换成空格,所以如果你想要在消息框中插入分隔符,你必须使用 %Tab% 表示。

如果想要在多行中显示一条语句,请使用函数 AllowRunOnLines' ,同时每一行结尾添加 \ 表示与下一行连接。

要使用变量,请给字符加上%%。如果%%包含的字符是未知的变量,obmm将无法自动识别,并且不会提示错误。这样做是为了与obmm 0.8.x或者之前的版本兼容。另外,有两个变量是所有脚本中已经定义好了的。%NewLine%,用来在消息框或者 ExecLines函数中表示另起一行,%Tab%,表示插入分隔符。只要函数要求你必须使用变量,你就必须给字符加上%%。

如果参数是空白字符,可直接使用双引号,即""

更多obmm的函数例子请直接阅读后面的内容。

最后一点,每个脚本编辑器都存在的问题,他只能给你大致的错误位置,同时并不代表所有错误都能够提示,最多只能提示错误的嵌套。

If <function> [...]

IfNot <function> [...]
Else
EndIf

条件语句,仅当<function>满足时,才执行后面的语句。所以<function>是必须填写的。当<function>不满足时,则执行Else后面的语句。EndIf用来结束判断。

If DialogYesNo <Message> [Title]

显示一个是否对话框,内容为<Message>,如果选择是(Yes)的话,将执行后面的语句。

例 · Example
If DialogYesNo "选择“是”或者“否”?" Question
    Message "您选择了“是”。"
Else
    Message "您选择了“否”。"
EndIf

If DataFileExists <FileName>

检查<FileName>是否存在,指的是文件 游戏安装目录\Data\<FileName>

If VersionGreaterThan <version>

If VersionLessThan <version>

比较OBMM的版本,如果要检查是否高于或等于<version>,可选择VersionGreaterThan,反之则选择VersionLessThan。要求<version>的格式为主要版本.次要版本.修正版本,也就是说三部分,由两个点号隔开。

例 · Example
If VersionLessThan 0.6.0
    Message "此mod需要使用 obmm 0.6.0 或者更新版本才能安装。"
    FatalError
EndIf

If ScriptExtenderPresent

检查游戏目录里是否存在obse_loader.exe。如果你的mod需要obse才能运行的话,你可以使用此算法检查。

If ScriptExtenderNewerThan <version>

检查游戏目录里obse_loader.exe的版本是否高于<version>。如果检测到的版本高于或者等于<version>定义的,将返回True,并执行后面的语句。<version>的格式为主要版本.次要版本.修正版本.构建版本(如:0.0.20.6)

例 · Example
IfNot ScriptExtenderNewerThan 0.0.0.4
    Message "部分mod需要 Oblivion Script Extender v0004 或者更高版本才能工作,您未满足条件,相关mod没有安装。" "警告"
    DontInstallPlugin "MyMod (obse extras).esp"
EndIf

If GraphicsExtenderPresent

If GraphicsExtenderNewerThan <version>

与 ScriptExtender... 相同,但检测的是 data\obse\plugins\obge.dll。(不是 obgev2.dll)

If OblivionNewerThan <version>

与 ScriptExtenderNewerThan 相同,但检测的是 Oblivion.exe

If Equal <arg1> <arg2>

If GreaterThan <arg1> <arg2>

判断 arg1 是否等于 arg2 ,要求 arg1 和 arg2 为整型。

If GreaterEqual <arg1> <arg2>

判断 arg1 是否大于或等于 arg2 ,要求 arg1 和 arg2 为整型。

If fGreaterThan <arg1> <arg2>

判断 arg1 是否等于 arg2 ,要求 arg1 和 arg2 为浮点型。

If fGreaterEqual <arg1> <arg2>

判断 arg1 是否大于或等于 arg2 ,要求 arg1 和 arg2 为浮点型。

例 · Example
ReadRendererInfo package "Shader Package"
If GreaterThan %package% 4
    IfNot Equal %package% 8
        Message "高于4的 shader package 仅支持 8。" "错误"
        FatalError
    EndIf
EndIf

Select... <args>
Case <option>
Default
Break
EndSelect

当一个脚本逻辑上要求根据特定条件做出真假判断并执行相应操作时,if语句是理想的解决方案。然而当你需要更复杂的判断结构,它们往往有两个以上的可选项,这些选项彼此相互排斥,如果还是继续使用if语句,你将需要一堆的else,而Select语句在可以实现一系列的平行选择,方便解决多分枝问题。

当脚本执行Select语句时,首先计算<args>的数值,然后与Case后面的<option>比较,如果相符,则执行该Case后面的命令,如果找不到相应的Case,则执行Default后面的命令。

Case后面的参数<option>已默认为字符型,所以即使遇到空格你也可以不填写引号""。不过为了语法可读性,笔者建议始终加上引号""。

Break表示退出该Case,直接跳到EndSelect

obmm的Select与C/C++里面的switchs完全一致,例:如果你不添加Break,该Case部分执行完后将执行下一个Case语句,除非遇到EndSelect或者Break。

SelectMany <Title> <Option1> [Option2] [...]
SelectWithPreview <Title> <Option1> <ImagePath1> [Option2] [ImagePath2] [...]
SelectManyWithPreview <Title> <Option1> <ImagePath1> [Option2] [ImagePath2] [...]
SelectWithDescriptions <Title> <Option1> <Description1> [Option2] [Description2] [...]
SelectManyWithDescriptions <Title> <Option1> <Description1> [Option2] [Description2] [...]
SelectWithDescriptionsAndPreviews <Title> <Option1> <ImagePath1> <Description1> [Option2] [ImagePath2] [Description2] [...]
SelectManyWithDescriptionsAndPreviews <Title> <Option1> <ImagePath1> <Description1> [Option2] [ImagePath2] [Description2]

Select下用户只能选择一个选项,而SelectMany则可以在0与每个选项间的数值选择。每一个符合条件的Case后面的语句都会执行,即使遇到了Break命令。

Select语句下,第一个Case为默认选择项,而SelectMany下,不存在默认选择项。如果你想要让脚本默认选择哪个<option>,你可以在在该<option>前加上“|”符号,就像<|option>,记住,不是加在Case后面的<option>

SelectWithPreview 和 SelectManyWithPreview 用来给每个选项加上预览图,这样用户选择时可以看到相应的预览。<ImagePath>要求是OMOD内该文件的相关路径,同时,记得安装时使用 DontInstallDataFile 指定不安装该图片,否则OMOD会把该预览图也给你安装到游戏中。如果某个选项你不想添加预览图,<ImagePath>处可以填写“None”。

SelectWithDescriptions 和 SelectManyWithDescriptions 允许你给某个选项添加<Description>说明。

例 · Example
Select "Choose an option", "option 1", "|option 2", "option 3", "option 4", "option5" ; 默认自动选择option 2
Case option 1
    Message "You selected option 1"
    ; 这边没有 Break,如果运行到这段,将继续执行到 Case option 2 。
Case option 2
    Message "You selected either option 1 or 2"
    Break
Case option 3
    Message "You selected option 3
    Break
Default
    Message "You selected either option 4 or 5"
    Break        ; EndSelect 前面的最后一个 Case 可以不必要再填写 Break 了,但是为了看起来整洁,写上去会好一点。
EndSelect

SelectVar <Variable>

SelectString <String>

不再让用户选择项目进行判断,这边直接判断给定的参数。其中,SelectVar默认需要判断的参数为变量,所以你可以不填写%%,而SelectString没有这样的假设。

注意:SelectVar bingle 与 SelectString %bingle% 在功能上是一致的。

例 · Example
ReadRendererInfo package "Shader Package"
SelectVar package
    Case 8
    Case 9
    Case 10
    Break
Default
    Message "You must be using shader package 8, 9 or 10" "Error"
    FatalError
EndSelect

For <function> <Variable> [...]
Continue
Exit
EndFor

这些函数主要用来实现循环。与If函数一样,这边可选择的循环类型也有多种。在每一种情况下,<Variable>在每一次循环中的值一般都不一样,同时在循环结束时它的值也是不可预测的。在定义<Variable>的名字是,千万不要使用%%。

Continue用来将脚本跳出,直接到下一步 EndFor (如果脚本有要求的话,还会再回到循环之初),而 Exit 则直接将循环跳到 EndFor 后面的语句。

For Count <Variable> <Start> <End> [Step]

<Start>开始循环,直到<End><Variable>每次增加的值为[Step],如果没有定义[Step],则默认值为1。

例 · Example
For Count var1 0 10 2
    If Equal %var1% 6
        Continue
    EndIf
    Message %var1%
EndFor
; 最后将以消息框的形式逐次输出 0, 2, 4, 8, 10。

For Each DataFolder <Variable> <FolderPath> [RecurseSubfolders] [SearchString]
For Each DataFile <Variable> <FolderPath> [RecurseSubfolders] [SearchString]
For Each PluginFolder <Variable> <FolderPath> [RecurseSubfolders] [SearchString]
For Each Plugin <Variable> <FolderPath> [RecurseSubfolders] [SearchString]

用来循环omod特定文件夹下的内容。需要注意的是 esp/esm 与其他 data 文件是完全独立的,另外文件夹与文件夹之间也是相互独立的。

[RecurseSubfolders]只能选择 'True' 或者 'False',如果不定义的话,默认为 False。

[SearchString]的工作方法与windows任务管理器的搜索功能一致,允许使用通配符。如果没有指定数值,则将使用“*”。(例:所有文件都符合搜索条件)

笔者注:从字面上理解,[RecurseSubfolders]应该表示是否允许递归子文件夹。

Goto <label>

Label <label>

跳转函数,使用此函数跳到后面脚本的特定位置(由Label定义)。可以跳出控制结构,但最好不要跳进控制结构。另外,不能跳到前面的脚本

笔者注:学过编程的人,都应该知道结构化程序设计中是不提倡使用 goto 语句的,因为 goto 语句随意转向目标,使程序流程无规律,可读性差。

Return

直接退出脚本。也就是说,一遇到 Return ,将不再执行其余的内容,而是直接结束脚本。

Message <Message> [Title]

DisplayImage <Image File Path> [Title]
DisplayText <Text File Path> [Title]

用来显示消息框。Message 显示简单的消息框,DisplayImage用来显示图片,DisplayText用来显示纯文本或者多格式文本。<Image File Path><Text File Path>要求是omod中确实存在的文件,如果该文件只是为了在脚本中显示,记得在安装时使用 DontInstallDataFile

LoadBefore <Plugin1> <Plugin2>
LoadAfter <Plugin1> <Plugin2>

LoadBefore将<Plugin1>排在<Plugin2>前面,LoadAfter则将<Plugin1>排在<Plugin2>后面。要求<Plugin1>必须是omod中的一部分,<Plugin2>可以是其他位置的文件。同时,参数必须是mod的完整文件名,也就是说必须包含后缀名。

例 · Example
If DataFileExists Bloodmoon.esm
    LoadAfter MyMod_BloodmoonPatch.esp MyMod.esp
Else
    DontInstallPlugin MyMod_BloodmoonPatch.esp
EndIf

UncheckESP <plugin>

正常情况下,使用omod安装插件后,该插件会自动勾选,如果你想要取消某个文件的勾选,可以使用此函数。

SetDeactivationWarning <plugin> <warning>

正常情况下,当你尝试取消勾选由omod安装的mod时,你会收到警告信息。你可以使用此函数关闭该警告,或者完全禁止用户取消该esp。<warning>可使用的数值有 'Allow', 'Disallow' 或者 'WarnAgainst' 。

ConflictsWith <ModName> [Comment] [Level]
ConflictsWith <ModName> <MinMajorVersion> <MinMinorVersion> <MaxMajorVersion> <MaxMinorVersion> [Comment] [Level]
ConflictsWithRegex <ModName> [Comment] [Level]
ConflictsWithRegex <ModName> <MinMajorVersion> <MinMinorVersion> <MaxMajorVersion> <MaxMinorVersion> [Comment] [Level]

DependsOn <ModName> [Comment]
DependsOn <ModName> <MinMajorVersion> <MinMinorVersion> <MaxMajorVersion> <MaxMinorVersion> [Comment]
DependsOnRegex <ModName> [Comment]
DependsOnRegex <ModName> <MinMajorVersion> <MinMinorVersion> <MaxMajorVersion> <MaxMinorVersion> [Comment]

<ModName>指的是omod的名字,而不是文件名。如果你想要查看mod的名字,将鼠标移到插件上面,就可以看到。regex版本为正则匹配

你还可以选择性的输入最小与最大版本号。如果你不制定的话,任何版本都可以匹配。如果你只想查查最小或者最大版本,而不是二者的话,可以将你不想使用的版本指定为0 0。

[Comment]将在冲突报告中显示。

参数[Level]则表示冲突的级别,可以是 'Minor', 'Major' 或者 'Unusable'。

例 · Example
If DataFileExists Bloodmoon.esm
ConflictsWith "Vampire Embrace" 0 0 2 3 "This mod is incompatible with version of vampire embrace below 2.3" Unusable
DependsOn "Vampire Hunger" "No particular reason"
DependsOnPartial "foo*"

DontInstallPlugin <FileName>

DontInstallDataFile <FileName>
InstallPlugin <FileName>
InstallDataFile <FileName>

安装或者不安装omod里面的文件,要求<FileName>必须是完整的文件名,即包含路径、后缀名。

DontInstallDataFolder <FolderName> [RecurseSubfolders]
InstallDataFolder <FolderName> [RecurseSubfolders]

DontInstallDataFile/InstallDataFile,但这边的对象是文件夹。默认下,子文件夹不会受到影响,如果你想将子文件夹考虑在内,可以将[RecurseSubfolders]的值设为 True。如果你不想安装一个文件夹内的大部分文件,你可以使用此函数和用InstallPlugin安装你想要安装的文件。如果你不想安装一个文件夹内的大部分子文件夹,你可以对主文件夹使用DontInstallDataFolder,然后使用InstallDataFolder安装你想要的子文件夹。

DontInstallAnyPlugins
DontInstallAnyDataFiles
InstallAllPlugins
InstallAllDataFiles

正常情况下,obmm会安装omod里的所有文件,除非你使用 DontInstall... 指定不安装特定文件。DontInstallAny...的作用则相反,表示obmm不安装任何文件,这时候你需要使用 Install... 安装你想要的文件。还有一点,前面使用 DontInstallAny... 的话,在后面你还可以使用 InstallAll... 来取消。

需要注意的是,InstallAll... 并不会取消之前的任何 DontInstall...,他只能取消 DontInstallAny...。同样地,在 InstallPlugin "bingle.esp" 后面再调用 DontInstallAnyPlugins 的最终结果是安装了 bingle.esp。

例 · Example
IfNot DialogYesNo "Do you want to overwrite the default textures?"
    DontInstallAnyDataFiles
EndIf

CopyDataFile <CopyFrom> <CopyTo>

CopyPlugin <CopyFrom> <CopyTo>

表面看起来只是简单的复制文件,但是其实是一个很强大的函数(可以同时修改路径与文件名),虽然会大大的破坏冲突检查功能。第一个参数<CopyFrom>表示你想要复制的文件,相关路径必须为oblivion\data。而且必须是omod里存在了的文件。另外,这个函数并不受DontInstallDataFile的影响,即使DontInstallDataFile定义不安装文件,你依旧可以使用此函数复制文件。第二个参数<CopyTo>表示你想要复制到的目标,同样要求关路径必须为oblivion\data,但可以不是omod里有的文件。

需要注意的是,此函数在0.7.x与0.8时发生了变化:0.8之前的obmm,如果你想要复制文件到已存在的文件,你必须使用DontInstallDataFile。而在0.8中,你不需要再这么做了。虽然算了做了调整,但是因为DontInstallDataFile不再影响文件复制操作,0.8之前的脚本还是能正常运行。

例 · Example
DontInstallDataFile "textures\\highrestexture.dds"
If DialogYesNo "Do you want to use high res textures?"
    CopyDataFile "textures\\highrestexture.dds" "textures\\mymodel\\sometexture.dds"
EndIf

CopyDataFolder <CopyFrom> <CopyTo> [RecurseSubfolders]

复制特定文件夹下的文件夹。如果你将[RecurseSubfolders]定义为True,任何子文件夹下的文件也会被复制。如果有必要的话,相应的文件夹也会自动创建。

PatchDataFile <NewFile> <FileToPatch> [Create]

PatchPlugin <NewFile> <FileToPatch> [Create]

利用此函数给<FileToPatch>安装补丁文件<NewFile>,同时不显示冲突警告。[Create]可使用True或者False。如果为True,文件不存在的话,obmm会自动创建。如果为False<FileToPatch>必须存在,否则函数无法执行。如果不定义的话,默认下[Create]False。(因为新创建的文件将不属于任何omod,不易于管理,作者建议始终使用False,如果需要创建新文件,则改用CopyDataFile/Plugin

这两个函数比较特别,因为即使omod激活出错,它们还是有发生作用的。初衷是为了在不激活的情况下,让那些给mod打补丁的补丁omod发生作用,所以你可以尽情地使用FatalError来避免omod被激活。即使你允许omod被激活,使用此函数复制的文件也不会与补丁omod相关联,而是与原omod相关联。如果该文件本来是不存在的,他将不属于任何omod。(unparented)

笔者注:unparented即安装的文件不属于任何omod,这将带来管理不变、无法使用omod卸载的麻烦。

为了避免在omod安装之初就收到冲突提示,<NewFile><FileToPatch>应该有不同的名字。

不会备份原文件,所以一旦打完补丁,你将需要取消激活并重新激活原来的omod以还原旧文件。

你不能使用此函数替换那些不属于任何omod的文件。(例:使用PatchPlugin替换Oblivion.esm是会出错的。)

例 · Example
DependsOn "An old plugin"

PatchPlugin "v2.0\anoldmod.esp" "anoldmod.esp" False
PatchDataFile "v2.0\meshes\anoldmod\FixedMesh.nif" "meshes\anoldmod\ACorruptMesh.nif" True

Message "Patch complete"
FatalError

其他

RegisterBSA <FileName>
UnregisterBSA <FileName>

使用RegisterBSA在Oblivion.ini中注册该bsa,UnregisterBSA则用来取消RegisterBSA惭怍,但不能取消注册已存在的BSA。<FileName>必须是完整的bsa文件名,即包括路径以及后缀名。

RegisterBSA注册的bsa在omod卸载时会自动取消注册,但是如果该bsa是由多个omod注册的,该文件只会在所有对应omod都卸载后才取消注册。

EditINI <section> <key> <new value>

修改oblivion.ini的数值,并且在omod卸载的时候会自动移除修改。要求<section>必须填写完整(包括方括号[])。

例 · Example
EditINI [display] bDoSpecularPass 0

EditShader <ShaderPackage> <ShaderName> <BinaryObjectPath>

用来编辑sdp文件内的单独shader文件。要插入的shader文件你必须实现编译成.pso或者.vso格式。<ShaderPackage>可用的参数为1到19的数字,表示Data\shaders下对应的sdp文件。<ShaderName>表示你要编辑的shader的名字,<BinaryObjectPath>为omod中已存在的你想要插入的二进制文件(已编译的.pso或者.vso文件)。

obmm会避免多个omod同时编译同一个shader,同时,卸载omod时,之前的修改会撤销。

例 · Example
DontInstallDataFile shaders\GreenEye.pso
For Count package 1 19
    EditShader %package% nighteye000.pso shaders\GreenEye.pso
EndFor

FatalError

取消omod的安装,该omod之前的所有操作也将全部取消。

例 · Example
IfNot DataFileExists Bloodmoon.esm
    Message "This mod requires bloodmoon to be installed" "Fatal error"
    FatalError
EndIf

SetGMST <file> <Editor ID> <new value>

编辑esp文件内的GMST为你想要的数值。你只能编辑由该omod添加的esp/esm。记住:修改插件的GMST可能对游戏产生位置的影响(例:取消激活再重新激活omod以修改esp的GMST,这将导致无法预测的副作用。)要编辑GMST的前提是该插件确实存在该GMST。此函数只能编辑,而不能创建。另外,编辑大文件的GMST会消耗很长的时间。

SetGlobal <file> <Editor ID> <new value>

类SetGMST,但修改的是Global Settings。建议如果SetGMST与SetGlobal都能达到相同的效果时,优先考虑SetGlobal,因为GMST可能是字符型,修改GMST可能意味着整个插件都得重写。而Global Settings可以直接编辑,速度会快很多。

SetPluginByte <file> <offset> <new value>
SetPluginShort <file> <offset> <new value>
SetPluginInt <file> <offset> <new value>
SetPluginLong <file> <offset> <new value>
SetPluginFloat <file> <offset> <new value>

用来编辑插件中的数据,要求插件必须是由该omod安装的esp/esm。

你可以用此函数来修改武器的属性。或者修改物品的脚本。

笔者注:乍看一看很强大,但是根本就是鸡肋,因为想要编辑该<offset>,你必须先知道它是Byte、Short、Int、Long或者是Float(字节、短整型、整型、长整型或者是浮点型)。。

SetVar <Variable> <Value>

修改变量<Variable>的值为<Value>

例 · Example
SetVar var1 bingle
Message %var1%
;Displays a messagebox containing 'bingle'

GetFolderName <Variable> <path>
GetFileName <Variable> <path>
GetFileNameWithoutExtension <Variable> <path>
CombinePaths <Variable> <path1> <path2>

使用这些函数用来管理路径。一般是搭配 For Each ... 使用。

Substring <Variable> <String> <startfrom> [length]
RemoveString <Variable> <String> <startfrom> [length]
StringLength <Variable> <String>

更普遍的字符串编辑。

例 · Example
SetVar str "1 2 3 4" ;不要忘了空格" "也算一个字符!
Substring str "%str%" 2 ;从"1 2 3 4"中第2个字符开始取,有"2 3 4"
Message "%str%" ;输出 "2 3 4"
RemoveString str "%str%" 2 2 ;从"2 3 4"中第2个字符开始删掉"3 "两个字符,得"2 4"
Message "%str%" ;输出 "2 4"
StringLength str "%str%" ;获得"2 4"的长度,为3
Message "%str%" ;输出 "3"

iSet <Variable> <expression>
fSet <Variable> <expression>

数学计算。允许使用的运算符有+、-、*、/、^、%、mod(mod与%是一样的操作,^是幂运算),每一个运算符周围都必须有空格,不能与周围的其他字符相连。iSet将强制计算过程中与计算结果都以整型输出,fSet则在计算过程中使用8字节的浮点型,结果中使用4字节的浮点型。要使用负数的话,可以直接用-连接,中间不写空格。要写科学记数法,则可借用E。

iSet还支持 or、xor、and 等双目运算符以及 not 单目运算符。

fSet还支持 sin、cos、tan、sinh、cosh、tanh、exp、log、ln 等单目运算符(三角函数请使用弧度制。)

运算符的优先级为:空格、单目运算符、and、or、xor、mod、%、^、/、*、+、-。

例 · Example
iSet result -1 + ( 5 mod 3 ) + ( 6 - 3 )
Message "%result%" ;Will print "4"
fSet result 1E+10 / 10
Message "%result%" ;Will print 1E+9

InputString <Variable> [Title] [Initial]

显示文本编辑器,要求玩家输入相应的文本。如果文本编辑器未保存就关闭,<Variable>将变成空白字符,即使已设置为文本编辑器的内容。

如果[Title][Initial]都没有定义的话,他们的默认数值为空白字符。

ReadINI <Variable> <section> <Value>
ReadRendererInfo <Variable> <Value>

使用此函数读取Oblivion.ini或者ReadRendererInfo.txt的数值。可以用来获取游戏分辨率或者应该使用的shader package。

例 · Example
ReadRendererInfo package "Shader Package"
SelectVar package
    Case 8
    Break
Default
    Message "You must be using shader package 8" "Error"
    FatalError
EndSelect

EditXMLLine <file> <line number> <new line>
EditXMLReplace <file> <text to find> <text to replace>

使用这两个函数编辑omod里的xml文件,不可以修改非omod内的xml文件!

EditXMLLine表示替换xml文件中的整行内容,EditXMLReplace则替换xml的<text to find><text to replace>

ExecLines <lines>

执行<lines>。可以与变量和循环结构搭配以实现动态的选项菜单。

在ExecLines不可以执行循环操作,但是可以执行If判断结构以及Select选择结构。

笔者注:很实用的函数,能大大的节省工作量,但对脚本不了解的请慎用。

例 · Example
SetVar select "SelectManyWithPreview \"Choose which optional texture replacers you'd like to install\" "
SetVar cases ""
For Each DataFolder fName "extras" False
SetVar select "%select% \"%fName%\" \"%fName%/preview.jpg\" "
SetVar cases "%cases%Case fName%NewLine%CopyDataFolder \"fName\" \"Textures\" True%NewLine%Break%NewLine%"
EndFor
ExecLines %select%%NewLine%%cases%%NewLine%EndSelect

AllowRunOnLines

obmm 0.9.26 以后你可以将一条语句分成多行书写,只要用"\"连接即可。但为了与旧的脚本兼容,要求使用前先声明AllowRunOnLines,否则会出错。

例 · Example
Message foo \
bar

将输出两个消息框,第一个是文本为foo,标题为\。第二个则显示错误,错误提示为 bar 为未知函数。

例 · Example
AllowRunOnLines
Message foo \
bar

将输出一个消息框,文本为foo,标题为bar。

Valid XHTML 1.0 Strict