From dd531bb7739ad772dc745392d6fee2fbae1d4db9 Mon Sep 17 00:00:00 2001 From: techno-sam <77073745+techno-sam@users.noreply.github.com> Date: Sun, 24 Aug 2025 20:58:53 +0200 Subject: [PATCH] add sky light (like vanilla light) --- build.gradle | 7 +++ .../datagen/CrystallineSkyDataGenerator.java | 14 +++++ .../CrystallineSkyModelProvider.java | 58 ++++++++++++++++++ .../mixin/ChunkLightProviderMixin.java | 2 +- .../mixin/ChunkSkyLightProviderMixin.java | 20 +++++- .../mixin/client/ClientWorldMixin.java | 22 +++++++ .../registry/CrystallineBlocks.java | 30 ++++++++- .../registry/CrystallineItems.java | 15 ++++- .../textures/item/sky_light.png | Bin 0 -> 616 bytes .../textures/item/sky_light_00.png | Bin 0 -> 789 bytes .../textures/item/sky_light_01.png | Bin 0 -> 739 bytes .../textures/item/sky_light_02.png | Bin 0 -> 764 bytes .../textures/item/sky_light_03.png | Bin 0 -> 764 bytes .../textures/item/sky_light_04.png | Bin 0 -> 735 bytes .../textures/item/sky_light_05.png | Bin 0 -> 809 bytes .../textures/item/sky_light_06.png | Bin 0 -> 805 bytes .../textures/item/sky_light_07.png | Bin 0 -> 858 bytes .../textures/item/sky_light_08.png | Bin 0 -> 820 bytes .../textures/item/sky_light_09.png | Bin 0 -> 842 bytes .../textures/item/sky_light_10.png | Bin 0 -> 848 bytes .../textures/item/sky_light_11.png | Bin 0 -> 859 bytes .../textures/item/sky_light_12.png | Bin 0 -> 847 bytes .../textures/item/sky_light_13.png | Bin 0 -> 832 bytes .../textures/item/sky_light_14.png | Bin 0 -> 773 bytes .../textures/item/sky_light_15.png | Bin 0 -> 732 bytes .../resources/crystalline_sky.mixins.json | 1 + src/main/resources/fabric.mod.json | 3 + 27 files changed, 164 insertions(+), 8 deletions(-) create mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/datagen/CrystallineSkyDataGenerator.java create mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyModelProvider.java create mode 100644 src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/ClientWorldMixin.java create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_00.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_01.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_02.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_03.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_04.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_05.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_06.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_07.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_08.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_09.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_10.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_11.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_12.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_13.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_14.png create mode 100644 src/main/resources/assets/crystalline_sky/textures/item/sky_light_15.png diff --git a/build.gradle b/build.gradle index 8aa04b3..c19d249 100644 --- a/build.gradle +++ b/build.gradle @@ -89,6 +89,13 @@ loom { } } +fabricApi { + configureDataGeneration { + client = true + outputDirectory = file("src/generated/resources") + } +} + tasks.withType(JavaCompile).configureEach { it.options.encoding = "UTF-8" it.options.release = 21 diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/CrystallineSkyDataGenerator.java b/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/CrystallineSkyDataGenerator.java new file mode 100644 index 0000000..ff59484 --- /dev/null +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/CrystallineSkyDataGenerator.java @@ -0,0 +1,14 @@ +package io.github.slimeistdev.crystalline_sky.datagen; + +import io.github.slimeistdev.crystalline_sky.datagen.providers.CrystallineSkyModelProvider; +import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; +import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; + +public class CrystallineSkyDataGenerator implements DataGeneratorEntrypoint { + @Override + public void onInitializeDataGenerator(FabricDataGenerator gen) { + FabricDataGenerator.Pack pack = gen.createPack(); + + pack.addProvider(CrystallineSkyModelProvider::new); + } +} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyModelProvider.java b/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyModelProvider.java new file mode 100644 index 0000000..8e56f9c --- /dev/null +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/datagen/providers/CrystallineSkyModelProvider.java @@ -0,0 +1,58 @@ +package io.github.slimeistdev.crystalline_sky.datagen.providers; + +import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks; +import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; +import net.fabricmc.fabric.api.client.datagen.v1.provider.FabricModelProvider; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.minecraft.block.LightBlock; +import net.minecraft.client.data.*; +import net.minecraft.client.render.item.model.ItemModel; +import net.minecraft.client.render.model.json.WeightedVariant; +import net.minecraft.state.property.Properties; +import net.minecraft.util.Identifier; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import static net.minecraft.client.data.BlockStateModelGenerator.createWeightedVariant; + +public class CrystallineSkyModelProvider extends FabricModelProvider { + public CrystallineSkyModelProvider(FabricDataOutput output) { + super(output); + } + + @Override + public void generateBlockStateModels(BlockStateModelGenerator gen) { + gen.registerBuiltinWithParticle(CrystallineBlocks.SKY, CrystallineItems.SKY); + gen.registerItemModel(CrystallineItems.SKY); + + registerSkyLightBlock(gen); + } + + private void registerSkyLightBlock(BlockStateModelGenerator gen) { + ItemModel.Unbaked fallback = ItemModels.basic(gen.uploadItemModel(CrystallineItems.SKY_LIGHT)); + Map itemModels = new HashMap<>(16); + BlockStateVariantMap.SingleProperty levelProp = BlockStateVariantMap.models(Properties.LEVEL_15); + + for (int level = 0; level <= 15; level++) { + String suffix = String.format(Locale.ROOT, "_%02d", level); + Identifier texture = TextureMap.getSubId(CrystallineItems.SKY_LIGHT, suffix); + + levelProp.register(level, createWeightedVariant(Models.PARTICLE.upload(CrystallineBlocks.SKY_LIGHT, suffix, TextureMap.particle(texture), gen.modelCollector))); + + ItemModel.Unbaked levelItemModel = ItemModels.basic(Models.GENERATED.upload( + ModelIds.getItemSubModelId(CrystallineItems.SKY_LIGHT, suffix), + TextureMap.layer0(texture), + gen.modelCollector + )); + itemModels.put(level, levelItemModel); + } + + gen.itemModelOutput.accept(CrystallineItems.SKY_LIGHT, ItemModels.select(LightBlock.LEVEL_15, fallback, itemModels)); + gen.blockStateCollector.accept(VariantsBlockModelDefinitionCreator.of(CrystallineBlocks.SKY_LIGHT).with(levelProp)); + } + + @Override + public void generateItemModels(ItemModelGenerator gen) {} +} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/ChunkLightProviderMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/ChunkLightProviderMixin.java index 35e3ac8..cfe27ec 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/ChunkLightProviderMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/ChunkLightProviderMixin.java @@ -11,6 +11,6 @@ import org.spongepowered.asm.mixin.Mixin; public class ChunkLightProviderMixin { @WrapMethod(method = "needsLightUpdate") private static boolean updateSky(BlockState oldState, BlockState newState, Operation original) { - return original.call(oldState, newState) || (oldState.isOf(CrystallineBlocks.SKY) != newState.isOf(CrystallineBlocks.SKY)); + return original.call(oldState, newState) || (CrystallineBlocks.getSkyLightLevel(oldState) != CrystallineBlocks.getSkyLightLevel(newState)); } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/ChunkSkyLightProviderMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/ChunkSkyLightProviderMixin.java index 4e0fde6..76e7a71 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/ChunkSkyLightProviderMixin.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/ChunkSkyLightProviderMixin.java @@ -3,11 +3,14 @@ package io.github.slimeistdev.crystalline_sky.mixin; import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkSectionPos; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkProvider; import net.minecraft.world.chunk.ChunkToNibbleArrayMap; import net.minecraft.world.chunk.light.ChunkLightProvider; import net.minecraft.world.chunk.light.ChunkSkyLightProvider; +import net.minecraft.world.chunk.light.LightSourceView; import net.minecraft.world.chunk.light.LightStorage; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -27,10 +30,21 @@ public abstract class ChunkSkyLightProviderMixin 0 && ((LightStorageAccessor) lightStorage).crystalline_sky$callIsSectionInEnabledColumn(ChunkSectionPos.fromBlockPos(blockPos))) { + enqueueIncrease(blockPos, QueueEntry.increaseLightFromEmission(level, isTrivialForLighting(state))); } } + + @Inject(method = "propagateLight", at = @At("RETURN")) + private void propagateCrystallineSkyLight(ChunkPos chunkPos, CallbackInfo ci) { + LightSourceView lightSourceView = this.chunkProvider.getChunk(chunkPos.x, chunkPos.z); + if (!(lightSourceView instanceof Chunk chunk)) return; + + chunk.forEachBlockMatchingPredicate(CrystallineBlocks::isCrystallineSky, (pos, state) -> { + enqueueIncrease(pos.asLong(), QueueEntry.increaseLightFromEmission(CrystallineBlocks.getSkyLightLevel(state), isTrivialForLighting(state))); + }); + } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/ClientWorldMixin.java b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/ClientWorldMixin.java new file mode 100644 index 0000000..9942e2f --- /dev/null +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/mixin/client/ClientWorldMixin.java @@ -0,0 +1,22 @@ +package io.github.slimeistdev.crystalline_sky.mixin.client; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.item.Item; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.HashSet; +import java.util.Set; + +@Mixin(ClientWorld.class) +public class ClientWorldMixin { + @ModifyExpressionValue(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/client/world/ClientWorld;BLOCK_MARKER_ITEMS:Ljava/util/Set;", opcode = Opcodes.PUTSTATIC)) + private static Set modifyBlockMarkerItems(Set original) { + Set extended = new HashSet<>(original); + extended.add(CrystallineItems.SKY_LIGHT); + return Set.copyOf(extended); + } +} diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineBlocks.java b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineBlocks.java index 0172dad..96727e1 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineBlocks.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineBlocks.java @@ -1,15 +1,14 @@ package io.github.slimeistdev.crystalline_sky.registry; import io.github.slimeistdev.crystalline_sky.CrystallineSky; +import net.minecraft.block.*; import net.minecraft.block.AbstractBlock.Settings; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.TransparentBlock; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.state.property.Properties; import java.util.function.Function; @@ -24,10 +23,35 @@ public class CrystallineBlocks { .suffocates(Blocks::never) .blockVision(Blocks::never)); + public static final Block SKY_LIGHT = register( + "sky_light", + LightBlock::new, + AbstractBlock.Settings.create() + .replaceable() + .strength(-1.0F, 3600000.8F) + .mapColor(state -> state.get(Properties.WATERLOGGED) ? MapColor.WATER_BLUE : MapColor.CLEAR) + .dropsNothing() + .nonOpaque() + ); + public static void init() {} private static T register(String id, Function factory, Settings settings) { RegistryKey key = CrystallineSky.key(RegistryKeys.BLOCK, id); return Registry.register(Registries.BLOCK, key, factory.apply(settings.registryKey(key))); } + + public static boolean isCrystallineSky(BlockState state) { + return getSkyLightLevel(state) > 0; + } + + public static int getSkyLightLevel(BlockState state) { + if (state.isOf(SKY_LIGHT)) { + return state.get(LightBlock.LEVEL_15); + } else if (state.isOf(SKY)) { + return 15; + } + + return 0; + } } diff --git a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineItems.java b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineItems.java index 6305396..7237260 100644 --- a/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineItems.java +++ b/src/main/java/io/github/slimeistdev/crystalline_sky/registry/CrystallineItems.java @@ -1,10 +1,23 @@ package io.github.slimeistdev.crystalline_sky.registry; +import net.minecraft.block.LightBlock; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.BlockStateComponent; import net.minecraft.item.Item; import net.minecraft.item.Items; +import net.minecraft.util.Rarity; public class CrystallineItems { - public static final Item SKY = Items.register(CrystallineBlocks.SKY); + public static final Item SKY = Items.register( + CrystallineBlocks.SKY, + settings -> settings.rarity(Rarity.EPIC) + ); + + public static final Item SKY_LIGHT = Items.register( + CrystallineBlocks.SKY_LIGHT, + settings -> settings.rarity(Rarity.EPIC) + .component(DataComponentTypes.BLOCK_STATE, BlockStateComponent.DEFAULT.with(LightBlock.LEVEL_15, 15)) + ); public static void init() {} } diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light.png new file mode 100644 index 0000000000000000000000000000000000000000..41dfef8d6ced948affb8b6f43bed233b9cf99a44 GIT binary patch literal 616 zcmV-u0+;=XP)EX>4Tx04R}tkv&MmKpe$iQ^g_`5jzxdh)|vE;uns!3Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RL3r>nIQsV!TLW>v=j{EWM-sA2aAT-KMv$|q{rdQ2W zA}(gKt76Y90tjOOBbb(%Wz0!Z5}xDh9zMR_MR}I@xj#prnzI<-6NzKYFssBH#50>! zgY!Odh!tg(_?&p$qze*1a$RxxjdQ_afoF!ybZVYBL@X9MSm|I^G&SNW;)ts0lrLml zRyl8R*2*>3x+i~OFsH99bDice5?I6%B#2N@LkVS65v5fp#X^eq;~xGY$1jmfAy)~E z91EyGgY5Xh|KNAGR(^8AO$x?=?ibts7zKKEfo9#dzmILZc>?&Kfh)c3uQY(!Ptxmc zEpi0(Zvz+CZB5w&E_ZxhUd%Qc)+1tNoTK)Y1@pE$7X?4hd00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=?EARBRfh2gINFo0A)!;K~y-)t&&j+z#t4mP1!ki z{}b&x@ozY3OKR62LC7j4nW4038tn(C6;ji1c2m`~ng& zw-vcMsDwu^gHg5KDH8r@q6AK?u%ek6=N1unq*a9g0000EX>4Tx04R}tkv&MmKpe$iQ^g_`5jzxdh)|vE;uns!3Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RL3r>nIQsV!TLW>v=j{EWM-sA2aAT-KMv$|q{rdQ2W zA}(gKt76Y90tjOOBbb(%Wz0!Z5}xDh9zMR_MR}I@xj#prnzI<-6NzKYFssBH#50>! zgY!Odh!tg(_?&p$qze*1a$RxxjdQ_afoF!ybZVYBL@X9MSm|I^G&SNW;)ts0lrLml zRyl8R*2*>3x+i~OFsH99bDice5?I6%B#2N@LkVS65v5fp#X^eq;~xGY$1jmfAy)~E z91EyGgY5Xh|KNAGR(^8AO$x?=?ibts7zKKEfo9#dzmILZc>?&Kfh)c3uQY(!Ptxmc zEpi0(Zvz+CZB5w&E_ZxhUd%Qc)+1tNoTK)Y1@pE$7X?4hd00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=?EARB{LF*tnB~*0TM|>K~y-)V|2Uv?mq(*@Kh%- zFfcGMGLQgRU>d))F2JflJ)`eGGXLe1hYTOKOk_kc02fft==* z(c6^)nf|To^`G_fHbw>p1_s8U06)C8|JL>TZ^!hO;rPXqjF$T5{}25WW`JoX$_uQQ zw=o|2C(M9NGr@EK17BZ0VmSBtKEqdDMFs(EDUlH9N(o?KU|?X_zjZgm@mFLRuz%}r zhI6;B;LZz#04($w7#J9iUp$E-M=%y(fSr^3|IhDV8OcgW3=9km*fcXRFfafBDO_U) TtSqOp00000NkvXXu0mjfmrGOs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_01.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_01.png new file mode 100644 index 0000000000000000000000000000000000000000..23e9f1f1924719bb0dcb0bf42574db274ecc55a4 GIT binary patch literal 739 zcmV<90v!E`P)EX>4Tx04R}tkv&MmKpe$iQ^g_`5jzxdh)|vE;uns!3Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RL3r>nIQsV!TLW>v=j{EWM-sA2aAT-KMv$|q{rdQ2W zA}(gKt76Y90tjOOBbb(%Wz0!Z5}xDh9zMR_MR}I@xj#prnzI<-6NzKYFssBH#50>! zgY!Odh!tg(_?&p$qze*1a$RxxjdQ_afoF!ybZVYBL@X9MSm|I^G&SNW;)ts0lrLml zRyl8R*2*>3x+i~OFsH99bDice5?I6%B#2N@LkVS65v5fp#X^eq;~xGY$1jmfAy)~E z91EyGgY5Xh|KNAGR(^8AO$x?=?ibts7zKKEfo9#dzmILZc>?&Kfh)c3uQY(!Ptxmc zEpi0(Zvz+CZB5w&E_ZxhUd%Qc)+1tNoTK)Y1@pE$7X?4hd00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=?EARCLQH|^5Fmg0N_bPK~y-)V_;xlU~s$o?tf5# z-+u-&0E^qzcX%~6W|d>e*H7zYL=nK{0&JSGieobXmu7T%CYTq#v@T#kHpKql0la>P z$+PUz7Gh+e05IW_kZ_QIv-hUT{eRSA@qcfs+<$EHIKhn-{{I;m7#Pl+I)y^R#EAk2 zGR*&X*SG#>U|?YAu5bN+Aj2F*Gb6EvoEGEX>4Tx04R}tkv&MmKpe$iQ^g_`5jzxdh)|vE;uns!3Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RL3r>nIQsV!TLW>v=j{EWM-sA2aAT-KMv$|q{rdQ2W zA}(gKt76Y90tjOOBbb(%Wz0!Z5}xDh9zMR_MR}I@xj#prnzI<-6NzKYFssBH#50>! zgY!Odh!tg(_?&p$qze*1a$RxxjdQ_afoF!ybZVYBL@X9MSm|I^G&SNW;)ts0lrLml zRyl8R*2*>3x+i~OFsH99bDice5?I6%B#2N@LkVS65v5fp#X^eq;~xGY$1jmfAy)~E z91EyGgY5Xh|KNAGR(^8AO$x?=?ibts7zKKEfo9#dzmILZc>?&Kfh)c3uQY(!Ptxmc zEpi0(Zvz+CZB5w&E_ZxhUd%Qc)+1tNoTK)Y1@pE$7X?4hd00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=?EARCNC|iqhSC50QpHoK~y-)V|2Uv?mq(*@Kh%- ztlO}Ok%0ujvP)Ztk%57M0ofpA(3n+@AznYN6Jd$l)p!44I4HpHKOxN+;@C7YFfcG2 z$T0tpOyiPgVqjok_|m!n!ypL<2?hoR1_p;2C$WYJOdcord>p&;(dAi)3F+GnX8$Fm zWEfsNd%~dFaEka?g4uHB)F~92kn2#ujTQd?yX#y3GcYhPbl123zp=s}MKe*(Ignxg z|FpOtgXzmn7=g+}i~$Fk92m~sy25af$pJGZ5@UdOLNJ3j0|UeUt-HxHVE@+L4CiiL u!JZe0F~HH=70zDHKqiQcjQr0)3jhERv~T3x_O?_20000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_03.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_03.png new file mode 100644 index 0000000000000000000000000000000000000000..656861cea12de02faf79b59f9c3800d6eadda2b7 GIT binary patch literal 764 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_06.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_06.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ee9d5902f68bb124639b57b01a97d40bea5337 GIT binary patch literal 805 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 U7}+Sd*#H0l07*qoM6N<$g3LE`ng9R* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_10.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_10.png new file mode 100644 index 0000000000000000000000000000000000000000..a85d44c3f6e5424e271f9357743105b0123057d7 GIT binary patch literal 848 zcmV-W1F!svP)EX>4Tx04R}tkv&MmKpe$iQ^g_`5jzxdh)|vE;uns!3Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RL3r>nIQsV!TLW>v=j{EWM-sA2aAT-KMv$|q{rdQ2W zA}(gKt76Y90tjOOBbb(%Wz0!Z5}xDh9zMR_MR}I@xj#prnzI<-6NzKYFssBH#50>! zgY!Odh!tg(_?&p$qze*1a$RxxjdQ_afoF!ybZVYBL@X9MSm|I^G&SNW;)ts0lrLml zRyl8R*2*>3x+i~OFsH99bDice5?I6%B#2N@LkVS65v5fp#X^eq;~xGY$1jmfAy)~E z91EyGgY5Xh|KNAGR(^8AO$x?=?ibts7zKKEfo9#dzmILZc>?&Kfh)c3uQY(!Ptxmc zEpi0(Zvz+CZB5w&E_ZxhUd%Qc)+1tNoTK)Y1@pE$7X?4hd00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=?EARDh|zc{4)Rm0ZmCnK~y-)wUE6_LSYn#pI3|v z5(bK+2wj9C99)`mXvih|k{06*&aI8o67&bO)Y1?U*DZ>2$-&`HHn`k`u0bS?qESdg zLvKUgtET8J=m!VR`<`>2^8rAz+LGz@RcZUS*?*(tNmg3}Nt3y(INc`K-LZN#|I8n_`?FgGj2q?xUBCn?Ry14-`&KX#A|nN@1Kw+E888vS1t31 zXe{*oFdIC+Pa*3@cZI&}ivR$hrY_5~HJaC3ec@;<1ZJaq#8IQ$T@_U$m_9^NH3uRh zi7^0wSOil#0G5c;Jm1C=aR7oT9al#b{;*I~jZ&cqK&enfQ8lL+K;T06XKV86VV;%f zEi>9>Uyaud;H7F&dGfLFVGYDw0VXz1+3BnRx!(gyg(8*O-O!jTz~b_fEX>4Tx04R}tkv&MmKpe$iQ^g_`5jzxdh)|vE;uns!3Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RL3r>nIQsV!TLW>v=j{EWM-sA2aAT-KMv$|q{rdQ2W zA}(gKt76Y90tjOOBbb(%Wz0!Z5}xDh9zMR_MR}I@xj#prnzI<-6NzKYFssBH#50>! zgY!Odh!tg(_?&p$qze*1a$RxxjdQ_afoF!ybZVYBL@X9MSm|I^G&SNW;)ts0lrLml zRyl8R*2*>3x+i~OFsH99bDice5?I6%B#2N@LkVS65v5fp#X^eq;~xGY$1jmfAy)~E z91EyGgY5Xh|KNAGR(^8AO$x?=?ibts7zKKEfo9#dzmILZc>?&Kfh)c3uQY(!Ptxmc zEpi0(Zvz+CZB5w&E_ZxhUd%Qc)+1tNoTK)Y1@pE$7X?4hd00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=?EARDjT4v7}x*+0a!^yK~y-)wUfU~0$~`(zprTM z(NZmfNQaP1NVF6L4h@+QM1+e=wn$qLLJkg1PW=fDg~K&R930)?)D4H|kS+$IICzjs zg4_uWPfH$mnsNz!r|0`V@B4Y4_ZI*lR_oL0$uZ$alYXAuv0C3YanjSMJq2RkAREW7 zm(5jXO4Ps7@7oKDd2E-2_bG^gD`8$%eiw5 z^AE84`|A~aH5)eY``ZV$E;8WwG-I=>>&-jTl>z`@ZGGDu@3krb0B-LL9G_-0x8U=~ z&BaC_0_bUN5Pns?-&t-Da)YO}BI{|bWpD5R>=xpd%2rvxikO>3Nq72~a?|`Bxqg=24{ui78 l_KyzC_z?>#nM@M?L*K5ej+(47zySaN002ovPDHLkV1hy{cd!5e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_12.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_12.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc554499de61024c828e558f95e59000ff08a94 GIT binary patch literal 847 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 DR=!!r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_15.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_15.png new file mode 100644 index 0000000000000000000000000000000000000000..4b250f4f55d22efe04e77cab1d661e94b2cd23ed GIT binary patch literal 732 zcmV<20wev2P)EX>4Tx04R}tkv&MmKpe$iQ^g_`5jzxdh)|vE;uns!3Pq?8YK2xEOfLO`CJjl8 zi=*ILaPVWX>fqw6tAnc`2!4RL3r>nIQsV!TLW>v=j{EWM-sA2aAT-KMv$|q{rdQ2W zA}(gKt76Y90tjOOBbb(%Wz0!Z5}xDh9zMR_MR}I@xj#prnzI<-6NzKYFssBH#50>! zgY!Odh!tg(_?&p$qze*1a$RxxjdQ_afoF!ybZVYBL@X9MSm|I^G&SNW;)ts0lrLml zRyl8R*2*>3x+i~OFsH99bDice5?I6%B#2N@LkVS65v5fp#X^eq;~xGY$1jmfAy)~E z91EyGgY5Xh|KNAGR(^8AO$x?=?ibts7zKKEfo9#dzmILZc>?&Kfh)c3uQY(!Ptxmc zEpi0(Zvz+CZB5w&E_ZxhUd%Qc)+1tNoTK)Y1@pE$7X?4hd00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=?EARCkTL7z1Fgz~*lj zVhnitNtc0vfq~)r-Phz9aQ*IUhKKiVW0fPy08M3428zL~$=&}MXaNAdH;_Kyb3ru# O0000