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 0000000..41dfef8 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_00.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_00.png new file mode 100644 index 0000000..a50bc00 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_00.png differ 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 0000000..23e9f1f Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_01.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_02.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_02.png new file mode 100644 index 0000000..1902a77 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_02.png differ 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 0000000..656861c Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_03.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_04.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_04.png new file mode 100644 index 0000000..7c08d17 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_04.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_05.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_05.png new file mode 100644 index 0000000..cfdd404 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_05.png differ 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 0000000..b6ee9d5 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_06.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_07.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_07.png new file mode 100644 index 0000000..4cb22f7 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_07.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_08.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_08.png new file mode 100644 index 0000000..5bf87f6 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_08.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_09.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_09.png new file mode 100644 index 0000000..3d55942 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_09.png differ 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 0000000..a85d44c Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_10.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_11.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_11.png new file mode 100644 index 0000000..28917e3 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_11.png differ 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 0000000..4dc5544 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_12.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_13.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_13.png new file mode 100644 index 0000000..c3f6ac9 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_13.png differ diff --git a/src/main/resources/assets/crystalline_sky/textures/item/sky_light_14.png b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_14.png new file mode 100644 index 0000000..e124dfe Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_14.png differ 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 0000000..4b250f4 Binary files /dev/null and b/src/main/resources/assets/crystalline_sky/textures/item/sky_light_15.png differ diff --git a/src/main/resources/crystalline_sky.mixins.json b/src/main/resources/crystalline_sky.mixins.json index 8d39921..563dac2 100644 --- a/src/main/resources/crystalline_sky.mixins.json +++ b/src/main/resources/crystalline_sky.mixins.json @@ -12,6 +12,7 @@ "LightStorageAccessor" ], "client": [ + "client.ClientWorldMixin" ], "server": [ ], diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index d0ee967..81ebab0 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -32,6 +32,9 @@ "io.github.slimeistdev.crystalline_sky.CrystallineSky" ], "client": [ + ], + "fabric-datagen": [ + "io.github.slimeistdev.crystalline_sky.datagen.CrystallineSkyDataGenerator" ] } }