Sssss...
本帖最后由 Sssss... 于 2020-3-23 12:05 编辑

本教程的代码部分测试于Bukkit 1.13,理论上所有版本通用

一、思路整理
几天前打算写一个关于基岩的插件(即将发布),但由于基岩在生存模式无法破坏,所以需要通过一些特殊的方式“挖掘”
不久后翻阅Bukkit API文档时看到了一个没用过的事件:PlayerAnimationEvent,文档内的介绍是“玩家动作事件”,只能检测摆臂

于是因为我闲的没事干(可能),就简单测试了一下,得出以下结论:

现在可以通过计数器实现基岩挖掘。经过简单的思考,得出以下过程:
考虑到挖掘的方块变化、手中物品变化时需要清零挖掘进度
得到以下较为详细的过程(以下[I]代表Interact事件监听器,[A]代表Animation):
也许有人会好奇为什么没有一个100t之后刷新进度的定时器?因为实际上不刷新进度不会有影响,玩家松开鼠标以后再次点击必将触发PlayerInteractEvent,所以是否刷新无关紧要


深究一下,会发现isMining变量实际上并没有作用
因为挖掉方块后会因为lastInteractLocation不符而不再执行[A]监听器,若下方为虚空则不会继续触发[A]
于是删除I.1与A.1两步


二、代码实现(由于MCBBS自带的代码显示会出现内容消失等bug,故直接使用文本形式)
然后就可以正常运行了,手持铁镐对着基岩按住五秒后基岩就掉落为物品

是不是觉得少了什么?

于是toBreak方法改为:
        private void toBreak(Block block) {
        }
onAnimation下方加一行:
event.getPlayer().sendActionBar("§7基岩挖掘中... §f" + Math.round((double) animationCount / TICKS * 1000) / 10 + "%");

三、最终效果
完美实现破坏基岩:
(我截完这张图以后发现粒子太多了,于是把那边的8改成了3)



由于最后一张图片的链接有敏感词(D.J),请手动输入链接查看(去掉链接中的中括号)
https://i.loli.net/2020/03/22/xRD[]JydQ9q4mG8Ck.png



602723113
如果挖掘基岩的效果可以配合上NMS的Block Break Animation, 那就会更好了,这里是包的信息
https://wiki.vg/Protocol#Block_Break_Animation

洞穴夜莺
为什么不直接使用原版的挖掘动画?