一種基于Kubejs和原版指令的大逃殺縮圈方法(優(yōu)化版)
上一版請(qǐng)看CV24837073
上一版實(shí)際上是利用了層層嵌套的代碼來(lái)實(shí)現(xiàn)的,繁瑣,不美觀,行數(shù)高達(dá)200多行。在KJS群友的啟發(fā)下,我使用了遞歸函數(shù)來(lái)實(shí)現(xiàn)了大逃殺縮圈的效果,包括定時(shí)縮圈,圈中心移動(dòng)。
不過(guò)隨機(jī)縮圈還沒做,嗯,等下個(gè)版本吧。
代碼如下,并非最優(yōu)代碼,如要copy請(qǐng)標(biāo)明出處。
waittingTime = [600,300,240,60,60,30,30]//縮圈前的等待時(shí)間
closingTime = [300,180,120,60,60,30,60]//縮圈持續(xù)時(shí)間
xPoint = [476,505,336,382,355,361,319,355]//各次收縮時(shí)的中心點(diǎn)x坐標(biāo)
zPoint = [-718,-671,-556,-534,-578,-556,-566,-567]//各次收縮時(shí)的中心點(diǎn)y坐標(biāo)
range = [650,300,140,70,30,15,1]//各次收縮最終半徑
doneTime = 0 //函數(shù)已執(zhí)行次數(shù)
function doRing(sv){
? ? let ES = sv
? ? var i = 0 //記錄已經(jīng)執(zhí)行的步數(shù)
? ? 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('安全區(qū)正在縮小')
? ? ? ? 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) {//判斷條件以重復(fù)執(zhí)行
? ? ? ? ? ? ? ? callback.reschedule();
? ? ? ? ? ? } else if(i > imax && doneTime < 7){
? ? ? ? ? ? ? ? doneTime++
? ? ? ? ? ? ? ? ES.tell('安全區(qū)已停止縮小'+doneTime)
? ? ? ? ? ? ? ? doRing(ES)
? ? ? ? ? ? } else if(doneTime >= 7) ES.tell('安全區(qū)已完全縮小')
? ? ? ? })
? ? })
? ?
? ? }
onEvent('player.chat',function(event){
? ? if(event.message.trim().equalsIgnoreCase('!test')){
? ? ? ? event.server.tell('檢測(cè)到指令,開始測(cè)試')
? ? ? ? doRing(event.server)
? ? }
})