Smokey_Days
本帖最后由 Smokey_Days 于 2017-2-14 21:07 编辑

扩展I-序

条件,事件和目标由“指令字符串”定义。它是一段具有特定格式的文本,包含关于条件/事件/目标的指令。通过这串字符,条件/事件/目标将拥有自己的属性和用途。要定义指令字符串,您需要知道一些基本的东西,下面几节。它描述了这些事物的行为以及如何定义这些行为。所有的指令字符串都可在它们自己的配置文件中定义,例如所有条件都在conditions.yml 配置文件中定义。用于定义它们的语法如下所示:
  1. name: '包含数据的指令字符串'
复制代码
“ '' ”(英文半角单引号)在一些情况下是可选的(我们似乎在以前讲过这个问题),你可以问问度娘“YAML”文件的语法。

包和全局变量也是非常常用的属性,我们也将了解他们


条件

条件(conditions)是创建高级复杂任务中最常用也是最有用的工具。它们允许您控制玩家在对话中可用的选项,NPC使用什么选项回复玩家或者目标何时启动。在第八章将列出全部条件的列表。

您可以通过在条件名开头(在您使用它的地方,比如对话中或者事件中,不是在conditions.yml文件中)添加一个英文半角感叹号(!)来进行条件非门,即当没有达成该条件的时候才能执行该选项/事件/目标。

您可以在条件中使用变量来代替一个具体的数值。如果变量无法解析(即显示一个空字符串),或者使用的变量不是数值型的,BetonQuest将视为你填写的数值为0。


事件

有时,你希望执行一些事情,比如更新日志,设置标签,给予奖励等等。所有这些都是使用事件(events)完成的。如同条件一样,你也需要通过指定事件类型、名称和指令字符串。您可以在事件列表(第九章)中找到所有事件的指令字符串。在指令字符串的末尾,您可以添加conditions: 或者 condition:(带或不带s都可以),后面跟一个用逗号分隔的条件列表,如
  1. conditions:angry,!quest_started
复制代码
这将使事件仅在满足这些条件时才可以触发。

您可以在事件中使用变量来代替一个具体的数值。如果变量无法解析(即显示一个空字符串),或者使用的变量不是数值型的,BetonQuest将视为你填写的数值为0。


目标

目标是创建复杂任务时将使用的内容。你可以用一个事件来开始目标。您可以在objectives.yml文件中定义目标。就像条件或事件一样。在指令字符串的末尾,您可以为目标添加条件和事件。条件将限制何时可以启动目标(例如,在防御城市大门的任务中需要玩家在特定位置杀死僵尸),并且当目标完成时事件将被触发(例如给予奖励或设置将能够收集奖励的标签从NPC)。
通过把下方这样的字符串添加到指令字符串末尾,就可以使用条件/事件
  1. conditions:条件1,条件2 events:事件1,事件2
复制代码
用半角空格分隔事件和条件,并且用英文半角逗号分隔条件/事件们。这里不区分单复数,也就是说,condition: 和 event: 都是可行的。

如果你想在目标完成后立即开始一个目标(例如目标:当你死亡时,传送到一个特殊的产生点并再次启动目标),你可以在指令字符串的末尾添加持久性参数。它将防止目标完成,虽然它将运行所有的事件。要取消此类目标,您需要使用客观删除事件。

尽管一旦服务器启动,目标就会被加载。但是事实上,玩家没有进行的目标并不会占用资源,并且多个玩家如果进行同一个目标,那么只会占用一个目标的资源。这意味着如果你制作了100个目标,20个玩家正在做一个目标,另外20个玩家正在做第二个目标,其余的目标没有人做(也就等于不存在),那么实际上消耗的服务器资源只相当于2单位(1单位暂定为1目标/玩家消耗的资源),并不是100,也不是40。



您创建的所有内容将被打包。每个包都有其单独的对话、条件、事件等等,还有包含设置的main.yml  。默认包名为“default”。它是一个锁定的包。如果你删除它,那么就会有一套新的默认任务以default的名字生成一个新的包,它将被重新生成一个示例任务。

如果你希望的话,你可以简单地忽略包这个功能的存在,并在default包中写入所有的任务。然而,在某一时刻,你可能会做出包含几百个文件的巨无霸包。这就是为什么最好将你的任务拆分成多个包,例如“main”包的任务在主要城市,“dungeon”包则包括一些有趣的地下城故事吧啦吧啦吧啦。这样会让你整理、分类好各个部分的内容,不容易混淆。

不要担心,您可以通过在名称前加上包名来引用其他包中的内容。打个比方,你正在village包中写对话,但是你想执行一个来自beton包的名叫reward的事件,那么你只需引用事件beton.reward。插件将在beton中寻找一个名叫reward的事件执行,而不是在beton中寻找。其他东西基本也是这样

当然,有些东西你不能从其他包引用——日记条目和任务物品。如果你要用的话,必须把内容复制过来。

所有包必须在config.yml文件中的packages项下定义,这样系统才会把它当做一个包。如果您的包并没有在默认目录下(比如分层分包?),您应该添加用-(英文半角短划线)分隔的目录名称。打个比方,如果你的目录树是这样的:
  1. BetonQuest/
  2.   default
  3.   quests/
  4.     village1/
  5.       quest1
  6.       quest2
  7.     village2/
  8.       quest1
复制代码
那么在config文件里,它就是写成这样的
  1. packages:
  2. - default
  3. - quests-village1-quest1
  4. - quests-village1-quest2
  5. - quests-village2-quest1
复制代码


全局变量

您可以在任何指令字符串中插入全局变量。它看起来像这样:$ beton $(这个变量被称为“beton”)。当插件加载指令字符串时,它将用在main.yml文件中为其分配的值替换这些变量。它有一些特殊的作用——比如从网络上下载借助WE运作的schematic类型的任务建筑时,不需要通过写大量的代码来设置这些位置,名称或文本,你只需要指定一些变量(当然,只有当你下载的包的作者在代码中正确使用这些变量时,你才能应用它们)。

请注意,全局变量是一种与会话变量完全不同的东西。全局变量使用$字符,对话变量使用%字符。您也不能在全局变量中使用介绍。

有一种特殊类型的变量 - 位置修饰符。它们遵循特定的语法,如下所示:
  1. $ beton $ - >(12; 0; -20)
复制代码

这意味着,首先采用一个名为beton的变量(这是一个有效的位置,如上所述),并向它添加一个向量。于是,这个名为derived变量就被转换为
  1. 112;200;280;world
复制代码
这是因为100 + 12 = 112,零不做改变,300 +(-20)= 280。
于是就应该像这样:
  1. variables:
  2.   beton: 100;200;300;world
  3.   derived: $beton$->(12,0,-20)
复制代码

想要跟踪本帖的,请在下方回复或评分
  1. 这wiki翻译不错,我想订阅
复制代码
这样在每次更新时我会@你

订阅席:
@1345979462
@lsz7575
@光の旋律
@Rolas
@moshimowang18
@S_RwE
@WM2030

来自群组: PluginsCDTribe

kevinss
楼主辛苦了
这个插件翻译量也是够大的

lsz7575
好了好久终于理解了,..下次去试试...爆肛是不对滴.楼楼注意身体哟.

2945713179
777777777777777777777777777777777

大力水手
非常棒的wiki

kkk154
全局变量到底怎么用?

第一页 上一页 下一页 最后一页