本帖最后由 1012033254 于 2019-5-4 18:16 编辑

专为Sponge服务端打造的脚本方块插件来了!

ScriptBlock?ScriptBlockPlus?
不,是BlockAction!
基于SpongeAPI 5.0/6.0/7.0/7.1制作,兼容1.9-1.12.2所有服务端(包括SpongeForge)
1.9.x-1.10.x下载目录里对应API5.x
1.11.x下载目录里对应API6.x
1.12/1.12.1下载目录里对应API7-BETA
1.12.2下载对应目录里的API7.1
整合吸收ScriptBlock,ScriptBlockPlus的优点
但远远不止这么多!


1.支持一个方块多条脚本
2.支持区域范围触发脚本(直接绑定在一个区域上而不仅仅是单个方块)
3.支持一个脚本同时兼具两种触发(@Walk,@Click)
4.支持一个方块的多个脚本间的逻辑联系
5.更加完善强大的@Item系统(支持设定多个Item,以及操作类型[后面有详细解释])
6.完善的Item辅助系统.
7.一个脚本内本身就支持多条命令(一个@Command多条命令).
8.更加完善的命令/添加/删除/权限/读取/系统,一次设置可重复在多个方块上添加脚本,一次可清除范围内所有脚本...
9.全面的命令自动补全.
10.支持从书中读取脚本内容(由于功能强大,一些功能的设置可能较为长,这种方式更加有效,且能够储存,移交!)


虽然由于SpongeAPI的特性,理论上所有支持的经济/权限插件本插件都支持
但实际测试中表现较好的是LuckPerms权限插件TotalEconomy经济插件


支持语言:英文(LZ懒得取搞中文提示了)

下面进入正题:
<1>命令系统

/ba (或者/blockaction)根命令

/ba setmode [disabled/viewmode/deletemode/clearmode/aabbmode] [玩家] (PS:'[]'意为可选,下同)
用来设置右键方块后的触发模式,disabled不会有任何显示(未编辑状态,也就是初始状态),viewmode会列出该方块上的所有脚本及内容,deletemode会删除该方块上最后一条脚本,clearmode将删除该方块上的所有脚本,另外还有attachmode和changemode,在后面会提到.

注意:
aabbmode用于选定一块区域,在此模式下,左击一个方块选定第一个点,右击一个方块选定第二个点(用过创世神插件的很熟悉吧)
这样两个点都确定下来之后即可使用后面的/ba aabbseter create [name]命令来创建一个叫[name]的区域,后续用于绑定脚本。

/ba getmode [玩家]
显示玩家的当前模式,如果是attachmode/changemode还有脚本内容信息

/ba create 脚本内容
这条命令会把玩家的模式设置为attachmode,并且把这条脚本绑定到玩家,玩家右键一个方块上就可以添加脚本,只要模式没有改变,就可以重复添加到多个方块。同时也可以使用/ba aabbseter apply [name1] [name2] ... 命令将脚本绑定到名为[name1] [name2]..的多个区域上。

/ba change 脚本内容
这条命令会把玩家模式设置为changemode,并且把这条脚本绑定到玩家,玩家右键一个方块上会将当前脚本覆盖/整合进方块上的最后一个脚本里去,只要模式没有改变就可以一直重复操作。同时也可以使用/ba aabbseter apply [name1] [name2] ... 命令将脚本整合到到名为[name1] [name2]..的多个区域上的各自的最后一个脚本上去。

/ba createfrombook change/create
这条命令与上面差不多,只是从手持的书中读取脚本内容。

/ba aabbseter info [区域名]
这条命令会显示出名为[区域名]的区域的信息(包括上面的所有脚本)

/ba aabbseter list
这条命令会显示出当前存在的所有区域的名字

/ba aabbseter create [区域名]
这条命令必须在玩家处于aabbmode下才能被执行!
会以aabbmode下确定的两个点创建一个名为[区域名]的区域。

/ba aabbseter apply [区域名1] [区域名2] [区域名3]...
这条命令必须在玩家处于attachmode/changemode下才能被执行!
会将当前模式的挂载的脚本绑定/整合到名为[区域名1] [区域名2] [区域名3]...等区域中。

/ba aabbseter remove [区域名1] [区域名2] [区域名3]...
这条命令会删除名为[区域名1] [区域名2] [区域名3]...等区域。

/ba aabbseter clear [世界1] [世界2] [世界3]...
这条命令会删除名为[世界1] [世界2] [世界3]...等世界上的所有区域。

/ba aabbseter clearall
这条命令会删除所有世界上的所有区域。

/ba aabbseter remove [区域1] [区域2] [区域3]...
这条命令会删除名为[区域1] [区域2] [区域3]...的区域。

/ba aabbseter info [区域名]
这条命令会显示出名为[区域名]的区域的信息(包括上面的所有脚本)

/ba remove X Y Z R [世界](世界选项为可选,默认为执行命令的玩家的世界,如果不知道世界名字,可以按tab获得自动补全提示)
X,Y,Z是中心坐标,R是距离,距离小于等于R内的所有脚本都会被删除

/ba find X Y Z R [世界](这里的世界也是可选的,默认都是执行命令的玩家所在的世界)
同上,但是只会列出范围内的所有脚本,但不会删除

/ba clear [世界](这里的世界也是可选的,默认都是执行命令的玩家所在的世界)
清除一个世界内的所有脚本

/ba clearall
清除所有世界(包括曾经加载过的)的所有脚本

/ba getitemname [Item-Storage Token](这个Token也是可选的)
这里的Item-Storage Token跟后面的@Item辅助系统有关,稍后解释。
若只使用/ba getitemname则会只返回手中持有的物品的ID以及BlockState

这里就要解释一下了:
插件对物品的定位方式使用的是[物品ID:物品的BlockState]这样的方式
搞过MC开发或者认真研究了wiki的人就知道
对于同种类的物品,他们的物品ID是一样的,比如各种木头..区分他们的就是BlockState
在以前的Minecraft中物品ID和物品的BlockState都可以用数字ID的形式来定位
但现在全变成文字了...虽然有数字ID与之对应,但在SpongeAPI中没法用
使用文字的话定位精度更高,但很长且容易输错,所以本插件提供了Item的辅助系统!
你使用/ba getitemname [Item-Storage Token]这个命令
其中Item-Storage Token是你自己随便取一个切合的别名,然后插件就会帮你把你目前右手上拿着物品IDBlockState都存下来,避免长文字的手动输入。
你取的这个别名就会有办法用在@Item和@Hand里面了,稍后解释用法。

/ba itemstorage list
/ba itemstorage remove token1 token2 token3...
/ba itemstorage clear
这3个命令就是用来操作上面解释的物品储存信息了..
顾名思义list就是列出所有你保存的物品以及你取的别名,remove就是删掉一些你取的别名,clear就是清空啦。
还有就是每一个玩家都有自己的储存的物品别名,互不影响。


/ba reload
/ba reload config
/ba reload data
就是重新加载脚本数据(请务必小心)/脚本的配置
由于插件采取文本形式储存数据,所以离线之后也可以更改脚本的信息(不建议这样做),所以你可以先关闭autosave,修改完信息之后reload就好了
但是如果格式不合**导致信息丢失所以不建议这样暴力的修改.

/ba autosave state/start/stop
就是字面上的意思,查看当前autosave(内存到磁盘)的状态,每两次储存时间点的间隔,也可以开启或关闭autosave
无论你关闭或开启autosave,在服务器正常结束的时候都会保存数据,所以只要运行正常无论关闭与否都不会导致数据丢失
但是建议开启。

<2>脚本内容
脚本内容是以注解为根基的
一个注解是以@开头的一个特定的文本,插件会检测它并尝试读取信息....但其实往简单方面弄就非常简单.
基本内容:
@Walk
有这个注解的脚本可以通过被走过而被执行
@Click
有这个注解的脚本可以通过被点击而被执行


当然,一个脚本可以同时有这两种方式

@Command:命令内容1;命令内容2;命令内容3....
对,你没看错,这个插件不仅支持一个方块多个脚本,还支持一个脚本多条命令。
举个栗子:@Command:/weather clear;/give @a apple 2 @Walk @Click
完整命令:/ba create @Command:/weather;/give @a apple 2 @Walk @Click

这里和后面分隔多个元素的是';'而不是':',一定注意!

@Message:内容
向触发这个的玩家发送一条特定的信息
关于内容的可变格式以及颜色,样式等在后面高级内容讨论

@Server:内容
向全服发送一条特定消息。

@Bypass
设定这个注释后命令的执行会以控制台的身份执行,无视玩家是否有权限
举个栗子:@Command:/weather clear;/give @me apple 2 @Walk @Click @Bypass
注:V1.13以上版本 "@me"会被插件自动替换为触发的玩V1.12以及更低版本请正常使用"@a","@p"等原生指令
另外,luckperms插件提供短时间赋予玩家权限的功能,可以使用luckperms命令代替Bypass(在同一个方块上先绑定提权命令再绑定其他命令)

@Player:操作类型:name1;name2;name3....

这里的操作类型在后面所有的支持多个元素的注解中都是一样的,所以在这里解释一下
这个操作类型有三种
hasone:只要满足后面所有条件中的一种即可
hasall:满足后面所有的条件才行
exclude:后面所有的条件都不能满足

对与这里的@Player来说
你可以用hasone或者是exclude,当然hasall是不行的(你有几个名字?)
例如@Player:hasone:andy;simon;dale
只要你的名字是andy,simon,dale中的一个就行了
如果是@Player:exclude:andy;simon;dale
你的名字就不能是andy,simon,dale中的任意一个。

@Perm:操作类型:权限1;权限2;权限3;....
这里也有操作类型,自己理解吧


@Group:操作类型:权限组1;权限组2;权限组3....
由于Sponge的权限管理中一个用户是可以在多个组里面的,所以这里也有操作类型,体会体会吧。

@Amount:次数
设置脚本可以被执行的次数

@Value:钞票
设置执行脚本需要的钱(需要经济插件支持,不然会报错)
@Delay:秒
设置脚本触发后多久才会执行命令/发送信息
与原本的ScriptBlock不同,这里的Delay之后不会影响其他玩家与方块的交互(ScriptBlock Too Young)

@Pr:概率(一个小数)
设置脚本成功执行的概率(意思是当满足上面所有条件(如@Value,@Item等),并扣掉钱/物品之后成功执行@Command内容的概率)


举个栗子:@Command:/weather clear;/give @me apple 2 @Value:100 @Pr:0.6 @Walk @Click @Bypass

这个例子里面当玩家满足要求,并且已经被扣了100块之后,再进行一次随机判定,有60%概率成功改变天气并得到2个苹果。

@Cooldown:秒
设置触发后下次触发所需的间隔时间

高级功能(不需要可以直接略过了):


@Random(numl,numr)
插件支持的随机数功能,numl,numr是你想要生成的随机整数(支持负数)的范围(需满足numl <= numr)
可以在@Command, @Server @Message 里面任何位置使用
注意: 是@Random(numl,numr) 而不是 @Random:(numl,numr) !


举个栗子:@Command:/give @me apple @Random(1,5) @Message:[you now have: @Color:red @Style:bold] [@Random(1,5): @Color:green ] [random points: @Color:red @Style:bold] @Pr:0.3 @Walk @Click @CloseInfo


现在我们有了更多刺激的玩法!

@Hand:物品ID:物品BlockStateID:所需最少数量

设置脚本的触发条件:需要在手中拿着满足要求的物品才能触发.
注意这里并不会消耗你手里面拿的物品.
注意当物品的BlockStateID被设置为NULL的时候插件将忽略BlockStateID,只以物品ID进行比对!

当然这里可以被替换成这样@Hand:@ItemStore:你取的物品别名:所需最少数量

这里解释一下@ItemStore也是一种注解,专门用来标示物品别名的.

例子:假如你的物品是apple,你给它取的别名是bigapple
那么下面两个script是等价的
@Hand:@ItemStore:bigapple:5
@Hand:apple:NULL:5




@Item:操作类型:物品ID1:物品BlockStateID:所需最少数量:是否消耗该物品(true/false);物品ID2....

注意当物品的BlockStateID被设置为NULL的时候插件将忽略BlockStateID,只以物品ID进行比对!

当然里面每一个"物品ID1:物品BlockStateID:所需最少数量:是否消耗该物品(true/false)"都可以替换为:
"@ItemStore:你取的物品别名:所需最少数量:是否消耗该物品(true/false)"

对于这里的操作类型需要小小的解释一下
exclude:对于后面的每一种物品都不能超过设置的那个数量
hasone:后面有一个满足要求的物品即可,插件会找到第一个满足要求的物品,看它是否被消耗,如果是就消耗设置数量那么多的该物品,否则不消耗
hasall:后面每一个物品要求都要满足,并消耗所有被设置要消耗的物品

@Punish:命令1;命令2;命令3;.....
当脚本执行的条件没有被满足的时候
就是(@Player,@Item,@Hand,@Perm,@Group,@Value)中有任意一个没有满足的时候,原先设置的@Command后面的命令内容都不会被执行,如果设置了@Punish内容,就会执行@Punish后面的东西....
想想看有啥妙用吧..密室逃脱?死亡游戏?探险?...没有做不到,只有想不到。


脚本间的逻辑:

@SuccessStop
当脚本的执行满足所有条件的时候,插件会执行@Command的内容(如果有)并跳过执行该方块上的所有剩余脚本..
用处:比如设置了1,2,3等奖,满足了1等奖的条件就不会执行后面的了.


@FailStop
当脚本的执行没有满足所有条件的时候,插件会执行@Punish的内容(如果有)并跳过执行该方块上的所有剩余脚本..
用处:...可能有用吧,写插件的时候顺便一起做了233...

@CloseInfo
这个就有点微妙了,插件默认设置的是当玩家在执行脚本的时候如果没有满足某个条件会向玩家发送提示信息的..
这个就是用来关闭提示信息的
用处:...你用BlockAction做了一个解迷游戏,别人靠提示信息就过关了233...


最后就是用在@Message/@Server里面以及部分@Command/@Punish里面的可变格式以及颜色,样式等

一个包含样式的Message看起来像是这样的:

@Message:[I'm Gray:@Color:GRAY @Style:BOLD] and [I'm Green:@Color:GREEN @Style:BOLD]
内容中被[]包起来的东西插件会进行解析,等出现在对话框的时候就已经是有颜色和样式的了.


一个[]看起来应该像这样:
[信息内容:样式/颜色等注解]

@Color:颜色
这里支持的颜色非常多....有兴趣的可以去翻一翻SpongeAPI..
我会在下载附录里面附上所有支持的颜色,'颜色'输入的时候不区分大小写..
所以@Color:Green 和@Color:GREEN是等价的.

@Style:样式1;样式2;样式3....
这里支持的样式就不多了,只有这几种:
OBFUSCATED
BOLD
STRIKETHROUGH
UNDERLINE
ITALIC
可以按名称判断也可以去体验一下,同样的,大小写无关。


最重要的是这个东西:

@Add:每次加的值(可正可负):限制(前面为负这里就是大于等于,前面为正这里就是小于等于)
当然也可以没有限制
这个注解要求前面的信息内容必须是个数字,每执行一次脚本前面那个数字就会自动加减,直到刚好不超过/不小于限制

这个注解同时可以用在命令里面
比如:@Command:/give @a apple [1:@Add:1]
每执行一次下一次的时候多给一颗苹果
比如:@Command:/give @a apple [1:@Add:1:5]
每执行一次下一次的时候多给一颗苹果,但最多一次给5个苹果。


有啥用啊?
比如奖励分级/人数自动统计发送信息之类的。

栗子: @Message:[You are the :@Color:Yellow @Style:Bold][1:@Color:Green @Style:Bold @Add:1][ one executed this script:@Color:Yellow @Style:Bold]


....到这里所有功能就介绍完毕了...

插件配置:可用的配置很少
配置文件在服务器的config/blockaction文件夹内,名为Config.conf
脚本数据文件在同一文件夹下,名为WorldData.conf
WorldData.conf可以用文本编辑器修改,如果你知道你在做什么的话(不建议这样做)
AutoSave会自动保存这两个文件,reload也可以重新读取这两个文件,即使是在服务器运行中。
但要注意在游戏运行中修改配置要先关闭AutoSave,不然你的修改还没来得及使用/ba reload来生效就被覆盖了。
Config.conf可用配置:
AutoSaveIntervalSec             设置自动保存的间隔时间,默认是60s。
EnableAutoSave                    设置是否开启自动保存,默认开启,在游戏中使用命令开启/关闭是一样的效果。
EnableExecuteInfo                 设置是否开启提示信息,默认开启,设置为false相当于全局的@CloseInfo
EnableExecutePermCheck    设置是否检查脚本执行权限,默认关闭,设置为true会检查玩家是否有脚本的执行权限。
[1.12新增]:
PlayerPosCheckTickInterval 设置玩家位置刷新间隔Tick,默认为1,服主根据服务器人数/卡顿情况设置(建议不超过3),数值越高插件占用资源越少(与@Walk灵敏度相关)
PlayerScriptCheckInterval 设置玩家script时间检查间隔,单位毫秒,默认100(建议1000以下),数值越高插件占用资源越少(与@Dealy精准度相关)
,
权限相关:
blockaction.commands.info (显示插件信息的权限)
blockaction.commands.reload
blockaction.commands.createfrombook
blockaction.commands.rangeremove (范围删除相关)
blockaction.commands.find
blockaction.commands.clear
blockaction.commands.clearall
blockaction.commands.create
blockaction.commands.change

blockaction.commands.setmode
blockaction.commands.getmode
blockaction.commands.getitemname
blockaction.commands.itemstorage.list
blockaction.commands.itemstorage.clear
blockaction.commands.itemstorage.remove
blockaction.commands.autosave
blockaction.excute.click
blockaction.excute.walk
最后两个权限是脚本执行相关的,如果EnableExecutePermCheck为false的话这两个权限是不会检查的。

“区域”的加入满足了需要大范围触发脚本的情景,但在很小范围触发(1-3个方块)时不建议使用“区域”来完成,因为区域的采用不同机制触发,设置相对繁琐,效率在小范围(1-3个方块)较单个绑定更低!

有人可能会说功能太多太杂了...是有一点这样的感觉

但其实想要简单可以忽略很多功能直接使用,注意一下与ScriptBlock之间的区别就好了。
想要功能全面复杂,也可以研究研究,这绝对是覆盖面广,灵活度高的脚本方块插件了。

本插件在BlockCommands(Forge版本的脚本方块插件,也是我写的)基础上开发的,但代码几乎重新编写..功能上也要强劲许多!

有Bug也希望在本贴回复。
Sponge API 感觉上也复杂得多, 费时费力研究各种文档,论坛讨论,解决一个个问题才有现在这个
代码量达到了189.3kb的插件.
写插件劳神费力,还请各位多给点回复,人气之类的

本插件所用所有代码均为原创,不存在借用/抄袭等行为
本插件为非盈利性插件,免费发布,严禁销售和转卖
部分插件源码来自BlockAction开源项目 (开源地址:https://github.com/cxnaive/BlockAction)
最后祝大家使用愉快!


2017-8-21更新:V1.1:修复了一些权限判定的Bug

2017-12-10更新:V1.11:Bug Fix

2018-6-10更新1.12.2版本(NEW API7)
2018-6-11更新:修复1.12.2玩家登录崩溃bug
2018-6-28:更换数据处理方式,修复bug(待测试(old/new双版本))
2018-7-01:更新1.12版本,修复1.12.2各种bug(无力吐槽没有文档的Sponge API),新增配置
2018-11-8:更新1.13(API7.1)版本,引入全面的随机数支持(@Pr @Random),更多刺激用法!
2019-2-26:重大更新V1.2版本,加入区域和区域脚本绑定机制,极大丰富了插件内容和玩法!

------------------------------------------------------------------------------V1.13----------------------------------------------------------------------------
网盘密码:


还求大家给点回复!

lz高考归来,开始更新!!!