插件手册:betonquest:基本概念

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
插件手册:betonquest:基本概念 [2018/06/19 10:24]
小小k酱 [全局变量 Global Variables] 翻译+改编
插件手册:betonquest:基本概念 [2021/08/31 16:11] (当前版本)
duangfafa [物品 Items]
行 36: 行 36:
   - 当需要写”true“和”false“的时候你需要用引号把它套起来比如''%%'true'%%''   - 当需要写”true“和”false“的时候你需要用引号把它套起来比如''%%'true'%%''
   - 如果你需要以''&''作为开头的时候,整句话都需要用单引号套起来比如''%%'&c你好,很高兴认识你'%%''   - 如果你需要以''&''作为开头的时候,整句话都需要用单引号套起来比如''%%'&c你好,很高兴认识你'%%''
-  - (kj译注)另外你必须注意,所有的冒号都必须使用**英文半角冒号**'':''而不是中文冒号”:“,并且冒号和文字内容之间**必须有空格**! +  - (kj译注)另外你必须注意,一切冒号都必须使用**英文半角冒号**'':''而不是中文冒号”:“,并且冒号和文字内容之间**必须有空格**! 
-  - 如果你不确定你的yaml配置文件是否符合语法规定,你可以使用[[http://www.yamllint.com|这个工具]]检查。+  - 如果你不确定你的yaml配置文件是否符合语法规定,你可以使用[[https://yamlvalidator.com/|这个工具]]检查。
  
   * ''quester''是NPC的名字。这个名字应该要和所关联的NPC名字一样,当然你改别的也不会影响BetonQuest运行,只是会容易让人困惑。   * ''quester''是NPC的名字。这个名字应该要和所关联的NPC名字一样,当然你改别的也不会影响BetonQuest运行,只是会容易让人困惑。
行 46: 行 46:
   * ''player_options''里则是玩家可以选择的对话选项。   * ''player_options''里则是玩家可以选择的对话选项。
   * ''text''必填,这是显示在屏幕上的具体对话内容。   * ''text''必填,这是显示在屏幕上的具体对话内容。
-  * ''conditions''若需要对话显示出来,则这里指明的所有//条件conditions//都需要满足才行。多个条件用**英文逗号'',''**间隔。+  * ''conditions''若需要对话显示出来,则这里指明的//条件conditions//都需要同时满足才行。多个条件用**英文逗号'',''**间隔。
   * ''events''则定义了在这句对话被选择的时候,随同对话(由NPC或玩家)触发的//事件events//。多个事件用**英文逗号'',''**间隔。   * ''events''则定义了在这句对话被选择的时候,随同对话(由NPC或玩家)触发的//事件events//。多个事件用**英文逗号'',''**间隔。
   * ''pointer''指向另一方(NPC/玩家)对话的选项。在玩家对话里表示指向NPC的对话,在NPC对话里指向玩家的对话选项。   * ''pointer''指向另一方(NPC/玩家)对话的选项。在玩家对话里表示指向NPC的对话,在NPC对话里指向玩家的对话选项。
行 90: 行 90:
  
 如果你使用''chest''作为对话展示的方式,你可以修改按钮为其它物品。默认按钮使用//末影珍珠Ender Pearl//作为按钮。只需要在对话内容的前面加上特定前缀即可,例如''{diamond_sword}我想开启这个任务!''或者''{wool:10}紫色!'',物品id为Minecraft格式。 如果你使用''chest''作为对话展示的方式,你可以修改按钮为其它物品。默认按钮使用//末影珍珠Ender Pearl//作为按钮。只需要在对话内容的前面加上特定前缀即可,例如''{diamond_sword}我想开启这个任务!''或者''{wool:10}紫色!'',物品id为Minecraft格式。
 +
 +==== 对话继承 Extends ====
 +
 +(kj译注:此功能暂不兼容BetonQuest Editor)自BetonQuest 1.11版开始,对话脚本支持“继承”功能。对话选项中如果有''extends''设置项,那么''extends''指向的内容都回被合并到这个对话选项中。BetonQuest会检测死循环(循环指向)。
 +
 +<code yaml [enable_line_numbers="true"]>
 +NPC_options:
 +
 +  ## 对话开始
 +  对话开始:
 +    text: '你好啊'
 +    extends: 见过面, 主菜单
 +    
 +  ## 译注:被extends的这部分必须加到原对话的后面
 +  好像见过:
 +    text: ',我们昨天好像见过面?'
 +    condition: 见过了
 +
 +  ## 主菜单
 +  主菜单:
 +    pointers: 问你个事, 再见
 +</code>
 +在上面的例子中,对话选项''开始对话''会把''好像见过''的文字加到原始对话的后面,并且把''主菜单''的选项都包含进来。所以就相当于:
 +<code yaml [enable_line_numbers="true"]>
 +NPC_options:
 +
 +  ## 对话开始
 +  对话开始:
 +    text: '你好啊,我们昨天好像见过面?'
 +    condition: 见过了
 +    pointers: 问你个事, 再见
 +</code>
 +如果你能好好利用这个功能,它可以帮你缩短对话脚本。
  
 ---- ----
行 121: 行 154:
 ===== 脚本包 Packages ===== ===== 脚本包 Packages =====
  
-你所创建的所有内容都要按照//脚本包//分类存放。每一个脚本包必须包含一个//main.yml//文件,包中还可以包含一个存放对话脚本的//conversations//文件夹、//events.yml//、//conditions.yml//、//objectives.yml//、//items.yml//、以及//journal.yml//文件。BetonQuest必须有一个叫“default”的//包//(就是存放默认任务的那个文件夹),如果你删掉它,BetonQuest会再生成一个。+你所创建的一切内容都要按照//脚本包//分类存放。每一个脚本包必须包含一个//main.yml//文件,包中还可以包含一个存放对话脚本的//conversations//文件夹、//events.yml//、//conditions.yml//、//objectives.yml//、//items.yml//、以及//journal.yml//文件。BetonQuest必须有一个叫“default”的//包//(就是存放默认任务的那个文件夹),如果你删掉它,BetonQuest会再生成一个。
  
-如果你不介意混乱,你可以把所有任务都一股脑丢到“default”里面。这样你总有一天会遇到每个配置文件都上百行而你找不到你要改的地方在哪儿的窘境。因此分们别类存放你的脚本绝对是个非常好的习惯,比如用文件夹“主城”用来储存主城的任务、“副本”则可以存放一些有趣的副本任务,等等。+如果你不介意混乱,你可以把全部任务都一股脑丢到“default”里面。这样你总有一天会遇到每个配置文件都上百行而你找不到你要改的地方在哪儿的窘境。因此分们别类存放你的脚本绝对是个非常好的习惯,比如用文件夹“主城”用来储存主城的任务、“副本”则可以存放一些有趣的副本任务,等等。
  
 每个//脚本包//都可以通过各自的//main.yml//文件单独启用/禁用,你只需要设置''enabled''为''true''或''false'' 每个//脚本包//都可以通过各自的//main.yml//文件单独启用/禁用,你只需要设置''enabled''为''true''或''false''
  
-如果//任务包//与//任务包//之间不能互相访问就太限制人了,因此你可以通过//包//的前缀和名字去访问别的//包//的内容。比如你在为包''quest1''编写对话脚本,此时你想触发另一个包''quest2''的''reward''事件,你只需要写''quest2.reward''就可以触发它了。BetonQuest插件会去''quest2''而不是在''quest1''包里搜索这个''reward''事件。所有//事件events//、//条件conditions//、//任务目标objectives//、//物品items//和//对话脚本conversations//都可以用这种方式跨包访问。但是请注意,//任务日志journal//并不能跨包!+如果//任务包//与//任务包//之间不能互相访问就太限制人了,因此你可以通过//包//的前缀和名字去访问别的//包//的内容。比如你在为包''quest1''编写对话脚本,此时你想触发另一个包''quest2''的''reward''事件,你只需要写''quest2.reward''就可以触发它了。BetonQuest插件会去''quest2''而不是在''quest1''包里搜索这个''reward''事件。一切//事件events//、//条件conditions//、//任务目标objectives//、//物品items//和//对话脚本conversations//都可以用这种方式跨包访问。但是请注意,//任务日志journal//并不能跨包!
  
 //脚本包//可以用文件夹分们别类存放。一个文件夹可以是//脚本包//本身,或者用来存放//脚本包//,决不能即存放又是脚本包。包的路径前缀就是文件夹的名字,用**英文**横线分隔。下面这个路径树(每一个//main.yml//文件代表了一个//脚本包//): //脚本包//可以用文件夹分们别类存放。一个文件夹可以是//脚本包//本身,或者用来存放//脚本包//,决不能即存放又是脚本包。包的路径前缀就是文件夹的名字,用**英文**横线分隔。下面这个路径树(每一个//main.yml//文件代表了一个//脚本包//):
行 175: 行 208:
 ===== 统一坐标格式 Unified Location Formating ===== ===== 统一坐标格式 Unified Location Formating =====
  
-Whenever you want to define some location in your events, conditions, objectives or any other things, you will define it with this specific format. The location can consist of 2 things: base and vector. Only the base is always required.+当你需要在某些//事件//、//条件//、//任务目标//中用到坐标位置的时候,你需要以一个固定的格式定义定义它们。一般坐标包含两部分内容:**基准坐标base**和**向量vector**,只有基准坐标是必须的。 
 +基准坐标是一切坐标的核心,目前包含两类:**绝对坐标**和**坐标变量**。
  
-The base is a core location. Currently there are two types: absolute coordinates and variables. Absolute coordinates are defined like ''100;200;300;world'', where ''100'' is X coordinate, ''200'' is Y''300'' is and ''world'' is the name of the world. These can have decimal values. If you want you can also add two more numbers at the end, yaw and pitch (these are controlling the rotation, for example in teleportation event, both are needed if you decide to add them; example: ''0.5;64;0.5;world;90;-270'').+**绝对坐标**的格式类似''100;200;300;world'',这里''100''是x坐标值、''200''Y''300''Z、而''world''则是世界,你可以输入小数,在最后你可以加上可选的//偏角yaw//和//仰角pitch//决定头应该看向哪儿(例如:''0.5;64;0.5;world;90;-270'')。
  
-To use a variable as the location's base it must resolve to a valid absolute coordinates. An example of such variable is ''%location%'', which shows player's exact location. Simply place it instead of coordinates. There is one rule thoughyou can't use variable base types in events running without players (for example static events or the ones run from folder event after their player left the server). BetonQuest won't be able to resolve the location variable without the player!+某些情况下你也可以使用**坐标变量**而不需要自己输入坐标值。例,如果你需要提取玩家所在坐标,你可以输入''%location%'',它会被解析成实际坐标值。但有一点需要注意:你不可以在玩家不在线的时候使用这个变量(例如在玩家离线后执行的//[[插件手册:betonquest:事件列表#事件包folder|事件包folder事件]]//或某些//[[插件手册:betonquest:基本概念#静态事件_static_events|静态事件]]//。),BetonQuest没办法在玩家离线的时候解析它。
  
-The vector is a modification of the location. It will be useful if you use global variables instead of base (described in the next subsection) or the base itself is variable, like ''player''. Vectors look like ''->(10;2.5;-13)'' and are added to the end of the base. This will modify the location, X by 10, Y by 2.5 and Z by -13. For example, location written as ''100;200;300;world_nether->(10;2.5;-13)'' will generate a location with X=110Y=202.5 and Z=287 on ''world_nether'' world.+**向量vector**相当于坐标的修改值。在某些情况下,比如配合//全局变量//(请看下一章节)使用的时候,它会非常有用。向量的格式类似于''->(10;2.5;-13)'',它加在//基准坐标//的后面。向量的作用是用来增减//基准坐标//的值,比如''100;200;300;world_nether->(10;2.5;-13)''表示的实际坐标值应该是X=100+10=110Y=200+2.5=202.5Z=300-13=287
  
 ===== 全局变量 Global Variables ===== ===== 全局变量 Global Variables =====
  
-你可以在编写//事件//、//条件//、或//任务目标//指令的时候把//全局变量 global variables//作为值填进去。全局变量是类似这样的东西:''$beton$'(这个变量的名字就是”beton“)。当插件加载脚本的时候,这个变量会被替换成//main.yml//中定义的实际值,而**不是**在执行脚本的时候。 +你可以在编写//事件//、//条件//、或//任务目标//指令的时候把//全局变量 global variables//作为值填进去。全局变量是类似这样的东西:''$beton$''(这个变量的名字就是”beton“)。当插件加载脚本的时候,这个变量会被替换成//main.yml//中定义的实际值,而**不是**在执行脚本的时候。 
- +<code yaml [enable_line_numbers="true"]> 
-  variables: +variables: 
-    村庄坐标: 100;200;300;world +  村庄坐标: 100;200;300;world 
-    村庄名字: Concrete +  村庄名字: Concrete 
 +</code>
 如果你需要在脚本中重复输入多次某个固定值(比如某个WorldEdit schematic),那么使用全局变量会变得很方便。你只需要打几个字就行,而不需要输入一长串的坐标、名字、甚至一大段文本(当然,是在剧本作者合理利用的情况下,内容非常短的名字就没必要用变量了)。 如果你需要在脚本中重复输入多次某个固定值(比如某个WorldEdit schematic),那么使用全局变量会变得很方便。你只需要打几个字就行,而不需要输入一长串的坐标、名字、甚至一大段文本(当然,是在剧本作者合理利用的情况下,内容非常短的名字就没必要用变量了)。
  
行 199: 行 233:
 有个功能可以让玩家取消一个正在进行中的任务。在//main.yml//中有一个''cancel''的分支,在这里定义什么任务可以被取消,以及取消的时候需要做什么。请参照默认的''default''包里面的自带任务作为参考例子。你可以定义的参数是: 有个功能可以让玩家取消一个正在进行中的任务。在//main.yml//中有一个''cancel''的分支,在这里定义什么任务可以被取消,以及取消的时候需要做什么。请参照默认的''default''包里面的自带任务作为参考例子。你可以定义的参数是:
  
-  * ''name'' - 这会被作为名字显示在玩家的//背包backpack//中。所有下划线''_''都会被显示成空格。如果你想显示多语言,你也可以在这里添加(''en''英文这样)。+  * ''name'' - 这会被作为名字显示在玩家的//背包backpack//中。名字中的下划线''_''都会被显示成空格。如果你想显示多语言,你也可以在这里添加(''en''英文这样)。
   * ''conditions'' - //条件conditions//列表,用英文逗号分隔。如果玩家要取消这个任务,他要先满足列表中的这些条件。你可以用这个来判断玩家已经开始了这个任务(比如判断有没有什么//标签tags//),但并没有完成。   * ''conditions'' - //条件conditions//列表,用英文逗号分隔。如果玩家要取消这个任务,他要先满足列表中的这些条件。你可以用这个来判断玩家已经开始了这个任务(比如判断有没有什么//标签tags//),但并没有完成。
   * ''objectives'' - 需要取消的//任务目标objectives//列表。   * ''objectives'' - 需要取消的//任务目标objectives//列表。
行 210: 行 244:
 如果玩家要取消一个任务,他需要打开他的//背包backpack//(/backpack)然后点击“取消”按钮(默认是个骨头图标,如需自定义你可以在//items.yml//中创建一个名为“cancel_button”的物品)。点击之后就会显示一系列可以被取消的任务。 如果玩家要取消一个任务,他需要打开他的//背包backpack//(/backpack)然后点击“取消”按钮(默认是个骨头图标,如需自定义你可以在//items.yml//中创建一个名为“cancel_button”的物品)。点击之后就会显示一系列可以被取消的任务。
  
-===== 全局位置 Global Locations =====+===== 全局任务目标 Global Objectives =====
  
-Global locations are locations at which events can fire. They are defined as normal **location** objectives in objectives.yml and will fire when any player is in range of that location. Global locations are active for all players, even if they don't have an active objective. They can be used for starting location specific quest (such as encountering a dungeon and checking it out), teleporting players to arenas, this kind of stuff. They use tags to tell which player has been at certain location and which hasn't. These tags follow syntax ''global_<tag>'', where ''<tag>'' is location objective's tag, defined at the end of instruction string (eg. ''global_conversation_start'', where ''conversation_start'' is a tag of location objective). You can specify which events will be global locations in the //main.yml// file inside a package, separating them with commas:+如果你想制作一个对所有玩家都有效的任务目标,无论玩家有没有开启,你可以通过“全局目标”实现。在普通的任务目标指令(objectives.yml中的指令)末尾加上''global''参数,那么这个任务目标就会对所有进入游戏的玩家生效。每次玩家加入服务器的时候,都会自动启动这个任务目标。
  
-  global_locations: dungeon_entrance,trap,something_else+但为了避免这个任务目标在玩家每次加入服务器的时候被重复启动,系统还会给启动过这个任务目标的玩家添加一个tag,只要玩家有这个tag在身上,就不会重复启动这个任务目标。这个tag的格式是''<package>.global-<id>'',其中''<id>''是任务目标的id(如下例中是“start_quest_mine”),''<package>''是该任务目标所在的objectives.yml的脚本包路径。(kj译注)如果你需要这个任务目标可以被重复完成,你应该在末尾添加''persistent''参数,而不是删除global tag!
  
-===== 静态事件 Static Events =====+你可以利用这个设计出诸如在固定地点启动某些事件,或破坏某些特定方块后触发奖励的功能。
  
-//静态事件static events//是指可以在一天中某个时刻自动触发的事件。这些//事件//不与玩家关联,所以类似于''tag''这样关系到玩家的事件就不属于静态事件。并且,静态事件没有//条件//一说,因为检查条件的时候会涉及到具体某个玩家。在[[插件手册:betonquest:事件列表|事件列表]]中的所有//静态事件//都会用**static**特别标注。如需在固定时间发动静态事件,可以在//main.yml//的''static''分支写上类似这样的内容:+<code yaml [enable_line_numbers="true"]> 
 +start_quest_mine'location 100;200;300;world 5 events:start_quest_mine_folder global' 
 +</code>
  
-  static: +===== 静态事件 Static Events =====
-    '09:00': beton +
-    '23:59': lightning_strike +
-    '11:23': some_command+
  
 +//静态事件static events//是指可以在一天中某个时刻自动触发的事件。这些//事件//不与玩家关联,所以类似于''tag''这样关系到玩家的事件就不属于静态事件。并且,静态事件没有//条件//一说,因为检查条件的时候会涉及到具体某个玩家。在[[插件手册:betonquest:事件列表|事件列表]]中的一切//静态事件//都会用**static**特别标注。如需在固定时间发动静态事件,可以在//main.yml//的''static''分支写上类似这样的内容:
 +<code yaml [enable_line_numbers="true"]>
 +static:
 +  '09:00': beton
 +  '23:59': lightning_strike
 +  '11:23': some_command
 +</code>
 注意时间必须用''%%' '%%''套起来才符合YAML格式要求。如果小时小于10则需要在前面补上”0“。''beton''、''lightnint_strike''这些都是来自于''events.yml''的事件。每一条只能写一个//事件//,如果你需要同时触发多个事件你可以使用[[插件手册:betonquest:事件列表#事件包folder|”事件包folder“]]。 注意时间必须用''%%' '%%''套起来才符合YAML格式要求。如果小时小于10则需要在前面补上”0“。''beton''、''lightnint_strike''这些都是来自于''events.yml''的事件。每一条只能写一个//事件//,如果你需要同时触发多个事件你可以使用[[插件手册:betonquest:事件列表#事件包folder|”事件包folder“]]。
  
 ===== 任务日志 Journal ===== ===== 任务日志 Journal =====
  
-The journal is a book in which all your adventures are described. You can obtain it by typing **/j** command or **/b** and selecting it from backpack. You cannot put it into any chests, item frames and so on. If you ever feel the need to get rid of your journal, just drop it - it will return to your backpack. The journal is updated with the ''journal'' event, and the text inside is defined in //journal.yml// config file. If you update these texts and reload the plugin, all players' journals will reflect changes. Colors in the journal can be altered in config.yml. The entries can use color codes, but the color will be lost between pages.+日志是一本记录你所有冒险历程的书。你可以输入**/j**指令或输入**/b**在背包里找到它。你不能将它放入任何箱子、展示框等。如果你觉得有必要解除你的日志,只需要丢掉它,它将会回到你的背包中。日志将随日志事件''journal''更新,其文本由配置文件//journal.yml//定义。如果你更新了文本并重新加载(reload)了插件,所有玩家的日志将会反映变化。日志中的颜色可以在//config.yml//中修改。条目可以使用颜色代码,但颜色会在页面间消失。
  
-The journal by default appears in the last slot of the hotbar. If you want to change that use ''default_journal_slot'' option in //config.yml//, experiment with different settings until you're ok with it.+日志默认出现在快捷栏最后一格中。如果你想更改它,可以调试//config.yml//中的''default_journal_slot''项,尝试不同设置直到你觉得没问题。 
 +如果你想要编译条目,做与conversation项相同的行为——换行,添加你想包括的所有语言ID与日志文本。
  
-If you want to translate the entry do the same thing as with conversation option - go to new line, add language ID and the journal text for every language you want to include.+你可以通过//config.yml//文件中的日志''journal''部分控制日志行为。''chars_per_page''说明了单页上可以放置多少字符。如果你设置得过高,文本将会溢出页面,而太低则会有过多页面。''one_entry_per_page''允许你将所有条目放置于同一页面。在此情况下''chars_per_page''则被无视,BetonQuest将把全体条目放入此页面。''reversed_order''允许你反转条目顺序而''hide_date''让你从日志条目中删除日期。 
 +您可以在//config.ym//l的''journal_colors''部分中控制日记中的颜色:''date''是每个条目的日期颜色,''line''是条目分割线的颜色,''text''是文本的颜色。 您需要使用不带''&''的标准颜色代码(如:''4''表示深红色)。
  
-You can control behavior of the journal in //config.yml// file, in ''journal'' section. ''chars_per_page'' specifies how many characters will be placed on a single page. If you set it too high, the text will overflow outside of the page, too low, there will be too much pages. ''one_entry_per_page'' allows you to place every entry on a single page. The ''chars_per_page'' setting is in this case ignored, BetonQuest will put entire entry on that page. ''reversed_order'' allows you to reverse order of entries and ''hide_date'' lets you remove the date from journal entries. +您还可以将主页添加到日记中。 这是一个文本列表,仅在满足指定条件时显示。 您可以在//main.yml//文件的''journal_main_page''部分中定义它们:
- +
-You can control colors in the journal in ''journal_colors'' section in //config.yml//: ''date'' is a color of date of every entry, ''line'' is a color of lines separating entries and ''text'' is just a color of a text. You need to use standard color codes without ''&'' (eg. '''4''' for dark red). +
- +
-You can also add a main page to the journal. It's a list of texts, which will show only if specified conditions are met. You can define them in the //main.yml// file, in the ''journal_main_page'' section:+
 <code yaml [enable_line_numbers="true"]> <code yaml [enable_line_numbers="true"]>
 journal_main_page: journal_main_page:
行 249: 行 287:
     conditions: 'quest_started,!quest_completed'     conditions: 'quest_started,!quest_completed'
 </code> </code>
-Each string can have text in different languages, list of conditions separated by commas (these must be met for the text to show in the journal) and ''priority'', which controls the order of texts. You can use conversation variables in the texts, but they will only be updated when the player gets his journal with the **/journal** command. Color codes are supported.+每个字符串可以有不同语言的文本,条件列表用逗号分割(这些条件必须满足日志中显示的文本)和优先级(''priority'')——它控制文本的顺序。你可以在文本中使用会话变量,但只有在玩家使用**/journal**命令获取日志时才会更新它们。支持颜色代码。 
 + 
 +如果您希望主页采用单独的页面(条目将显示在下一个空页面上),将//config.yml//中的''full_main_page''设置为“true”。
  
-If you want your main page take a separate page (so entries will be displayed on next free page), set ''full_main_page'' in //config.yml// to "true". 
  
 ===== 标签 Tags ===== ===== 标签 Tags =====
行 281: 行 320:
 某物品: MATERIAL 其它参数... 某物品: MATERIAL 其它参数...
 </code> </code>
-这个''MATERIAL''是物品ID,具体请参阅[[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html|这个列表]]。ID不一定要全大写。”其它参数“包括定义物品名字、备注、附魔、药效等等的参数,这些参数分为两大类:1.通用的,可用来定义全部物品;2.只针对某些物品的。例如''name''所有物品都可以定义,而''text''则针对//书本//+这个''MATERIAL''是物品ID,具体请参阅[[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html|这个列表]]。ID不一定要全大写。”其它参数“包括定义物品名字、备注、附魔、药效等等的参数,这些参数分为两大类:1.通用的,可用来定义全部物品;2.只针对某些物品的。例如''name''所有物品都可以定义,而''text''针对//书本//
  
 每一个参数都有两种用法:在创造物品的时候,或在检查物品是否具有某些参数的时候。第一种情况非常直截了当——BetonQuest会完全按照你的参数定义并创造出这个物品;第二种情况就有点复杂了,你可以检查某个物品,必须具有某些属性且不能有另一些属性,或干脆不管有没有另一些属性,你还可以检查某个属性的值(比如附魔级别)是否大于/小于//x// 每一个参数都有两种用法:在创造物品的时候,或在检查物品是否具有某些参数的时候。第一种情况非常直截了当——BetonQuest会完全按照你的参数定义并创造出这个物品;第二种情况就有点复杂了,你可以检查某个物品,必须具有某些属性且不能有另一些属性,或干脆不管有没有另一些属性,你还可以检查某个属性的值(比如附魔级别)是否大于/小于//x//
  
-下列是所有物品都通用的参数: +下列是全部物品都通用的参数: 
-  * ''name'' - 物品的名字. 所有下划线会被显示成空格,你还可以使用''&''彩色代码。如果你要检查某个没有名字的物品(kj:<del>连Minecraft自带的名字都不显示?</del>),你可以使用''name:none''要求某个物品没有任何名字。+  * ''name'' - 物品的名字。名字中的下划线会被显示成空格,你还可以使用''&''彩色代码。如果你要检查某个没有名字的物品(kj:<del>连Minecraft自带的名字都不显示?</del>),你可以使用''name:none''要求某个物品没有任何名字。
  
-  * ''lore'' - 物品名字下面的备注。这段文字格式默认是紫色斜体的。所有下划线都会被显示成空格,你还可以使用''&''彩色代码。如果需要换行请使用英文分号'';''字符。如果你要检查某个没有任何备注的物品,请使用''name:none''关键字求某个物品没有任何备注。在匹配/检查备注的时候,默认情况下要求每一行文字都能一一对应才行。如果你只是想检查整段备注里是否包含某一行文字,你可以在//指令//的后面加上''lore-containing''参数。+  * ''lore'' - 物品名字下面的备注。这段文字格式默认是紫色斜体的。备注中的下划线都会被显示成空格,你还可以使用''&''彩色代码。如果需要换行请使用英文分号'';''字符。如果你要检查某个没有任何备注的物品,请使用''name:none''关键字求某个物品没有任何备注。在匹配/检查备注的时候,默认情况下要求每一行文字都能一一对应才行。如果你只是想检查整段备注里是否包含某一行文字,你可以在//指令//的后面加上''lore-containing''参数。
  
   * ''data'' - 物品附加值。例如不同颜色的羊毛,或镐子的损坏度。查找的时候你可以匹配完全一致的某个数字,或大于/小于某个数,在数字的后面加上''+''/''-''就可以了。   * ''data'' - 物品附加值。例如不同颜色的羊毛,或镐子的损坏度。查找的时候你可以匹配完全一致的某个数字,或大于/小于某个数,在数字的后面加上''+''/''-''就可以了。
  
-  * ''enchants'' - 附魔列表和对应的级别。每个附魔都需要包含下面这些信息,用冒号分隔:\\ > ''name''[[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/enchantments/Enchantment.html|附魔名称]]\\ > ''level''附魔级别(正整数)\\ 格式是''name:level''。举个例子,''damage_all:3''是//锋利 III//。你可以同时定义多个附魔,每样附魔之间用英文句号''.''分隔开。\\ 你可以填写''none''要求某个物品没有任何附魔。你还可以在后面加上''+''/''-''去检查某样附魔的级别是否大于/小于一定值。如果你不在意等级,可以用''?''代替数字部分。\\ 默认情况下所有附魔都会完全匹配。如果你只是想检查这个物品是否具有某一些附魔,请在最后加上''enchants-containing''参数。如果你想检查某个物品是否__不__包含某样附魔,请在附魔名字的前面加上''none-'',比如''enchants:none-knockback:?''表示这个物品不能有//击退//附魔。\\ **请不要在没有''enchants-containing''的情况下使用''none-''**,这并不符合逻辑而且会破坏检查过程。+  * ''enchants'' - 附魔列表和对应的级别。每个附魔都需要包含下面这些信息,用冒号分隔:\\ > ''name''[[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/enchantments/Enchantment.html|附魔名称]] (你可以在这里[[插件手册:mythicmobs:物品:附魔|查阅汉化后的附魔列表]]) \\ > ''level''附魔级别(正整数)\\ 格式是''name:level''。举个例子,''damage_all:3''是//锋利 III//。你可以同时定义多个附魔,每样附魔之间用英文句号''.''分隔开。\\ 你可以填写''none''要求某个物品没有任何附魔。你还可以在后面加上''+''/''-''去检查某样附魔的级别是否大于/小于一定值。如果你不在意等级,可以用''?''代替数字部分。\\ 默认情况下所有//附魔//都会匹配。如果你只是想检查这个物品是否具有某一些附魔,请在最后加上''enchants-containing''参数。如果你想检查某个物品是否__不__包含某样附魔,请在附魔名字的前面加上''none-'',比如''enchants:none-knockback:?''表示这个物品不能有//击退//附魔。\\ **请不要在没有''enchants-containing''的情况下使用''none-''**,这并不符合逻辑而且会破坏检查过程。
  
   * ''unbreakable'' - 加上这个参数表示这个物品//无法破坏//。你可以直接写''unbreakable''或者是''unbreakable:true''来检查某个物品是否//无法破坏//。如果你想检查某个物品是否可以破坏,请使用''unbreakable:false''   * ''unbreakable'' - 加上这个参数表示这个物品//无法破坏//。你可以直接写''unbreakable''或者是''unbreakable:true''来检查某个物品是否//无法破坏//。如果你想检查某个物品是否可以破坏,请使用''unbreakable:false''
行 316: 行 355:
 下面的参数适用于//书//以及//书与笔// 下面的参数适用于//书//以及//书与笔//
  
-  * ''title'' - 书的标题。所有下划线都会显示为空格,你还可以使用''&''颜色代码。如果你需要这书没有标题,请填写''none''。 +  * ''title'' - 书的标题。下划线都会显示为空格,你还可以使用''&''颜色代码。如果你需要这书没有标题,请填写''none''。 
-  * ''author'' - 书的作者。所有下划线都会显示为空格,你还可以使用''&''颜色代码。如果你需要这书没有作者,请填写''none''。 +  * ''author'' - 书的作者。下划线都会显示为空格,你还可以使用''&''颜色代码。如果你需要这书没有作者,请填写''none''。 
-  * ''text'' - 书的内容。所有下划线都会显示为空格,你还可以使用''&''颜色代码。如果内容超过//config.yml//中的''journal.chars_per_page''规定,文字就会被自动分段成多页。如果你想自动分页,请使用''|''字符。换行请用''\n''。请留意你不可以在文字中输入空格,如果你需要文字显示空格,请使用下划线代替(''_'')。这是个单一参数,无论它有多长。如果你需要这书没有任何内容,请填写''none''+  * ''text'' - 书的内容。下划线都会显示为空格,你还可以使用''&''颜色代码。如果内容超过//config.yml//中的''journal.chars_per_page''规定,文字就会被自动分段成多页。如果你想自动分页,请使用''|''字符。换行请用''\n''。请留意你不可以在文字中输入空格,如果你需要文字显示空格,请使用下划线代替(''_'')。这是个单一参数,无论它有多长。如果你需要这书没有任何内容,请填写''none''
  
 **一些例子**: **一些例子**:
行 335: 行 374:
   * ''upgraded'' - 高级(在游戏里你通过添加荧石获得,//瞬间伤害II//之于//瞬间伤害//)。可以是''upgraded''或''upgraded:true''。如果你想检查某个药水__不__是高级的,请使用''upgraded:false''   * ''upgraded'' - 高级(在游戏里你通过添加荧石获得,//瞬间伤害II//之于//瞬间伤害//)。可以是''upgraded''或''upgraded:true''。如果你想检查某个药水__不__是高级的,请使用''upgraded:false''
  
-  * ''effects'' - 自定义//药效//列表。独立于上面的药水类型。//药效//之间必须用英文逗号'',''分隔。每一种//药效//都需要包含下面这些东西,且用英文冒号'':''隔开:\\ > [[https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/potion/PotionEffectType.html|药效名称]](这个和上面的//药水类型//不一样!)\\ > 时长(秒)\\ > 强度\\ 一个例子是''WITHER:2:30'',表示30秒的//凋灵II//药效。\\ 如果你只想检查没有任何自定义//药效//的药水,请填写''none''。你还可以检查//药效//的等级或时长大于/小于(或等于)某个值,只需要在后面加上''+''/''-''即可。如果你不在意等级/时长,可以用''?''代替。\\ 默认情况下所有//药效//都会完全匹配。如果你只是想检查这个药水是否具有某种药效,请在最后加上''effects-containing''参数。如果你想确认某个药水是否__不__包含某种药效,请在//药效//的前面加上''none-''前缀。\\ **请不要在没有''effects-containing''的情况下使用''none-''**,这并不符合逻辑而且会破坏检查过程。+  * ''effects'' - 自定义//药效//列表。独立于上面的药水类型。//药效//之间必须用英文逗号'',''分隔。每一种//药效//都需要包含下面这些东西,且用英文冒号'':''隔开:\\ > [[https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/potion/PotionEffectType.html|药效名称]](这个和上面的//药水类型//不一样!)\\ > 时长(秒)\\ > 强度\\ 一个例子是''WITHER:2:30'',表示30秒的//凋灵II//药效。\\ 如果你只想检查没有任何自定义//药效//的药水,请填写''none''。你还可以检查//药效//的等级或时长大于/小于(或等于)某个值,只需要在后面加上''+''/''-''即可。如果你不在意等级/时长,可以用''?''代替。\\ 默认情况下所有//药效//都会匹配。如果你只是想检查这个药水是否具有某种药效,请在最后加上''effects-containing''参数。如果你想确认某个药水是否__不__包含某种药效,请在//药效//的前面加上''none-''前缀。\\ **请不要在没有''effects-containing''的情况下使用''none-''**,这并不符合逻辑而且会破坏检查过程。
  
 **一些例子**: **一些例子**:
行 356: 行 395:
 ==== 皮革装备 Leather Armor ==== ==== 皮革装备 Leather Armor ====
  
-下面的参数适用于所有//皮革装备//+下面的参数适用于一切//皮革装备//
  
   * ''color'' - 皮革装备的颜色。它的值可以是具体的[[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/DyeColor.html|颜色名字]],或者是以''#''开头的RGB颜色代码,亦或者是一个十进制数字。如果你需要这//皮革装备//没有指定颜色,请填写''none''   * ''color'' - 皮革装备的颜色。它的值可以是具体的[[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/DyeColor.html|颜色名字]],或者是以''#''开头的RGB颜色代码,亦或者是一个十进制数字。如果你需要这//皮革装备//没有指定颜色,请填写''none''
行 369: 行 408:
 下面的参数适用于//烟花火箭// 下面的参数适用于//烟花火箭//
  
-  * ''firework'' - 一系列火箭特效。//火箭特效//之间用英文逗号'',''分隔。每一样//特效//都需要包含下面这些属性且用英文冒号'':''隔开:\\ > [[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/FireworkEffect.Type.html|火箭特效]]名字\\ > 主颜色列表 - 具体格式请参考上面的//皮革装备//,每样颜色用英文分号'';''分隔。\\ > 渐变颜色列表\\ > ''true''/''false'' - 是否有拖痕(钻石效果)\\ > ''true''/''false'' - 是否闪烁(荧石粉效果)\\ 请特别留意分隔符号:1.英文逗号用来分隔每一样//特效//2.英文冒号分隔各种属性3.英文分号用来分隔//特效//的颜色。\\ 如果你想检查某个没有任何//特效//的火箭,请填写''none''。如果你不在意特效的类型,可以用''?''代替。如果你想检查没有主/渐变颜色的火箭,请填写''none''。如果你不在意主/渐变颜色是啥,可以用''?''代替。如果你不在意有没有拖痕/闪烁,可以用''?''代替true/false。\\ 默认情况下整个//特效//列表会被完全匹配。如果你只是想检查这个火箭是否具有某些//特效//,请在最后加上''firework-containing''。如果你想确认某个火箭是否__不__包含某种特效,请在//火箭特效//名字的前面加上''none-''\\ **请不要在没有''firework-containing''的情况下使用''none-''**,这并不符合逻辑而且会破坏检查过程。 +  * ''firework'' - 一系列火箭特效。//火箭特效//之间用英文逗号'',''分隔。每一样//特效//都需要包含下面这些属性且用英文冒号'':''隔开:   
 +    * [[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/FireworkEffect.Type.html|火箭特效]]名字 
 +    * 主颜色列表 - 具体格式请参考上面的//皮革装备//,每样颜色用英文分号'';''分隔。 
 +    * 渐变颜色列表 
 +    * ''true''/''false'' - 是否有拖痕(钻石效果) 
 +    * ''true''/''false'' - 是否闪烁(荧石粉效果) 
 +  请特别留意分隔符号:1.英文逗号用来分隔每一样//特效//2.英文冒号分隔各种属性3.英文分号用来分隔//特效//的颜色。 
 +   
 +  如果你想检查某个没有任何//特效//的火箭,请填写''none''。如果你不在意特效的类型,可以用''?''代替。如果你想检查没有主/渐变颜色的火箭,请填写''none''。如果你不在意主/渐变颜色是啥,可以用''?''代替。如果你不在意有没有拖痕/闪烁,可以用''?''代替true/false。 
 +   
 +  默认情况下整个//特效//列表会被完全匹配。如果你只是想检查这个火箭是否具有某些//特效//,请在最后加上''firework-containing''。如果你想确认某个火箭是否__不__包含某种特效,请在//火箭特效//名字的前面加上''none-'' 
 +   
 +  //__请不要在没有''firework-containing''的情况下使用''none-''__//,这并不符合逻辑而且会破坏检查过程。
   * ''power'' - 飞行时长,等级。你可以检查//飞行时长//是否大于/小于(等于)某个等级,只需要在数字后面加上''+''/''-''即可。   * ''power'' - 飞行时长,等级。你可以检查//飞行时长//是否大于/小于(等于)某个等级,只需要在数字后面加上''+''/''-''即可。
  
行 391: 行 441:
 ===== 背包 Backpack ===== ===== 背包 Backpack =====
  
-有时候你想要某些东西在玩家死后依然保留在背包中,比如这些东西是完成整个任务的关键。你可以给这个物品添加这个lore让这个物品不会消失:''&2Quest_Item''(请注意这个lore必须是单独的一行),这样这个物品就不会因为玩家死亡而掉落。+有时候你想要某些东西在玩家死后依然保留在背包中,比如这些东西是完成整个任务的关键。你可以给这个任务物品添加这个lore让这个物品不会消失:''&2任务物品''(请注意这个lore必须是单独的一行),这样这个物品就不会因为玩家死亡而掉落。
  
 **例子:** **例子:**
-<code yaml>神剑: 'DIAMOND_SWORD name:毁灭之_凝结神力 lore:用秘银锻造的大剑;&2Quest_Item'</code>+<code yaml [enable_line_numbers="true"]> 
 +神剑: 'DIAMOND_SWORD name:毁灭之_凝结神力 lore:用秘银锻造的大剑;&2任务物品' 
 +</code> 
 + 
 +(kj译注:这个''&2任务物品''根据你的语言设置不同而不同,如果你的//config.yml//语言设置是''language: en''英语,则需要写成''&2Quest_Item'',具体请看你的//config.yml//和//messages.yml//文件)
  
 如需打开背包,请输入指令**/backpack**。输入之后一个GUI就会显示,里面有你的任务物品和一些任务相关按钮。第一个物品永远是你的任务日志,取走之后这个位置会一直留空。你可以通过点击这些物品,让这些物品在//背包//和你的物品栏之间移动,左键移动一个物品,右键移动全部物品。只有任务相关物品才可以存入//背包// 如需打开背包,请输入指令**/backpack**。输入之后一个GUI就会显示,里面有你的任务物品和一些任务相关按钮。第一个物品永远是你的任务日志,取走之后这个位置会一直留空。你可以通过点击这些物品,让这些物品在//背包//和你的物品栏之间移动,左键移动一个物品,右键移动全部物品。只有任务相关物品才可以存入//背包//
行 400: 行 454:
 如果//背包//中的任务物品超过一页,那么下面就会显示“下一页”按钮。你可以自定义这些按钮,在//items.yml//分别创建两个名为''previous_button''表示上一页、''next_button''表示下一页的物品即可,按钮的实际显示名字会被//messages.yml//覆盖。 如果//背包//中的任务物品超过一页,那么下面就会显示“下一页”按钮。你可以自定义这些按钮,在//items.yml//分别创建两个名为''previous_button''表示上一页、''next_button''表示下一页的物品即可,按钮的实际显示名字会被//messages.yml//覆盖。
  
-任务物品除了使用它们之外不能丢弃。你可以利用这个特性去创建一个吃饼干大赛,玩家必须吃完所有饼干才算完成任务,而不能偷偷丢掉它们。+任务物品只能被使用不能丢弃。你可以利用这个特性去创建一个吃饼干大赛,玩家必须吃完全部饼干才算完成任务,而不能偷偷丢掉它们。
  
 如果你发现在创造模式下任务物品还是可以丢地上,别担心,因为这不是bug,是特性,方便你在设计任务的时候把物品放入宝箱中。 如果你发现在创造模式下任务物品还是可以丢地上,别担心,因为这不是bug,是特性,方便你在设计任务的时候把物品放入宝箱中。
行 415: 行 469:
  
 假设这个按钮在一个副本准备室里,大小只有50x50。上面那么做的好处是,只有在这房间里(50米内)的玩家才会在有人按按钮之后被传送进副本。与此同时外面的玩家则不受影响,因为他们并不在50m的范围内,而且这些范围外的玩家也可以自己组队进个房间然后按按钮传送进副本。需要注意的是,没有满足''quest_started''(没有开始这个任务)的玩家即使在50m范围内也不会被传输进副本,因为他们不满足上面那个//事件//中规定的条件。 假设这个按钮在一个副本准备室里,大小只有50x50。上面那么做的好处是,只有在这房间里(50米内)的玩家才会在有人按按钮之后被传送进副本。与此同时外面的玩家则不受影响,因为他们并不在50m的范围内,而且这些范围外的玩家也可以自己组队进个房间然后按按钮传送进副本。需要注意的是,没有满足''quest_started''(没有开始这个任务)的玩家即使在50m范围内也不会被传输进副本,因为他们不满足上面那个//事件//中规定的条件。
 +
 +===== 方块选择 Block Selectors =====
 +
 +当你需要在脚本中指明/选择某种方块的时候,你需要用到“方块选择器Block Selectors”。但由于Minecraft更改物品ID的缘故,方块选择的格式在1.13之前和之后的版本会略有不同:
 +
 +==== 1.12 及以下 ====
 +
 +基本格式为: ''material:data''
 +
 +其中:
 +  * ''material'' - 方块的材质。你可以在[[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html|这个列表]]搜索你要的材质。
 +  * ''data'' - (可选)方块的副ID。如果为空则默认无视副ID(不管副ID是啥都算匹配得上)。
 +
 +例如:
 +  * ''LOG'' - 匹配一切类型的“原木”
 +  * ''LOG:1'' - 只匹配“杉木原木”
 +
 +
 +==== 1.13 及以上 ====
 +基本格式为: ''prefix:material[state=数值,...]''
 +
 +其中:
 +  * ''prefix'' - (可选)材质的前缀。如果不填/留空则默认为“minecraft”
 +  * ''material'' - 方块的材质。你可以在[[https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html|这个列表]]搜索你要的材质。注意从1.13版开始BetonQuest支持通配符(* 和 ?),详见下面的例子。
 +  * ''state'' - (可选)[[https://minecraft-zh.gamepedia.com/%E6%96%B9%E5%9D%97%E7%8A%B6%E6%80%81|方块状态]],你可以在方括号中指定每一种方块状态并且用英文逗号隔开,请看[[https://minecraft-zh.gamepedia.com/%E6%96%B9%E5%9D%97%E7%8A%B6%E6%80%81|这个列表]]搜索你想指定的方块状态。如果留空则不匹配任何状态。
 +
 +例如:
 +  * ''minecraft:stone'' - 匹配所有的“石头” STONE 方块
 +  * ''redstone_wire'' - 匹配所有“红石粉(红石线路)” REDSTONE_WIRE 方块
 +  * ''redstone_wire[power=5]'' - 匹配“红石粉(红石线路)” REDSTONE_WIRE 方块,并且要求方块的充能等级=5
 +  * ''redstone_wire[power=5,north=none]'' - 匹配“红石粉(红石线路)” REDSTONE_WIRE 方块,并且要求方块的充能等级=5、没有和//北边//有任何连接
 +  * ''*_LOG'' - 匹配一切“原木”方块
 +  * ''*'' - 匹配一切(任意一种)方块
 +  * ''*[waterlogged=true]'' - 匹配一切泡在水中的方块
  • 插件手册/betonquest/基本概念.1529375077.txt.gz
  • 最后更改: 2018/06/19 10:24
  • 小小k酱