Multiple entries with same key

Версия Minecraft
1.21.3
API
NeoForge
4,167
68
693
И вновь я тут )
Кто-нибудь встречал подобную вещь?
Вылезает при попытке запустить генерацию даты.

Ругается на мои кастомные регистраторы, хотя я делал всё по примеру из Twillight Forest, который можно посмотреть тут.

Java:
public class MistRegistries {

    private static List<Registry<?>> KEYS = Lists.newArrayList();

    public static final Registry<MistChunkSettings> GENERATION_SETTINGS = register(new RegistryBuilder<>(Keys.GENERATION_SETTINGS));
    public static final Registry<MistSettings> GLOBAL_SETTINGS = register(new RegistryBuilder<>(Keys.GLOBAL_SETTINGS).sync(true));
    public static final Registry<BiomeHolder> BIOME_SETTINGS = register(new RegistryBuilder<>(Keys.BIOME_SETTINGS));

    private static <T> Registry<T> register(RegistryBuilder<T> builder) {
        Registry<T> reg = builder.create();
        KEYS.add(reg);
        return reg;
    }

    public static void createNewRegistries(NewRegistryEvent event) {
        KEYS.forEach(reg -> event.register(reg));
    }

    public static final class Keys {

        public static final ResourceKey<Registry<MistChunkSettings>> GENERATION_SETTINGS = createKey("generation_settings");
        public static final ResourceKey<Registry<MistSettings>> GLOBAL_SETTINGS = createKey("global_settings");
        public static final ResourceKey<Registry<BiomeHolder>> BIOME_SETTINGS = createKey("biome_settings");

        private static <T> ResourceKey<Registry<T>> createKey(String name) {
            return ResourceKey.createRegistryKey(Mist.resLoc(name));
        }
    }
}
 
Краш-лог
Caused by: java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: Multiple entries with same key: mist:global_settings=net.minecraft.core.RegistrySetBuilder$UniversalLookup@329e39d4 and mist:global_settings=net.neoforged.neoforge.common.CommonHooks$1@4b1a9760
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:649)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
Краш-лог:
Caused by: java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: Multiple entries with same key: mist:global_settings=net.minecraft.core.RegistrySetBuilder$UniversalLookup@329e39d4 and mist:global_settings=net.neoforged.neoforge.common.CommonHooks$1@4b1a9760
	at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315)
	at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320)
	at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:649)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
Решение
В общем, раздербанил я весь мод и методом исключения понял, что, если я собираюсь использовать мои регистраторы в датапаках, то регать их надо через DataPackRegistryEvent.NewRegistry, а не через NewRegistryEvent. И тогда их можно юзать в генераторах даты и там они уже сами всё создают.
Но для чего тогда нужны обычные регистраторы и почему можанги всё единообразно не сделали, не понятно.
Да, оно там всё по два раза регается.

Попробовал с проверкой, то же самое.
Java:
public static void createNewRegistries(NewRegistryEvent event) {
    //REGS.forEach(reg -> event.register(reg));
    if (!BuiltInRegistries.REGISTRY.containsKey(Mist.resLoc("generation_settings"))) event.register(GENERATION_SETTINGS);
    if (!BuiltInRegistries.REGISTRY.containsKey(Mist.resLoc("global_settings"))) event.register(GLOBAL_SETTINGS);
    if (!BuiltInRegistries.REGISTRY.containsKey(Mist.resLoc("biome_settings"))) event.register(BIOME_SETTINGS);
}

К тому же, в самом эвенте уже есть проверка, и ошибка явно не оттуда приходит.
Java:
private void registerToRootRegistry(Registry<?> registry) {
    ResourceLocation registryName = registry.key().location();
    if (BuiltInRegistries.REGISTRY.containsKey(registryName)) {
        throw new IllegalStateException("Attempted duplicate registration of registry " + String.valueOf(registryName));
    } else {
        ((WritableRegistry)BuiltInRegistries.REGISTRY).register(registry.key(), registry, RegistrationInfo.BUILT_IN);
    }
}

Дублирование где-то совсем в потрохах происходит.
 
В общем, раздербанил я весь мод и методом исключения понял, что, если я собираюсь использовать мои регистраторы в датапаках, то регать их надо через DataPackRegistryEvent.NewRegistry, а не через NewRegistryEvent. И тогда их можно юзать в генераторах даты и там они уже сами всё создают.
Но для чего тогда нужны обычные регистраторы и почему можанги всё единообразно не сделали, не понятно.
 
Но для чего тогда нужны обычные регистраторы и почему можанги всё единообразно не сделали, не понятно.
У можангов вообще нет никаких эвентов.

Просто напоминаю, что Neoforge - переделка Forge, при том WIP. Могли остаться эвенты регистрации (и их временно переименовали) с Forge, которые работают нестабильно с текущими эвентами.
 
Ну да, ты прав. Оба эвента регаются в разные места. Хотя все ванильные регистраторы однотипны, что для датапаков, что обычные.
Ну ладно, возможно, разберутся позже.

Может и WIP, но вод сам Forge мне показался куда более сырым, чем Neo.
 
Назад
Сверху