Skip to content

🌎 Globale Aktionen & Massenumschalter

ParameterSpezifikation
Komponentenklassenet.instantgratification.collapsiblegamerules.ui.GlobalActionsRuleEntry
Position in ListeIndex 0 (Immer ganz oben in RuleList fixiert)
Linker Button[ Expand All ] (gui.collapsible-game-rules.expand_all)
Rechter Button[ Collapse All ] (gui.collapsible-game-rules.collapse_all)
Mittelpunkt linker Buttonthis.getX() + this.getWidth() / 4
Mittelpunkt rechter Buttonthis.getX() + 3 * this.getWidth() / 4
Hover-Farbe0x22FFFFFF (Hebt die überfahrene Hälfte hervor)
Trennlinie unten0x44AAAAAA
Klick-SoundSoundEvents.UI_BUTTON_CLICK (1.0F)

📖 Übersicht

In umfangreichen Modpacks mit hunderten Spielregeln ist das manuelle Öffnen oder Schließen einzelner Ordner mühsam.

Die Globale Aktionsleiste ist auf Index 0 verankert und ermöglicht das vollständige Aus- oder Einklappen aller Kategorien mit nur einem Mausklick.


🎨 Geteiltes Button-Design

┌─────────────────────────────────────────────────────────────────────────────┐
│ ◄──────────────── Left Half ───────────────►◄────────────── Right Half ───► │
│               [ Expand All ]                               [ Collapse All ] │
│ ─────────────────────────────────────────────────────────────────────────── │
└─────────────────────────────────────────────────────────────────────────────┘
  • Linke Zone (mouseX < getX() + getWidth() / 2): Löst expandAll aus.
  • Rechte Zone (mouseX >= getX() + getWidth() / 2): Löst collapseAll aus.
  • Hover-Zustand: Hebt nur die fokussierte Hälfte mit 0x22FFFFFF hervor und wechselt die Schriftfarbe zu 0xFFFFFFAA.

⚙️ Technische Mechaniken

1. Fixierte Injektion auf Index 0

In AbstractGameRulesScreenRuleListMixin:

java
if (!this.collapsible_game_rules$allEntries.isEmpty()) {
    this.addEntry(new GlobalActionsRuleEntry(
        () -> {
            List<String> allKeys = this.collapsible_game_rules$allEntries.stream()
                .filter(e -> e instanceof AbstractGameRulesScreen.CategoryRuleEntry)
                .map(e -> {
                    Component lbl = ((CategoryRuleEntryAccessor) e).collapsible_game_rules$getLabel();
                    if (lbl.getContents() instanceof TranslatableContents translatable) {
                        return translatable.getKey();
                    }
                    return lbl.getString();
                })
                .toList();
            GameRuleStateConfig.expandAll(allKeys);
            this.collapsible_game_rules$updateVisibleEntries();
        },
        () -> {
            GameRuleStateConfig.collapseAll();
            this.collapsible_game_rules$updateVisibleEntries();
        }
    ));
}

2. Ermittlung der Kategorie-Schlüssel

  1. Filtert Einträge nach CategoryRuleEntry.
  2. Liest das Label über CategoryRuleEntryAccessor.
  3. Extrahiert den Übersetzungsschlüssel (gamerule.category.spawning).
  4. Verwendet bei unübersetzten Schlüsseln den Text.
  5. Sammelt Schlüssel in einer unveränderlichen Java 25-Liste (.toList()) und übergibt sie an GameRuleStateConfig.expandAll(allKeys).

3. Klick-Auswertung

In GlobalActionsRuleEntry.mouseClicked(MouseButtonEvent event, boolean doubleClick):

java
if (event.button() == 0 || event.button() == 1) {
    double mouseX = event.x();
    if (mouseX < this.getX() + this.getWidth() / 2.0) {
        this.expandAll.run();
    } else {
        this.collapseAll.run();
    }
    Minecraft.getInstance().getSoundManager().play(
        SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)
    );
    return true;
}

🌐 Lokalisierungsschlüssel

json
{
  "gui.collapsible-game-rules.expand_all": "Expand All",
  "gui.collapsible-game-rules.collapse_all": "Collapse All"
}

🔗 Weiterführende Dokumentation

Official documentation & web portal for Dasik Igaijinn mods.