本帖最后由 蕾米洛伊 于 2021-2-23 10:08 编辑 
 
 
Step 2. 写一个领地TP付费吧!
Step 3. 我想自定义一个 /suicide 指令试试!
Step 4. 人生苦短, 我用Pyt.. JS! 写一个 /motd 吧!
Step 5. 用上更多语法: 做个没有灵.魂的结婚指令咋样
Step6. 体验一把通配符: 制作必须是OP才能为某领地设置权限的规则
当然实际上 Loiscript/OhMyCmd 有更多内建指令, 支持对玩家做更多事♂情, 在下一页可以看到文档.
# OhMyCmd 指令
> /ohmycmd 或 /ohcmd
/ohmycmd <reload/test> [测试指令,不需要/]
/ohmycmd reload: 重载
/ohmycmd test: 测试某个指令, 可显示出命令被解析的详细过程, 由于大部分指令需要事件作为上下文, 所以很多东西实际上用不了, 之后会逐步完善
如: /ohmycmd test res tp xxx
# OhMyCmd 权限
# 配置文件
我的代码水平比较菜233, 可能会出现各种各样奇怪的 bug, 如果发现欢迎各位提交!另外, 请尽量避免过多使用 JavaScript, 目前 loiscript 尚未做到复用 ScriptEngine, 可能会有性能损耗, 当然代码少的话可以忽略。
感谢下载!
# 下载!
 OhMyCmd-v1.1.jar
(81.73 KB, 下载次数: 37)
OhMyCmd-v1.1.jar
(81.73 KB, 下载次数: 37)
 
由于是实时解析的脚本, 所以理论上全版本通用, 老版本不支持某些变量, 只有使用时会报错。
 
 

OhMyCmd!命令付费 | 世界限制 | 脚本自定义指令 | 命令管理
# OhMyCmd 可以做什么?
1. 命令以参数为粒度匹配, 支持通配符。领地TP付费, 领地设置特定权限付费, warp到指定地点需付费都不在话下;2. 不再受限于单个限制, 支持多限制。比如只有特定权限/等级玩家才能传送到某副本/世界等.3. 甚至可以通过本插件的脚本自己写命令。 没有ess想用/suicide? 没问题! 想让玩家通过 /副本 xxx /世界 xxx 快捷输入命令? 没问题!4. 支持与 JavaScript 或网站进行交互! (返回值可以看的清 清 楚 楚)
Step 1. 我就是想单个命令付费/世界限制, 我要怎么写?
```# +* 的意思是向后通配符, 匹配后面的所有参数
"res tp +*":
requirements:
- "如果: {玩家是否OP} == true"
- "是否在世界: survival_world"
- "检测是否足够经济然后直接扣费: 1.00"
```
这个配置可以做到对领地 res tp xxx... 的命令扣费, 对OP玩家和在 survival_world 世界的玩家免除费用.
Attention! 当您写下多个限制时, 插件只要求命令执行的玩家满足一个即可, 而不是所有限制必须全部满足。
如果有其他免扣费的条件, 必须写在扣费指令之前, 否则会优先扣费!
```# +* 的意思是向后通配符, 匹配后面的所有参数
"res tp +*":
requirements:
- "是否在世界: survival_world"
```
这个配置可以做到玩家只能在 survival_world 世界里执行 res tp xxx...
Step 2. 写一个领地TP付费吧!
```
# 每传送一次领地就花费1元, 否则不传送
# 下面的条件, 意味着任何以 /res tp 开头的指令都会被拦截。
# +* 的意思是向后通配符, 匹配后面的所有参数
"res tp +*":
requirements:
# |-> 如果玩家是OP忽略扣费直接进行
- "如果: {玩家是否OP} == true"
# |-> 或者玩家在生存世界, 就可以免费 res tp
- "是否在世界: survival_world"
# |-> 或者玩家为此支付1元, 如果玩家经济不足一元会直接阻挡命令执行
- "检测是否足够经济然后直接扣费: 1.00"
# --> on-toggle 字段可以省略
on-reject:
- "私聊: &&c进入领地 >{命令参数:2}< 需要 1 元经济, 你没有足够的钱!"
# {命令参数:2} 代表命令用空格分隔的第三个字符, 在这里是领地的名字
```
这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /res tp xx 体验
玩家没有足够钱的效果:

Step 3. 我想自定义一个 /suicide 指令试试!
```
"suicide":
# 执行命令的必要条件, 满足下列其一才会执行
requirements:
# |-> 如果玩家名是 Saber 就可以直接执行命令
- "如果: {玩家} == Saber"
# |-> 或者如果玩家金钱够1,就满足条件,并直接扣费,否则不会执行
- "检测是否足够经济然后直接扣费: 1.00"
on-toggle:
# 杀.死这个操作, 可以忽略参数, 默认只对执行命令的玩家有效果。
- "杀.死"
- "私聊: &&e再见, 世界!"
- "广播: &&6{玩家} 结束了他自己的生命"
- "阻止命令继续执行"
# |-> 如果你在自定义命令, 必须要先或者在最后阻止命令继续执行
on-reject:
- "私聊: &&c这么做需要花费你 1 元钱! 你没有足够的钱!"
- "条件执行: (如果:{玩家游戏模式} == creative) {私聊:&&c你是神,不能xx!}"
```
这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /suicide 体验另: 那个xx是为了避免屏蔽词2333
Step 4. 人生苦短, 我用Pyt.. JS! 写一个 /motd 吧!
```
"motd":
# --> requirements 省略后, 这个指令所有人都不能执行
requirements:
# |-> 这么写, 让所有人都可以执行这个指令
- "直接返回: true"
on-toggle:
- "JS执行: (string) '今天的日期是: '+new Date()"
# |-> 运行JS之后的结果将输出到变量 {执行结果}
- "私聊: &&6欢迎来到服务器! {执行结果}"
- "阻止命令继续执行"
```
这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /motd 体验
Attention: 我们来看看如何调用 JavaScript
语法是: javascript: (string/bool) JS代码....
中间的 (string) (bool) 用于定义本JS的返回值, 如果JS代码返回布尔值, 那么就需要 (bool), 字符串则为 (string)
然后, 你就可以愉快地使用 {执行结果} 或者 {result} 调用JS返回值了!
效果:

Step 5. 用上更多语法: 做个没有灵.魂的结婚指令咋样
这一次我们挑战一把纯英文写指令!
把下面的替换成中文也是可以执行的!
```
"marry *":
requirements:
# 是否有权限
- "haveperm: ohmycmd.marry"
- "if: {player_isop} == true"
on-toggle:
# 控制台执行 console:
- "console: tp {player} {命令参数:1}"
- "broadcast: &&b{player} married with {命令参数:1}"
- "playsound: ENTITY_BLAZE_BURN"
- "javascript: (string) (new Date()).toString()"
- "tell: &&cYou married with {命令参数:1} on {result}!"
# 向某个URL发起 GET 请求, 可通过 {执行结果} 获得返回的数据
- "http get: h ttps://baidu.com"
# 自定义指令最后需要阻止命令继续执行, 否则会出现 Unknown command.
- "setcancel"
```
这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /marry 玩家ID 体验
效果:

Step6. 体验一把通配符: 制作必须是OP才能为某领地设置权限的规则
首先我们知道, 设置领地权限的指令是 res pset [玩家ID] [领地名称] [权限] [true/false] 对吧
```
# 这里的意思是, 只要玩家执行
# /res pset [随便填什么] OPRes xxx true/false/t/f
# 都会被检测,比如
# /res pset hypergryph OPRes move true, /res pset notch OPRes health false
# 以上指令都会被检测到
"res pset * OPRes * *":
requirements:
# 只有是OP才会允许执行
- "如果: {玩家是否OP} == true"
on-reject:
- "私聊: &&c只有OP才能为OPRes领地设置玩家权限!"
```
其实这个例子比较鸡肋,可以按照这个逻辑来配置其它你需要的逻辑
效果: 迷hotel,尝一尝甜不甜啊,哎,没吃呢
当然实际上 Loiscript/OhMyCmd 有更多内建指令, 支持对玩家做更多事♂情, 在下一页可以看到文档.
# OhMyCmd 指令
> /ohmycmd 或 /ohcmd
/ohmycmd <reload/test> [测试指令,不需要/]
/ohmycmd reload: 重载
/ohmycmd test: 测试某个指令, 可显示出命令被解析的详细过程, 由于大部分指令需要事件作为上下文, 所以很多东西实际上用不了, 之后会逐步完善
如: /ohmycmd test res tp xxx
# OhMyCmd 权限
```
ohmycmd.command:
使用 OhMyCmd 指令
默认所有玩家拥有
ohmycmd.bypass:
拥有此权限的人将不会被本插件影响
默认无人拥有, 因为会影响自定义指令
ohmycmd.test:
使用 /ohmycmd test 指令测试命令
默认OP
ohmycmd.reload:
可以重载本插件
默认OP
```
# 配置文件
```
settings:
# 我们希望通过 bStat 了解都有谁在使用这个插件
# 您可在我们的 bStat 页面上了解统计信息
# 设置下面的值为 false, 禁止 bStat 传输您的使用统计
allow-bstats: true
# 启用的命令拦截器列表,
# 写完拦截器后, **请一定不要忘记** 把它添加在这里!!!
# 写完拦截器后, **请一定不要忘记** 把它添加在这里!!!
# 写完拦截器后, **请一定不要忘记** 把它添加在这里!!!
enabled-listeners:
- "suicide"
- "res tp +*"
- "motd"
- "marry *"
- "传送领地 *"
# 定义命令
listener:
"suicide":
# 执行命令的必要条件, 满足下列其一才会执行
requirements:
# |-> 如果玩家金钱够1,就满足条件,并直接扣费,否则不会执行
- "检测是否足够经济然后直接扣费: 1.00"
# |-> 或者如果玩家名是 Saber 就可以直接执行命令
- "如果: {玩家} == Saber"
on-toggle:
- "杀死: {player}"
- "私聊: &&e再见, 世界!"
- "广播: &&6{player} 结束了他自己的生命"
- "阻止命令继续执行"
# |-> 如果你在自定义命令, 必须要先或者在最后阻止命令继续执行
on-reject:
- "私聊: &&c这么做需要花费你 1 元钱!"
- "条件执行: (如果:{玩家游戏模式} == creative) {私聊:&&c你是神,不能xx!}"
# 每传送一次领地就花费1元, 否则不传送并且播放打龙音效
# 下面的条件, 意味着任何以 /res tp 开头的指令都会被拦截。
# +* 的意思是向后通配符, 匹配后面的所有参数
"res tp +*":
requirements:
# |-> 如果玩家是OP忽略扣费直接进行
- "如果: {玩家是否OP} == true"
# |-> 或者玩家为此支付1元, 如果玩家经济不足一元会直接阻挡命令执行
- "检测是否足够经济然后直接扣费: 1.00"
# |-> 或者玩家在生存世界, 就可以免费 res tp
- "是否在世界: survival_world"
# --> on-toggle 字段可以省略
on-reject:
- "私聊: &&c进入领地 >{命令参数:2}< 需要 1 元经济!"
# {命令参数:2} 代表命令用空格分隔的第三个字符, 在这里是领地的名字
"motd":
# --> requirements 省略后, 这个指令所有人都不能执行
requirements:
# |-> 这么写, 让所有人都可以执行这个指令
- "直接返回: true"
on-toggle:
- "JS执行: (string) '今天的日期是: '+new Date()"
# |-> 运行JS之后的结果将输出到变量 {执行结果}
- "私聊: &&6欢迎来到服务器! {执行结果}"
- "阻止命令继续执行"
# 你还可以通过 OhMyCmd 定义中文快捷指令
"传送领地 *":
requirements:
- "直接返回: true"
on-toggle:
- "玩家执行: res tp {命令参数:2}"
- "阻止命令继续执行"
# 试试用纯英文做个指令?
"marry *":
requirements:
- "haveperm: ohmycmd.marry"
- "if: {player_isop} == true"
on-toggle:
- "console: tp {player} {命令参数:1}"
- "broadcast: &&b{player} married with {命令参数:1}"
- "playsound: ENTITY_BLAZE_BURN"
- "javascript: (string) (new Date()).toString()"
- "tell: &&cYou married with {命令参数:1} on {result}!"
- "http get: https://baidu.com"
- "setcancel"
```
我的代码水平比较菜233, 可能会出现各种各样奇怪的 bug, 如果发现欢迎各位提交!另外, 请尽量避免过多使用 JavaScript, 目前 loiscript 尚未做到复用 ScriptEngine, 可能会有性能损耗, 当然代码少的话可以忽略。
感谢下载!
# 下载!
由于是实时解析的脚本, 所以理论上全版本通用, 老版本不支持某些变量, 只有使用时会报错。
 如果帮到你的话, 就评个分吧 (雾)本插件所用所有代码均为原创,不存在借用/抄袭等行为
如果帮到你的话, 就评个分吧 (雾)本插件所用所有代码均为原创,不存在借用/抄袭等行为
以下是脚本原生支持的语法:
if: xxx ==(!=) xxx
example: if: {玩家} == Notch
set: 变量名 值...
example: set: wanjiamingzi 蕾米洛伊
println: 消息
example: println 玩家 {玩家} 触发了指令!
javascript: (bool/string/boolean) 代码...
参数分两段以空格分隔 第一段声明后面一段代码的返回值 可通过 {result} 调用 返回值不正确会导致报错
example: javascript: (string) (new Date()).toString();
if then: (返回布尔值的某个语句 (如 "if: hello == hello") ) {执行的代码1;执行的代码2...}
如果那么, 如果括号中语句返回为true, 那么执行花括号中的语句, 以;分割
return: true/false
直接返回。
插件支持的额外语法:
私聊: xxxxx..
给执行命令的玩家发送私聊消息
杀死
kill 执行命令玩家
阻止命令继续执行
取消事件, 如果你有自定义指令务必在语句的最前或最后执行这个, 防止出现 Unknown command
广播: xxxx...
世界广播消息
检测是否足够经济然后直接扣费: x.xx
首先检测玩家是否足够经济, 如果不够直接返回否(阻止执行指令), 够就直接扣费
给予玩家经济: x.xx
给玩家钱
控制台执行: say xxx...
以控制台身份执行指令 不需要/
玩家执行: sethome...
以玩家身份执行 不需要/
是否在世界: 世界名
返回玩家是否在指定世界
是否有权限: xx.xxx
返回玩家是否有指定权限
playsound: 声音枚举
给玩家播放声音, 声音枚举请在这里获取 https://bukkit.windit.net/javadoc/org/bukkit/Sound.html
插件支持的变量:
{执行结果} - 有返回值的地方, 比如JS和HTTP操作会用到
{玩家} - 执行命令的玩家ID
{玩家游戏模式} - survival,creative,adventure,spectator
{玩家血量} - 20.0
{玩家是否OP} - true/false
{玩家语言} - zh_cn, en_us
{玩家等级} - 12
其实自己一个写一个脚本指令非常简单(但是不知道有没有人真这么干),你可以反编译看它的处理逻辑。
所有的命令都继承了 loi.lois.ParseWorker.CommandWorker 和 run(String value, HandleWorker handler),
run() 会在命令被触发时调用。其中,value 是命令的参数, handler 是上下文。handler 有 getContext(String key) 方法, 可以获得指定的上下文。如果找不到则返回 null。
比如获取 OhMyCmd 捕捉的玩家执行命令事件, 从中获取执行命令的玩家, 你可以通过 (PlayerCommandPreprocessEvent) handler.getContext("event") 来获取。
写好事件之后, 还需要有一步注册, 使用:
ink.loi.lois.ParseWorker.EnvironmentManager.workerRegister("命令触发词", (CommandWorker) new 命令所在类());
事实上, 插件的中文命令是通过创建别名实现的,
ink.loi.lois.ParseWorker.EnvironmentManager.createAlias("私聊", "tell");
就可以为 tell 指令创建一个别名私聊, 之后使用该别名 ("私聊") 就可以触发 tell 。如果存在重复别名, 那么后注册的的会覆盖前面的。
插件的命令, 如 "tell: something" 不是系统自动解析的。为了以后能够更好地自定义,插件是通过需要额外定义的解析器来解析的。
如果你想让命令的格式改成这样 "tell(something)" 你就可以自己写一个命令解析器。一个命令解析器继承 StandardDecoder, 在插件解析命令时会调用 decode(String cmd) 方法。其中 cmd 是一行完整的命令。再由解析器去调用 handler 调用相关的指令类。
才发现我写的好复杂 TAT
 
OhMyCmd!
命令付费 | 世界限制 | 脚本自定义指令 | 命令管理
# OhMyCmd 可以做什么?
1. 命令以参数为粒度匹配, 支持通配符。领地TP付费, 领地设置特定权限付费, warp到指定地点需付费都不在话下;
2. 不再受限于单个限制, 支持多限制。比如只有特定权限/等级玩家才能传送到某副本/世界等.
3. 甚至可以通过本插件的脚本自己写命令。 没有ess想用/suicide? 没问题! 想让玩家通过 /副本 xxx /世界 xxx 快捷输入命令? 没问题!
4. 支持与 JavaScript 或网站进行交互! (返回值可以看的清 清 楚 楚)
Step 1. 我就是想单个命令付费/世界限制, 我要怎么写?
Step 2. 写一个领地TP付费吧!
Step 3. 我想自定义一个 /suicide 指令试试!
Step 4. 人生苦短, 我用
Step 5. 用上更多语法: 做个
Step6. 体验一把通配符: 制作必须是OP才能为某领地设置权限的规则
当然实际上 Loiscript/OhMyCmd 有更多内建指令, 支持对玩家做更多事♂情, 在下一页可以看到文档.
# OhMyCmd 指令
> /ohmycmd 或 /ohcmd
/ohmycmd <reload/test> [测试指令,不需要/]
/ohmycmd reload: 重载
/ohmycmd test: 测试某个指令, 可显示出命令被解析的详细过程, 由于大部分指令需要事件作为上下文, 所以很多东西实际上用不了, 之后会逐步完善
如: /ohmycmd test res tp xxx
# OhMyCmd 权限
ohmycmd.command:
  使用 OhMyCmd 指令
 默认所有玩家拥有
ohmycmd.bypass:
  拥有此权限的人将不会被本插件影响
  默认无人拥有, 因为会影响自定义指令
ohmycmd.test:
  使用 /ohmycmd test 指令测试命令
  默认OP
ohmycmd.reload:
  可以重载本插件
  默认OP# 配置文件
我的代码水平比较菜233, 可能会出现各种各样奇怪的 bug, 如果发现欢迎各位提交!另外, 请尽量避免过多使用 JavaScript, 目前 loiscript 尚未做到复用 ScriptEngine, 可能会有性能损耗, 当然代码少的话可以忽略。
感谢下载!
# 下载!
由于是实时解析的脚本, 所以理论上全版本通用, 老版本不支持某些变量, 只有使用时会报错。
 
如果帮到你的话, 就评个分吧 (雾)
本插件所用所有代码均为原创,不存在借用/抄袭等行为
2021.12 数据,可能有更多内容

OhMyCmd!命令付费 | 世界限制 | 脚本自定义指令 | 命令管理
# OhMyCmd 可以做什么?
1. 命令以参数为粒度匹配, 支持通配符。领地TP付费, 领地设置特定权限付费, warp到指定地点需付费都不在话下;2. 不再受限于单个限制, 支持多限制。比如只有特定权限/等级玩家才能传送到某副本/世界等.3. 甚至可以通过本插件的脚本自己写命令。 没有ess想用/suicide? 没问题! 想让玩家通过 /副本 xxx /世界 xxx 快捷输入命令? 没问题!4. 支持与 JavaScript 或网站进行交互! (返回值可以看的清 清 楚 楚)
Step 1. 我就是想单个命令付费/世界限制, 我要怎么写?
```# +* 的意思是向后通配符, 匹配后面的所有参数
"res tp +*":
requirements:
- "如果: {玩家是否OP} == true"
- "是否在世界: survival_world"
- "检测是否足够经济然后直接扣费: 1.00"
```
这个配置可以做到对领地 res tp xxx... 的命令扣费, 对OP玩家和在 survival_world 世界的玩家免除费用.
Attention! 当您写下多个限制时, 插件只要求命令执行的玩家满足一个即可, 而不是所有限制必须全部满足。
如果有其他免扣费的条件, 必须写在扣费指令之前, 否则会优先扣费!
```# +* 的意思是向后通配符, 匹配后面的所有参数
"res tp +*":
requirements:
- "是否在世界: survival_world"
```
这个配置可以做到玩家只能在 survival_world 世界里执行 res tp xxx...
Step 2. 写一个领地TP付费吧!
```
# 每传送一次领地就花费1元, 否则不传送
# 下面的条件, 意味着任何以 /res tp 开头的指令都会被拦截。
# +* 的意思是向后通配符, 匹配后面的所有参数
"res tp +*":
requirements:
# |-> 如果玩家是OP忽略扣费直接进行
- "如果: {玩家是否OP} == true"
# |-> 或者玩家在生存世界, 就可以免费 res tp
- "是否在世界: survival_world"
# |-> 或者玩家为此支付1元, 如果玩家经济不足一元会直接阻挡命令执行
- "检测是否足够经济然后直接扣费: 1.00"
# --> on-toggle 字段可以省略
on-reject:
- "私聊: &&c进入领地 >{命令参数:2}< 需要 1 元经济, 你没有足够的钱!"
# {命令参数:2} 代表命令用空格分隔的第三个字符, 在这里是领地的名字
```
这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /res tp xx 体验
玩家没有足够钱的效果:

Step 3. 我想自定义一个 /suicide 指令试试!
```
"suicide":
# 执行命令的必要条件, 满足下列其一才会执行
requirements:
# |-> 如果玩家名是 Saber 就可以直接执行命令
- "如果: {玩家} == Saber"
# |-> 或者如果玩家金钱够1,就满足条件,并直接扣费,否则不会执行
- "检测是否足够经济然后直接扣费: 1.00"
on-toggle:
# 杀.死这个操作, 可以忽略参数, 默认只对执行命令的玩家有效果。
- "杀.死"
- "私聊: &&e再见, 世界!"
- "广播: &&6{玩家} 结束了他自己的生命"
- "阻止命令继续执行"
# |-> 如果你在自定义命令, 必须要先或者在最后阻止命令继续执行
on-reject:
- "私聊: &&c这么做需要花费你 1 元钱! 你没有足够的钱!"
- "条件执行: (如果:{玩家游戏模式} == creative) {私聊:&&c你是神,不能xx!}"
```
这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /suicide 体验另: 那个xx是为了避免屏蔽词2333
Step 4. 人生苦短, 我用
```
"motd":
# --> requirements 省略后, 这个指令所有人都不能执行
requirements:
# |-> 这么写, 让所有人都可以执行这个指令
- "直接返回: true"
on-toggle:
- "JS执行: (string) '今天的日期是: '+new Date()"
# |-> 运行JS之后的结果将输出到变量 {执行结果}
- "私聊: &&6欢迎来到服务器! {执行结果}"
- "阻止命令继续执行"
```
这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /motd 体验
Attention: 我们来看看如何调用 JavaScript
语法是: javascript: (string/bool) JS代码....
中间的 (string) (bool) 用于定义本JS的返回值, 如果JS代码返回布尔值, 那么就需要 (bool), 字符串则为 (string)
然后, 你就可以愉快地使用 {执行结果} 或者 {result} 调用JS返回值了!
效果:

Step 5. 用上更多语法: 做个
这一次我们挑战一把纯英文写指令!
把下面的替换成中文也是可以执行的!
```
"marry *":
requirements:
# 是否有权限
- "haveperm: ohmycmd.marry"
- "if: {player_isop} == true"
on-toggle:
# 控制台执行 console:
- "console: tp {player} {命令参数:1}"
- "broadcast: &&b{player} married with {命令参数:1}"
- "playsound: ENTITY_BLAZE_BURN"
- "javascript: (string) (new Date()).toString()"
- "tell: &&cYou married with {命令参数:1} on {result}!"
# 向某个URL发起 GET 请求, 可通过 {执行结果} 获得返回的数据
- "http get: h ttps://baidu.com"
# 自定义指令最后需要阻止命令继续执行, 否则会出现 Unknown command.
- "setcancel"
```
这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /marry 玩家ID 体验
效果:

Step6. 体验一把通配符: 制作必须是OP才能为某领地设置权限的规则
首先我们知道, 设置领地权限的指令是 res pset [玩家ID] [领地名称] [权限] [true/false] 对吧
```
# 这里的意思是, 只要玩家执行
# /res pset [随便填什么] OPRes xxx true/false/t/f
# 都会被检测,比如
# /res pset hypergryph OPRes move true, /res pset notch OPRes health false
# 以上指令都会被检测到
"res pset * OPRes * *":
requirements:
# 只有是OP才会允许执行
- "如果: {玩家是否OP} == true"
on-reject:
- "私聊: &&c只有OP才能为OPRes领地设置玩家权限!"
```
其实这个例子比较鸡肋,可以按照这个逻辑来配置其它你需要的逻辑
效果: 迷hotel,尝一尝甜不甜啊,哎,没吃呢
当然实际上 Loiscript/OhMyCmd 有更多内建指令, 支持对玩家做更多事♂情, 在下一页可以看到文档.
# OhMyCmd 指令
> /ohmycmd 或 /ohcmd
/ohmycmd <reload/test> [测试指令,不需要/]
/ohmycmd reload: 重载
/ohmycmd test: 测试某个指令, 可显示出命令被解析的详细过程, 由于大部分指令需要事件作为上下文, 所以很多东西实际上用不了, 之后会逐步完善
如: /ohmycmd test res tp xxx
# OhMyCmd 权限
```
ohmycmd.command:
使用 OhMyCmd 指令
默认所有玩家拥有
ohmycmd.bypass:
拥有此权限的人将不会被本插件影响
默认无人拥有, 因为会影响自定义指令
ohmycmd.test:
使用 /ohmycmd test 指令测试命令
默认OP
ohmycmd.reload:
可以重载本插件
默认OP
```
# 配置文件
```
settings:
# 我们希望通过 bStat 了解都有谁在使用这个插件
# 您可在我们的 bStat 页面上了解统计信息
# 设置下面的值为 false, 禁止 bStat 传输您的使用统计
allow-bstats: true
# 启用的命令拦截器列表,
# 写完拦截器后, **请一定不要忘记** 把它添加在这里!!!
# 写完拦截器后, **请一定不要忘记** 把它添加在这里!!!
# 写完拦截器后, **请一定不要忘记** 把它添加在这里!!!
enabled-listeners:
- "suicide"
- "res tp +*"
- "motd"
- "marry *"
- "传送领地 *"
# 定义命令
listener:
"suicide":
# 执行命令的必要条件, 满足下列其一才会执行
requirements:
# |-> 如果玩家金钱够1,就满足条件,并直接扣费,否则不会执行
- "检测是否足够经济然后直接扣费: 1.00"
# |-> 或者如果玩家名是 Saber 就可以直接执行命令
- "如果: {玩家} == Saber"
on-toggle:
- "杀死: {player}"
- "私聊: &&e再见, 世界!"
- "广播: &&6{player} 结束了他自己的生命"
- "阻止命令继续执行"
# |-> 如果你在自定义命令, 必须要先或者在最后阻止命令继续执行
on-reject:
- "私聊: &&c这么做需要花费你 1 元钱!"
- "条件执行: (如果:{玩家游戏模式} == creative) {私聊:&&c你是神,不能xx!}"
# 每传送一次领地就花费1元, 否则不传送并且播放打龙音效
# 下面的条件, 意味着任何以 /res tp 开头的指令都会被拦截。
# +* 的意思是向后通配符, 匹配后面的所有参数
"res tp +*":
requirements:
# |-> 如果玩家是OP忽略扣费直接进行
- "如果: {玩家是否OP} == true"
# |-> 或者玩家为此支付1元, 如果玩家经济不足一元会直接阻挡命令执行
- "检测是否足够经济然后直接扣费: 1.00"
# |-> 或者玩家在生存世界, 就可以免费 res tp
- "是否在世界: survival_world"
# --> on-toggle 字段可以省略
on-reject:
- "私聊: &&c进入领地 >{命令参数:2}< 需要 1 元经济!"
# {命令参数:2} 代表命令用空格分隔的第三个字符, 在这里是领地的名字
"motd":
# --> requirements 省略后, 这个指令所有人都不能执行
requirements:
# |-> 这么写, 让所有人都可以执行这个指令
- "直接返回: true"
on-toggle:
- "JS执行: (string) '今天的日期是: '+new Date()"
# |-> 运行JS之后的结果将输出到变量 {执行结果}
- "私聊: &&6欢迎来到服务器! {执行结果}"
- "阻止命令继续执行"
# 你还可以通过 OhMyCmd 定义中文快捷指令
"传送领地 *":
requirements:
- "直接返回: true"
on-toggle:
- "玩家执行: res tp {命令参数:2}"
- "阻止命令继续执行"
# 试试用纯英文做个指令?
"marry *":
requirements:
- "haveperm: ohmycmd.marry"
- "if: {player_isop} == true"
on-toggle:
- "console: tp {player} {命令参数:1}"
- "broadcast: &&b{player} married with {命令参数:1}"
- "playsound: ENTITY_BLAZE_BURN"
- "javascript: (string) (new Date()).toString()"
- "tell: &&cYou married with {命令参数:1} on {result}!"
- "http get: https://baidu.com"
- "setcancel"
```
我的代码水平比较菜233, 可能会出现各种各样奇怪的 bug, 如果发现欢迎各位提交!另外, 请尽量避免过多使用 JavaScript, 目前 loiscript 尚未做到复用 ScriptEngine, 可能会有性能损耗, 当然代码少的话可以忽略。
感谢下载!
# 下载!
由于是实时解析的脚本, 所以理论上全版本通用, 老版本不支持某些变量, 只有使用时会报错。

以下是脚本原生支持的语法:
if: xxx ==(!=) xxx
example: if: {玩家} == Notch
set: 变量名 值...
example: set: wanjiamingzi 蕾米洛伊
println: 消息
example: println 玩家 {玩家} 触发了指令!
javascript: (bool/string/boolean) 代码...
参数分两段以空格分隔 第一段声明后面一段代码的返回值 可通过 {result} 调用 返回值不正确会导致报错
example: javascript: (string) (new Date()).toString();
if then: (返回布尔值的某个语句 (如 "if: hello == hello") ) {执行的代码1;执行的代码2...}
如果那么, 如果括号中语句返回为true, 那么执行花括号中的语句, 以;分割
return: true/false
直接返回。
插件支持的额外语法:
私聊: xxxxx..
给执行命令的玩家发送私聊消息
杀死
kill 执行命令玩家
阻止命令继续执行
取消事件, 如果你有自定义指令务必在语句的最前或最后执行这个, 防止出现 Unknown command
广播: xxxx...
世界广播消息
检测是否足够经济然后直接扣费: x.xx
首先检测玩家是否足够经济, 如果不够直接返回否(阻止执行指令), 够就直接扣费
给予玩家经济: x.xx
给玩家钱
控制台执行: say xxx...
以控制台身份执行指令 不需要/
玩家执行: sethome...
以玩家身份执行 不需要/
是否在世界: 世界名
返回玩家是否在指定世界
是否有权限: xx.xxx
返回玩家是否有指定权限
playsound: 声音枚举
给玩家播放声音, 声音枚举请在这里获取 https://bukkit.windit.net/javadoc/org/bukkit/Sound.html
插件支持的变量:
{执行结果} - 有返回值的地方, 比如JS和HTTP操作会用到
{玩家} - 执行命令的玩家ID
{玩家游戏模式} - survival,creative,adventure,spectator
{玩家血量} - 20.0
{玩家是否OP} - true/false
{玩家语言} - zh_cn, en_us
{玩家等级} - 12
其实自己一个写一个脚本指令非常简单(但是不知道有没有人真这么干),你可以反编译看它的处理逻辑。
所有的命令都继承了 loi.lois.ParseWorker.CommandWorker 和 run(String value, HandleWorker handler),
run() 会在命令被触发时调用。其中,value 是命令的参数, handler 是上下文。handler 有 getContext(String key) 方法, 可以获得指定的上下文。如果找不到则返回 null。
比如获取 OhMyCmd 捕捉的玩家执行命令事件, 从中获取执行命令的玩家, 你可以通过 (PlayerCommandPreprocessEvent) handler.getContext("event") 来获取。
写好事件之后, 还需要有一步注册, 使用:
ink.loi.lois.ParseWorker.EnvironmentManager.workerRegister("命令触发词", (CommandWorker) new 命令所在类());
事实上, 插件的中文命令是通过创建别名实现的,
ink.loi.lois.ParseWorker.EnvironmentManager.createAlias("私聊", "tell");
就可以为 tell 指令创建一个别名私聊, 之后使用该别名 ("私聊") 就可以触发 tell 。如果存在重复别名, 那么后注册的的会覆盖前面的。
插件的命令, 如 "tell: something" 不是系统自动解析的。为了以后能够更好地自定义,插件是通过需要额外定义的解析器来解析的。
如果你想让命令的格式改成这样 "tell(something)" 你就可以自己写一个命令解析器。一个命令解析器继承 StandardDecoder, 在插件解析命令时会调用 decode(String cmd) 方法。其中 cmd 是一行完整的命令。再由解析器去调用 handler 调用相关的指令类。
才发现我写的好复杂 TAT
woc woc牛逼 赞
论,为了一个服务器学N种知识的重要性
 
推荐添加指令冷却塔就可以成一套
绝对很牛
绝对很牛
乐死自认 发表于 2020-7-9 08:19
推荐添加指令冷却塔就可以成一套
绝对很牛
竟然还有人用这个又复杂又难用的插件hhhhc 感动了 马上安排
感谢你,这个插件可以有脑洞可以搞许多花样出来
mcbbs有你更精彩
刷下热度~
好用,但是配置有点麻烦
刷下热度~
刷下热度~
刷下热度~
刷下热度~
刷下热度~
刷下热度~
刷下热度~
刷下热度~