一种基于Kubejs和原版指令的大逃杀缩圈方法(优化版)
上一版请看CV24837073
上一版实际上是利用了层层嵌套的代码来实现的,繁琐,不美观,行数高达200多行。在KJS群友的启发下,我使用了递归函数来实现了大逃杀缩圈的效果,包括定时缩圈,圈中心移动。
不过随机缩圈还没做,嗯,等下个版本吧。
代码如下,并非最优代码,如要copy请标明出处。
waittingTime = [600,300,240,60,60,30,30]//缩圈前的等待时间
closingTime = [300,180,120,60,60,30,60]//缩圈持续时间
xPoint = [476,505,336,382,355,361,319,355]//各次收缩时的中心点x坐标
zPoint = [-718,-671,-556,-534,-578,-556,-566,-567]//各次收缩时的中心点y坐标
range = [650,300,140,70,30,15,1]//各次收缩最终半径
doneTime = 0 //函数已执行次数
function doRing(sv){
let ES = sv
var i = 0 //记录已经执行的步数
var imax = closingTime[doneTime]/0.1
var x = xPoint[doneTime]
var z = zPoint[doneTime]
var aveX = (xPoint[doneTime+1]-xPoint[doneTime])/imax
var aveZ = (zPoint[doneTime+1]-zPoint[doneTime])/imax
var r = range[doneTime]
var CT = closingTime[doneTime]
ES.schedule(waittingTime[doneTime] *SECOND ,ES,function(callback){
ES.tell('安全区正在缩小')
ES.tell(`x=${x},z=${z},imax=${imax}`)
ES.runCommandSilent(`worldborder set ${r} ${CT}`)
ES.schedule(0.02 * SECOND, ES, function(callback){
i++;
x = x + aveX
z = z + aveZ
ES.runCommandSilent(`worldborder center ${x} ${z}`)
if (i <= imax) {//判断条件以重复执行
callback.reschedule();
} else if(i > imax && doneTime < 7){
doneTime++
ES.tell('安全区已停止缩小'+doneTime)
doRing(ES)
} else if(doneTime >= 7) ES.tell('安全区已完全缩小')
})
})
}
onEvent('player.chat',function(event){
if(event.message.trim().equalsIgnoreCase('!test')){
event.server.tell('检测到指令,开始测试')
doRing(event.server)
}
})