Carpet TIS Addition 介紹:規(guī)則——更新補丁 v1.33 ~ v1.47
專欄 CV16172536 的更新補丁
由于修改次數(shù)限制的原因,專欄并不適合長期更新,想看最新完整版的規(guī)則分析介紹的話,去我的博客就行:https://fallenbreath.me/2022/03/16/introduction-to-carpet-tis-addition/
圖片動態(tài)根本發(fā)不出去,只能拷一份文字版了。專欄文本編輯器的排版一言難盡,就這樣吧
創(chuàng)造模式用新增機制
fill指令模式增強 (fillCommandModeEnhance)
增加?
/fill
?指令中各種模式的功能:增加?softreplace
?模式: 盡可能地保留原方塊的方塊狀態(tài),可用于替換樓梯/半磚的材質(zhì)等
指令例子:
這個指令會將范圍內(nèi)的所有橡木樓梯替換成石磚樓梯,并保留樓梯的方塊狀態(tài)

技術(shù)上來講,該功能并不關(guān)心新舊方塊的種類是什么,它只管確保那些新舊方塊均擁有的方塊狀態(tài),在?/fill
?前后保持不變。 舉個例子,在偵測器 / 活塞 / 末地燭三者相互?softreplace
?時,它們的“朝向”(facing
)方塊狀態(tài)將會保持不變
同步服務(wù)端mspt指標數(shù)據(jù) (syncServerMsptMetricsData)
向客戶端同步服務(wù)端的 mspt 指標數(shù)據(jù),借此,玩家可使用 F3 + ALT 在調(diào)試界面中看到這一服務(wù)端的指標。需要在客戶端中安裝 Carpet TIS Addition 模組
單人游戲的 F3 調(diào)試界面中,右下角的那個顯示 mspt 的圖表可是個好東西。可惜在原版里,多人游戲中用不了這個功能
這條規(guī)則的功能即為讓調(diào)試界面的 mspt 顯示功能在多人游戲中也能用,也即讓服務(wù)端把它的 mspt 數(shù)據(jù)同步給客戶端,進而在客戶端顯示相關(guān)數(shù)據(jù)
由于需要進行服務(wù)端與客戶端之間的網(wǎng)絡(luò)通訊,本規(guī)則依賴規(guī)則?tiscmNetworkProtocol

TISCM網(wǎng)絡(luò)協(xié)議 (tiscmNetworkProtocol)
TISCM 網(wǎng)絡(luò)協(xié)議的開關(guān)
作為一個總開關(guān),這條規(guī)則可以一鍵讓所有用了 TISCM 網(wǎng)絡(luò)協(xié)議的規(guī)則失效,讓 MC 的網(wǎng)絡(luò)層面上回歸原版表現(xiàn)
當(dāng)然,這條規(guī)則默認值是?false
,因此你需要把它設(shè)置為?true
?來使得用了 TISCM 網(wǎng)絡(luò)協(xié)議的規(guī)則生效
可以使用指令?/carpet list TISCM_protocol
?來列出所有使用了 TISCM 網(wǎng)絡(luò)協(xié)議的規(guī)則
創(chuàng)造模式用游戲修改
創(chuàng)造玩家地獄放水 (creativeNetherWaterPlacement)
允許創(chuàng)造模式的玩家在地獄通過水桶放出水。技術(shù)上來講,本條規(guī)則對所有 ultrawarm 的維度都生效
都已經(jīng)是創(chuàng)造模式了,玩家當(dāng)然是想干什么就干什么,想劃水就放水

創(chuàng)造玩家無物品冷卻 (creativeNoItemCooldown)
取消創(chuàng)造模式玩家的任何物品使用冷卻,例如使用末影珍珠的 20gt 冷卻
都已經(jīng)是創(chuàng)造模式了,麻將為何還要用物品使用冷卻邏輯約束玩家

爆炸不影響實體 (explosionNoEntityInfluence)
爆炸不會影響任何實體。這里的影響包括傷害、加速等效果
雖然 carpet 的規(guī)則?explosionNoBlockDamage
?可以阻止爆炸對方塊的影響,但它并不阻止爆炸對實體的影響, 會導(dǎo)致亂飛的 TNT 依然可以把意料之外的實體炸沒。這不好,用這條規(guī)則給我關(guān)
禁用耕地被踩踏 (farmlandTrampledDisabled)
阻止耕地被生物踩成泥土
在設(shè)計一些如小黑瓜機這種,使用了生物 + 耕地的機器時,很容易會遇到生物踩爛了耕地的情況。 這挺煩人的,尤其是在做概念驗證的時候,畢竟這時我們更關(guān)心其他數(shù)據(jù),并不在意耕地是否足夠安全
拍扁三角形分布 (flattenTriangularDistribution)
本規(guī)則僅在 Minecraft >= 1.19 中存在
把 Minecraft 隨機數(shù)發(fā)生器的三角形分布改為均勻分布。借此,邊界情況就更有可能發(fā)生了
在 MC 1.19 版本之前,fabric carpet 提供了一個被命名為?extremeBehaviours
?的規(guī)則,它能使得一些依賴正態(tài)分布隨機數(shù)生成器的游戲機制更頻繁地產(chǎn)生極端情況。 這些機制包括:投擲器噴出物品的隨機速度、箭矢的基礎(chǔ)傷害、生物生成時的?FOLLOW_RANGE
?屬性隨機調(diào)整等
正態(tài)分布的隨機數(shù)生成器產(chǎn)生的結(jié)果是無邊界的,在極端情況下可能會產(chǎn)生偏差很大的隨機值。extremeBehaviours
?正是為了測試機器在這些極端情況的穩(wěn)定性而生。 不過隨著 MC 1.19 的到來,麻將把各種正態(tài)分布換成了有界的三角分布,fabric carpet 也因此將?extremeBehaviours
?規(guī)則刪除了
但是,就算是三角分布,它的邊界情況依然也是罕見的,設(shè)計機器時也依然存在著測試邊界情況的需求。 那么不如整一個?flattenTriangularDistribution
,把三角分布替換成值域相同的均勻分布,讓邊界情況更容易發(fā)生
在本規(guī)則開啟前后,相關(guān)隨機數(shù)生成器的概率密度函數(shù)變化如下所示。左側(cè)為原來的三角分布,右側(cè)為修改后的均勻分布

重新引入瞬時方塊更新邏輯 (instantBlockUpdaterReintroduced)
本規(guī)則僅在 Minecraft >= 1.19 中存在
重新引入 1.19 以前的瞬時方塊更新邏輯。本規(guī)則讓基于棧溢出的更新抑制在 1.19+ 中再次可行
它還可以讓微時序記錄器的記錄結(jié)果更加清晰有邏輯,如 1.19 以前的版本一樣的清晰
MC 1.19 引入了人工棧數(shù)據(jù)結(jié)構(gòu)來處理 MC 方塊更新,這導(dǎo)致 1.19 之后,方塊并不會瞬時發(fā)出更新了。這帶來了兩個影響:
足夠長的方塊更新鏈不再能引發(fā) JVM 棧溢出異常,這導(dǎo)致基于方塊更新棧溢出的更新抑制不再可行
方塊更新之間的代碼調(diào)用關(guān)系從直接調(diào)用變成了間接調(diào)用,變得更加晦澀。這不僅僅使得代碼閱讀的難度增加,還會使得微時序記錄器的輸出變得抽象起來,增加借助微時序記錄器分析時序的難度
好在麻將并沒有完全移除瞬時更新的邏輯,因此可以整條規(guī)則把 1.19 以前的瞬時方塊更新帶回來
參考 Void514 的觀點,在這里,一個操作是“瞬時”的,指:在操作的結(jié)果發(fā)生時,觸發(fā)操作的原因位于當(dāng)前 JVM 的函數(shù)調(diào)用棧上
礦車搭載乘客最小速度 (minecartTakePassengerMinVelocity)
決定礦車將其附近實體作為乘客搭載上車所需的最低水平方向速度(m/gt)。將其設(shè)為 0 以讓礦車忽略速度,像船一樣總能將附件實體載上車。將其設(shè)為 NaN 以讓礦車永遠不能把實體載上車
一個礦車想要把附近的生物吸上車,需要滿足其在水平方向上的速度大于 0.1m/gt(2m/s)這個條件,這意味著靜止 / 慢慢移動的礦車無法把生物吸上車
在設(shè)計機器時,這個礦車吸生物上車的條件有時候就挺煩人的。為了把生物裝進礦車里,我們還得專門搞一段鐵軌來給礦車加速。 如果礦車能像船一樣,蹭著生物就能吸上車,那就最好了。多說無益,整條規(guī)則改之
由于本規(guī)則修改的是“礦車搭載乘客的最小速度”,因此你可以把它設(shè)置成不同的取值,來滿足不同場景下的需求:
把值設(shè)成?
0
:礦車像船一樣,蹭著生物就能把生物吸上去把值設(shè)成?
NaN
:礦車無論怎樣都不會把生物吸上去

橡樹長成雞腿樹百分率 (oakBalloonPercent)
橡樹樹苗長成雞腿樹(fancy_oak)的概率,使用百分率作為值。如,0 代表沒有雞腿樹,50 代表有 50% 的概率長成雞腿樹,100 代表總長成雞腿樹
將其設(shè)為 -1 以禁用本規(guī)則并使用原版邏輯(10% 概率長成雞腿樹)
若想高效地測試樹場對雞腿橡樹的兼容性,與其對著原版的 10% 雞腿樹概率慢慢嘗試,不如開條規(guī)則來修改原版的概率。必出雞腿樹 / 必不出雞腿樹,任你選擇
禁用偵測器檢測功能 (observerNoDetection)
不準偵測器在受狀態(tài)更新時添加計劃刻事件。可以認為這條規(guī)則禁用了觀察者的檢測功能
在使用?/fill
、/clone
?指令、結(jié)構(gòu)方塊、worldedit 等方式來修改世界時,有時候會莫名其妙地把偵測器給激活了。 與其想辦法關(guān)掉方塊更新,排除各種誤觸的地方,不如直接禁止偵測器檢測方塊變化,從源頭上解決問題
值得注意的是,不要在機器開著的時候啟用這條規(guī)則,畢竟這條規(guī)則的作用范圍是整個服務(wù)器

堅韌的凋零玫瑰 (toughWitherRose)
由死而生,凋零玫瑰非常堅韌,能在任意表面上種植。該規(guī)則移除了凋零玫瑰所有的放置約束,這意味著你可以將零玫瑰種植在任何地方。
在你想用更新抑制的凋零玫瑰做凋靈骷髏塔時,這條規(guī)則可以幫你一把
背景知識:凋靈玫瑰在受到狀態(tài)更新時會檢查其是否處于合法的狀態(tài),如果不合法則立即掉落
如規(guī)則介紹所述,在設(shè)計把凋靈玫瑰種在地獄磚上的凋靈骷髏塔時,很容易因誤觸而整掉了一整片的凋靈玫瑰,非常煩人
本條規(guī)則的作用就是去除凋靈玫瑰的一切放置限制,讓凋靈玫瑰可以種在任何方塊上。在什么地獄磚,鐵軌,巖漿,甚至空氣之上,都能種凋靈玫瑰

亡靈生物別在陽光下著火 (undeadDontBurnInSunlight)
阻止亡靈生物在陽光下著火。不過他們的頭盔依然會在陽光下?lián)p失耐久
有時在主世界測試一些與亡靈生物相關(guān)的機器時,還得記得給做個遮陽天花板,防止亡靈生物被曬死。 這挺煩人的,不如整個規(guī)則給亡靈涂足防曬霜。畢竟絕大部分情況下,給最終實裝版本加個天花板防曬是很容易的操作
虛空傷害數(shù)值 (voidDamageAmount)
修改虛空傷害的數(shù)值
讓掉虛空的生物死快些,原版虛空的 4 點傷害有點太低了,直接加到 1000 點
虛空傷害忽略玩家 (voidDamageIgnorePlayer)
阻止玩家受到任何虛空傷害。對玩家完全無害的虛空,好耶!
有些時候,你想飛到虛空深處,來從遠處貼近世界底部的機器的整體運行情況,但又擔(dān)心會被無視游戲模式的虛空傷害搞死。 不如整個規(guī)則,移除虛空對玩家的傷害,讓玩家想在虛空逛多深逛多久都沒問題
生存模式用新增特性/bug修復(fù)
玩家重生丟失客戶端設(shè)置數(shù)據(jù)修復(fù) (clientSettingsLostOnRespawnFix)
修復(fù)在玩家重生或從末地進入末地門時,新創(chuàng)建的玩家實體未遷移舊玩家實體中儲存著的客戶端設(shè)置的問題。因此依賴客戶端設(shè)置數(shù)據(jù)的模組總能正常的工作,如本模組以及 worldedit 模組的服務(wù)端翻譯
對于玩家重生,以及玩家從末地進入末地門這兩個操作,MC 會重建一個玩家實體對象,并把原實體的數(shù)據(jù)復(fù)制到新實體上
可惜,在這個復(fù)制數(shù)據(jù)的過程中,麻將忘了復(fù)制客戶端配置相關(guān)的數(shù)據(jù),這包括但不限于玩家客戶端的語言設(shè)置。 這會導(dǎo)致一些依賴客戶端設(shè)置數(shù)據(jù)的 mod 無法按照預(yù)期工作,比如 worldedit 和本 mod 的文本在玩家重生后都變成了英文
這是個 bug,雖然不嚴重,但挺影響游戲體驗的,得重進服務(wù)器或者手動調(diào)一下客戶端設(shè)置,才能恢復(fù)正常
有蟲,得修,/carpet setDefault clientSettingsLostOnRespawnFix true
,done
技術(shù)上來講,在從舊玩家實體復(fù)制數(shù)據(jù)到新玩家實體的過程中,這條規(guī)則會重新將曾經(jīng)用于舊玩家實體的客戶端設(shè)置數(shù)據(jù)包(ClientSettingsC2SPacket
)應(yīng)用到新的玩家實體上。
其他規(guī)則
射線追蹤命令開關(guān) (commandRaycast)
啟用?
/raycast
?命令用于分析射線追蹤
/raycast
?指令的開關(guān)及其權(quán)限控制
移除實體命令開關(guān) (commandRemoveEntity)
啟用?
/removeentity
?命令用于直接在世界中抹除目標實體
/removeentity
?指令的開關(guān)及其權(quán)限控制
睡眠命令開關(guān) (commandSleep)
啟用?
/sleep
?命令用于制造卡頓
/sleep
?指令的開關(guān)及其權(quán)限控制
反混淆崩潰報告堆棧追蹤 (deobfuscateCrashReportStackTrace)
反混淆崩潰報告中輸出的堆棧追蹤
在分析生產(chǎn)環(huán)境下游戲崩潰的日志時,一份反混淆好的堆棧追蹤所提供的閱讀體驗可比混淆版的堆棧追蹤好多了
假人遠程召喚 (fakePlayerRemoteSpawning)
使用?
/player
?指令遠程召喚假人的權(quán)限需求。在這里,“遠程”指的是被召喚的假人位于 16m 以外,或另一個維度
禁止遠程召喚 bot,這可一點都不像一個“小號”能做的事情
移動記錄器 (loggerMovement)
移動記錄器的開關(guān) / 權(quán)限等級需求
移動記錄器(movement
?logger)并不是一個適合在生存服中使用的記錄器,畢竟它容易刷屏 + 會暴露其他玩家的位置信息,最好還是加個權(quán)限開關(guān)來控制下
stop指令兩步確認 (stopCommandDoubleConfirmation)
為?
/stop
?指令添加兩步確認機制,以防止誤觸導(dǎo)致意外地關(guān)掉了服務(wù)器。你需要在1分鐘內(nèi)輸入兩次?/stop
?指令來關(guān)閉服務(wù)器。該確認機制僅對玩家有效
一波操作猛如虎,/st
?+ tab 一頓敲,一按回車服務(wù)器無。這種輸錯指令把服務(wù)器關(guān)掉了的情況是小天才最喜歡干的事,比如在敲?//stack
?時少打了個?/
對于這種手抖問題,加一個兩步確認就能很好的避免了

阻止更新抑制崩潰 (yeetUpdateSuppressionCrash)
阻止服務(wù)端因棧溢出異常造成崩潰。具體功能實現(xiàn)類似 carpet 的?
updateSuppressionCrashFix
?規(guī)則,但包含更多信息
并不是所有版本的 fabric carpet / carpet extra 都提供了更新抑制防崩服的規(guī)則。對于那些缺失?updateSuppressionCrashFix
?的場景,就是本規(guī)則派上用場的時候了
借助微時序記錄器同款游戲階段記錄功能,該規(guī)則可在更新抑制崩服時提供更加豐富的信息

若 fabric carpet / carpet extra 存在規(guī)則?updateSuppressionCrashFix
,本規(guī)則會自動禁用,以避免發(fā)生沖突
移植自:
fabric carpet?1.4.50?的規(guī)則?
updateSuppressionCrashFix
TISCarpet13?build238?的規(guī)則?
yeetUpdateSuppressionCrash
沖突版本:
fabric carpet:?
[1.4.49, 1.4.76]
carpet extra:?
[1.4.14, 1.4.43]