aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/Texture Pack Format.md4
-rw-r--r--src/main/java/moe/nea/firmament/mixins/accessor/sodium/AccessorSodiumWorldRenderer.java14
-rw-r--r--src/main/kotlin/moe/nea/firmament/compat/SodiumChunkReloader.kt12
-rw-r--r--src/main/kotlin/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt12
4 files changed, 42 insertions, 0 deletions
diff --git a/docs/Texture Pack Format.md b/docs/Texture Pack Format.md
index 4726e53..bb5dc25 100644
--- a/docs/Texture Pack Format.md
+++ b/docs/Texture Pack Format.md
@@ -467,6 +467,10 @@ Currently, the only supported filter is `title`, which accepts a [string matcher
## Block Model Replacements
+Firmament adds the ability to retexture block models. Supported renderers are vanilla, indigo (fabric), sodium (and
+anything sodium based). Firmament performs gentle world reloading so that even when the world data gets updated very
+late by the server there should be no flicker.
+
If you want to replace block textures in the world you can do so using block overrides. Those are stored in
`assets/firmskyblock/overrides/blocks/<id>.json`. The id does not matter, all overrides are loaded. This file specifies
which block models are replaced under which conditions:
diff --git a/src/main/java/moe/nea/firmament/mixins/accessor/sodium/AccessorSodiumWorldRenderer.java b/src/main/java/moe/nea/firmament/mixins/accessor/sodium/AccessorSodiumWorldRenderer.java
new file mode 100644
index 0000000..b759204
--- /dev/null
+++ b/src/main/java/moe/nea/firmament/mixins/accessor/sodium/AccessorSodiumWorldRenderer.java
@@ -0,0 +1,14 @@
+package moe.nea.firmament.mixins.accessor.sodium;
+
+import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer;
+import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Pseudo;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(SodiumWorldRenderer.class)
+@Pseudo
+public interface AccessorSodiumWorldRenderer {
+ @Accessor("renderSectionManager")
+ RenderSectionManager getRenderSectionManager_firmament();
+}
diff --git a/src/main/kotlin/moe/nea/firmament/compat/SodiumChunkReloader.kt b/src/main/kotlin/moe/nea/firmament/compat/SodiumChunkReloader.kt
new file mode 100644
index 0000000..4bb231a
--- /dev/null
+++ b/src/main/kotlin/moe/nea/firmament/compat/SodiumChunkReloader.kt
@@ -0,0 +1,12 @@
+package moe.nea.firmament.compat
+
+import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer
+import moe.nea.firmament.mixins.accessor.sodium.AccessorSodiumWorldRenderer
+
+class SodiumChunkReloader : Runnable {
+ override fun run() {
+ (SodiumWorldRenderer.instanceNullable() as AccessorSodiumWorldRenderer)
+ .renderSectionManager_firmament
+ .updateChunks(false)
+ }
+}
diff --git a/src/main/kotlin/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt b/src/main/kotlin/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt
index c869ba4..18da54c 100644
--- a/src/main/kotlin/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt
+++ b/src/main/kotlin/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt
@@ -3,6 +3,7 @@
package moe.nea.firmament.features.texturepack
import java.util.concurrent.CompletableFuture
+import net.fabricmc.loader.api.FabricLoader
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
@@ -29,6 +30,7 @@ import net.minecraft.util.math.BlockPos
import net.minecraft.util.profiler.Profiler
import moe.nea.firmament.Firmament
import moe.nea.firmament.annotations.Subscribe
+import moe.nea.firmament.compat.SodiumChunkReloader
import moe.nea.firmament.events.BakeExtraModelsEvent
import moe.nea.firmament.events.EarlyResourceReloadEvent
import moe.nea.firmament.events.FinalizeResourceManagerEvent
@@ -161,10 +163,20 @@ object CustomBlockTextures {
// false schedules rebuilds outside a 27 block radius to happen async
it.scheduleRebuild(false)
}
+ sodiumReloadTask?.run()
}
}
}
+ private val sodiumReloadTask = runCatching {
+ SodiumChunkReloader()
+ }.getOrElse {
+ if (FabricLoader.getInstance().isModLoaded("sodium"))
+ logger.error("Could not create sodium chunk reloader")
+ null
+ }
+
+
fun matchesPosition(replacement: BlockReplacement, blockPos: BlockPos?): Boolean {
if (blockPos == null) return true
val rc = replacement.roughCheck