Skip to content

🗂️ 可折疊類別

參數規格說明
核心元件CollapsibleCategoryRuleEntry (內部類別)
所屬 MixinAbstractGameRulesScreenRuleListMixin
目標類別net.minecraft.client.gui.screens.worldselection.AbstractGameRulesScreen.RuleList
狀態指示圖示展開: | 折疊:
數量徽章格式 (N rules) (顏色: ChatFormatting.GRAY)
懸停高亮顏色0x22FFFFFF (25% 不透明度白色方框)
底部分隔線顏色0x44AAAAAA (細分界線)
文字顏色懸停: 0xFFFFFFAA | 預設: 0xFFFFFFFF
互動音效net.minecraft.sounds.SoundEvents.UI_BUTTON_CLICK (音量: 1.0F)
朗讀類型NarratedElementType.TITLE (NarrationPriority.HOVERED)

📖 機制概述

在原生 Minecraft 中,遊戲規則畫面將分類標題呈現為靜態、無法互動的文字標籤(CategoryRuleEntry),所有子規則依序排列在單一滾動面板中。當模組新增數十項規則時,介面會變得極其冗長且難以瀏覽。

Collapsible Categories 將靜態標籤替換為支援展開與收合的互動式 CollapsibleCategoryRuleEntry 元件。


🎨 視覺排版與層次結構

RuleList 中呈現時,每個分類標題都包含動態視覺指示與狀態徽章:

┌─────────────────────────────────────────────────────────────────────────────┐
│ [ Expand All ]                                             [ Collapse All ] │ ◄── GlobalActionsRuleEntry (Index 0)
├─────────────────────────────────────────────────────────────────────────────┤
│ ▼ ⚔️ Mobs (14 rules)                                                        │ ◄── CollapsibleCategoryRuleEntry (Expanded)
│ ─────────────────────────────────────────────────────────────────────────── │
│   mobGriefing                                                     [ ON ]    │ ◄── Child RuleEntry
│   doMobSpawning                                                   [ ON ]    │ ◄── Child RuleEntry
│   doMobLoot                                                       [ ON ]    │ ◄── Child RuleEntry
├─────────────────────────────────────────────────────────────────────────────┤
│ ▶ 👤 Player (8 rules)                                                       │ ◄── CollapsibleCategoryRuleEntry (Collapsed)
│ ─────────────────────────────────────────────────────────────────────────── │
│ ▼ 🌧️ Updates (6 rules)                                                      │ ◄── CollapsibleCategoryRuleEntry (Expanded)
│ ─────────────────────────────────────────────────────────────────────────── │
│   doFireTick                                                      [ ON ]    │ ◄── Child RuleEntry
│   randomTickSpeed                                                 [ 3  ]    │ ◄── Child RuleEntry
└─────────────────────────────────────────────────────────────────────────────┘

⚙️ 技術機制

1. 子規則計數演算法

updateVisibleEntries() 遍歷 allEntries 時,會計算當前分類到下一個分類之間的子規則數量:

java
int childCount = 0;
for (int j = i + 1; j < this.collapsible_game_rules$allEntries.size(); j++) {
    if (this.collapsible_game_rules$allEntries.get(j) instanceof AbstractGameRulesScreen.CategoryRuleEntry) {
        break;
    }
    childCount++;
}

2. 類別渲染管線 (extractContent)

渲染流程透過 Minecraft 現代 GuiGraphicsExtractor 介面執行:

  1. 懸停方框:游標懸停在分類條目上時,在 [getX() - 2, getY()][getX() + getWidth() + 2, getY() + 24] 繪製半透明矩形(0x22FFFFFF)。
  2. 箭頭與文字:展開時加上 ,折疊時加上 ,後接分類標籤與灰色規則數徽章( (N rules))。
  3. 置中對齊:文字水平置中繪製於 getContentXMiddle(),垂直偏移為 getContentY() + 5
  4. 底部分隔線:在 getY() + 23 處繪製一條細分隔線(0x44AAAAAA)區隔相鄰類別。

3. 滑鼠點擊事件處理

分類標題在 mouseClicked(MouseButtonEvent event, boolean doubleClick) 中捕捉點擊:

  • 左鍵點擊 (event.button() == 0)右鍵點擊 (event.button() == 1)
    1. 觸發類別的 toggleAction.run()
    2. 將新的布林狀態寫入 GameRuleStateConfig
    3. 播放原版點擊音效:SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)
    4. 呼叫 updateVisibleEntries() 動態從清單中新增或移除子規則項目。
    5. 呼叫 updateSizeAndPosition(...) 重新計算清單長度。

4. 無障礙與螢幕朗讀

CollapsibleCategoryRuleEntry 實作 NarratableEntry

  • 優先級NarrationPriority.HOVERED
  • 朗讀內容:將類別標籤宣告為 NarratedElementType.TITLE,確保螢幕朗讀器在聚焦或懸停時朗讀類別名稱。

🔗 相關文件

Official documentation & web portal for Dasik Igaijinn mods.