aboutsummaryrefslogtreecommitdiff
path: root/api/src/main
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2024-08-14 19:26:34 +0900
committershedaniel <daniel@shedaniel.me>2024-08-14 19:34:44 +0900
commit612dddf0b65be65a70783622c6406a966d935ebc (patch)
treec14ca86eae0dadace3617681aad605da5b849b56 /api/src/main
parentd0a69811215c779229e9227264f5b79839c471af (diff)
parent90af6e03bcf45b0c13d5b7af51126bd2fc7389a5 (diff)
downloadRoughlyEnoughItems-612dddf0b65be65a70783622c6406a966d935ebc.tar.gz
RoughlyEnoughItems-612dddf0b65be65a70783622c6406a966d935ebc.tar.bz2
RoughlyEnoughItems-612dddf0b65be65a70783622c6406a966d935ebc.zip
Merge remote-tracking branch 'origin/15.x-1.20.5' into 16.x-1.21
Fixes #1665 Fixes #1662 Fixes #1663
Diffstat (limited to 'api/src/main')
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java9
-rw-r--r--api/src/main/java/me/shedaniel/rei/impl/common/InternalRegistryAccess.java86
2 files changed, 88 insertions, 7 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java b/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java
index f9707be9a..8d4b45d4d 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/display/basic/BasicDisplay.java
@@ -23,12 +23,11 @@
package me.shedaniel.rei.api.common.display.basic;
-import dev.architectury.utils.EnvExecutor;
-import dev.architectury.utils.GameInstance;
import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.api.common.display.SimpleDisplaySerializer;
import me.shedaniel.rei.api.common.entry.EntryIngredient;
import me.shedaniel.rei.api.common.util.EntryIngredients;
+import me.shedaniel.rei.impl.common.InternalRegistryAccess;
import net.minecraft.core.RegistryAccess;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
@@ -38,16 +37,12 @@ import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Optional;
-import java.util.function.Supplier;
/**
* A basic implementation of a display, consisting of a list of inputs, a list of outputs
* and a possible display location.
*/
public abstract class BasicDisplay implements Display {
- protected static final Supplier<RegistryAccess> REGISTRY_ACCESS =
- EnvExecutor.getEnvSpecific(() -> () -> () -> GameInstance.getClient().player.level().registryAccess(),
- () -> () -> () -> GameInstance.getServer().registryAccess());
protected List<EntryIngredient> inputs;
protected List<EntryIngredient> outputs;
protected Optional<ResourceLocation> location;
@@ -64,7 +59,7 @@ public abstract class BasicDisplay implements Display {
@ApiStatus.Experimental
public static RegistryAccess registryAccess() {
- return REGISTRY_ACCESS.get();
+ return InternalRegistryAccess.getInstance().get();
}
/**
diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/InternalRegistryAccess.java b/api/src/main/java/me/shedaniel/rei/impl/common/InternalRegistryAccess.java
new file mode 100644
index 000000000..2f1354c4a
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/impl/common/InternalRegistryAccess.java
@@ -0,0 +1,86 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020, 2021, 2022, 2023 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.impl.common;
+
+import dev.architectury.platform.Platform;
+import dev.architectury.utils.Env;
+import dev.architectury.utils.GameInstance;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.client.Minecraft;
+import net.minecraft.core.RegistryAccess;
+import net.minecraft.core.registries.BuiltInRegistries;
+import org.jetbrains.annotations.ApiStatus;
+
+import java.lang.ref.WeakReference;
+import java.util.function.Supplier;
+
+@ApiStatus.Internal
+public final class InternalRegistryAccess implements Supplier<RegistryAccess> {
+ private static final InternalRegistryAccess INSTANCE = new InternalRegistryAccess();
+ private WeakReference<RegistryAccess> registryAccess;
+ private boolean warned;
+
+ public static InternalRegistryAccess getInstance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public RegistryAccess get() {
+ RegistryAccess access = this.registryAccess == null ? null : this.registryAccess.get();
+ if (access != null) {
+ return access;
+ }
+
+ if (Platform.getEnvironment() == Env.CLIENT) {
+ access = getFromClient();
+ } else if (GameInstance.getServer() != null) {
+ access = GameInstance.getServer().registryAccess();
+ }
+
+ if (access == null && !this.warned) {
+ this.warned = true;
+
+ new NullPointerException("Cannot get registry access!").printStackTrace();
+ InternalLogger.getInstance().warn("Cannot get registry access!");
+ return RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY);
+ }
+
+ return access;
+ }
+
+ @Environment(EnvType.CLIENT)
+ private static RegistryAccess getFromClient() {
+ if (Minecraft.getInstance().level != null) {
+ return Minecraft.getInstance().level.registryAccess();
+ } else if (Minecraft.getInstance().getConnection() != null) {
+ return Minecraft.getInstance().getConnection().registryAccess();
+ } else if (Minecraft.getInstance().gameMode != null) {
+ // Sometimes the packet is sent way too fast and is between the connection and the level, better safe than sorry
+ return Minecraft.getInstance().gameMode.connection.registryAccess();
+ }
+
+ return null;
+ }
+}