Skip to content

🧠 Persistência de Estado & Configuração JSON

ParâmetroEspecificação
Classe de Configuraçãonet.instantgratification.collapsiblegamerules.GameRuleStateConfig
Caminho do Arquivo.minecraft/config/collapsible-game-rules-state.json
Armazenamento em MemóriaSet<String> expandedCategories = new HashSet<>()
Motor de Serializaçãocom.google.gson.Gson (Pretty-Printing)
Flag de Otimização I/Oprivate static boolean isDirty = false
Hook de SalvamentoScreenMixin intercepta Screen.removed() (@At("HEAD"))
Chave de PersistênciaChave de tradução (TranslatableContents.getKey()) ou string literal

📖 Visão Geral

O Collapsible Game Rules conta com um sistema de persistência com controle de fluxo. Em vez de redefinir as categorias ao fechar a tela, o mod armazena quais estavam abertas ou fechadas entre sessões.


📄 Formato de Configuração JSON

O arquivo .minecraft/config/collapsible-game-rules-state.json salva um array simples e legível:

json
[
  "gamerule.category.spawning",
  "gamerule.category.mobs",
  "gamerule.category.updates"
]
  • Presente no array: A categoria está EXPANDIDA.
  • Ausente do array: A categoria está RECOLHIDA (padrão).

⚡ Controle de I/O de Alta Performance

Gravar em disco a cada clique no mouse geraria travamentos desnecessários. Para garantir zero perda de desempenho, GameRuleStateConfig utiliza a flag isDirty:

┌─────────────────────────────────────────────────────────────────────────────┐
│                       THROTTLED PERSISTENCE WORKFLOW                        │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   Player clicks Category Header                                             │
│        │                                                                    │
│        ▼                                                                    │
│   GameRuleStateConfig.setExpanded(key, state)                               │
│        ├─ Updates in-memory HashSet<String> in 0.0001 μs                    │
│        └─ Marks: isDirty = true (ZERO DISK I/O)                             │
│                                                                             │
│   Player closes Game Rules Screen (Esc, Done, or Cancel)                    │
│        │                                                                    │
│        ▼                                                                    │
│   ScreenMixin.collapsible_game_rules$onRemoved()                            │
│        │                                                                    │
│        ▼                                                                    │
│   GameRuleStateConfig.saveIfDirty()                                         │
│        ├─ Checks: if (isDirty) Ellipsis                                      │
│        ├─ Writes JSON to disk in background buffer                          │
│        └─ Resets: isDirty = false                                           │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

💻 Métodos da API

Métodos Públicos de GameRuleStateConfig

AssinaturaRetornoDescrição
load()voidCarrega o arquivo collapsible-game-rules-state.json na inicialização.
save()voidGrava o conjunto expandedCategories no disco usando Files.newBufferedWriter.
saveIfDirty()voidSalva no disco apenas se isDirty == true, redefinindo a flag em seguida.
isExpanded(String categoryKey)booleanVerifica se a categoria está no conjunto expandedCategories.
setExpanded(String categoryKey, boolean expanded)voidAdiciona ou remove a chave e marca isDirty = true.
expandAll(Iterable<String> allKeys)voidAdiciona todas as chaves em massa e marca isDirty = true.
collapseAll()voidLimpa todas as entradas e marca isDirty = true.

🔒 Salvamento ao Fechar a Tela (ScreenMixin)

java
@Mixin(Screen.class)
public abstract class ScreenMixin {

    @Inject(method = "removed", at = @At("HEAD"))
    private void collapsible_game_rules$onRemoved(CallbackInfo ci) {
        if ((Object) this instanceof AbstractGameRulesScreen) {
            GameRuleStateConfig.saveIfDirty();
        }
    }
}

Isso garante que todas as escolhas do jogador sejam salvas ao sair, seja clicando em Concluído, Cancelar ou pressionando a tecla Escape.


🔗 Documentação Relacionada

Official documentation & web portal for Dasik Igaijinn mods.