這玩意兒啾竟怎么刷的?刷線機(jī)原理探討 - 含手動(dòng)刷線機(jī)和【百萬(wàn)】無(wú)人刷線機(jī)
【請(qǐng)使用電腦查看 - 手機(jī)會(huì)出現(xiàn)排版錯(cuò)誤】
這篇專欄是對(duì)刷線機(jī)的解釋,對(duì)于知其然也想知其所以然的小伙伴,或許有所幫助。
觀前提示:本特性適用于vanilla,對(duì)于修改過(guò)的paper/spigot服務(wù)端不保證適用性。
另外:1.19.2的paper服務(wù)器里可以直接使用1728k/h(安裝前問(wèn)問(wèn)腐竹,小心被ban)
注意:剪刀剪絆線要輕,很容易一穿二,跟金鎬子挖地獄巖一樣都是秒破 很容易多挖

背景與手動(dòng)刷線機(jī)
要想解釋刷線機(jī)的原理,首先要知道它是如何工作的。
1. 常亮絆線
故事要從2021年1月講起,當(dāng)時(shí)在做依賴絆線的虛空交易所的時(shí)候(做村民出坑判定),偶然發(fā)現(xiàn)玩家在較短的時(shí)間內(nèi) [1] 朝特定方向 [2] 連續(xù)破壞兩個(gè)絆線,只會(huì)掉落1個(gè)掉落物,另1個(gè)本該生成掉落物的絆線變成了1格能一直保持激活的絆線,這種線即使實(shí)體踩上去也不會(huì)熄滅,除非你打掉它,否則會(huì)一直亮著。在xekr紅石顯示資源包中,這種“powered=true”的絆線,會(huì)呈現(xiàn)一種亮紅色,為了方便描述這種特殊狀態(tài)的絆線,本著通(直)俗(白)易(粗)懂(暴)的原則,在之后的探索中,神經(jīng)元和我稱之為:常亮絆線。常亮絆線吞掉了原本該掉落的掉落物,并在原地生成了其本身,但因沒(méi)想到該特性的實(shí)際用途,暫且擱置。
[1] 只要時(shí)間間隔小于10gt,該操作就可以復(fù)現(xiàn)出來(lái)。
[2] 經(jīng)過(guò)多次實(shí)驗(yàn)發(fā)現(xiàn),絆線與絆線鉤為東西朝向時(shí),玩家要站在東側(cè),先破壞東側(cè)絆線再破壞西側(cè)絆線;絆線與絆線鉤為南北朝向時(shí),玩家要站在北側(cè),先破壞北側(cè)絆線再破壞南側(cè)絆線。

2. 萬(wàn)惡之源
時(shí)隔一年,2022年1月,在reddit的一篇報(bào)道中提到使用流水破壞絆線可以實(shí)現(xiàn)絆線復(fù)制,B站BV1US4y1T72E也對(duì)此有所報(bào)導(dǎo)。在嘗試復(fù)現(xiàn)、使用G4mespeed降低tps觀察流水的慢鏡頭時(shí)發(fā)現(xiàn),西側(cè)的線發(fā)生了復(fù)制。觀察到水流破壞絆線存在先后順序(中間絆線先破壞,西側(cè)絆線后破壞),這與玩家制作常亮絆線的破壞順序很類似。
由此我們聯(lián)想產(chǎn)生了假設(shè)1:流水破壞絆線也會(huì)產(chǎn)生常亮絆線,但剛產(chǎn)生的常亮絆線一定也被水沖掉了。

?

3.嘗試觀測(cè)到流水制造的常亮絆線
即使使用carpet指令 /tick freeze 和 /tick step,也無(wú)法觀測(cè)到上圖所示情況的任何常亮絆線。但我們認(rèn)為可能和 tick freeze 的時(shí)機(jī)不對(duì)有關(guān),總結(jié)玩家和單桶流水破壞絆線的異同,發(fā)現(xiàn)單筒流水的破壞間隔 和玩家打斷絆線的時(shí)間間隔有所不同,實(shí)驗(yàn)證實(shí),如果讓玩家放置間隔不同于流水計(jì)劃刻5gt的流水,便能正常觀察到常亮絆線。
流水破壞絆線不同于玩家破壞絆線,
玩家破壞絆線,掉落物沒(méi)正常生成,只是多了一根常亮絆線,絆線守恒;
流水破壞絆線,掉落物會(huì)正常生成,而且后續(xù)的流動(dòng)還會(huì)把這根常亮絆線沖掉,絆線自加1。
當(dāng)時(shí)的我們敏銳的意識(shí)到可以將這個(gè)特性利用起來(lái),實(shí)現(xiàn)自動(dòng)化,源源不斷地產(chǎn)出絆線的AFK機(jī)器就此誕生了。
這就是我們?cè)O(shè)計(jì)的手動(dòng)放線刷線機(jī)的核心特性。

4.總結(jié)和猜測(cè)
大量實(shí)踐后,我們嘗試總結(jié)這種特性:
絆線與絆線鉤朝向?yàn)闁|西/南北,以第1格絆線被破壞為0時(shí)計(jì),10gt內(nèi)?[3]?由流水破壞這格空缺西側(cè)/南側(cè)的絆線,string++
10gt后,無(wú)論是流水還是玩家再行破壞絆線都不會(huì)產(chǎn)生上述狀態(tài)。我們稱這?10gt?為?絆線?-?絆線鉤?結(jié)構(gòu)的不穩(wěn)定狀態(tài)。
[3] 10gt 是絆線鉤發(fā)出紅石信號(hào)的長(zhǎng)度,也是絆線鉤添加計(jì)劃刻的延遲長(zhǎng)度
直觀的理解:因?yàn)閙ojang當(dāng)初設(shè)計(jì)叢林神廟的時(shí)候是打算用絆線+絆線鉤坑玩家的,玩家必須用mojang指定的道具:剪刀,剪掉絆線,才不會(huì)觸發(fā)絆線鉤發(fā)出紅石信號(hào),才能免于發(fā)射器的萬(wàn)箭齊發(fā)。除了剪刀以外,無(wú)論是玩家直接破壞絆線,還是玩家用流水沖掉絆線,都會(huì)觸發(fā)絆線鉤的10gt紅石信號(hào),都會(huì)挨幾箭。
mojang可能認(rèn)為,玩家/流體拆掉1格絆線應(yīng)該和玩家踩上絆線,都一樣,絆線鉤都該激活。為了將這倆情況加以區(qū)別,mojang可能讓絆線鉤10gt后再觀察一下這條線路中到底是斷了個(gè)口,還是被玩家踩線了。
如果是斷了個(gè)口子,那就是破壞行為,絆線鉤就不發(fā)出信號(hào),10gt的紅石信號(hào)就完事兒了;如果有實(shí)體在上面踩著,那就繼續(xù)亮。如果我們?cè)诮O線鉤打算10gt后才反應(yīng)的這段時(shí)間里,趁絆線鉤不注意,干點(diǎn)兒別的勾當(dāng)(比如讓流水/玩家再破壞一格絆線),那可能會(huì)有意想不到的收獲(常亮絆線get√)
于是手動(dòng)防線的刷線機(jī)就這么誕生了。
?更進(jìn)一步的探索
2022年1月以來(lái),手動(dòng)刷線機(jī)雖然經(jīng)過(guò)改進(jìn),效率由6k/h,上升至14.4k/h,再到玩家手長(zhǎng)極限放置的86.4k/h,效率達(dá)到了瓶頸,但我們沒(méi)有停下對(duì)機(jī)制的探索。對(duì)于常亮絆線的出現(xiàn),我們還處于一種“知其然而不知其所以然”的朦朧狀態(tài),想搞清楚“mojang到底為什么會(huì)放置常亮絆線”的好奇心的驅(qū)使下,向 Youmiel、Fallen_breath 學(xué)習(xí)了反混淆源碼的相關(guān)知識(shí),獲取了 TripWireBlock.java 和 TripWireHookBlock.java 文件,并嘗試在這坨東西里找到答案。
注:本文參考代碼使用1.18官方mapping進(jìn)行反混淆
不過(guò)在介紹我們找到的判定條件之前,請(qǐng)補(bǔ)充以下知識(shí)方便閱讀理解:
1. 補(bǔ)充知識(shí)
? ??絆線鉤和線在復(fù)制中牽扯了三個(gè)重要的方塊狀態(tài):
? ? ? ? 一個(gè)是絆線鉤的attached
? ? ? ? ? ? attached=true,絆線鉤處于連接狀態(tài)
? ? ? ? ? ? attached=false,絆線鉤處于非連接態(tài)
? ? ? ? 另一個(gè)是絆線的disarmed
? ? ? ? ? ? disarmed=true,絆線被剪刀剪過(guò)
? ? ? ? ? ? disarmed=false,絆線是正常的
? ? ? ? 第三個(gè)是絆線的attached
? ? ? ? ? ? attached=true,絆線處于連接狀態(tài),扁扁的,距離底部方塊有懸空的1像素高的空檔
? ? ? ? ? ? attached=false,絆線處于非連接態(tài),會(huì)膨脹起來(lái),碰撞箱和臺(tái)階一樣
? ? 玩家破壞絆線、流水破壞絆線,都會(huì)激活絆線鉤,被剪刀剪過(guò)的絆線(剪刀左鍵絆線)是不會(huì)觸發(fā)絆線的。
??? | 畢竟麻將頭一開始設(shè)計(jì)這玩意兒就是打算在叢林神廟設(shè)置機(jī)關(guān)坑玩家的,不用剪刀直接拆線會(huì)挨箭矢。
? ? 玩家如果不使用連點(diǎn)器,右鍵放置物品是4gt一次
2. 常亮絆線的制備條件
? ? 常亮絆線是絆線鉤自檢時(shí)calculateState被制造出來(lái)的副產(chǎn)物,查閱代碼輔以實(shí)踐我們總結(jié)出了常亮絆線的出現(xiàn)條件:
? ? ? ? 定義事件A:一對(duì)絆線鉤之間有更新源以外的非絆線方塊(比如空氣),1是有,0是無(wú)
? ? ? ? 定義事件B:更新源(一般是絆線)的disarmed值,1是被剪了,0是沒(méi)被剪
? ? ??? 定義事件H:絆線鉤的attached值,1是連接狀態(tài),0是非連接態(tài)
? ? ? ? 那么,只有H==(A∨B)時(shí), 才會(huì)放置出“常亮絆線”,也是鉤子更新絆線連接狀態(tài)的條件
??? ? ?| 這里H == A || B代碼里的實(shí)現(xiàn)其實(shí)是H != !A && !B ,是絆線鉤calculateState中比較靠下的一段
我們理解的mojang設(shè)計(jì)目的是:
????線被破壞時(shí),游戲設(shè)計(jì)上來(lái)說(shuō)要求激活絆線鉤激活叢林神廟里的發(fā)射器偷襲玩家;這種表現(xiàn)和線被踩踏時(shí)的反應(yīng)是一致的,區(qū)別在于線被破壞后的絆線鉤只輸出這一次紅石信號(hào)(長(zhǎng)度10gt),而被踩踏的絆線應(yīng)該讓絆線鉤持續(xù)輸出紅石信號(hào)(直到實(shí)體消失為止)。
mojang的程序員當(dāng)時(shí)可能是這么想的:
????那么就讓破壞的絆線,也向絆線鉤報(bào)告自己處于“powered=true”的狀態(tài)好了。直接復(fù)用實(shí)體站在絆線上“powered=true”這段代碼,懶得再寫了。但為了區(qū)分“到底是絆線被敲了還是被壓著了”,那就再加條件判定下:
? ? 于是這位神仙寫道:鉤子在收到絆線的report之后,馬不停蹄地開始判斷自己?calculateState:
? ? ① 絆線鉤這個(gè)檢測(cè)方向是從南往北,或者從西往東開始的
? ? ② 絆線鉤會(huì)挨個(gè)挨個(gè)捋過(guò)去兩個(gè)鉤子之間的所有方塊,挨個(gè)判斷它們,讓我康康你們正不正常,同時(shí)更新絆線狀態(tài)。
問(wèn)題就出在這兒,絆線鉤更新絆線狀態(tài)不是改狀態(tài),而是直接?setblock.TripWire 直接放置一個(gè)新的方塊替換掉原本的方塊,而且由絆線鉤直接賦予給線的方塊狀態(tài)不只有?TripWire.attached = false,也就是線是否膨脹(false的線和下板磚一樣的碰撞箱,true的線就是那種扁扁的),絆線其余的狀態(tài)都來(lái)自它們自身原本的狀態(tài)。
因?yàn)?/strong> 被破壞的絆線,向絆線鉤報(bào)告的自己處于“powered=true”,絆線鉤就信了,所以哪怕這格絆線剛剛報(bào)告完,線就無(wú)了,絆線鉤也會(huì)認(rèn)為它是“powered=true”,所以?setblock.TripWire時(shí),在這塊之后被破壞的絆線所在格子里,出現(xiàn)了一個(gè)狀態(tài)為?TripWire.attached = false,?powered=true?的常亮絆線。
注意:?calculateState不是邊檢查邊更新絆線,而是先檢查一遍,
????????????確定線路狀態(tài)之后更新對(duì)面絆線鉤,再更新自己,最后才設(shè)置絆線的狀態(tài)
這位神仙當(dāng)時(shí)具體考慮了什么東西呢?
? ? 給鉤子報(bào)告情況的絆線(更新源)是不是被剪刀剪過(guò)???
? ??? ??? ??? ??如果是一剪子下去了,其余的地方還都是線,那就是玩家正常用剪刀剪線,絆線鉤就不該發(fā)出信號(hào)
? ??? ??? ??? ? ????????????????絆線鉤不發(fā)出信號(hào)的話,TripWireHook.attached 應(yīng)該是 false,
????????????????????????????????如果?TripWireHook.attached?原本就是 false 那不用動(dòng),總之先Lazy,現(xiàn)在不急,10gt后再說(shuō)
????????????????????????????????如果?TripWireHook.attached?原本是 true,
? ??? ??? ??? ??? ??? ??? ??? ? ????????那就把?TripWireHook.attached?設(shè)定為?false(目的是先讓絆線鉤歇菜不發(fā)出信號(hào))
????????????????????????????????????????挨個(gè)捋,從南到北從西向東把絆線狀態(tài)重新設(shè)置一遍?可能程序員覺(jué)得鉤子false 線該就是松的
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 然后把捋到的絆線 TripWire.attached = false 其余狀態(tài)不變
? ?給鉤子報(bào)告情況的絆線(更新源)沒(méi)被剪刀咔嚓過(guò),那它是不是被破壞了吖?
? ??? ??? ??? ? 如果是被破壞,那其余地方還都是線嗎?
????????????????????????如果都是線那就激活絆線鉤(正常被打掉),而且也懶得再更新一遍絆線狀態(tài)了,10gt后再說(shuō)
? ? ????????????????????如果除報(bào)告情況的絆線(更新源)外還有其他不是線的方塊?
????????????????????????????????????????這說(shuō)明絆線應(yīng)該沒(méi)和鉤子連上,整條線路中存在斷路,線該是松弛膨脹
????????????????????????????????????? ? 那就得挨個(gè)捋把絆線狀態(tài)重新設(shè)置一遍
????????????????????????????????????????把捋到的絆線 TripWire.attached = false 其余狀態(tài)不變
邏輯蠻清晰的?的個(gè)鬼吖!這有機(jī)可乘w~
?不信我們逐步分析下手動(dòng)刷線中,比較簡(jiǎn)單的初代機(jī);
如果你對(duì)微時(shí)序不熟悉,可以看看這個(gè)視頻臨時(shí)補(bǔ)課:

3.?手動(dòng)刷線初代機(jī)案例分析
?? gt 0?- NU?
? ? ? ? 玩家放下第1個(gè)絆線,這時(shí)水被絆線替換掉,水添加了計(jì)劃刻準(zhǔn)備5gt后沖掉這個(gè)絆線(現(xiàn)在一切正常)

? ? gt 4 - NU?
? ? ? ? 玩家放下第2個(gè)絆線,水又被替換掉,然后5gt后準(zhǔn)備沖掉腳下這個(gè)絆線,這時(shí)絆線已經(jīng)連接,狀態(tài)很正常。

? ? gt 5 - NTE?
? ? ? ? 玩家放下的第一格絆線被水沖掉了,形成了1個(gè)掉落物
? ? ? ? 這個(gè)時(shí)候,被破壞的絆線會(huì)將自己被破壞這件事情,告訴絆線鉤(一種特殊的更新機(jī)制)
? ? ? ? 而這格被破壞的絆線告訴絆線鉤的是,自己 powered=on?
? ? ? ?| 這和絆線被實(shí)體壓住激活時(shí),絆線告訴絆線鉤的一樣都是powered on
? ? ? ? 絆線鉤開始自檢
? ? ? ?| 這對(duì)絆線鉤中間的方塊,會(huì)在這個(gè)時(shí)候,從西往東從南到北,被絆線鉤挨個(gè)捋一遍,并更新它們的狀態(tài)
? ? ? ? ? ? H:tripwirehook.attached = true? 絆線鉤是連接態(tài)的
? ? ? ? ??? A:false?這對(duì)絆線鉤之間出了這個(gè)更新源(被破壞的絆線)以外,所有方塊都是線
? ? ? ? ? ? B:tripwire.disarmed = false 這個(gè)更新源(被破壞的絆線)沒(méi)被剪刀剪過(guò)
? ? ??? ? ? (A∨B) = false 沒(méi)被剪刀剪過(guò),整個(gè)線路還都是閉合的(畢竟其余的都是線)
? ? ? ? ? ? (A∨B) ≠ H?所以可以Lazy一下,不用著急忙慌的挨個(gè)更新絆線,10gt后再說(shuō)
? ? ? ? ? ? 所以不會(huì)放出常亮絆線
? ? ? ? ? ??| 絆線鉤還是連接態(tài)不變,只是發(fā)出了紅石信號(hào)
? ? ? ? 這時(shí)開始,絆線鉤進(jìn)入了一個(gè)為期為10gt的不穩(wěn)定態(tài)

? ? gt 8 - NU?
? ? ? ? 玩家視線對(duì)著底下平滑石頭的邊緣像素塊,現(xiàn)在準(zhǔn)星在腳下這格絆線上,上面有告示牌,玩家是放不出任何方塊。

? ? gt 9 - NTE?
? ? ? 水流破壞掉玩家腳底的線,形成另1個(gè)掉落物,這時(shí)投入的絆線(2個(gè))已回收,被破壞的絆線將打報(bào)告給絆線鉤
? ? ? ? 告訴絆線鉤自己 powered=on 了
? ? ? ? 絆線鉤開始自檢
? ? ? ? ? ? H:tripwirehook.attached = true? 絆線鉤是連接態(tài)的
? ? ? ? ? ? A:true?這對(duì)絆線鉤之間出了這個(gè)更新源(被破壞的絆線)以外,有一格剛剛沖來(lái)的水
? ? ? ? ? ? B:tripwire.disarmed = false 這個(gè)更新源(被破壞的絆線)沒(méi)被剪刀剪過(guò)
? ? ? ? ? ? (A∨B) = true?沒(méi)被剪刀剪過(guò),線路是開路(有一格水)
? ? ? ? ?(A∨B) = H?那絆線鉤怎么回事啊,不該是連接態(tài),也不該有紅石信號(hào)發(fā)出!應(yīng)該馬上松弛下來(lái)!所以
? ? ? ? ? ? 絆線鉤會(huì)從西往東捋,挨個(gè)檢查絆線鉤之間的所有方塊,并從西往東逐個(gè)setblock所有絆線(更新狀態(tài)),到這個(gè)剛剛被破壞了的絆線,setblock了這個(gè)被破壞的絆線上報(bào)的powered=true,以及自檢中判斷出的tripwire.attached=false,所以放出了常亮的松弛膨脹的絆線
? ? ? ? 絆線鉤自檢完成,更新自己的狀態(tài),停掉紅石信號(hào)輸出

? ? gt 10 - NTE
? ? ? ? 流水在5gt前添加的計(jì)劃刻,這個(gè)時(shí)候沖掉了常亮絆線,線成功的多了1,有了盈余,刷線成功!

? ? gt 12 - NU
? ? ? ? 因?yàn)榻O線都被清理了,沒(méi)有阻擋準(zhǔn)星的東西了,所以玩家放下了絆線,刷線的下一周期開始。
????????因此,初代機(jī)的刷線周期是12gt,理論效率為20/12*3600=6000/h
進(jìn)一步思考
? ? 剛剛我們提到了,放出常亮絆線的幾個(gè)條件:
? ? ? ??事件 A:一對(duì)絆線鉤之間有更新源以外的非絆線方塊(比如空氣),1是有,0是無(wú)
? ? ? ? 事件 B:更新源(一般是絆線)的disarmed值,1是被剪了,0是沒(méi)被剪
? ? ? ??事件 H:絆線鉤的attached值,1是連接狀態(tài),0是非連接態(tài)
? ? ? ? 那么,只有?H==(A∨B)?時(shí), 才會(huì)放置出“常亮絆線”
? ? 我們的初代機(jī)利用了事件 A,那么線被剪刀剪過(guò)的?事件 B?能不能也運(yùn)用起來(lái)?
????答案是可行的。拜此所賜我們做出了自動(dòng)刷線機(jī)的雛形。

自動(dòng)刷線機(jī)的雛形
? ? 這個(gè)自動(dòng)架構(gòu)中,活版門對(duì)著的線,被剪刀剪過(guò),變成了disarmed = true,拿剪刀左鍵線的時(shí)候輕點(diǎn)兒,別把剪出來(lái)的線給敲掉了(就像金鎬子一不小心點(diǎn)掉幾塊地獄巖一樣,畢竟都是瞬間破壞
? ? 這里有一個(gè)比較巧妙的點(diǎn),盔甲架站在地毯上,在絆線處于連接態(tài)?attached=true,連接態(tài)的絆線底部的1像素高正好讓盔甲架碰不到絆線,也無(wú)法激活絆線。但如果絆線處于非連接態(tài)?attached=false,那么盔甲架正好可以碰到膨脹的絆線。我們來(lái)看微時(shí)序:



? ? gt 0 - NU
? ? ? ? 玩家打開活版門,水流準(zhǔn)備5gt后順勢(shì)而下(添加計(jì)劃刻)

? ? gt 5 - NTE
? ? ? ? 流水破壞了這個(gè)被剪了一剪子的絆線,絆線告訴絆線鉤,自己?powered = on,disarmed = true,
????? ? ? ? 絆線鉤開始自檢
? ? ? ? ? ? H:tripwirehook.attached = true? 絆線鉤是連接態(tài)的
? ? ? ? ??? A:false?這對(duì)絆線鉤之間出了這個(gè)更新源(被破壞的絆線)以外都是線
? ? ? ??? ? B:tripwire.disarmed = true 這個(gè)更新源(被破壞的絆線)被剪刀剪過(guò)
? ? ? ? ? ? (A∨B) = true?那不對(duì)勁啊,你看,被剪過(guò),絆線線路是閉合的,你絆線鉤憑什么是連接態(tài)啊?
? ? ? ? ? ? (A∨B) = H?所以絆線鉤應(yīng)該馬上松弛下來(lái),線也應(yīng)該馬上松弛下來(lái),不該有信號(hào)輸出w!
? ? ? ? 這個(gè)時(shí)候絆線鉤setblock了這個(gè)被破壞的絆線上報(bào)的powered=true和disarmed=true,以及自檢中判斷出的tripwire.attached=false,放出了仍然是被剪斷的常亮絆線。
????????因?yàn)槭潜患魯嗟?,所以這一瞬間絆線鉤認(rèn)為自己應(yīng)該是 H:tripwirehook.attached = false?
????????絆線鉤和絆線都呈現(xiàn)非連接態(tài)(能看到絆線鉤瞬間的愣神,線沒(méi)跟鉤子連在一起)

????????????這個(gè)時(shí)候盔甲架剛巧能碰到非連接態(tài)的膨脹的絆線,盔甲架頭頂這個(gè)絆線成了新的激活源,
????????????????這引起絆線鉤的另一輪自檢,絆線鉤發(fā)現(xiàn)自己應(yīng)該變成連接態(tài),還順帶添加了個(gè)計(jì)劃刻,10gt后再看看情況
????????????????于是絆線鉤狀態(tài)改變?H:tripwirehook.attached = true?


? ? gt 10 - NTE 下一個(gè)周期
? ? ? ? 流水繼續(xù)沖掉這個(gè)刷出來(lái)的被剪過(guò)的常亮絆線
? ? ? ? 絆線鉤開始自檢
? ? ? ? ? ? H:tripwirehook.attached = true? 絆線鉤是連接態(tài)的
? ? ? ??? ? A:false 這對(duì)絆線鉤之間出了這個(gè)更新源(被破壞的絆線)以外都是線
? ? ? ? ? ??B:tripwire.disarmed = true 這個(gè)更新源(被破壞的絆線)被剪刀剪過(guò)
? ? ? ? ? ? (A∨B) = true?那絆線鉤大兄弟你不對(duì)勁啊,你看,被剪過(guò),絆線線路是閉合的,你絆線鉤憑什么是連接態(tài)?。?/span>
? ? ? ? ?(A∨B) = H?所以絆線鉤應(yīng)該馬上松弛下來(lái),線也應(yīng)該馬上松弛下來(lái),
? ? ? ? 這個(gè)時(shí)候絆線鉤setblock出了被剪斷的常亮絆線
????????因?yàn)槭潜患魯嗟?,所以這一瞬間絆線鉤認(rèn)為自己應(yīng)該是 H:tripwirehook.attached = false?
????????絆線鉤和絆線都呈現(xiàn)非連接態(tài)
????? ??但絆線鉤因?yàn)?gt前已經(jīng)添加計(jì)劃刻了所以沒(méi)有再添加成功計(jì)劃刻
? ? ? ? 盔甲架仍然碰到非連接態(tài)的膨脹的絆線,但是絆線由于還是 powered=on(5gt前已經(jīng)激活了),絆線自己的10gt的冷卻還沒(méi)結(jié)束,所以絆線沒(méi)有再添加成功計(jì)劃刻,絆線鉤還是處于 H:tripwirehook.attached = false

? ? gt 15 - NTE?
? ? ? ? 頭一開始先執(zhí)行了絆線鉤在 gt 5 時(shí)添加的計(jì)劃刻,絆線鉤同時(shí)自檢,setblock了所有的絆線讓他們 tripwire.attached = true,同時(shí)絆線鉤恢復(fù)自身狀態(tài) H:tripwirehook.attached = true
? ? ? ? 盔甲架頭頂?shù)哪歉窠O線在 gt 5 時(shí)添加的計(jì)劃刻,這個(gè)時(shí)候也開始執(zhí)行,先把自己tripwire.attached = false,再給絆線鉤添加個(gè)計(jì)劃刻(10gt后的)
? ? ? ? 然后才是水沖掉常亮絆線,重復(fù) gt 5 時(shí)的樣子

? ? 這東西的周期是5gt,輕易達(dá)到了14400/h,效率破萬(wàn)。
? ? 有個(gè)缺點(diǎn),刷線機(jī)正在刷著的時(shí)候卸載區(qū)塊,絆線鉤、絆線、水的計(jì)劃刻可能會(huì)亂。
丐版 自動(dòng)刷線機(jī)
? ? 經(jīng)過(guò)一番探索我們發(fā)現(xiàn)可以去掉盔甲架,進(jìn)一步簡(jiǎn)化機(jī)器本身。讓我們來(lái)分析一下它是怎么運(yùn)作的:
????注意:展示框下的絆線被剪刀剪過(guò)
? ? gt 0 -NU
? ? ? ? 玩家拉回拉桿,活版門收起,流水打算沖掉面前的線,首先被沖出去的水應(yīng)該是平滑石頭下面的水源(拉桿附著的先被收起),而后才是拉桿下面的活版門(拉桿毗鄰的后更新)

? ? gt 5 - NTE
? ? ? ? 流水沖掉被剪了一刀的絆線,這個(gè)絆線報(bào)告給絆線鉤
? ? ? ? 絆線鉤開始自檢
? ? ? ? ? ? H:tripwirehook.attached = true? 絆線鉤是連接態(tài)的
? ? ? ? ? ? A:false?這對(duì)絆線鉤之間出了這個(gè)更新源(被破壞的絆線)以外都是線
? ? ? ? ? ? B:tripwire.disarmed = true 這個(gè)更新源(被破壞的絆線)被剪刀剪過(guò)
? ? ? ? ? ??(A∨B) = true?那不對(duì)勁啊,你看,被剪過(guò),絆線線路是閉合的,你絆線鉤憑什么是連接態(tài)?。?br>? ? ? ? ? ? (A∨B) = H?所以絆線鉤應(yīng)該馬上松弛下來(lái),線也應(yīng)該馬上松弛下來(lái),不該有信號(hào)輸出w!
? ? ? ? ? ? 這時(shí)絆線鉤setblock了這個(gè)被破壞的絆線上報(bào)的powered=true和disarmed=true,
????????????以及自檢中判斷出的tripwire.attached=false,放出了仍然是被剪斷的常亮絆線
????????????因?yàn)槭潜患魯嗟木€,所以這一瞬間絆線鉤認(rèn)為自己應(yīng)該是 H:tripwirehook.attached = false
????????????絆線鉤和絆線都呈現(xiàn)非連接態(tài)
? ? ? ? 流水沖掉另一邊的沒(méi)有激活的絆線,這個(gè)絆線報(bào)告給絆線鉤
? ? ? ? 絆線鉤再次自檢
? ? ? ? ? ? H:tripwirehook.attached = false? 絆線鉤是非連接態(tài)的
? ? ? ? ? ? A:false?這對(duì)絆線鉤之間出了這個(gè)更新源(被破壞的絆線)以外都是線(剛剛的空被常亮絆線填上了)
? ? ? ??? ? B:tripwire.disarmed = false 這個(gè)更新源(被破壞的絆線)沒(méi)被剪刀剪過(guò)
? ??? ? ? ? (A∨B) = false?沒(méi)被剪刀剪過(guò),線路是閉合的
? ? ? ? ?(A∨B) = H?那絆線鉤怎么回事啊,明明是閉合的線路你卻不是連接態(tài),趕緊干活!
? ? ? ? ? ? 這個(gè)時(shí)候絆線鉤setblock了這個(gè)被破壞的絆線上報(bào)的powered=true,放出了正常的常亮絆線,
????????????這時(shí)絆線鉤已經(jīng)更新了自己的狀態(tài),認(rèn)為又沒(méi)被剪過(guò)所以自己應(yīng)該是 H:tripwirehook.attached = true?
????????????絆線鉤和絆線都呈現(xiàn)連接態(tài)
? ? ? ? 絆線喜+2

? ? gt 10 - NTE?
? ? ? ? 又是一次循環(huán),又是一個(gè)新的周期……
? ? ? ? ? 這個(gè)全自動(dòng)刷線機(jī)小巧可愛(ài),周期5gt,每個(gè)周期產(chǎn)出兩個(gè)絆線。所以效率比雛形翻了一番,達(dá)到了驚人的28800/h,接近3萬(wàn)的產(chǎn)量需要4個(gè)漏斗收集。而且你想懟多少個(gè)單元都可以,效率飆升到百萬(wàn)的陣列也不是不可能。
? ? ????? 而且卸載也壞不了。
一些發(fā)散思維
? ? 刷出的“常亮絆線”不見得都是“常亮的”
? ? ? ??如果絆線里有實(shí)體,絆線有計(jì)劃刻,可以取消激活態(tài)
? ? 關(guān)于為啥這個(gè)自動(dòng)刷線機(jī)把拉桿和被剪絆線反向之后不能刷線的解釋:
? ? ? ? 這樣子,東面的水(平滑石頭下面的)會(huì)先流動(dòng),被剪的絆線會(huì)率先被破壞,絆線鉤從西往東捋線,挨個(gè)對(duì)線setblock,正好到西面水面前絆線的時(shí)候更新到了西面的水,給西面的水強(qiáng)行加了一個(gè)計(jì)劃刻,東面的水要再加計(jì)劃刻得等到絆線鉤捋到它面前的時(shí)候(常亮絆線放出來(lái)的時(shí)候)。
? ? ? ? 在這1gt內(nèi)東面的水添加計(jì)劃刻慢了,導(dǎo)致5gt后(下個(gè)循環(huán))東面的水一定會(huì)晚于西面的水,所以時(shí)序壞掉了。

那這種刷線機(jī)可以擴(kuò)展嗎?畢竟一對(duì)鉤子之間可以最多放40根線呢?
? ? ? ? 當(dāng)然可以,? 你只要交叉著堆疊,并且保證流水都是先沖剪過(guò)的線:
? ? ? 【東 -[?正常線?剪過(guò)的線?][?正常線?剪過(guò)的線?]……[?正常線?剪過(guò)的線?]- 西】
? ? ? ? 效率就能成比例提升,比如這個(gè)576k/h的刷線機(jī)。
? ? ? ? 著刷線效率大概每小時(shí)333盒,刷沙機(jī)才108k/h(一般來(lái)說(shuō))
? ? ? ??那么再翻一番,直接破百萬(wàn)也是很合理的叭(576k*2=1152k/h)
????????一些連接:
????????桃桃嗚龍椛喵茶的動(dòng)態(tài)-嗶哩嗶哩 (bilibili.com)
????????Aircraft飛翼之心的動(dòng)態(tài)-嗶哩嗶哩 (bilibili.com)
????????https://t.bilibili.com/705205845988737029





破壞絆線還可以用什么?
? ? ? ? 源碼里看,玩家移除絆線 playerWillDestroy?是不能復(fù)制的,但是水和爆炸可以。? ? ? ? 活塞呢?活塞會(huì)吞掉常亮絆線,所以我們把活塞直接排除了。
? ? ? ??【特定版本】22w13o(22w13oneBlockAtATime),激活發(fā)射器,它就會(huì)把面前的絆線射出去,這玩意兒稍微快一些,是4gt一周期
