蕾米洛伊
本帖最后由 蕾米洛伊 于 2021-2-23 10:08 编辑


OhMyCmd!
命令付费 | 世界限制 | 脚本自定义指令 | 命令管理



# OhMyCmd 可以做什么?

1. 命令以参数为粒度匹配, 支持通配符。领地TP付费, 领地设置特定权限付费, warp到指定地点需付费都不在话下;
2. 不再受限于单个限制, 支持多限制。比如只有特定权限/等级玩家才能传送到某副本/世界等.
3. 甚至可以通过本插件的脚本自己写命令。 没有ess想用/suicide? 没问题! 想让玩家通过 /副本 xxx /世界 xxx 快捷输入命令? 没问题!
4. 支持与 JavaScript 或网站进行交互! (返回值可以看的清 清 楚 楚)


Step 1. 我就是想单个命令付费/世界限制, 我要怎么写?



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 权限
ohmycmd.command:
  使用 OhMyCmd 指令
默认所有玩家拥有
ohmycmd.bypass:
  拥有此权限的人将不会被本插件影响
  默认无人拥有, 因为会影响自定义指令
ohmycmd.test:
  使用 /ohmycmd test 指令测试命令
  默认OP
ohmycmd.reload:
  可以重载本插件
  默认OP


# 配置文件


我的代码水平比较菜233, 可能会出现各种各样奇怪的 bug, 如果发现欢迎各位提交!另外, 请尽量避免过多使用 JavaScript, 目前 loiscript 尚未做到复用 ScriptEngine, 可能会有性能损耗, 当然代码少的话可以忽略。
感谢下载!

# 下载!
OhMyCmd-v1.1.jar (81.73 KB, 下载次数: 37)
由于是实时解析的脚本, 所以理论上全版本通用, 老版本不支持某些变量, 只有使用时会报错。

如果帮到你的话, 就评个分吧 (雾)
本插件所用所有代码均为原创,不存在借用/抄袭等行为



2021.12 数据,可能有更多内容



OhMyCmd!命令付费 | 世界限制 | 脚本自定义指令 | 命令管理


# OhMyCmd 可以做什么?
1. 命令以参数为粒度匹配, 支持通配符。领地TP付费, 领地设置特定权限付费, warp到指定地点需付费都不在话下;2. 不再受限于单个限制, 支持多限制。比如只有特定权限/等级玩家才能传送到某副本/世界等.3. 甚至可以通过本插件的脚本自己写命令。 没有ess想用/suicide? 没问题! 想让玩家通过 /副本 xxx /世界 xxx 快捷输入命令? 没问题!4. 支持与 JavaScript 或网站进行交互! (返回值可以看的清 清 楚 楚)


Step 1. 我就是想单个命令付费/世界限制, 我要怎么写?


```# +* 的意思是向后通配符, 匹配后面的所有参数
&quot;res tp +*&quot;:
requirements:
    - &quot;如果: {玩家是否OP} == true&quot;
    - &quot;是否在世界: survival_world&quot;
    - &quot;检测是否足够经济然后直接扣费: 1.00&quot;
```


这个配置可以做到对领地 res tp xxx... 的命令扣费, 对OP玩家和在 survival_world 世界的玩家免除费用.
Attention! 当您写下多个限制时, 插件只要求命令执行的玩家满足一个即可, 而不是所有限制必须全部满足。
如果有其他免扣费的条件, 必须写在扣费指令之前, 否则会优先扣费!

```# +* 的意思是向后通配符, 匹配后面的所有参数
&quot;res tp +*&quot;:
requirements:
    - &quot;是否在世界: survival_world&quot;
```


这个配置可以做到玩家只能在 survival_world 世界里执行 res tp xxx...


Step 2. 写一个领地TP付费吧!


```
# 每传送一次领地就花费1元, 否则不传送
# 下面的条件, 意味着任何以 /res tp 开头的指令都会被拦截。
# +* 的意思是向后通配符, 匹配后面的所有参数
&quot;res tp +*&quot;:
    requirements:
   # |-&gt; 如果玩家是OP忽略扣费直接进行
   - &quot;如果: {玩家是否OP} == true&quot;
   # |-&gt; 或者玩家在生存世界, 就可以免费 res tp
   - &quot;是否在世界: survival_world&quot;
   # |-&gt; 或者玩家为此支付1元, 如果玩家经济不足一元会直接阻挡命令执行
   - &quot;检测是否足够经济然后直接扣费: 1.00&quot;
    # --&gt; on-toggle 字段可以省略
    on-reject:
   - &quot;私聊: &amp;&amp;c进入领地 &gt;{命令参数:2}&lt; 需要 1 元经济, 你没有足够的钱!&quot;
   # {命令参数:2} 代表命令用空格分隔的第三个字符, 在这里是领地的名字
```


这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /res tp xx 体验
玩家没有足够钱的效果:



Step 3. 我想自定义一个 /suicide 指令试试!


```
&quot;suicide&quot;:
    # 执行命令的必要条件, 满足下列其一才会执行
    requirements:
   # |-&gt; 如果玩家名是 Saber 就可以直接执行命令
   - &quot;如果: {玩家} == Saber&quot;
   # |-&gt; 或者如果玩家金钱够1,就满足条件,并直接扣费,否则不会执行
   - &quot;检测是否足够经济然后直接扣费: 1.00&quot;
    on-toggle:
   # 杀.死这个操作, 可以忽略参数, 默认只对执行命令的玩家有效果。
   - &quot;杀.死&quot;
   - &quot;私聊: &amp;&amp;e再见, 世界!&quot;
   - &quot;广播: &amp;&amp;6{玩家} 结束了他自己的生命&quot;
   - &quot;阻止命令继续执行&quot;
   # |-&gt; 如果你在自定义命令, 必须要先或者在最后阻止命令继续执行
    on-reject:
   - &quot;私聊: &amp;&amp;c这么做需要花费你 1 元钱! 你没有足够的钱!&quot;
   - &quot;条件执行: (如果:{玩家游戏模式} == creative) {私聊:&amp;&amp;c你是神,不能xx!}&quot;
```


这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /suicide 体验另: 那个xx是为了避免屏蔽词2333


Step 4. 人生苦短, 我用Pyt.. JS! 写一个 /motd 吧!


```
&quot;motd&quot;:
    # --&gt; requirements 省略后, 这个指令所有人都不能执行
    requirements:
   # |-&gt; 这么写, 让所有人都可以执行这个指令
   - &quot;直接返回: true&quot;
    on-toggle:
   - &quot;JS执行: (string) '今天的日期是: '+new Date()&quot;
   # |-&gt; 运行JS之后的结果将输出到变量 {执行结果}
   - &quot;私聊: &amp;&amp;6欢迎来到服务器! {执行结果}&quot;
   - &quot;阻止命令继续执行&quot;
```


这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /motd 体验
Attention: 我们来看看如何调用 JavaScript
语法是: javascript: (string/bool) JS代码....
中间的 (string) (bool) 用于定义本JS的返回值, 如果JS代码返回布尔值, 那么就需要 (bool), 字符串则为 (string)
然后, 你就可以愉快地使用 {执行结果} 或者 {result} 调用JS返回值了!
效果:



Step 5. 用上更多语法: 做个没有灵.魂的结婚指令咋样


这一次我们挑战一把纯英文写指令!
把下面的替换成中文也是可以执行的!
```
&quot;marry *&quot;:
    requirements:
   # 是否有权限
   - &quot;haveperm: ohmycmd.marry&quot;
   - &quot;if: {player_isop} == true&quot;
    on-toggle:
   # 控制台执行 console:
   - &quot;console: tp {player} {命令参数:1}&quot;
   - &quot;broadcast: &amp;&amp;b{player} married with {命令参数:1}&quot;
   - &quot;playsound: ENTITY_BLAZE_BURN&quot;
   - &quot;javascript: (string) (new Date()).toString()&quot;
   - &quot;tell: &amp;&amp;cYou married with {命令参数:1} on {result}!&quot;
   # 向某个URL发起 GET 请求, 可通过 {执行结果} 获得返回的数据
   - &quot;http get: h ttps://baidu.com&quot;
   # 自定义指令最后需要阻止命令继续执行, 否则会出现 Unknown command.
   - &quot;setcancel&quot;


```


这是在配置文件里的一个例子, 你可以下载插件之后直接输入 /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
# 以上指令都会被检测到
&quot;res pset * OPRes * *&quot;:
    requirements:
   # 只有是OP才会允许执行
   - &quot;如果: {玩家是否OP} == true&quot;
    on-reject:
   - &quot;私聊: &amp;&amp;c只有OP才能为OPRes领地设置玩家权限!&quot;
```


其实这个例子比较鸡肋,可以按照这个逻辑来配置其它你需要的逻辑
效果: 迷hotel,尝一尝甜不甜啊,哎,没吃呢


当然实际上 Loiscript/OhMyCmd 有更多内建指令, 支持对玩家做更多事♂情, 在下一页可以看到文档.


# OhMyCmd 指令


&gt; /ohmycmd 或 /ohcmd
/ohmycmd &lt;reload/test&gt; [测试指令,不需要/]


/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:
- &quot;suicide&quot;
- &quot;res tp +*&quot;
- &quot;motd&quot;
- &quot;marry *&quot;
- &quot;传送领地 *&quot;


# 定义命令
listener:
&quot;suicide&quot;:
    # 执行命令的必要条件, 满足下列其一才会执行
    requirements:
   # |-&gt; 如果玩家金钱够1,就满足条件,并直接扣费,否则不会执行
   - &quot;检测是否足够经济然后直接扣费: 1.00&quot;
   # |-&gt; 或者如果玩家名是 Saber 就可以直接执行命令
   - &quot;如果: {玩家} == Saber&quot;
    on-toggle:
   - &quot;杀死: {player}&quot;
   - &quot;私聊: &amp;&amp;e再见, 世界!&quot;
   - &quot;广播: &amp;&amp;6{player} 结束了他自己的生命&quot;
   - &quot;阻止命令继续执行&quot;
   # |-&gt; 如果你在自定义命令, 必须要先或者在最后阻止命令继续执行
    on-reject:
   - &quot;私聊: &amp;&amp;c这么做需要花费你 1 元钱!&quot;
   - &quot;条件执行: (如果:{玩家游戏模式} == creative) {私聊:&amp;&amp;c你是神,不能xx!}&quot;


# 每传送一次领地就花费1元, 否则不传送并且播放打龙音效
# 下面的条件, 意味着任何以 /res tp 开头的指令都会被拦截。
# +* 的意思是向后通配符, 匹配后面的所有参数
&quot;res tp +*&quot;:
    requirements:
   # |-&gt; 如果玩家是OP忽略扣费直接进行
   - &quot;如果: {玩家是否OP} == true&quot;
   # |-&gt; 或者玩家为此支付1元, 如果玩家经济不足一元会直接阻挡命令执行
   - &quot;检测是否足够经济然后直接扣费: 1.00&quot;
   # |-&gt; 或者玩家在生存世界, 就可以免费 res tp
   - &quot;是否在世界: survival_world&quot;
    # --&gt; on-toggle 字段可以省略
    on-reject:
   - &quot;私聊: &amp;&amp;c进入领地 &gt;{命令参数:2}&lt; 需要 1 元经济!&quot;
   # {命令参数:2} 代表命令用空格分隔的第三个字符, 在这里是领地的名字


&quot;motd&quot;:
    # --&gt; requirements 省略后, 这个指令所有人都不能执行
    requirements:
   # |-&gt; 这么写, 让所有人都可以执行这个指令
   - &quot;直接返回: true&quot;
    on-toggle:
   - &quot;JS执行: (string) '今天的日期是: '+new Date()&quot;
   # |-&gt; 运行JS之后的结果将输出到变量 {执行结果}
   - &quot;私聊: &amp;&amp;6欢迎来到服务器! {执行结果}&quot;
   - &quot;阻止命令继续执行&quot;


# 你还可以通过 OhMyCmd 定义中文快捷指令
&quot;传送领地 *&quot;:
    requirements:
   - &quot;直接返回: true&quot;
    on-toggle:
   - &quot;玩家执行: res tp {命令参数:2}&quot;
   - &quot;阻止命令继续执行&quot;


# 试试用纯英文做个指令?
&quot;marry *&quot;:
    requirements:
   - &quot;haveperm: ohmycmd.marry&quot;
   - &quot;if: {player_isop} == true&quot;
    on-toggle:
   - &quot;console: tp {player} {命令参数:1}&quot;
   - &quot;broadcast: &amp;&amp;b{player} married with {命令参数:1}&quot;
   - &quot;playsound: ENTITY_BLAZE_BURN&quot;
   - &quot;javascript: (string) (new Date()).toString()&quot;
   - &quot;tell: &amp;&amp;cYou married with {命令参数:1} on {result}!&quot;
   - &quot;http get: https://baidu.com&quot;
   - &quot;setcancel&quot;


```


我的代码水平比较菜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: (返回布尔值的某个语句 (如 &quot;if: hello == hello&quot;) ) {执行的代码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(&quot;event&quot;) 来获取。


写好事件之后, 还需要有一步注册, 使用:
ink.loi.lois.ParseWorker.EnvironmentManager.workerRegister(&quot;命令触发词&quot;, (CommandWorker) new 命令所在类());


事实上, 插件的中文命令是通过创建别名实现的,
ink.loi.lois.ParseWorker.EnvironmentManager.createAlias(&quot;私聊&quot;, &quot;tell&quot;);
就可以为 tell 指令创建一个别名私聊, 之后使用该别名 (&quot;私聊&quot;) 就可以触发 tell 。如果存在重复别名, 那么后注册的的会覆盖前面的。

插件的命令, 如 &quot;tell: something&quot; 不是系统自动解析的。为了以后能够更好地自定义,插件是通过需要额外定义的解析器来解析的。
如果你想让命令的格式改成这样 &quot;tell(something)&quot; 你就可以自己写一个命令解析器。一个命令解析器继承 StandardDecoder, 在插件解析命令时会调用 decode(String cmd) 方法。其中 cmd 是一行完整的命令。再由解析器去调用 handler 调用相关的指令类。

才发现我写的好复杂 TAT



1182350036
woc woc牛逼 赞

结城希亚
论,为了一个服务器学N种知识的重要性

TNT8


乐死自认
推荐添加指令冷却塔就可以成一套
绝对很牛

蕾米洛伊
乐死自认 发表于 2020-7-9 08:19
推荐添加指令冷却塔就可以成一套
绝对很牛

竟然还有人用这个又复杂又难用的插件hhhhc 感动了 马上安排

黑崎丶一护
感谢你,这个插件可以有脑洞可以搞许多花样出来

1620401549
mcbbs有你更精彩

Nullor404
刷下热度~

Nullor404
好用,但是配置有点麻烦

Nullor404
刷下热度~

Nullor404
刷下热度~

Nullor404
刷下热度~

Nullor404
刷下热度~

Nullor404
刷下热度~

Nullor404
刷下热度~

Nullor404
刷下热度~

Nullor404
刷下热度~