From 7c2bf2ed9e1d872b0b0de85ec0026f44b4e57218 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Sat, 27 Jun 2026 23:10:33 +0700 Subject: [PATCH] fakelevel: move field and init to impl class --- .../api/client/fakelevel/FakeLevel.java | 38 +------------------ .../pulsar/impl/client/PulsarClient.java | 4 +- .../impl/client/fakelevel/FakeLevelImpl.java | 23 +++++++++++ .../particles/VanillaParticleManager.java | 2 +- 4 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/main/java/dev/zenfyr/pulsar/api/client/fakelevel/FakeLevel.java b/src/main/java/dev/zenfyr/pulsar/api/client/fakelevel/FakeLevel.java index 69e4e3c..fedbc2f 100644 --- a/src/main/java/dev/zenfyr/pulsar/api/client/fakelevel/FakeLevel.java +++ b/src/main/java/dev/zenfyr/pulsar/api/client/fakelevel/FakeLevel.java @@ -1,13 +1,9 @@ package dev.zenfyr.pulsar.api.client.fakelevel; -import com.google.common.base.Suppliers; -import dev.zenfyr.pulsar.api.client.events.AfterFirstReload; import dev.zenfyr.pulsar.impl.client.fakelevel.FakeLevelImpl; -import java.util.function.Supplier; import lombok.experimental.UtilityClass; import net.minecraft.client.multiplayer.ClientLevel; import org.jetbrains.annotations.ApiStatus; -import sun.misc.Unsafe; /** * A fake {@link ClientLevel}, mainly to be used for rendering in GUIs. @@ -17,41 +13,11 @@ import sun.misc.Unsafe; @UtilityClass public class FakeLevel { - private static final ThreadLocal LOADING = ThreadLocal.withInitial(() -> false); - - public static final Supplier INSTANCE = Suppliers.memoize(() -> { - try { - LOADING.set(true); - - var field = Unsafe.class.getDeclaredField("theUnsafe"); - field.setAccessible(true); - Unsafe unsafe = (Unsafe) field.get(null); - - var level = (FakeLevelImpl) unsafe.allocateInstance(FakeLevelImpl.class); - level.initHook(); - return level; - - } catch (NoSuchFieldException | IllegalAccessException | InstantiationException e) { - throw new RuntimeException("Failed to init FakeLevelImpl!", e); - } finally { - LOADING.remove(); - } - }); - - /** - * Returns if the current loading world is the fake {@link ClientLevel}. - * @return if the current loading world is the fake {@link ClientLevel}. - */ - public static boolean isLoading() { - return LOADING.get(); + public static ClientLevel getInstance() { + return FakeLevelImpl.INSTANCE.get(); } public static boolean isFake(ClientLevel level) { return level instanceof FakeLevelImpl; } - - @ApiStatus.Internal - public static void init() { - AfterFirstReload.EVENT.listen(INSTANCE::get); - } } diff --git a/src/main/java/dev/zenfyr/pulsar/impl/client/PulsarClient.java b/src/main/java/dev/zenfyr/pulsar/impl/client/PulsarClient.java index 556da98..1540050 100644 --- a/src/main/java/dev/zenfyr/pulsar/impl/client/PulsarClient.java +++ b/src/main/java/dev/zenfyr/pulsar/impl/client/PulsarClient.java @@ -2,14 +2,14 @@ package dev.zenfyr.pulsar.impl.client; import dev.zenfyr.pulsar.api.client.events.AfterFirstReload; import dev.zenfyr.pulsar.api.client.fakelevel.BrightLightTexture; -import dev.zenfyr.pulsar.api.client.fakelevel.FakeLevel; +import dev.zenfyr.pulsar.impl.client.fakelevel.FakeLevelImpl; import net.fabricmc.api.ClientModInitializer; public class PulsarClient implements ClientModInitializer { @Override public void onInitializeClient() { - FakeLevel.init(); + FakeLevelImpl.init(); AfterFirstReload.EVENT.listen(BrightLightTexture::init); } } diff --git a/src/main/java/dev/zenfyr/pulsar/impl/client/fakelevel/FakeLevelImpl.java b/src/main/java/dev/zenfyr/pulsar/impl/client/fakelevel/FakeLevelImpl.java index a0af346..7df018f 100644 --- a/src/main/java/dev/zenfyr/pulsar/impl/client/fakelevel/FakeLevelImpl.java +++ b/src/main/java/dev/zenfyr/pulsar/impl/client/fakelevel/FakeLevelImpl.java @@ -1,5 +1,8 @@ package dev.zenfyr.pulsar.impl.client.fakelevel; +import com.google.common.base.Suppliers; +import dev.zenfyr.pulsar.api.client.events.AfterFirstReload; +import java.util.function.Supplier; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.renderer.LevelRenderer; @@ -14,9 +17,25 @@ import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.lighting.LevelLightEngine; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; +import sun.misc.Unsafe; public class FakeLevelImpl extends ClientLevel { + public static final Supplier INSTANCE = Suppliers.memoize(() -> { + try { + var field = Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + Unsafe unsafe = (Unsafe) field.get(null); + + var level = (FakeLevelImpl) unsafe.allocateInstance(FakeLevelImpl.class); + level.initHook(); + return level; + + } catch (NoSuchFieldException | IllegalAccessException | InstantiationException e) { + throw new RuntimeException("Failed to init FakeLevelImpl!", e); + } + }); + public FakeLevelImpl( ClientPacketListener clientPacketListener, ClientLevelData clientLevelData, @@ -32,6 +51,10 @@ public class FakeLevelImpl extends ClientLevel { clientPacketListener, clientLevelData, resourceKey, holder, i, j, levelRenderer, bl, l, k); } + public static void init() { + AfterFirstReload.EVENT.listen(INSTANCE::get); + } + // since we can't call the ctx, we init fields like this. public void initHook() {} diff --git a/src/main/java/dev/zenfyr/pulsar/impl/client/particles/VanillaParticleManager.java b/src/main/java/dev/zenfyr/pulsar/impl/client/particles/VanillaParticleManager.java index 16d149c..c9ed1b6 100644 --- a/src/main/java/dev/zenfyr/pulsar/impl/client/particles/VanillaParticleManager.java +++ b/src/main/java/dev/zenfyr/pulsar/impl/client/particles/VanillaParticleManager.java @@ -113,7 +113,7 @@ public class VanillaParticleManager { Particle particle; var window = Minecraft.getInstance().getWindow(); try { - LEVEL.set(FakeLevel.INSTANCE.get()); + LEVEL.set(FakeLevel.getInstance()); particle = ((ParticleEngineAccessor) Minecraft.getInstance().particleEngine) .pulsar$createParticle( options, -- 2.51.2