Início
» 🎮 Esportes eletrônicos
»
Correção de falha no arquivo de configuração do Minecraft: Resolve o erro "Não é possível obter o valor da configuração antes que ela seja carregada".
Correção de falha no arquivo de configuração do Minecraft: Resolve o erro "Não é possível obter o valor da configuração antes que ela seja carregada".
Para corrigir a falha na configuração do Minecraft, interrompa a leitura de um valor de configuração do Forge até que o Forge tenha carregado a configuração correspondente. Registre a configuração ForgeConfigSpecno construtor do seu mod e, em seguida, leia seus valores a partir do método `read` ModConfigEvent.Loadingou ModConfigEvent.Reloadingdo callback dessa configuração. Se você estiver instalando um mod de terceiros, atualize ou isole o mod mencionado no relatório de falha; a correção do código pertence ao autor desse mod.
A mensagem é geralmente expressa como IllegalStateException: Cannot get config value before config is loaded. Ela aponta para uma leitura antecipada de um valor de configuração, mas o rastreamento de pilha exato e o carregador são importantes. O exemplo do Forge abaixo foi escrito para o estilo da API do Forge 1.20.1; não o cole sem alterações no NeoForge ou em um projeto Fabric.
O que significa a exceção IllegalStateException na configuração do Minecraft?
O Forge permite que um mod declare uma configuração ForgeConfigSpece lida com o carregamento de seus valores a partir de arquivos de configuração. Uma ConfigValueconfiguração é uma referência a uma configuração; chamar o método `read() .get()` solicita o valor carregado. Se essa leitura ocorrer antes que o Forge tenha anexado e carregado a configuração apropriada, o Forge lançará uma exceção `IllegalStateException` em vez de retornar um valor.
Um campo estático que armazena o ConfigValuepróprio valor não é automaticamente um problema. O padrão arriscado é a avaliação MY_SETTING.get()durante a inicialização de uma classe, em um construtor executado prematuramente ou a partir de código acionado antes do carregamento da configuração. Um valor em cache também pode ficar desatualizado após uma recarga de arquivo, a menos que o módulo trate o evento de recarga.
Corrija a falha de configuração do Forge em quatro etapas.
Passo 1: Descubra qual módulo está lendo o valor muito cedo.
Abra o latest.logrelatório de falha mais recente e encontre o primeiro frame IllegalStateException. Leia o rastreamento de pilha de cima para baixo até que ele saia das classes de configuração do Forge e entre em um pacote de mod. Esse primeiro frame pertencente ao mod geralmente identifica o local da chamada. Anote as versões do Minecraft, do Forge e do mod, além de se a falha ocorreu no cliente, em um servidor dedicado, ao carregar ou recarregar o mundo.
Se você for um jogador, primeiro faça uma cópia do perfil. Atualize o mod em questão e suas dependências para versões compatíveis com as mesmas versões do Minecraft e do Forge. Se o problema persistir, desative apenas o mod suspeito na cópia do perfil para confirmar a causa e, em seguida, envie ao autor o log completo e as versões exatas. Evite excluir todos os arquivos de configuração: isso pode apagar configurações sem corrigir uma chamada anterior no código.
A primeira chamada pertencente ao aplicativo após o método de obtenção da configuração é a linha a ser inspecionada.
Etapa 2: Defina e registre a especificação de configuração
Crie a especificação uma única vez, mantenha o objeto de valor e registre essa mesma especificação a partir do construtor do módulo. Este exemplo define um inteiro limitado em uma configuração comum:
public final class MyModConfig {
public static final ForgeConfigSpec SPEC;
public static final ForgeConfigSpec.IntValue MAX_MOBS;
static {
ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder();
MAX_MOBS = builder.defineInRange("maxMobs", 10, 0, 100);
SPEC = builder.build();
}
}
Mantenha o tipo de configuração declarado alinhado com o local onde a configuração pertence. O Forge distingue entre configurações de servidor CLIENT, de cliente COMMONe SERVERde usuário; a configuração de servidor de um mundo não é intercambiável com um arquivo exclusivo do cliente.
Registre a especificação de configuração do Forge no construtor do mod antes que o Forge carregue o arquivo.
Etapa 3: Leia os valores dos eventos de carga e recarga correspondentes.
Registre ouvintes no barramento de eventos do mod e verifique a especificação do evento antes de lê-lo. O Forge envia eventos de configuração para as configurações do mod, portanto, um ouvinte deve ignorar eventos para outras especificações. Atualize um instantâneo de tempo de execução no carregamento inicial e novamente na recarga.
Use o valor de tempo de execução em cache onde o recurso precisar, em vez de distribuir leituras de configuração por meio de inicializadores estáticos. Se um recurso puder ser executado antes do carregamento da configuração, adie essa execução ou forneça um valor padrão seguro. Não utilize o rastreador de configuração interno do Forge nem force um carregamento manual para ocultar o bug de ordenação.
Filtre cada evento de acordo com sua especificação para que um retorno de chamada não leia outra configuração.
Passo 4: Teste o mesmo caminho de inicialização que apresentou falha.
Execute o cliente de desenvolvimento do projeto e repita a ação que falhou inicialmente: carregar um mundo, iniciar o servidor dedicado ou recarregar a configuração. Confirme se o relatório de falha não contém mais a exceção de valor de configuração inicial e se o snapshot de tempo de execução é alterado após uma recarga válida. Se a configuração for específica do servidor, teste um mundo do servidor, bem como o cliente. Use as tarefas de execução do Gradle fornecidas pelo Forge MDK do seu projeto; os nomes das tarefas podem variar de acordo com a configuração.
Os eventos do ciclo de vida do Forge, como a configuração comum, não substituem o retorno de chamada de carregamento de configuração. O barramento de eventos do módulo executa muitos eventos do ciclo de vida em paralelo, portanto, mover uma leitura para um manipulador de configuração arbitrário não torna a ordem segura por si só. Use o evento de configuração documentado para o valor e utilize a transferência de thread apropriada somente quando a própria operação precisar ser executada em uma thread específica.
Confirme se a inicialização e a recarga foram concluídas sem a exceção de leitura antecipada.
Se o projeto usar Fabric ou NeoForge
O Fabric Loader não fornece o callback do Forge ForgeConfigSpecnem um callback universal ConfigLoadingEvents. Mods do Fabric frequentemente usam uma biblioteca de configuração separada ou seu próprio leitor de arquivos. Identifique essa dependência a partir do rastreamento de pilha e siga a API de carregamento e recarregamento da versão correspondente; certifique-se de que a biblioteca tenha sido inicializada antes que o mod leia seus valores. Os entrypoints do Fabric são executados no início da inicialização, portanto, não presuma que um inicializador signifique que todas as configurações de terceiros já foram carregadas.
Se o rastreamento de pilha net.neoforgedindicar a versão específica do Minecraft e do NeoForge, consulte a documentação da API do NeoForge. Forge e NeoForge compartilham conceitos, mas seus nomes de pacotes e APIs suportadas podem ser diferentes. Não misture trechos de código nem adicione um callback hipotético para silenciar a exceção.
Lista de verificação rápida de prevenção
Registre cada especificação de configuração do Forge a partir do construtor de mods.
Mantenha as declarações de configuração separadas das chamadas que avaliam .get().
Leia os valores após o evento de carregamento da configuração correspondente e atualize os valores em cache ao recarregar a página.
Verifique o tipo de configuração e teste o lado onde ela está efetivamente carregada.
Quando outro mod for mencionado no rastreamento de pilha, reporte o log completo e a versão compatível definida ao autor desse mod.