mirror of
https://github.com/wisplite/crystalline-sky.git
synced 2026-10-30 13:32:18 -05:00
Start implementing sky light
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
package io.github.slimeistdev.crystalline_sky;
|
||||
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
import net.minecraft.registry.Registry;
|
||||
import net.minecraft.registry.RegistryKey;
|
||||
import net.minecraft.util.Identifier;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class CrystallineSky implements ModInitializer {
|
||||
public static final String ID = "crystalline_sky";
|
||||
public static final Logger LOG = LoggerFactory.getLogger(ID);
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
ModSetup.init();
|
||||
}
|
||||
|
||||
public static Identifier id(String path) {
|
||||
return Identifier.of(ID, path);
|
||||
}
|
||||
|
||||
public static <T> RegistryKey<T> key(RegistryKey<? extends Registry<T>> registryKey, String path) {
|
||||
return RegistryKey.of(registryKey, id(path));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package io.github.slimeistdev.crystalline_sky;
|
||||
|
||||
import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks;
|
||||
import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems;
|
||||
|
||||
public class ModSetup {
|
||||
public static void init() {
|
||||
CrystallineBlocks.init();
|
||||
CrystallineItems.init();
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
package io.github.slimeistdev.crystalline_sky.mixin;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
|
||||
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||
import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.world.chunk.light.ChunkLightProvider;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
|
||||
@Mixin(ChunkLightProvider.class)
|
||||
public class ChunkLightProviderMixin {
|
||||
@WrapMethod(method = "needsLightUpdate")
|
||||
private static boolean updateSky(BlockState oldState, BlockState newState, Operation<Boolean> original) {
|
||||
return original.call(oldState, newState) || (oldState.isOf(CrystallineBlocks.SKY) != newState.isOf(CrystallineBlocks.SKY));
|
||||
}
|
||||
}
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
package io.github.slimeistdev.crystalline_sky.mixin;
|
||||
|
||||
import com.llamalad7.mixinextras.expression.Definition;
|
||||
import com.llamalad7.mixinextras.expression.Expression;
|
||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import com.llamalad7.mixinextras.sugar.Share;
|
||||
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
|
||||
import com.llamalad7.mixinextras.sugar.ref.LocalIntRef;
|
||||
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
|
||||
import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.ChunkSectionPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
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.LightStorage;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Slice;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(ChunkSkyLightProvider.class)
|
||||
public abstract class ChunkSkyLightProviderMixin<M extends ChunkToNibbleArrayMap<M>, S extends LightStorage<M>> extends ChunkLightProvider<M, S> {
|
||||
@Shadow
|
||||
@Final
|
||||
private BlockPos.Mutable scratchPos;
|
||||
|
||||
@Unique
|
||||
private static final int crystalline_sky$EMISSION_FROM_SKY_BLOCK = 1 << 22; // used to allow 15-level light to go down without reduction
|
||||
|
||||
protected ChunkSkyLightProviderMixin(ChunkProvider chunkProvider, S lightStorage) {
|
||||
super(chunkProvider, lightStorage);
|
||||
}
|
||||
|
||||
@Inject(method = "checkNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/light/SkyLightStorage;get(J)I"))
|
||||
private void emitFromSky(long blockPos, CallbackInfo ci) {
|
||||
BlockState state = getStateForLighting(scratchPos.set(blockPos));
|
||||
if (state.isOf(CrystallineBlocks.SKY) && ((LightStorageAccessor) lightStorage).crystalline_sky$callIsSectionInEnabledColumn(ChunkSectionPos.fromBlockPos(blockPos))) {
|
||||
enqueueIncrease(blockPos, QueueEntry.increaseLightFromEmission(15, isTrivialForLighting(state)) | crystalline_sky$EMISSION_FROM_SKY_BLOCK);
|
||||
}
|
||||
}
|
||||
|
||||
@Definition(id = "lightLevel", local = @Local(type = int.class, argsOnly = true, ordinal = 0))
|
||||
@Expression("lightLevel - 1")
|
||||
@ModifyExpressionValue(
|
||||
method = "propagateIncrease",
|
||||
at = @At("MIXINEXTRAS:EXPRESSION"),
|
||||
slice = @Slice(
|
||||
from = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/light/SkyLightStorage;get(J)I"),
|
||||
to = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/light/ChunkSkyLightProvider;getStateForLighting(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;", ordinal = 0)
|
||||
)
|
||||
)
|
||||
private int unreducedDown1(int original, long blockPos, long packed, int lightLevel, @SuppressWarnings("LocalMayBeArgsOnly") @Local(ordinal = 0) LocalRef<Direction> direction, @Share("unreduced") LocalBooleanRef unreduced) {
|
||||
if (lightLevel == 15 && (packed & crystalline_sky$EMISSION_FROM_SKY_BLOCK) != 0 && direction.get() == Direction.DOWN) {
|
||||
unreduced.set(true);
|
||||
return lightLevel;
|
||||
} else {
|
||||
unreduced.set(false);
|
||||
return original;
|
||||
}
|
||||
}
|
||||
|
||||
@WrapOperation(
|
||||
method = "propagateIncrease",
|
||||
at = @At(
|
||||
value = "INVOKE",
|
||||
target = "Lnet/minecraft/world/chunk/light/ChunkSkyLightProvider;getOpacity(Lnet/minecraft/block/BlockState;)I",
|
||||
ordinal = 0
|
||||
),
|
||||
slice = @Slice(
|
||||
from = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/light/ChunkSkyLightProvider;getStateForLighting(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;", ordinal = 0)
|
||||
)
|
||||
)
|
||||
private int unreducedDown2(ChunkSkyLightProvider instance, BlockState blockState, Operation<Integer> original, @Share("unreduced") LocalBooleanRef unreduced) {
|
||||
if (unreduced.get()) {
|
||||
return blockState.getOpacity();
|
||||
}
|
||||
|
||||
return original.call(instance, blockState);
|
||||
}
|
||||
|
||||
@WrapOperation(
|
||||
method = "propagateIncrease",
|
||||
at = @At(
|
||||
value = "INVOKE",
|
||||
target = "Lnet/minecraft/world/chunk/light/ChunkSkyLightProvider;enqueueIncrease(JJ)V"
|
||||
),
|
||||
slice = @Slice(
|
||||
from = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/light/ChunkSkyLightProvider;getStateForLighting(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;", ordinal = 0)
|
||||
)
|
||||
)
|
||||
private void passFlagOn(ChunkSkyLightProvider instance, long pos, long flags, Operation<Void> original, @Share("unreduced") LocalBooleanRef unreduced) {
|
||||
if (unreduced.get()) {
|
||||
flags |= crystalline_sky$EMISSION_FROM_SKY_BLOCK;
|
||||
}
|
||||
original.call(instance, pos, flags);
|
||||
}
|
||||
|
||||
@Definition(id = "k", local = @Local(type = int.class, ordinal = 4))
|
||||
@Definition(id = "j", local = @Local(type = int.class, ordinal = 1))
|
||||
@Expression("k <= j - 1")
|
||||
@ModifyExpressionValue(
|
||||
method = "propagateDecrease",
|
||||
at = @At("MIXINEXTRAS:EXPRESSION"),
|
||||
slice = @Slice(
|
||||
from = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/light/SkyLightStorage;get(J)I"),
|
||||
to = @At(value = "INVOKE", target = "Lnet/minecraft/world/chunk/light/SkyLightStorage;set(JI)V")
|
||||
)
|
||||
)
|
||||
private boolean cleanBelowSkyLight(boolean original, @Local(ordinal = 1) LocalIntRef j, @Local(ordinal = 4) LocalIntRef k, @SuppressWarnings("LocalMayBeArgsOnly") @Local LocalRef<Direction> direction) {
|
||||
return original || direction.get() == Direction.DOWN && j.get() == 15 && k.get() == 15;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package io.github.slimeistdev.crystalline_sky.mixin;
|
||||
|
||||
import net.minecraft.world.chunk.light.LightStorage;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
|
||||
@Mixin(LightStorage.class)
|
||||
public interface LightStorageAccessor {
|
||||
@Invoker("isSectionInEnabledColumn")
|
||||
boolean crystalline_sky$callIsSectionInEnabledColumn(long sectionPos);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package io.github.slimeistdev.crystalline_sky.registry;
|
||||
|
||||
import io.github.slimeistdev.crystalline_sky.CrystallineSky;
|
||||
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 java.util.function.Function;
|
||||
|
||||
@SuppressWarnings("SameParameterValue")
|
||||
public class CrystallineBlocks {
|
||||
public static final Block SKY = register("sky", TransparentBlock::new, Settings.create()
|
||||
.strength(0.3f)
|
||||
.sounds(BlockSoundGroup.GLASS)
|
||||
.nonOpaque()
|
||||
.allowsSpawning(Blocks::never)
|
||||
.solidBlock(Blocks::never)
|
||||
.suffocates(Blocks::never)
|
||||
.blockVision(Blocks::never));
|
||||
|
||||
public static void init() {}
|
||||
|
||||
private static <T extends Block> T register(String id, Function<Settings, T> factory, Settings settings) {
|
||||
RegistryKey<Block> key = CrystallineSky.key(RegistryKeys.BLOCK, id);
|
||||
return Registry.register(Registries.BLOCK, key, factory.apply(settings.registryKey(key)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package io.github.slimeistdev.crystalline_sky.registry;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.Items;
|
||||
|
||||
public class CrystallineItems {
|
||||
public static final Item SKY = Items.register(CrystallineBlocks.SKY);
|
||||
|
||||
public static void init() {}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package io.github.username.modid;
|
||||
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class ModId implements ModInitializer {
|
||||
public static final String ID = "mod_id";
|
||||
public static final Logger LOGGER = LoggerFactory.getLogger(ID);
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
//LOGGER.info("[Mod ID] pretty pink princess ponies prancing perpendicular");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user