Closes #4264
---
Dependency order is now:
BotaniaAPI/BotaniaBrews -> XplatAbstractions -> internal RegistryHolder
.../botania/fabric/xplat/FabricXplatImpl.java | 11 +++++++++--
.../vazkii/botania/forge/xplat/ForgeXplatImpl.java | 13 +++++++++----
.../vazkii/botania/common/brew/BotaniaBrews.java | 2 +-
.../vazkii/botania/common/impl/BotaniaAPIImpl.java | 4 ++--
.../vazkii/botania/xplat/XplatAbstractions.java | 2 +-
5 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/Fabric/src/main/java/vazkii/botania/fabric/xplat/FabricXplatImpl.java b/Fabric/src/main/java/vazkii/botania/fabric/xplat/FabricXplatImpl.java
index 2d27174bc..d5c1d40f0 100644
--- a/Fabric/src/main/java/vazkii/botania/fabric/xplat/FabricXplatImpl.java
+++ b/Fabric/src/main/java/vazkii/botania/fabric/xplat/FabricXplatImpl.java
@@ -500,8 +500,15 @@ public <T extends AbstractContainerMenu> MenuType<T> createMenuType(TriFunction<
}
@Override
- public Registry<Brew> createBrewRegistry() {
- return FabricRegistryBuilder.createDefaulted(Brew.class, prefix("brews"), prefix("fallback")).buildAndRegister();
+ public Registry<Brew> getOrCreateBrewRegistry() {
+ return RegistryHolder.BREW;
+ }
+
+ // static final field of an inner class provides:
+ // - at most once initialization
+ // - synchronization/serialization of concurrent accesses
+ private static class RegistryHolder {
+ public static final Registry<Brew> BREW = FabricRegistryBuilder.createDefaulted(Brew.class, prefix("brews"), prefix("fallback")).buildAndRegister();
}
@Nullable
diff --git a/Forge/src/main/java/vazkii/botania/forge/xplat/ForgeXplatImpl.java b/Forge/src/main/java/vazkii/botania/forge/xplat/ForgeXplatImpl.java
index 74c1590fc..c2622c7db 100644
--- a/Forge/src/main/java/vazkii/botania/forge/xplat/ForgeXplatImpl.java
+++ b/Forge/src/main/java/vazkii/botania/forge/xplat/ForgeXplatImpl.java
@@ -501,10 +501,15 @@ public <T extends AbstractContainerMenu> MenuType<T> createMenuType(TriFunction<
}
@Override
- public Registry<Brew> createBrewRegistry() {
- // The registryKey really belongs on BotaniaBrews, but this method is called from there,
- // so we'd like to avoid the circular dependency.
- return RegistryForgeAccessor.callRegisterDefaulted(ResourceKey.createRegistryKey(prefix("brews")),
+ public Registry<Brew> getOrCreateBrewRegistry() {
+ return RegistryHolder.BREW;
+ }
+
+ // static final field of an inner class provides:
+ // - at most once initialization
+ // - synchronization/serialization of concurrent accesses
+ private static class RegistryHolder {
+ public static final Registry<Brew> BREW = RegistryForgeAccessor.callRegisterDefaulted(ResourceKey.createRegistryKey(prefix("brews")),
LibMisc.MOD_ID + ":fallback", registry -> BotaniaBrews.fallbackBrew);
}
diff --git a/Xplat/src/main/java/vazkii/botania/common/brew/BotaniaBrews.java b/Xplat/src/main/java/vazkii/botania/common/brew/BotaniaBrews.java
index 0a4d86f2c..bd0b5ddcd 100644
--- a/Xplat/src/main/java/vazkii/botania/common/brew/BotaniaBrews.java
+++ b/Xplat/src/main/java/vazkii/botania/common/brew/BotaniaBrews.java
@@ -25,7 +25,6 @@
public class BotaniaBrews {
- public static final Registry<Brew> registry = XplatAbstractions.INSTANCE.createBrewRegistry();
public static final Brew fallbackBrew = new Brew(0, 0).setNotBloodPendantInfusable().setNotIncenseInfusable();
public static final Brew speed = new Brew(0x59B7FF, 4000, new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 1800, 1));
public static final Brew strength = new Brew(0xEE3F3F, 4000, new MobEffectInstance(MobEffects.DAMAGE_BOOST, 1800, 1));
@@ -50,6 +49,7 @@ public class BotaniaBrews {
public static final Brew clear = make(4000, new MobEffectInstance(BotaniaMobEffects.clear, 0, 0));
public static void registerBrews() {
+ Registry<Brew> registry = XplatAbstractions.INSTANCE.getOrCreateBrewRegistry();
BiConsumer<Brew, ResourceLocation> r = (b, id) -> Registry.register(registry, id, b);
r.accept(fallbackBrew, prefix("fallback"));
r.accept(speed, prefix(LibBrewNames.SPEED));
diff --git a/Xplat/src/main/java/vazkii/botania/common/impl/BotaniaAPIImpl.java b/Xplat/src/main/java/vazkii/botania/common/impl/BotaniaAPIImpl.java
index d58182cdc..2cac1c6e3 100644
--- a/Xplat/src/main/java/vazkii/botania/common/impl/BotaniaAPIImpl.java
+++ b/Xplat/src/main/java/vazkii/botania/common/impl/BotaniaAPIImpl.java
@@ -36,13 +36,13 @@
import vazkii.botania.api.internal.ManaNetwork;
import vazkii.botania.client.fx.SparkleParticleData;
import vazkii.botania.common.block.flower.functional.SolegnoliaBlockEntity;
-import vazkii.botania.common.brew.BotaniaBrews;
import vazkii.botania.common.handler.BotaniaSounds;
import vazkii.botania.common.handler.EquipmentHandler;
import vazkii.botania.common.handler.ManaNetworkHandler;
import vazkii.botania.common.integration.corporea.CorporeaNodeDetectors;
import vazkii.botania.common.item.BotaniaItems;
import vazkii.botania.common.item.relic.RingOfLokiItem;
+import vazkii.botania.xplat.XplatAbstractions;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@@ -181,7 +181,7 @@ public int apiVersion() {
@Override
public Registry<Brew> getBrewRegistry() {
- return BotaniaBrews.registry;
+ return XplatAbstractions.INSTANCE.getOrCreateBrewRegistry();
}
@Override
diff --git a/Xplat/src/main/java/vazkii/botania/xplat/XplatAbstractions.java b/Xplat/src/main/java/vazkii/botania/xplat/XplatAbstractions.java
index 4342d097a..56f715a5c 100644
--- a/Xplat/src/main/java/vazkii/botania/xplat/XplatAbstractions.java
+++ b/Xplat/src/main/java/vazkii/botania/xplat/XplatAbstractions.java
@@ -184,7 +184,7 @@ default Item.Properties noRepairOnForge(Item.Properties builder) {
}
<T extends AbstractContainerMenu> MenuType<T> createMenuType(TriFunction<Integer, Inventory, FriendlyByteBuf, T> constructor);
- Registry<Brew> createBrewRegistry();
+ Registry<Brew> getOrCreateBrewRegistry();
@Nullable
EquipmentHandler tryCreateEquipmentHandler();
--
2.40.1