本帖最后由 XiangZi_ 于 2020-3-29 19:48 编辑


前言
本插件兼WIKI皆为本人一人搬运
部分内容作者写的比较抽象化
仅凭个人理解能力来写

插件BUG请前往原帖回复作者

翻译内容存在部分偏差,如果遇到有不对的或者翻译出错的请及时联系我更改
本帖正在持续更新中

站内搬运插件传送

本帖所有Sponge[传送]需要梯子
本帖所有Bukkit[传送]无需梯子
也有可能是本人网络原因

*本插件涉及基础编程语言知识

鸣谢人员

由于本人是一位萌新,第一次搬运WIKI
有许多方面懵懵懂懂,导致很多地方都问了前辈们
在此鸣谢CPS小组全体成员
是他们的帮助我才能将此WIKI翻译贴完成的非常好
特此感谢!

@我好兔啊 @安不生 @南外丶仓鼠 @AzureHanChen  


字数统计

2020.3.22 - 2020.3.28

汉字12354
标点符号714
英文字母76209
数字2056

以上为不完全统计

*超过万的为紫色
*没超过万的为橙色

更新记录
  • 完善'高级篇-同步/异步模式'板块 (2020.3.29)
  • 完善'高级篇-循环'板块 (2020.3.28)
  • 完善'高级篇-数组'板块 (2020.3.28)
  • 完善'高级篇-方法'板块 (2020.3.26)
  • 完善'变量'板块 (2020.3.25)
  • 完善'触发条件'板块 (2020.3.24)
  • 修改'自定义触发器'板块 (2020.3.24)
  • 完善'执行器'、'占位符'板块 (2020.3.23)
  • 完善'基础篇'前15章 (2020.3.22)





插件介绍
TriggerReactor是一款超级强大的脚本插件,有非常多的游戏内交互功能以及Skript的所有功能!
你可以创建触发器上制作以下脚本
踩踏,点击方块,命令,进入/离开区域,自定义触发事件,背包格子GUI触发,所有Bukkit事件,和第三方插件联动!
可以与众多插件HOOK,形成与第三方插件联动

特点
  • 多线程(无延迟)
  • 6种触发类型:点击,踩踏,命令,命名,背包,重复
  • 可以以任何事件来创建自定义触发器
  • 包括49个以上的执行器和43个以上的占位符
  • 可以创建自己的执行器或者和其他插件进行HOOK
  • 创建变量
  • 条件系统
  • 创建/使用循环系统和数列系统
  • HOOK第三方插件的API,以达到联动效果

运行要求
  • 对于1.5.2-1.12.2服务器,请使用bukkit-legacy
  • 对于1.13-1.15.1服务器,请使用bukkit-latest
  • 对于sponge服务器,请使用sponge
  • 需要 PlaceholderAPI,Vault 作为前置插件
  • java版本要求:7.0+
  • 服务端版本:1.7-1.15.X
  • 目前测试 Spigot 核心无问题
  • 更多核心等待测试中








插件指令

  • /trg walk {script} - 创建踩踏触发器
  • /trg click {script} - 创建点击触发器
  • /trg command {name} {script} - 创建指令触发器

  • /trg inventory {name} - 展示背包的命令
             /trg inventory {name} create {size} - 创建一个背包的命令,大小可以是9, 18, 27, 36, 45, 54
             /trg inventory {name} delete - 删除一个背包
             /trg inventory {name} item {slot} - 将手持物品设置为对应卡槽展示物品
             /trg inventory {name} open {player} - 对指定玩家打开指定背包
             /trg inventory {name} edit - 编辑一个背包

  • /trg area - 区域触发命令
            /trg area toggle - 开启/关闭区域选择模式
            /trg area {name} create - 在选定区域创建新的区域触发器
            /trg area {name} delete - 删除一个区域触发器
            /trg area {name} enter {script} - 对指定区域触发器新增一个进入脚本
            /trg area {name} exit {script} - 对指定区域触发器新增一个离开脚本
            /trg area {name} sync - 开启/关闭同步模式

  • /trg repeat - 重复触发命令
            /trg repeat {name} - 创建一个重复触发器
            /trg repeat {name} interval {time} - 改变触发间隔
            /trg repeat {name} autostart - 开启/关闭自动启动模式
            /trg repeat {name} toggle - 开启/关闭重复触发器
            /trg repeat {name} pause - 暂停/继续重复触发器
            /trg repeat {name} status - 检查重复触发器状态
            /trg repeat {name} delete - 删除一个重复触发器

  • /trg custom {event} {name} {script} - 创建一个自定义触发器
  • /trg synccustom {name} - 开启/关闭自定义触发器的同步模式

  • /trg item - 显示物品命令
            /trg item title {item title} - 更改手持物品名字
            /trg item lore add {lore) - 增加手持物品描述
            /trg item lore set {line} {lore} - 在指定行插入描述
            /trg item lore remove {line} - 删除指定行描述

  • /trg variables {name} {value} - 设置全局变量值(value是检查该变量值)
  • /trg run {script} - 运行一个脚本
  • /trg sudo {name} {script} - 对指定玩家运行一个脚本
  • /trg delete {trigger/variable} {name} - 删除一个变量/触发器
  • /trg search - 将当前区块的触发器显示为发光的石头

  • /trg timings - 显示计时相关命令
            /trg timings toggle - 开启/关闭计时(默认关闭)
            /trg timings reset - 重置当前计时信息
            /trg timings print - 发送当前计时信息给管理员
            /trg timings print {file} - 将当前计时信息写入一个文件中

  • /trg saveall - 保存所有触发器/变量/设置
  • /trg reload - 重载所有触发器/变量/设置

简写命令
  • triggerreactor - trg
  • walk - w
  • click - c
  • command - cmd
  • inventory - i
  • area - a
  • repeat - r
  • synccustom - sync
  • variables - vars
  • delete - del

举例:/trg walk {script} - > /trg w {script}  [看到木有,这就是简写]

插件权限

此插件没有任何权限需要给玩家
唯一权限

  • triggerreactor.admin - 给予玩家使用插件的所有命令






基本语法

  • 取顺序
在TriggerReactor中,命令是从左到右,从上到下读取的
比如下面这个例子
  1. #MESSAGE "欢迎"; #MESSAGE "来到"
  2. #MESSAGE "MCBBS"
复制代码
这样输出的话就会是 欢迎 来到 MCBBS

  • 分割语句
一条语句就是一个完整的命令。上面的例字包含了3条语句。每个语句必须用分号或回车分行分隔
如果示例中的第一行缺少分号,就是下面这样
  1. #MESSAGE "欢迎" #MESSAGE "来到"#MESSAGE "MCBBS"
复制代码
TriggerReactor会将两个命令作为一条语句来处理,就会导致报错,或者无法运行脚本
以下示例正确分割语句
  1. //这是分号的正确使用方法
  2. #MESSAGE "欢迎"; #MESSAGE "来到";#MESSAGE"MCBBS"

  3. //这是回车分行的正确使用方法
  4. #MESSAGE "欢迎"
  5. #MESSAGE "来到"
复制代码

  • 注释
在上面的示例中,有几行代码前面带有//
这就是注释。注释中的任何信息都会被忽略,不会与脚本一起运行
注释对于代码是非常重要,所有看你代码的人都可以看到注释
  1. #MESSAGE "&l&c欢迎来到MCBBS!" //红色加粗字体,玩家容易看到
复制代码
上面的代码就有一行注释。从//符号一直到这行末尾的任何信息都会被忽略,即使它包含可以执行的代码
多行注释以开头/* */结尾
例如
  1. /* MCBBS究极搬运工
  2. 超级爱MCBBS
  3. 这里是施工现场 */
复制代码
多行注释里的内容包含可执行的代码,也会被忽略

  • 值的类型
TriggerReactor脚本可以和非常多不同类型的数据进行联动。这里有3个非常常用的类型:字符串 , 整数 , 布尔值

  • 字符串
怎么样才能将String值放入脚本中,文本必须用双引号""圈起来,然后TR就会把文本看做String值,而不是可以执行的命令代码。
例如将这句话定义为字符串
  1. Hi! Welcome to MCBBS!
复制代码
把""附加到句子的开头和结尾就可以了
  1. "Hi! Welcome to MCBBS!"
复制代码
这样这句话就是字符串了

  • 合并多个字符串
"+"符号表示添加,也就是合并,"+"还可以将两个String放在一起。
比如
  1. "Hi! Welcome to MCBBS!"就好比与"Hi!" + " Welcome to " + "MCBBS" + "!"
复制代码
还可以把字符串与任何值联动,比如与变量联动
  1. "你好!我的名字是"+$playername+"!"
复制代码
(有关$ playername和其他变量的更多信息,请至变量原帖)
  • 换行
如果要用"",需要吧\放在双引号后
比如,你要打
  1. you can "do" that.
复制代码
加上""后就是这个样子.
  1. #MESSAGE "you can "do" that"
复制代码
还可以使用\n换行
比如
  1. #MESSAGE "这是第一行\n这是第二行"
复制代码
在一些符号前,你可以添加\来保证插件不会寻找其他符号,并且和它产生联动
  1. #MESSAGE "C:\\users"
复制代码

  • 整数
通常缩写为"int" 正整数、负整数、0
在TriggerReactor中,整数的最小/最大限制:-2,147,483,648 - 2,147,438,647
整数可以用于算术运算,比如

  1. #MESSAGE 3 * 9
  2. #MESSAGE 1 - 900
复制代码
如果把整数和字符串放在一起用,那么整数会自动转换成字符串
  1. #MESSAGE "This is an apple: " + 99 //"This is an apple: 99"
  2. #MESSAGE 10 + "种方法在MC作死"
复制代码

  • 布尔值
布尔值是二进制的,比如:0、1、true、false
可以用true,false进行定义
  1. bool = false
  2. IF bool == false
  3.     #MESSAGE "hi"
  4. ELSE
  5.     #MESSAGE "bye"
  6. ENDIF
复制代码
这几行代码的意思就是
1、设置 bool 为 false
2、如果 bool 是 false,那么消息就会提示 "hi"
3、如果 bool 不是 false , 那么消息就会提示 "bye"





入门教学
  • 概括
触发反应器必须要有两个主要组件:触发器和脚本

  • 触发器
触发器是你希望TR做出什么反应的事件,所以它才可以运行你创建的脚本
比如,我要TR对我们在指定方块上"路过"时发出信息,就可以创建一个踩踏触发器
  • 输入命令 /trg walk #MESSAGE "你好!"
  • 单击一个方块绑定命令
  • 踩上去
如果一切操作正确,你会看到 你好! 出现在聊天栏上
注意:你可以使用骨头 左键触发器方块或者在WalkTrigger文件夹中删除对应配置文件来删除触发器
TR中内置了超多触发器,你可以用它们来触发任何事件,和第三方插件联动等

  • 脚本
在上面的例子里面,用了#MESSAGE执行这个脚本命令,这就会和TR说你想在聊天中向玩家发送啥消息
脚本可以包含:
Executors - 执行器
Placeholders - 占位符
Conditions - 条件
Variables - 变量
Methods - 方法
Arrays - 数组
Loops - 循环

提示:
你可以使用 /trg run <script> 来测试脚本,(不需要触发器)
这个对调试很有用,建议做的时候试试看
例子脚本:
  1. /trg run #MESSAGE "我的ID是" + $playername
复制代码
用分号可以运行多个脚本:
  1. /trg run #MESSAGE "召唤一只苦力怕."; #SPAWN "CREEPER"
复制代码

  • 执行器
执行器是让这个脚本触发的关键点
比如,你可以设置时间或者把玩家传送到其他位置
  1. #MESSAGE
  2. #SPAWN
复制代码

  • 占位符
占位符可以引用服务器中的变量
比如,用来获取玩家名称
  1. $playername
复制代码
这里提供占位符的完整列表:【点击传送

  • 条件
条件仅在满足这些条件的时候触发特定脚本
比如,你可以吧他设置在每天定点触发
  1. IF $time == 18000
  2.     #MESSAGE "现在是午夜哦."
  3. ENDIF
复制代码

  • 变量
变量可以存储值,这个值可以在其他触发器上使用
比如创建一个名为的points的变量
在脚本中使用
  1. points = 10
  2. #MESSAGE "我现在有 " + 点券 + " points."
复制代码
这就会输出
  1. 我现在有10点券.
复制代码

  • 方法
你可以在spigot上看到所有方法
方法在脚本中没有任何限制
比如有需要的执行器或占位符,但是没有或者找不到,这里就可以使用方法来制作脚本
有关方法的更多信息请查看专页介绍

  • 脚本

  • 脚本语法
语法是TR为了运行脚本而使用独特的语言
如果语法不正确,就会错误,而且脚本就没办法使用

  • 读取命令
触发反应器读取的顺序是从左到右,从上到下
  1. #MESSAGE "第一个读取"; #MESSAGE "第二个读取"
  2. #MESSAGE "第三个读取"
复制代码

  • 类型
触发器反应器中有三种主要数据类型
  • 符号
  • 字符串
  • 布尔值

  • 符号
可以用符号进行任何数字运算


  • 字符串
字符串必须用双引号圈起来!如果不用双引号圈起来,TR会把他看做变量或者数字
可以用"+"把字符串和数字连在一起。使用运算操作来执行这个命令
比如
  1. "My name is " + "XiangZi_." 输出: My name is XiangZi_
  2. "我" + 17 + " 岁啦." 输出: 我17岁啦.
复制代码

  • 布尔值
布尔值是0、1、true、false, 经常出现在条件中

  • 注释
  • 单行注释
在前面加双斜杠"//"
  1. //#MESSAGE "这条命令不会运行."
复制代码
  • 多行注释
"/*"和"*/"可以注释多行
  1. /*#MESSAGE "这行命令不会运行"
  2. #MESSAGE "当然这行也不会"*/
复制代码





内置编辑器

当你创建没有代码参数的新触发器时,游戏内编辑器就会在聊天框出现



支持游戏内编辑器的触发器:
  • 单击触发器
  • 踩踏触发器
  • 命令触发
  • 自定义触发器
  • 背包空间触发
  • 区域触发

除了命名触发器外,其他触发器都可以使用游戏内置编辑器



  • 教学
以点击触发器为例

1、启动编辑器
  1. /trg c
复制代码
你就会看到游戏内置编辑器
  1. In edit mode, you cannot receive any messages from other users.
  2. You can type ‘save’ or ‘exit’ at any time to escape from the edit mode.
  3. If the code is more than one line, you can go up or down by typing ‘u’ or ‘d’.
  4. When you are doing so, you can provide the number of lines to skip
  5. If you don't provide the number, the default value 1 will be used instead.
  6. Type ‘il’ to insert a new line and ‘dl’ to delete the current line.
  7. Look for the << sign to see where you are currently at.
  8. the chat line, due to client quirks)
  9. Because of how minecraft client is made, you need to specify space with ^ to insert spaces.
  10. For example, you can add four spaces before the a line of code like this:
  11. Now enter anything to continue.
复制代码
2、输入任何内容进行下一步
  1. save, exit Click Trigger
  2. -----------------------------------------------------------------------
  3. 1. <<


  4. ----------------------------------------------------------------------
  5. u <lines>, d <lines>, il, dl
复制代码
编辑器窗口将显示上面的代码
在这里,你可以添加行,添加脚本
3、在聊天中输入任何内容(不要带斜杠 "/”),然后回车(示例中输入的ABC)
  1. save, exit Click Trigger
  2. -----------------------------------------------------------------------
  3. 1. ABC <<





  4. ----------------------------------------------------------------------
  5. u <lines>, d <lines>, il, dl
复制代码
你在聊天框中输入的所有内容都会输入到你正在编辑的这一行
输入其他内容看看(例如CEF)
  1. save, exit Click Trigger
  2. -----------------------------------------------------------------------
  3. 1. CEF <<




  4. ----------------------------------------------------------------------
  5. u <lines>, d <lines>, il, dl
复制代码
如上方代码所示,CEF取代了ABC
如何输入多行
聊天框中输入il
  1. save, exit Click Trigger
  2. -----------------------------------------------------------------------
  3. 1. CEF <<
  4. 2.




  5. ----------------------------------------------------------------------
  6. u <lines>, d <lines>, il, dl
复制代码
可以看到2.已添加到新的一行。
il是 "插入行”的缩写
il是在当前光标<<所在的行的下面创建新的一行
添加一行光标不会跟随移动
在聊天栏输入d,才会向下移动一行
  1. save, exit Click Trigger
  2. -----------------------------------------------------------------------
  3. 1. CEF
  4. 2. <<



  5. ----------------------------------------------------------------------
  6. u <lines>, d <lines>, il, dl
复制代码
可以看到<<标记已经移至第2行,d不是"换行"
d是 "down" 的缩写
输入d 2,它就会向下移动两行
向上移动怎么办?
聊天栏输入u
  1. save, exit Click Trigger
  2. -----------------------------------------------------------------------
  3. 1. CEF <<
  4. 2.



  5. ----------------------------------------------------------------------
  6. u <lines>, d <lines>, il, dl
复制代码
可以看到<<符号已经移至第1行。
"u"是 "up" 的缩写
输入u 2,向上移动2行
如何删除该行?
假设光标在1. CEF <<
在聊天中输入dl
  1. save, exit Click Trigger
  2. -----------------------------------------------------------------------
  3. 1. <<




  4. ----------------------------------------------------------------------
  5. u <lines>, d <lines>, il, dl
复制代码
就会删除这一行
这行的所有语句也会删除。
如何保存代码?
聊天栏中输入save
  1. save
复制代码
如果保存成功,就会显示上面的消息
如果不小心进了编辑器,或者输入错代码,不想保存,怎么办
聊天栏输入exit
  1. Are you sure to exit? Unsaved data will be deleted! Type yes to exit or type anything to cancel.
复制代码
会出现上方提示
输入yes就可以退出编辑器








点击&踩踏触发器
  • 创建触发器
首先输入以下命令,选一个输入
click是点击,walk是踩踏
  1. /trg click <script>
  2. /trg walk <script>
复制代码
比如:
  1. /trg click #MESSAGE "欢迎来到MCBBS"
复制代码
之后,TR会提示设置要触发的方块。单击一个方块设置触发的位置
如果提示以下消息,就说明你设置成功了
  1. - - - - - - - - - -
  2. Trigger: Click
  3. Block Type: ?
  4. Location: ?@?,?,?

  5. Script:
  6.     #MESSAGE "欢迎来到MCBBS"
  7. - - - - - - - - - -
复制代码

  • 编辑触发器
有2种方法编辑触发器
1、使用骨头工具右移单击触发器
2、打开ClickTrigger或WalkTrigger文件夹,编辑对应配置文件

  • 工具类
用这些工具来可以快速编辑触发器位置

  • 变量
下面是可以在点击&踩踏触发器中使用的变量
还可以使用第三方变量 【点击传送

  • 点击触发器
在点击触发器中可以使用的变量
要了解有关变量的更多信息,请参见变量 【点击传送
  • 事件
玩家与物体互动时的事件
Bukkit【点击传送】 Sponge【点击传送
  • 玩家
触发事件的玩家
Bukkit 【点击传送】 Sponge【点击传送
  • 方块
与触发器有关的方块
Bukkit 【点击传送】 Sponge【点击传送
  • 物品
你手持的物品
Bukkit 【点击传送】 Sponge【点击传送
  • 点击
左键或右键
  1. item.getDurability() - 读取持物品的耐久。0是满耐久
  2. item.getItemMeta().getDisplayName() - 读取物品的名字
  3. block.getRelative(EAST, 2).getType().name()
  4. event.getAction().name()
复制代码

  • 踩踏触发器
在踩踏触发器中可以使用下面的变量
  • 事件
有关玩家移动事件
  • 玩家
触发事件的玩家
Bukkit 【点击传送】 Sponge【点击传送
  • 方块
触发器触发的方块
Bukkit 【点击传送】 Sponge【点击传送






指令触发器
指令触发器可以在服务器上创建自定义指令

  • 创建触发器
第一步,输入下面的指令
  1. /trg cmd <command> <script>
复制代码
比如:
  1. /trg cmd hi #MESSAGE "欢迎来到MCBBS"
复制代码
然后,输入 /hi 就会发出 "欢迎来到MCBBS" 的消息

  • 编辑触发器
重新输入创建指令触发器的命令就可以
比如编辑"hi"触发器
  1. /trg cmd hi
复制代码
还可以通过服务端配置文件找到触发器,编辑文件,保存,然后/trg reload 即可
删除触发器:/trg delete cmd <command>或者删除对应配置文件

  • 变量
  • 事件
当玩家运行命令时,都会调用这里的事件
Bukkit 【点击传送】 Sponge【点击传送
  • 玩家
触发事件的玩家
Bukkit 【点击传送】 Sponge【点击传送
  • 命令
实际上就是String
  • args
字符串数组,就是玩家输入的参数,args[0]对第一个参数,args[1]对第二个参数
有关更多args 【点击传送
  • 参数
参数的值,相当于"args.length"

更多变量信息请至原帖查看





参数
  • 定义
args是一个字符串数组,包含了相关命令的参数
比如,输入"/hello apple banana gerzytet"
args就包含 "apple","banana"和"gerzytet"这三个参数
args不包含指令名称它本身

  • 用法
默认用法是args[index]
比如,输入"/hello chicken"在运行时输出 "chincken sir"
命令如下
  1. #MESSAGE args[0]+" sir"
复制代码
所以
  1. /command args[0] args[1] args[2]..... args[N]
复制代码
这就是agrs的最基本用法

  • LENGTH
获取参数的长度
比如,指令 "/try your best" args带有两个字符串“ your”和“ best”
在读取数据之前,请一定要先检查参数的长度
比如,要读取args[0],参数的长度至少一定为1

创建一条公告
  1. /broadcast 服务器将于5秒后重启
复制代码
args [0] + args [1] + .... args [N] 这样就是把他们组合成一个字符串
  1. mergeArguments(String[])
复制代码
mergeArguments可以吧字符串转化成一个更大的字符串
例子
  1. mergeArguments(args)
复制代码
用mergeArguments,执行公告命令
  1. #BROADCAST mergeArguments(args)
复制代码





区域触发器
  • 创建区域触发器
  • 选择区域
首先你必须先创建一个区域
指令
  1. /trg a toggle
复制代码
切换到选择模式,左键/右键2个角来确定区域大小
选区域的用法与WorldEdit类同
选择两个角后,TR会显示相对坐标
  • 创建区域触发器
选择完成后,使用命令创建区域触发器
  1. /trg a MyAreaTrigger create
复制代码
  • 添加触发器
有两种选择:进入区域、离开区域
设置进入区域提示
  1. /trg a MyAreaTrigger enter #MESSAGE "欢迎来到MCBBS!"
复制代码
设置离开区域提示
  1. /trg a MyAreaTrigger exit #MESSAGE "下次再见!"
复制代码
可以设置多行代码
进入时触发
  1. /trg a MyAreaTrigger enter
复制代码
离开时触发
  1. /trg a MyAreaTrigger exit
复制代码

  • 编辑区域触发器
使用添加触发器命令打开内置编辑器
  • 删除区域编辑器
使用命令
  1. /trg a MyAreaTrigger delete
复制代码

  • 内部变量
  • 事件
有关玩家移动的事件
PlayerBlockLocationEvent 【点击传送
  • 玩家
触发事件的玩家
Bukkit 【点击传送】 Sponge【点击传送





命名触发器
作者原话:
如果你不知道自己在做什么,永远不要在内部调用命名触发器
可能会导致无限循环

没有创建命名触发器的命令
需要创建一个空文件开始编译
保证文件的后缀为 .trg
如果使用一个叫 foo 的命名触发器,文件名应该是 foo.trg

  • 使用
命名触发器只能从其他触发器调用
必须在其他触发器中写入#CALL
比如,在指令触发器中
  1. #CALL "Trigger1"
复制代码
这样就会激活名为"Trigger1"的命名触发器
如果有多行代码,就会这样...
比如
  1. #MESSAGE "嘿!"
  2. #CALL "Trigger1"
  3. #MESSAGE "完毕!"
复制代码
解析先后顺序:
1、#MESSAGE会向玩家发出 "嘿!"
2、这个触发器会把执行权交给命名触发器"Trigger1"
命名触发器会开始运行,直到命名触发器运行完毕。
3、命名触发器运行完毕后,它会把执行权还给当前触发器
继续执行当前触发器,输出"完毕!"

  • 变量
命名触发器与当前触发器的变量可以共享
当前触发器的所有变量可以直接在命名触发器中使用
命名触发器的所有变量也可以在当前触发器中使用

  • 分组命名
如果你的文件数目越来越多,可以把相关的触发器移至同一个文件夹
在命名触发器文件夹内创建一个新的文件夹,然后把你同类型的触发器移动到文件夹就可以乐
文件夹内的触发器就算名字相同也不会和主文件夹的触发器产生矛盾
创建新文件夹或文件后,要输入 /trg reload 重载插件

  • 调用命名触发器
如何调用在文件夹中的命名重复阿奇
比如你的Trigger5在MyTriggers这个文件夹中
  1. #CALL "MyTriggers:Trigger5"
复制代码





自定义触发器
当某个事件触发时激活。例如: PlayerJoinEvent
它可以是Bukkit/Sponge中的某个事件,也可以是某个插件创建的自定义事件。
  • 创建自定义触发器
基本指令
  1. /trg custom <event> <name> [...]
复制代码
例子
  1. /trg custom onJoin Greeting #BROADCAST "&a欢迎您, &6"+player.getName()
复制代码
只要有玩家加入服务器,聊天栏就会发送"&a欢迎您,玩家名"

  • 编辑自定义触发器
指令
  1. /trg custom <anything> <name>
复制代码
比如
  1. /trg custom pewpew Greeting
复制代码
这样就会打开 Greeting 的自定义编辑器

删除自定义触发器
  1. /trg del custom <name>
复制代码
比如
  1. /trg del custom Greeting
复制代码
这样就删除Greeting的自定义触发器

  • 事件

如果你在上方找不到心仪的事件,或者想麻烦点不依赖简写的事件名称,那么也可以导入Bukkit/Sponge等中的事件全称
例如
  1. /trg custom org.bukkit.event.player.PlayerJoinEvent Greeting #BROADCAST "&aGreetings, &6"+player.getName()
复制代码
当一位玩家进入服务器时,这段字符串就会显示给服务器内的所有玩家
让我们简化一下  
  1. /trg custom <事件所在类.事件> <名称> [...]
复制代码

该板块以下由于本人一点都看不懂,由 @AzureHanChen 帮助完成汉化
  • 监听另一个插件的事件
您需要提供完整的事件所在包以及事件名称
例如我想监听 Zrips的 Jobs Reborn 插件中的 JobsJoinEvent 事件  
我已经通过一些方法知道了他在"com.gamingmesh.jobs.api"包中
因此,我们可以套用上方的模板,例如
/trg custom com.gamingmesh.jobs.api.JobsJoinEvent Test #MESSAGE player.getUserName()+" 加入了  "+job.getName()

但很不幸的是,变量player与事件中的player重叠了  
此时,变量player是'JobsPlayer'而非'Player'
这意味你可能没办法使用Bukkit方法中的'player.getName()'获取万家名称
不用不用担心,可以通过'event.getPlayer().getUserName' 获取事件,再层层解析得到事件中的 'Player' 的名称
可以使用这段指令
/trg custom com.gamingmesh.jobs.api.JobsJoinEvent JobsJoinHandle #MESSAGE player.getUserName()+" 加入了 "+event.getJob().getName()

效果与上方代码相同

  • 监听Sponge服务端中的某一事件
因为Login事件是ClientConnectionEvent的内部类
因此要用'类$内部类'来做区分
/trg custom org.spongepowered.api.event.network.ClientConnectionEvent$Login onLogin #MESSAGE "欢迎您,"+player.getName()







背包格子触发器
  • 创建格子触发器
比如
  1. /trg i Test create 54
复制代码
这就是创建一个有54个个字的触发器
大小只可以是9、18、27、36、45、54
可以检查plugins/TriggerReactor/InventoryTrigger/文件夹以查看是否创建了以下两个文件
  1. plugins/TriggerReactor/InventoryTrigger/Test.yml
  2. plugins/TriggerReactor/InventoryTrigger/Test.trg
复制代码

  • 触发行为
触发背包触发器的三个事件:
打开, 单击, 关闭
  1. IF trigger == "open"
  2.     ...
  3. ENDIF

  4. IF trigger == "click"
  5. ENDIF
复制代码

  • 并发性问题
不希望2个相同任务一起运行,咋办捏?
可以假设一下下面的清洁:你已经创建了一个用格子触发器做成的小游戏
如果玩家可以在已经开始的游戏再点一次开始游戏
这样的话就会存在部分BUG
这就是需要变量的原因!
“背包”会保留所有变量,知道GUI界面关闭
比如
  1. IF trigger == "click"
  2.     IF slot == 0
  3.         FOR 0:10
  4.             do some slot thing
  5.             #WAIT 1
  6.         ENDFOR
  7.     ENDIF
  8. ENDIF  
复制代码
如上代码所示,格子0(也就是第一个格子)会启动for循环10秒
如果你想让玩家在进行这个for循环时,禁止开启另一个for循环
看下面的代码
  1. IF trigger == "click"
  2.     IF slot == 0
  3.         IF isRunning
  4.             #STOP
  5.         ENDIF

  6.         isRunning = true
  7.         FOR 0:10
  8.             do some slot thing
  9.             #WAIT 1
  10.         ENDFOR
  11.         isRunning = false
  12.     ENDIF
  13. ENDIF
复制代码
如果把 "isRunning" 设置为 "true" , 那么会立刻停止触发器
当上一个任务完成For循环时
"isRunning"会自动设置成"false",玩家就可以继续点击开启游戏
所有变量都是共享的在这个触发器中
不要在"close"部分设置无限循环
把无限循环设置在 "打开" "单机" 是没问题的
所以触发器会在玩家关闭背包时停止触发
建议在"打开"中设置无限循环
方便获取背包标题,展示物品等
在"开放"中设置无限循环,一定要设置#WAIT,延迟时间
没有延迟时间,会造成超多CPU资源浪费

  • 添加图标
为背包格子添加显示物品的图标
  1. /trg i Test item 0
复制代码
注意:背包格子是从0开始算,而不是1

  • 删除图标
删除背包格子对应显示物品的图标
  1. /trg i Test item 0
复制代码
这样会替换掉第一个格子设置的物品

  • 编辑背包触发器
指令
  1. /trg i <name> edit
复制代码

  • 删除背包触发器
指令
  1. /trg i Test delete
复制代码

  • 设置展示物品的名字和介绍
更改标题
  1. /trg item title &a这是一个标题
复制代码
增加Lore
  1. /trg item lore add &6这是一行介绍
复制代码
删除指定行的lore
  1. /trg item lore remove 0
复制代码
替换指定行的lore
  1. /trg item lore set 0 &7这是替换的第一行的内容
复制代码

  • 完整的例子
位置:/TriggerReactor/InventoryTrigger/menu.trg
  1. IF trigger == "open" // This only happens when the inventory first open
  2.     WHILE true // infinite loop is safe in the "open" as closing the inventory will terminate it later.
  3.         //sky
  4.         index = 0 //set index variable to zero before calling "Bungee:ItemServerInfo" NamedTrigger
  5.         address = "127.0.0.1:25501" //set address variable
  6.         message = "&a>> Click to move to wild server" //set message variable
  7.         #CALL "Bungee:ItemServerInfo" //now let the "Bungee:ItemServerInfo" NamedTrigger to handle the rest
  8.         //war
  9.         index = 2
  10.         address = "127.0.0.1:25502"
  11.         message = "&a>> Click to move to pvp server"
  12.         #CALL "Bungee:ItemServerInfo"
  13.         //mini
  14.         index = 4
  15.         address = "127.0.0.1:25503"
  16.         message = "&a>> Click to move to minigames server"
  17.         #CALL "Bungee:ItemServerInfo"

  18.         #WAIT 1 //be aware of this part. This makes the loop to wait for one second before proceed
  19.                 //without the #WAIT, the update will be too fast, and it will be buggy on client side
  20.         
  21.         //sky
  22.         index = 0
  23.         address = "127.0.0.1:25501"
  24.         message = "&f>> Click to move to wild server"
  25.         #CALL "Bungee:ItemServerInfo"
  26.         //war
  27.         index = 2
  28.         address = "127.0.0.1:25502"
  29.         message = "&f>> Click to move to pvp server"
  30.         #CALL "Bungee:ItemServerInfo"
  31.         //mini
  32.         index = 4
  33.         address = "127.0.0.1:25503"
  34.         message = "&f>> Click to move to minigames server"
  35.         #CALL "Bungee:ItemServerInfo"

  36.         #WAIT 1
  37.     ENDWHILE
  38. ENDIF

  39. IF trigger == "click" // This is when a player click the slot. Doesn't matter if there is icon or not.
  40.                       // Still will be called even if the slot is empty.
  41.     IF isCoolddown // check if the player pressed icon too quickly.
  42.                    // notice that if isCooldown is not set, it will be treated as false
  43.                    // check out Conditions section of Wiki for more information.
  44.         #MESSAGE "&6Please slow down!"
  45.         #STOP //stop the trigger immediately, so the codes below will not be executed
  46.     ENDIF
  47.    
  48.     isCoolddown = true // set isCooldown to 'true.' This will stop player from clicking the slot until
  49.                        // isCooldown is set to 'false' again.
  50.    
  51.     IF slot == 0
  52.         #SERVER "skyblock"
  53.         #BROADCAST "&8[&6ServerMove&8]&7 &6"+$playername+" &7-> &6Wild"
  54.     ENDIF
  55.     IF slot == 2
  56.         //#SERVER "war"
  57.         //#BROADCAST "&8[&6ServerMove&8]&7 &6"+$playername+" &7-> &6War"
  58.     ENDIF
  59.     IF slot == 4
  60.         #SERVER "minigames"
  61.         #BROADCAST "&8[&6ServerMove&8]&7 &6"+$playername+" &7-> &6MiniGames"
  62.     ENDIF
  63.    
  64.     #WAIT 1 // wait for one second
  65.     isCoolddown = false // now set isCooldown to false so player can click the slots again.
  66. ENDIF
复制代码
位置:/plugins/TriggerReactor/NamedTriggers/Bungee/ItemServerInfo
  1. //'inventory' inventory to update
  2. //'index' item index
  3. //'address' address of server
  4. //'message' message color

  5. IF placeholder //check if PlaceholderAPI exists.
  6.     item = inventory.getItem(index) // get item in the 'index'th slot of the inventory
  7.     clearLore(item) // first delete all lores
  8.     addLore(item, placeholder.parse(player, "&7Status&8: &6%pinger_isonline_"+address+"%"))
  9.     addLore(item, placeholder.parse(player, "&7Online Players&8: &6%pinger_players_"+address+"%"))
  10.     addLore(item, placeholder.parse(player, "&7Version&8: &6%pinger_gameversion_"+address+"%"))
  11.     addLore(item, "")
  12.     addLore(item, color(message))
  13.     inventory.setItem(index, item) // you put item back the inventory
  14. ENDIF
复制代码

  • 执行器和占位符适用于背包触发器

#setslot
SETSLOT {slot} {item}设置对应格子的物品
这不是永久性的更改,它仅适用于当前触发器,并且仅持续到脚本触发停止之前
$slot $slot:0
读取对应格子中的物品

  • 变量
  • 事件1
当玩家打开背包触发器时的事件,在打开触发器中触发
Bukkit 【点击传送】 Sponge【点击传送
  • 事件2
当玩家单击背包触发器内的物品卡槽时的事件,在点击时触发
Bukkit 【点击传送】 Sponge【点击传送
  • 事件3
当玩家关闭背包触发器时的事件,在关闭触发器中触发
Bukkit 【点击传送】 Sponge【点击传送
  • 玩家
触发事件的玩家
Bukkit 【点击传送】 Sponge【点击传送
  • 背包
在动态GUI中删除/编辑物品
Bukkit 【点击传送】 Sponge【点击传送
  • 物品
单击物品时触发
Bukkit 【点击传送】 Sponge【点击传送
  • slot
点击的卡槽位
  • 触发器
正在使用的触发器(打开、单击、关闭)





重复触发器
  • 创建新的重复触发器
帮助命令
  1. /trg r <name>
复制代码
不可以使用同一个命令来创建重复触发器
  1. /trg r MyRepeat
复制代码
进入编辑模式

  • 触发行为
有一个触发器的变量告诉TR在啥时候运行这个脚本
  1. IF trigger == "init"
  2.     mymessage = "This is message"
  3. ENDIF
复制代码
在第一次运行这个脚本时有效
/trg reload 或/trg r 重载重复触发器

此触发器中任何变量都可以共享使用
作者原话:
建议重置"int"的部分之
可以使用“重复”触发部分设置重复部分,使用“停止”触发部分设置终止部分
  1. IF trigger == "init"
  2.     mymessage = "This is message"
  3. ENDIF
  4. IF trigger == "repeat"
  5.     #BROADCASE mymessage
  6. ENDIF
  7. IF trigger == "stop"
  8.     #LOG "repetition stopped"
  9. ENDIF
复制代码

  • 设置间隔
  1. /trg r <name> status
复制代码
这个命令可以设置触发间隔时间
  1. /trg r MyRepeat interval <time format>
复制代码

  • 时间格式
时间格式是一个字符串,包含小时、分钟、秒
1h = 1小时,30m = 30分钟 10s = 10秒
比如
  1. /trg r MyRepeat interval 100h30m20s
复制代码
这样写就是让MyRepeat触发器每隔100小时30分钟20秒触发一次

  • 编辑重复触发
  1. /trg r MyRepeat
复制代码

  • 自动启动
  1. /trg r MyRepeat autostart
复制代码
使用/trg reload命令,会让触发器重新加载

  • 手动开始/停止触发
开始/停止状态切换
  1. /trg r MyRepeat toggle
复制代码

  • 暂停/取消重复触发
在你突然有急事,但是写的触发器还在触发,可以使用暂停命令
  1. /trg r MyRepeat pause
复制代码
再输入一次就会继续触发,这个命令不会导致代码丢失

  • 删除重复触发
  1. /trg r MyRepeat delete
复制代码

  • 变量
  • 触发
数据类型: String
触发此触发器的事件(初始化、重复、停止)





执行器
Executors

  • 内置执行器
这是TR插件带的内置执行器
注意事项:
字符串有双引号,数字,变量和布尔值没有
示例:
  1. #DROPITEM <String ID>, 1, "NONE", -204, 82, 266
  2. #DROPITEM "APPLE", 1, "NONE", -12, 0, 15
复制代码
参考帖 【点我传送

  • 操作栏
向玩家操作栏发送信息
可以指定玩家
  1. #ACTIONBAR player("wysohn"), color("&cMy Action Bar")
复制代码
#BREAK和#CONTINUE控制WHILE和FOR循环
查看循环详细信息 【点我传送

  • 公告
发送一条公告,所有玩家都可以看到
  1. #BROADCAST "你好MCBBS!"
复制代码

  • 燃烧
让指定玩家燃烧
如果要指定其他玩家或实体,要使用两个参数代替
#BURN {玩家名称} {秒}
  1. #BURN "XiangZi_" 5
复制代码
#BURN {Entity instance} {seconds}
  1. #BURN player("XiangZi_") 5
复制代码
作者原话:
*如果不是专业的开发人员请忽略这里

  • 消息
运行一个命名触发器
  1. #CALL "NamedTrigger"
复制代码
要同时运行
  1. #CALL "NamedTrigger" false
复制代码

  • 删除事件
删除已激活的触发器
  1. #CANCELEVENT
复制代码
如果你的触发器不是同步运行,删除时间对该触发器无效

  • 清除聊天
清除当前玩家的聊天
  1. #CLEARCHAT
复制代码
清除指定其他玩家,其聊天记录
  1. #CLEARCHAT player("XiangZi_")
复制代码

  • 清除实体
清除当前玩家半径范围内的所有实体
  1. #CLEARENTITY 5 //5是半径可以自己设置
复制代码

  • 清除buff
移除玩家身上所有buff
  1. #CLEARPOTION
复制代码
如清除特定的药水,需要药水参数
  1. #CLEARPOTION "LUCK" //"这里为药水参数"
复制代码

  • 关闭GUI
关闭玩家当前查看的背包格子触发器的GUI界面
  1. #CLOSEGUI
复制代码

  • 指令
让一个玩家执行当前指令
  1. #CMD "spawn"
复制代码
附加参数
  1. #CMD "spawn" true
复制代码

  • 控制台指令
通过控制台操作
  1. #CMDCON "version"
复制代码
附加参数
  1. #CMDCON "version" true
复制代码

  • 指令(op)
让玩家以op身份执行一条命令
  1. #CMDOP "spawn"
复制代码
附加参数
  1. #CMDOP "spawn" true
复制代码

  • 冷却
为触发器添加冷却时间
  1. #COOLDOWN 10 //冷却时间10s
复制代码

  • 关闭门
在指定坐标关闭门
  1. #DOORCLOSE -204, 78, 266 //后面3个数分别对应x,y,z轴坐标
复制代码

  • 打开门
在指定坐标打开门
  1. #DOOROPEN -204, 78, 266 //后面3个数分别对应x,y,z轴坐标
复制代码

  • 开/关门
在指定坐标开启/关闭门
  1. #DOORTOGGLE -204, 78, 266
复制代码

  • 放置物品
将物品放置在坐标点
  1. #DROPITEM 1, 1, "NONE", -204, 82, 266
复制代码
更多参数
  1. #DROPITEM {ID} {Amount} {Enchantment String} {x} {y} {z}
复制代码
更多附魔参数 【点我传送
例子
  1. #DROPITEM 1, 1, "LUCK:0,POISON:1", -204, 82, 266
复制代码
不想设置位置,可以输入"none"
  1. #DROPITEM 1, 1, "NONE", -204, 82, 266
复制代码
更多参数
  1. #DROPITEM {ID} {Data} {Amount} {Enchantment String} {x} {y} {z}
  2. #DROPITEM {ID} {Amount} {Enchantment String} {Location instance}
  3. #DROPITEM {ID} {Data} {Amount} {Enchantment String} {Location instance}
  4. #DROPITEM {ItemStack instance} {Location instance}
复制代码
可以使用全局变量
  1. /trg vars Item {"item.on.hand.saved"}
  2. #DROPITEM {"item.on.hand.saved"} location($worldname, -204, 82, 266)
复制代码

  • 爆炸
在当前位置造成爆炸
  1. #EXPLOSION $worldname, 100, 70, 100
复制代码
附加参数
功率-爆炸功率。4.0等同于TNT爆炸。如果没写功率,默认为4.0
  1. #EXPLOSION $worldname 100, 70, 100, 4.0
复制代码
如果你想让爆炸生成火焰,请设置true
  1. #EXPLOSION $worldname 100, 70, 100, 4.0, true
复制代码

  • 掉落一个物品
在指定地点掉落一个物品
  1. #FALLINGBLOCK 1, -204, 82, 266
复制代码
更多参数
  1. #FALLINGBLOCK {block id} {x} {y} {z}
  2. #FALLINGBLOCK {block id} {block data} {x} {y} {z}
  3. #FALLINGBLOCK {block id} {Location instance}
  4. #FALLINGBLOCK {block id} {block data} {Location instance}
复制代码

  • 给予物品
给予玩家一个物品
  1. #GIVE {"items.0"}
复制代码
附加参数
可以使用附加值
  1. #GIVE item(ID, Amount, Data Value) //Data Vaule 就是附加值 Amount是数量
复制代码

  • GUI
打开一个背包格子触发器,如果已经打开了一个GUI,那么会关闭当前开启的GUI
  1. #GUI "MainMenu"
复制代码

  • 踢出玩家
将一位玩家t出游戏
  1. #KICK  //用默认原因t出玩家。
  2. #KICK "Reason"  //用指定原因t出玩家
  3. #KICK player        t  //出一位玩家,无任何原因。
  4. #KICK player "reason"  //用指定的原因t出一位玩家。
复制代码

  • KILL
杀死一位玩家
  1. #KILL
复制代码

  • 雷击
在指定位置雷击
  1. #LIGHTNING $worldname, 100, 70, 100
复制代码

  • LOG
向控制台发送消息
  1. #LOG "你好 MCBBS!"
复制代码

  • 信息
向玩家发送信息
  1. #MESSAGE "你好 MCBBS!"
复制代码
要发送多行消息,请用空格或逗号分隔
  1. #MESSAGE "你好!" "欢迎来到" "MCBBS!"
复制代码

  • 修改信息
修改当前项目的信息
Title - 字符串
  1. #MODIFYHELDITEM "标题" "ThisIsMyItem(字符串)"
复制代码
Lore - 字符串,字符串,字符串,数字(可选)
  1. #MODIFYHELDITEM "LORE" "ADD" "ThisIsMyItem" 4
复制代码
Lore - 字符串,字符串,字符串,数字
  1. #MODIFYHELDITEM "LORE" "SET" "ThisIsMyItem" 4
复制代码
Lore 字符串,字符串,数字
  1. #MODIFYHELDITEM "LORE" "REMOVE" 4
复制代码

  • 金币
给予玩家金币
  1. #MONEY 100
复制代码
*需要安装 Vault 插件
扣钱的话请给负钱,因为没有专门的扣钱代码
  1. #MONEY -100
复制代码

  • MYSQL
将数值存储到数据库中
  1. #MYSQL "myValue" "Hoho"
复制代码
值可以是String,Number或Boolean

  • 权限
给予玩家权限
  1. #PERMISSION "my.permission"
复制代码
*需要安装 Vault 插件
*海绵端还没实现给予权限
在权限前加"-"删掉权限
  1. #PERMISSION "-my.permission"
复制代码

  • 药水效果
给予玩家药水效果
  1. #POTION "LUCK" 100
复制代码
药水持续时间 20Tick = 1s
可以指定药水效果和等级
  1. #POTION "LUCK" 100 1 //给予玩家幸运1 持续 5秒
复制代码

  • PUSH
向指定方向推动实体
  1. #PUSH player, 1, 2, 5
复制代码

  • 旋转方块
将方块旋转到指定方向
  1. #ROTATEBLOCK "EAST", -204, 82, 266
复制代码
更多参数
  1. #ROTATEBLOCK {"Direction (see the link below)"}
  2. #ROTATEBLOCK {"Direction"} {location}
  3. #ROTATEBLOCK {"Direction"} {x} {y} {z}
复制代码
方向请查看链接: Bukkit 【点击传送】 Sponge【点击传送

  • 计分板
修改玩家计分板,每个玩家个人的计分板
  1. #SCOREBOARD "OBJ" "someobjective:dummy" "SLOT" "SIDEBAR"
复制代码
OBJ  String, String, String, Number
  1. #SCOREBOARD "OBJ" "myObjective:someCriteria" "SET" "valuename" 100
复制代码
OBJ
  1. #SCOREBOARD "OBJ" "myObjective:someCriteria" "SET" "valuename" null
复制代码
OBJ        String, String, String
  1. #SCOREBOARD "OBJ" "myObjective:someCriteria" "NAME" "displayname"
复制代码
OBJ
  1. #SCOREBOARD "OBJ" "myObjective:someCriteria" "SLOT" "SIDEBAR"
复制代码
TEAM  String, String, String
  1. #SCOREBOARD "TEAM" "myteam" "ADD" "someplayername"
复制代码
如果没有计分板,需要先创建计分板
有关Slot的值请查看原帖 【点击传送

  • Server
适用于BC端的跳转设置,将玩家传送至服务器
  1. #SERVER "lobby"
复制代码
*海绵端未实现

  • 放置方块
在指定位置放置方块
  1. #SETBLOCK "STONE", -204, 82, 266
复制代码
更多参数
  1. #SETBLOCK {block id} {x} {y} {z}
  2. #SETBLOCK {block id} {block data} {x} {y} {z}
  3. #SETBLOCK {block id} {Location instance}
  4. #SETBLOCK {block id} {block data} {Location instance}
复制代码

  • 生命
设置玩家当前生命值
  1. #SETHEALTH 19.5
复制代码

  • 手持物品(v3.0开始)
设置手持物品,新的物品会覆盖已持有的物品
  1. #SETHELDITEM item("APPLE", 1)
复制代码

  • 副手物品(v3.0开始)
设置副手物品,新的物品会覆已持有的物品
  1. #SETOFFHAND item("SHIELD", 1)
复制代码

  • 玩家物品栏(v3.0开始)
设置玩家当前的物品栏,旧的物品会被覆盖
  1. #SETSLOT 8, item("STONE", 1)
复制代码

  • 玩家背包物品(v3.0开始)
设置玩家背包对呀格的物品,旧的物品会被覆盖
  1. #SETPLAYERINV 0, item("AIR", 1)
复制代码

  • 玩家饱和度
设置玩家饱和度,必须为正值!
  1. #SETSATURATION 10
复制代码
有关饱和度详细请至原帖 【点我传送

  • 玩家经验
设置玩家等级,经验条
  1. #SETXP 0.2
复制代码
数值为0.0到1.0之间的百分比值,其中1.0表示下一级别,而0.0表示没有进度

  • 行走速度
设置玩家行走的速度
  1. #SETWALKSPEED 0.2
复制代码
速度范围:-1.0 - 1.0
正常步行速度为0.2 正常潜行速度为0.1 负值会让玩家向后走

  • 飞行速度
设置玩家飞行的速度
  1. #SETFLYSPEED 0.1
复制代码
速度范围:-1.0 - 1,.0
正常飞行速度为0.1,负值会让玩家向后飞
也会让上升/下降方向反向

  • 允许/禁止飞行
设置玩家是否允许飞行
  1. #SETFLYMODE true
复制代码
设置是否允许玩家飞行
设置为true可以飞行,并切换到飞行模式
设置为false禁用飞行,并关闭飞行模式

  • 饱食度
设置玩家当前饱食度
  1. #SETFOOD 18
复制代码
设置当前玩家的饱食度,以半格为单位。不可以超过最大饱食度(20)或小于0

  • 游戏模式
设置玩家当前游戏模式
  1. #SETGAMEMODE 0 // 生存模式
复制代码

  • 物品LORE(v3.0开始)
设置物品的Lore,可以使用颜色代码&,允许多行,请在后面加\n
  1. #SETITEMLORE "这是你的剑\n这是第二行介绍", $helditem
复制代码

  • 物品名字(v3.0开始)
设置物品的名字,可以使用颜色代码&
  1. #SETITEMNAME "祥子的剑", $helditem
复制代码

  • 物品数量(v3.1开始)
设置物品的数量
  1. #SETCOUNT 3, $helditem
复制代码

  • 物品Type(v3.1开始)
设置物品的类型
  1. #SETTYPE "STONE", $helditem
复制代码

  • 最大生命
设置玩家的最大生命值
  1. #SETMAXHEALTH 24
复制代码
以半格心为单位,必须至少为1

  • 标志牌
改变标志牌的位置
  1. #SIGNEDIT 0, "test", -205, 79, 266
复制代码
更多参数
  1. #SIGNEDIT {line index} {new text} {x} {y} {z}
  2. #SIGNEDIT {line index} {new text} {Location instance}
复制代码

  • 音乐
为指定玩家播放音乐
  1. #SOUND player.getLocation(), "LEVEL_UP", 1.0, 1.0
复制代码
后面2个数字分别对应音量和音高
音量:应为0.0到1.0
音高:可以为0.5到2.0

为所有玩家播放音乐
  1. #SOUNDALL player.getLocation(), "LEVEL_UP", 1.0, 1.0
复制代码
后面2个数字分别对应音量和音高
音量:应为0.0到1.0
音高:可以为0.5到2.0
音量在这里可以大于1.0,但是不会增加音量,增加声音的传播距离

  • 生成实体
在指定位置生成实体
  1. #SPAWN "CREEPER"
复制代码
可以使用全局变量来设置位置
  1. #SPAWN {"locations.creeperspawner"} "CREEPER"
复制代码
实体列表: Bukkit 【点击传送】 Sponge【点击传送

  • 停止脚本
立刻停止当前脚本
  1. #STOP
复制代码

  • 时间
改变世界时间
  1. #TIME $worldname 12000
复制代码

  • 传送
将玩家传送至指定坐标
  1. #TP 100, 60, 100 , 90, 20
复制代码
传送玩家可以借助x,y,z轴坐标,旋转角和仰角
可以使用变量代替坐标
  1. /trg vars Location some.place.to.tp
  2. #TP {"some.place.to.tp"}
复制代码

  • 速度
设置当前玩家速度
  1. #VELOCITY 0, 2, 0
复制代码

  • 暂停脚本
将脚本暂停()秒
  1. #WAIT 5
复制代码

  • 天气
更改当前世界的天气
  1. #WEATHER $worldname true
复制代码
设置为true表示世界将下雪/下雨





占位符
占位符可以代替服务器中的变量
比如,$playername占位符可以获取玩家名字
  1. /trg run #MESSAGE "Hello " + $playername + "."
复制代码
我的ID是XIangZi_
那么他就会输出 "Hello祥子."

有两种在字符串内写入占位符的方法
1、以$开头,以字符串结尾
  1. "my name is $playername" "hey $playername !"
复制代码
2、以${开头,以}结尾
  1. "hey ${playername}!"
复制代码

以下是TR可用的占位符列表
*请确保你所使用的TR是最新版本,否则部分占位符无法使用!


位置系列占位符


世界系列占位符


服务器系列占位符


物品系列占位符


Vault系列占位符


MYSQL系列占位符
      占位符                    类型                           备注
$mysql:{String}         *Depends             用key从mysql获取value

特殊的占位符


PlaceholderAPI
请查看原帖下载PlaceholderAPI 【点我传送

PlaceholderAPI教程
在#MESSAGE和#BROADCAST中,执行器会自动解析PlaceholderAPI占位符

  1. #MESSAGE "Hi %playername%"
复制代码
其他触发器需要强制编译器解析PlaceholderAPI占位符

  1. #MESSAGE placehoder.parse(player, "Hi %playername%")
复制代码

使用PlaceholderAPI和TR的区别
使用TR
  1. #MESSAGE "Hi "+$playername
复制代码
使用PlaceholderAPI
  1. #MESSAGE "Hi %playername%"
复制代码





触发条件
  • 创建条件
  • 布尔值
布尔值就是true、false,也可以是运算符号 "=="、"!"、"="、">"、"<"、"> ="、"<="

最后的结果一定是布尔值
  1. $isop == true
复制代码

  • 逻辑运算符
逻辑运算符只能和布尔值一起使用
  • && 运算符
  1. 1 == 1 && 2 == 2 - PASS --- true && true
  2. 1 == 2 && 2 == 2 - FAIL --- false && true
  3. 1 == 2 && 1 == 2 - FAIL --- false && false
复制代码
这里的意思是,前后的数值必须一模一样,如果出现一个错误,整行代码都会出错
  • || 运算符
  1. 1 == 1 || 2 == 2 - PASS --- true || true
  2. 1 == 2 || 2 == 2 - PASS --- false || true
  3. 1 == 2 || 1 == 2 - FAIL --- false || false
复制代码
这里的意思是,前面和后面两个式子,必须有一个是True(正确),否则整行代码都会出错

  • !运算符
  1. !(1 == 1) - FAIL --- !(true)
  2. !(1 == 2 && 2 == 2) - PASS --- !(false && true)
  3. !(1 == 2 || 1 == 2) - PASS --- !(false || false)
复制代码
这里的意思是,前后的式子如果是假的,可以使用"!"(Not),将他变成真的,等于说"负负得正"

  • IF语句
  • 基本结构
  1. IF <boolean>
  2.     <codes to run if the provided boolean is true>
  3. ELSEIF <boolean>
  4.     <codes to run if IF statement above failed but this boolean is true>
  5. ELSEIF <boolean>
  6.     <codes to run if ELSEIF statement above failed but this boolean is true>
  7. ...

  8. ELSE
  9.     <codes to run if none of the booleans in above are true.>
  10. ENDIF
复制代码
*注意:
假设你用IF语句,那么结尾一定要使用"ENDIF"的语句
不想使用"ELSE"和"ELSEIF"可以直接不看,跳过

  • 布尔值占位符
  1. IF $isop
  2.     #MESSAGE "Hey, you are op!"
  3. ELSEIF $haspermission:"some.permission"
  4.     #MESSAGE "Hey, you are not op but you have 'some.permission'!"
  5. ELSE
  6.     #MESSAGE "dang, you have nothing. Sorry!"
  7. ENDIF
复制代码
你可以使用不是布尔值的占位符来和布尔值运算符创建一个新的布尔值
  1. IF $playername == "wysohn"
  2.     #MESSAGE "your name is wysohn"
  3. ELSE
  4.     #MESSAGE "your name is not wysohn"
  5. ENDIF



  6. IF $health != $maxhealth
  7.     #MODIFYPLAYER "HEALTH" $maxhealth
  8.     #MESSAGE "You are healed!"
  9.     #MONEY -100
  10. ELSE
  11.     #MESSAGE "you have full health!"
  12. ENDIF



  13. IF $y >= 128 && $worldname == "world_nether"
  14.     #MESSAGE "&aI am on top of the nether!!"
  15. ENDIF
复制代码

  • IF语句
IF语句可以在另一个IF语句中运行
  1. IF x < 10
  2.     IF x < 6
  3.         #MESSAGE "x is smaller than 6"
  4.     ENDIF

  5.     #MESSAGE "x is smaller than 10"
  6. ENDIF
  7. #MESSAGE "code finished"
复制代码
解读上方代码
如果X值小于10,那么他就会跳过'X is smaller than 6'这块,直接来到'X is smaller than 10'
如果X值大于10,那么这几行代码就没任何用,直接报错
结果就是
code finished

如果X值=8,那么他就会运行'x  is smaller than 10'这块代码,为啥不运行X<6呢?因为8>6他不会运行
但是'x is smaller than 10'不属于内部IF语句,所以会被一起输出
结果就是
x is smaller than 10
code finished

如果X值=2,那么它就同时满足X<10 和 X<6 这两行代码都会被运行
结果就是
x is smaller than 6
x is smaller than 10
code finished

  • NULL检查
'NULL'表示错误&不存在,比如在你把没定义的变量和一个值作比较,他就会输出'null'

  1. IF {"points"} == null
  2.     {"points"} = 10
  3. ELSE
  4.     {"points"} = {"points"} + 1
  5. ENDIF
复制代码
解读代码
在第一遍运行代码的时候,他默认会给你10points,在以后每运行一次,他都会在10的基础上+1
也就是说你运行2遍就是12,3遍就是13.....

  • 比较
以下2行
  1. IF value != null
复制代码
可以删除部分符号,结构意思相同
  1. IF value
复制代码

  • 规则

  1. IF value
  2.     ...
  3. ENDIF
复制代码
如何处理不是布尔值的一些方法
1、如果IF的值是布尔值,那可以直接设置为true、false、null这三种
2、如果IF的值是数字,那么0会被认为是false,其他值(1,2,3)会被认为是true
3、如果IF的值不是NULL,那么这里会设置永远都是true

  • 完整例子
下面的例子可以帮你理清楚上面讲的一些板块内容
  1. IF $gamemode == "SURVIVAL"
  2.     IF $money >= 1000
  3.         #GIVE item(276 1)
  4.         #MONEY -1000
  5.         #MESSAGE "&a$1000 已扣除!"
  6.     ELSE
  7.         #MESSAGE "&c你没有足够的金币!"
  8.     ENDIF
  9. ELSE
  10.     #MESSAGE "&c你必须是生存模式!"
  11. ENDIF
复制代码




变量
  • 类型
以下三种类型是TR中常用的,请您务了解~
String、Number、Boolean,用中文来说就是字符串,数字,布尔值

  • 字符串
字符串是代表字符集合的一种特殊的类型,用""双引号括起来的内容,可以称之为字符串
比如
"你好"

  • 数字
数字和我们日常生活用的数字没任何区别,但是可以使用数字在插件内进行运算
比如
  1. #MESSAGE "111" + 1 // 1111
  2. #MESSAGE 111 + 1 // 112
复制代码
代码解读
第一行是字符串的'111'+'1' 这里是在后面+1而不是运算+1 所以输出的是 1111
第二行是数字的111+1 这里的意思就是加法了,所以输出的是 112
完整例子
  1. #MESSAGE "sum is "+(10+20) //sum is 30
  2. #MESSAGE "sub is "+(10-20) //sub is -10
  3. #MESSAGE "product is "+(10*20) //product is 200
  4. #MESSAGE "div is" + (10/20) //div is 0 *Strange huh
复制代码
代码解读
注意这里的所有括号是用来运算的,不是将他们定义成字符串的括号
整数除以整数,就没有小数点了,小数点会被系统自动移除
如果想要他输出的是小数,那么你输入的值前后2个必须有一个是小数

  • 布尔值
布尔值已经讲过很多次了,它是一种非常特殊的值,有2个普遍用的 true、false

  • 局部变量
这里创建的局部变量只能供给这个触发器使用,而不能给所有触发器使用,因为是局部变量
在触发器运行开始时,局部变量就会启动,在触发器运行结束,这个局部变量也就停止了
  • 创建局部变量
使用"赋值运算符"创建变量,再运算符右边的值都会被左边的变量使用
  1. temp = 5
  2. #MESSAGE temp
复制代码
这里就会创建一个值为5的变量,运行脚本的话就会直接输出5
  1. temp2 = temp - 3
  2. #MESSAGE temp2
复制代码
代码解读
temp我们上面给他的值是5,所以5-3=2 所以输出的是 2
  • 用字符串来当做变量的值
  1. temp3 = "啦啦啦,这里是一个字符串的值"
  2. #MESSAGE temp3
复制代码
这样就会输出"啦啦啦,这里是一个字符串的值"
这些脚本都是临时脚本,在脚本运行结束之后,就毫无任何用处,除非这个脚本再次运行才有用

  • 内部变量
服务器的组件之类的变量可以成为内部变量,比如'player'在每个触发器中都含有变量
这个变量可以执行一些有关玩家的操作
  • 警告
创建局部变量的时候不要使用内部变量的名称
比如
  1. player = 5.0
复制代码
这样写的话就会导致这个触发器没有任何办法获取玩家信息了!
  • 使用
如何使用多个变量
  1. age = 17
  2. #MESSAGE "我今年 " + age + "岁了."
复制代码
这就会输出"我今年17岁了."双引号圈起来就代表它是一个字符串,输出的时候会原封不动的输出
没有双引号就是变量,'+'号会把字符串和变量连接起来一起输出
  • 运算

  1. temp = 2
  2. temp2 = 3
  3. #MESSAGE "这个算数的答案是 " + (temp2 - temp) + "."
复制代码
这里输出'这个算数的答案是1.' 括号内的减**第一个执行,然后才会输出'消息'
运算顺序与数学的运算顺序想同,先乘除,后加减,有括号的先算括号!

  • 全局变量
这个变量的范围是最大的,可以在TR的任何脚本中使用,在脚本结束之后依然有效
创建
用大括号括起来
  1. {“Plugin.Enabled”} = true
  2. #MESSAGE {"Plugin.Enabled"}
复制代码
这里输出的就是"True" 全局变量使用的是字符串,所以必须加双引号

  • 指令
/trg variables {name} - 创建一个变量
/trg variables Plugin.Enable true - 这样就会创建一个和上面例子相同的变量
/trg variables Plugin.Enable - 这里会回到"true"

  • 保存
/trg vars Location location.test - 将当前位置保存到全局变量location.test文件中
/trg variables Item items.test - 将手持物品保存到全局变量items.test文件中

  • 连接多个变量
这个板块是让事件变得复杂的地方,同时也是变量发挥最大作用的地方

playeruuid = player.getUniqueID()
{playeruuid + ".isActive"} = true

注意上方如何使用'连接运算符'把变量和字符串一起连接添加到全局变量
例:打开var.yml
85532811-ddf2-44b4-83d0-e8b5f2e2ac48:
  isActive: true

这个方法可以将每个用户的UUID作为变量来使用

  • 临时全局变量
新开发了一个临时全局变量,解决要使用一个变量来与多个触发器联动,不会保存这个变量
对时间信息,指定玩家的标记,pvp等标签比较实用
  • 创建
把'?'放到'{'的旁边
{?"my.variable"} = 3

特点
临时全局变量与正常的全局变量一样,只不过他们的联动不一样,比如使用相同名字吧'2'保存在普通变量的文件中
那么就会报错,出错,如果把'3'保存在临时变量中,就不会出错
{"my.variable"} = 2
{?"my.variable"} = 3
#MESSAGE {"my.variable"}
#MESSAGE {?"my.variable"}

输出的结果
2
3

服务器关服之后,3就会被自动删除,不会保存下来,而2会被保存下来,开服之后也会出现

  • 空值
Null代表一个空的值,表示该变量不存在,如果创建或者指定的值不存在或者没有,可以使用null代替
#MESSAGE test //null
test = "yo"
#MESSAGE test //yo









方法
在TR里可以直接使用开发人员使用的方法,方便使用脚本,无限制!
有一些方法需要JAVA知识,新手可以不看
  • 什么是方法?

方法是用JAVA来描述一个功能的术语
TR中有三种方法:常用方法、内部变量方法、第三方插件方法

  • 常用方法
这里的所有方法可以在所有触发器中直接使用
通用的方法 【点击传送】Bukkit可使用的方法 【点击传送】 Sponge可使用的方法【点击传送

  • 内部变量方法
可以在触发器板块介绍中了解详情

  • 第三方插件方法
这里需要安装第三方插件
插件列表 【点击传送

  • 使用方法
方法没有特定的字符,和默认语法一样
教学
如果要获得5-10之间随机的数字,可以使用common方法,放到脚本中就如下所示
#MESSAGE "Random value is " + random(5, 10)

使用内部变量方法
#MESSAGE "Your name is " + player.getName()

  • 特殊类型
有时候你用自己习惯的数据类型,可以点击触发内部变量使用特殊的数据类型
包括以下
  • 附魔
  • 一堆掉落物品的数量
  • 耐久
  • 物品
  • 物品名称
  • 介绍
  • 标签

  • JAVA文档
在此版块中,只需要看两件事
1、方法(输入)
2、修饰符(输出)

  • 方法(输入)

可以使用这个方法
item.getAmount()

来获取itemStack中的物品数量
括号是一定要输入的参数,方法才会起作用,括号如果留空,就不会在输入
所以'item.getAmount()'会按照原来样子一直运行
对于特殊的,括号内不为空
比如
vault.give(Player player, double amount)

这里的每个参数,它显示的都是需要的类型
完整例子
vault.give(player, 200)

player是玩家,数据类型就是'Player'
200是一个整数或者一个'int',整数必须是一个正整数或负整数,不可使用小数点,否则会报错
这个例子就是给触发这个事件的玩家200金币

  • 修饰符(输出)
修饰符和类型就是返回数据的类型,这里就是这个方法输出的东西
'int'、'short'、'double'都是数字的子类,可以进行数**算,当方法要求输入int类型的时候
不要输入double,double可以十进制,int只能二进制!
void在JAVA语言中相当于一个空,这里普遍用来执行实际功能比如给玩家钱,而不是用来获取数据

  • 点运算符
常用于调用类方法,在'item.getAmount()'中,item是正在引用的累,getAmount()是正在调试的方法
添加其他的点运算符可以在一行里调试多个方法。'item.getMeta().getDisplayName()'这个可以读取物品的名字
TP会把'getMata()'作为第一个要处理的方法,然后会返回itemMeta的类型,接着TR会调用这个方法,并且输出 一个字符串

  • 枚举
数据类型有时候是'enumeration'或'enum'
比如
这里是'统计枚举'可以统计的列表 【点击传送
这里是'材料枚举'可以使用的材料列表 【点击传送

  • 使用枚举
将枚举转为字符串,可以在'Enum'中用name()找到的方法来运行

IF item.getType().name() == "DIAMOND_SWORD"
    #MESSAGE "This item is a diamond sword."
ENDIF






数组
数组是一系列项,可以访问BUKKIT世界的很多东西

  • 创建数组
myArray = array(10)

创建一个为10的数组,可以在这连续10个空间存储&读取物品

  • 存储数据
myArray[9] = "Hey";

任何数据都可以存入到数组当中,在写'index'的时候要仔细一点,在[]括号内的成为'index',它是从 0 到 size -1
因为上方创建的是一个10的数组,'index'和0-9可以一起使用,10不可以,因为10需要大小为11的数组

  • 读取数据
从数组中读取对应数据
#MESSAGE myArray[9]





循环
在TR中可以使用2个循环:while循环和for循环

  • WHILE循环
while循环会在自己本身和endwhile之间重复执行,设置为true,就会执行指定的条件
基本结构
  1. WHILE <boolean>
  2.     <your code to repeat>
  3. ENDWHILE
复制代码

WHILE true
    #BROADCAST "大家好!"
ENDWHILE

这类的示例会导致无限运行直到服务器关闭/崩溃才会停止运行,所以在使用while循环的时候要注意
一定要确保有一个条件为false,才能停止循环

完整例子
loc = player.getLocation()
x = loc.getBlockX()
y = loc.getBlockY()
z = loc.getBlockZ()

#MESSAGE "传送中,禁止移动!"
count = 5
   
WHILE count > 0
    #WAIT 1
    #MESSAGE count
    count = count - 1

    loc2 = player.getLocation()
    x2 = loc2.getBlockX()
    y2 = loc2.getBlockY()
    z2 = loc2.getBlockZ()

    IF x != x2 || y != y2 || z != z2
        #MESSAGE "传送取消."
        #STOP
    ENDIF
ENDWHILE
#CMDOP spawn

  • 创建一个while循环
第一步,创建一个叫'count'的局部变量,设置值为5
  1. count = 5
复制代码
第二步,循环声明,下方的条件说的是'count'变量需要大于0,但是我们有5个'count'变量,所以是true
WHILE count > 0

在第一次循环时,'count'为5,count -1就是4,4就会被替换到count变量当中,所以下一次就会显示count = 4,在下一次就是3
count = count - 1

然后其他的代码都会运行,直到碰到有ENDWHILE的这行代码,是WHILE循环结束的标志
在这里遇到结束之后,TR会自动返回刚开始的WHILE循环,会再次检查条件,重新运行
所以刚刚count -1 输出的就是 count = 4
WHILE循环的代码在没有碰到停止循环的代码时,会一直运行,第二次会再在count中-1,就是3,直到我们上方设置的条件
count > 0 时,代码就会失效而停止,也就是说当count = 0 时,这个代码就会无效停止运行了
当碰到ENDWHILE时,TR会再次检查条件,WHILE循环中的所有内容,什么4,3,2,1都会被无视,然后会再次运行

  • FOR循环
for循环就是吧自己本身到endfor之间的代码执行指定次数就是吧自己本身到endfor之间的代码执行指定次
基本结构
  1. FOR <variable> = <iterator>
  2.     <your codes>
  3. ENDFOR
复制代码

FOR i = 0:10
    #BROADCAST "大家好! "+i
ENDFOR

在FOR循环中,需要指定要保存迭代的变量的每个值,所以在':'左边和右边的数字
要设置它们开始的时候的初始值和变量的最大值,如果上方例的代码运行,变量'i'或许会从0开始,又或者从9开始,但是不会从10开始
因为在最大值排除了10,如果设置FOR i = 5:9, 那么变量'i'会从5开始到9会停止
上面的例子运行就会输出这样的消息
大家好!0
大家好!1
大家好!2
...
大家好!8
大家好!9

总共会输出10行

  • 迭代
在TriggerReactor中,数组迭代是诠释了为什么要用FOR循环的一个重要原因,如果你使用FOR循环,则可以轻轻松松地遍历一个数组
* 注: 迭代原文 iteration

FOR p = getPlayers()
    p.getInventory().addItem({"items.testItem"})
ENDFOR

这样会把保存在全局变量'items.testitem'中的物品发送至当前在线的玩家
有关 'getplayers'的变量,请至原帖 【点我传送

  • 跳出和跳回
  • 跳出 #BREAK
#BREAK是一个特殊的执行器,就好比#CANCELEVENT,#STOP,#WAIT,在内部中,TR会改变循环,帮助更快结束循环
  • 使用 #BREAK
在循环中使用#BREAK,TR会认定该条件会更早结束循环
比如,WHILE x<5 中的代码是 x = x+1 那么就会运行5次(输出0、1、2、3、4)
#BREAK可以停止内部循环,即时没有满足对应条件

在WHILE循环或FOR循环中,把#BREAK放在要迭代的位置即可
x = 0
WHITE x < 5
    x = x + 1
    IF x > 1
        #BREAK
    ENDIF
ENDWHILE

代码解释
WHILE循环结束时,输入的X是2,而不是4,因为在x = 2 时,条件1 x> 1 会变为true,触发#BREAK,停止循环

  • 跳回 #CONTINUE
#CONTINUE和#BREAK一样,都是特殊的执行器,#CONTINUE会跳过循环,不会终止循环
  • 使用 #CONTINUE
#CONTINUE会跳过下面的代码,并且开始下一个迭代
在WHILE循环或FOR循环中,把#CONTINUE放在要迭代的位置即可
i = 0
x = 0
WHITE x < 5
    x = x + 1
    IF x > 1
        #CONTINUE
    ENDIF
    i = i + 1
ENDWHILE

代码解读
结束循环后,x为4,i为1
迭代次数
x
i
默认值/初始值 00
1 1 1
2 2 1
3 3 1
4 4 1
如果x > 2 , i = i+1 就会被忽略,#CONTINUE会忽略下面的代码,不会和#BREAK一样停止循环





同步/异步模式
  • 设置同步/异步模式
设置触发器为同步模式,可以对以下两种触发器设置
  • 区域触发器
  1. /trg a MyArea sync
复制代码
  • 自定义触发器
  1. /trg sync MyCustomTrigger
复制代码

  • 取消事件执行器
在使用同步模式的同时,可以使用CANCELEVENT取消事件
  1. #CANCELEVENT
复制代码
如果是区域触发器,在输入#CANCELEVENT之后,玩家可以离开这个区域,但是不能进入
移动事件被取消了

  • 更便捷的方式
  • 如果触发器没有进行修改
比如你与'PlayerTeleportEvent'HOOK了,但是想取消这个事件,就是在修改游戏的自然行为事件
所以所有不会改变游戏自然行为事件额事情,都可以认为触发器只读取数据,所以可以把同步模式设置为false
  • 如果触发器修改了内容
比如你在一个世界生成了一个实体,它不是自然生成,那么就可以认为是修改自然行为事件
如果在触发器中使用#CANCELEVENT来取消玩家移动,那么就是修改了游戏的自然行为,必须吧同步模式设置为true

  • 同步/异步语句
SYNC/ASYNC语句有一个缺点就是使用'#STOP''#WAIT'的时候,不支持保存的执行器,请在命名触发器中来使用这些语句
  • 同步
SYNC语句会运行在它本身和ENDSYNC之间的所有代码,如果触发器已经在同步模式,那么他只需要合并需要同时运行的代码
同步模式为多线程运行
SYNC
    #MESSAGE "1"
    #MESSAGE "2"
    #MESSAGE "3"
ENDSYNC

这样就会同时输出'1,2,3'
  • 异步
ASYNC语句会运行在它本身和ENDASYNC之间的所有代码,如果触发器在异步模式,那么就没办法进行控制,异步会和触发器分开运行
异步模式为单线程运行
ASYNC
    FOR x = 0:10
        #MESSAGE x
    ENDFOR
ENDASYNC

触发器运行时,会同时输出'0-9'





创建执行器
开荒中...



[groupid=1701]Complex Studio[/groupid]