From 755ec1daa8ae76ceee3bcd547bda3622bd04566d Mon Sep 17 00:00:00 2001 From: gnembon <41132274+gnembon@users.noreply.github.com> Date: Fri, 12 May 2023 22:04:19 +0200 Subject: [PATCH] relight cleanup - think it works now. Little higher level, but that's what's needed. --- .../fakes/ChunkLightProviderInterface.java | 8 -- .../carpet/fakes/LightStorageInterface.java | 12 -- ...ighting_scarpetChunkCreationInterface.java | 4 - ...tionStorage_scarpetChunkCreationMixin.java | 72 ---------- .../ChunkMap_scarpetChunkCreationMixin.java | 63 +++++---- ...LightEngine_scarpetChunkCreationMixin.java | 24 +--- ...tionStorage_scarpetChunkCreationMixin.java | 86 ++---------- ...LightEngine_scarpetChunkCreationMixin.java | 10 -- ...tionStorage_scarpetChunkCreationMixin.java | 127 ------------------ ...LightEngine_scarpetChunkCreationMixin.java | 32 ++++- src/main/resources/carpet.mixins.json | 2 - 11 files changed, 75 insertions(+), 365 deletions(-) delete mode 100644 src/main/java/carpet/fakes/ChunkLightProviderInterface.java delete mode 100644 src/main/java/carpet/fakes/LightStorageInterface.java delete mode 100644 src/main/java/carpet/mixins/BlockLightSectionStorage_scarpetChunkCreationMixin.java delete mode 100644 src/main/java/carpet/mixins/SkyLightSectionStorage_scarpetChunkCreationMixin.java diff --git a/src/main/java/carpet/fakes/ChunkLightProviderInterface.java b/src/main/java/carpet/fakes/ChunkLightProviderInterface.java deleted file mode 100644 index 6da216c4..00000000 --- a/src/main/java/carpet/fakes/ChunkLightProviderInterface.java +++ /dev/null @@ -1,8 +0,0 @@ -package carpet.fakes; - -import net.minecraft.world.level.chunk.DataLayer; - -public interface ChunkLightProviderInterface -{ - int callGetCurrentLevelFromSection(DataLayer array, long blockPos); -} diff --git a/src/main/java/carpet/fakes/LightStorageInterface.java b/src/main/java/carpet/fakes/LightStorageInterface.java deleted file mode 100644 index 9c91f2af..00000000 --- a/src/main/java/carpet/fakes/LightStorageInterface.java +++ /dev/null @@ -1,12 +0,0 @@ -package carpet.fakes; - -import net.minecraft.world.level.lighting.LightEngine; - -public interface LightStorageInterface extends Lighting_scarpetChunkCreationInterface -{ - void processRemoveLightData(long pos); - - void processRelight(LightEngine lightProvider, long pos); - - int getLightLevelByLong(long blockPos); -} diff --git a/src/main/java/carpet/fakes/Lighting_scarpetChunkCreationInterface.java b/src/main/java/carpet/fakes/Lighting_scarpetChunkCreationInterface.java index 8dc0ab68..7cfdb5fd 100644 --- a/src/main/java/carpet/fakes/Lighting_scarpetChunkCreationInterface.java +++ b/src/main/java/carpet/fakes/Lighting_scarpetChunkCreationInterface.java @@ -3,8 +3,4 @@ package carpet.fakes; public interface Lighting_scarpetChunkCreationInterface { void removeLightData(long pos); - - void relight(long pos); - - default void clearQueuedSectionBlocksPublicAccess(long sectionPos) {}; } diff --git a/src/main/java/carpet/mixins/BlockLightSectionStorage_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/BlockLightSectionStorage_scarpetChunkCreationMixin.java deleted file mode 100644 index 5111b614..00000000 --- a/src/main/java/carpet/mixins/BlockLightSectionStorage_scarpetChunkCreationMixin.java +++ /dev/null @@ -1,72 +0,0 @@ -package carpet.mixins; - -import org.spongepowered.asm.mixin.Mixin; - -import carpet.fakes.ChunkLightProviderInterface; -import carpet.fakes.LightStorageInterface; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.SectionPos; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.chunk.DataLayer; -import net.minecraft.world.level.chunk.LightChunkGetter; -import net.minecraft.world.level.lighting.BlockLightSectionStorage; -import net.minecraft.world.level.lighting.BlockLightSectionStorage.BlockDataLayerStorageMap; -import net.minecraft.world.level.lighting.LightEngine; -import net.minecraft.world.level.lighting.LayerLightSectionStorage; - -@Mixin(BlockLightSectionStorage.class) -public abstract class BlockLightSectionStorage_scarpetChunkCreationMixin extends LayerLightSectionStorage implements LightStorageInterface -{ - private BlockLightSectionStorage_scarpetChunkCreationMixin(final LightLayer lightType, final LightChunkGetter chunkProvider, final BlockDataLayerStorageMap lightData) - { - super(lightType, chunkProvider, lightData); - } - - @Override - public void processRelight(final LightEngine lightProvider, final long cPos) - { - //final DynamicGraphMinFixedPoint_resetChunkInterface levelPropagator = (DynamicGraphMinFixedPoint_resetChunkInterface) lightProvider.; - - for (int y = -1; y < 17; ++y) - { - final long sectionPos = SectionPos.asLong(SectionPos.x(cPos), y, SectionPos.z(cPos)); - final long pos = BlockPos.asLong(SectionPos.sectionToBlockCoord(SectionPos.x(sectionPos)), SectionPos.sectionToBlockCoord(y), SectionPos.sectionToBlockCoord(SectionPos.z(sectionPos))); - - if (!this.storingLightForSection(sectionPos)) - continue; - - for (final Direction dir : Direction.Plane.HORIZONTAL) - { - final DataLayer neighborLightArray = this.getDataLayerData(SectionPos.offset(sectionPos, dir)); - - if (neighborLightArray == null) - continue; - - final int ox = 15 * Math.max(dir.getStepX(), 0); - final int oz = 15 * Math.max(dir.getStepZ(), 0); - - final int dx = Math.abs(dir.getStepZ()); - final int dz = Math.abs(dir.getStepX()); - - for (int t = 0; t < 16; ++t) - for (int dy = 0; dy < 16; ++dy) - { - final long dst = BlockPos.offset(pos, ox + t * dx, dy, oz + t * dz); - lightProvider.checkBlock(BlockPos.of(dst)); - //final long src = BlockPos.offset(dst, dir); - - //final int srcLevel = ((ChunkLightProviderInterface) lightProvider).callGetCurrentLevelFromSection(neighborLightArray, src); - - //levelPropagator.cmInvokeUpdateLevel(src, dst, levelPropagator.cmCallGetPropagatedLevel(src, dst, srcLevel), true); - } - } - } - } - - @Override - public int getLightLevelByLong(long blockPos) - { - return getLightValue(blockPos); - } -} diff --git a/src/main/java/carpet/mixins/ChunkMap_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/ChunkMap_scarpetChunkCreationMixin.java index 5087666d..83450966 100644 --- a/src/main/java/carpet/mixins/ChunkMap_scarpetChunkCreationMixin.java +++ b/src/main/java/carpet/mixins/ChunkMap_scarpetChunkCreationMixin.java @@ -398,34 +398,8 @@ public abstract class ChunkMap_scarpetChunkCreationMixin implements ThreadedAnvi this.modified = true; this.promoteChunkMap(); - // Remove light for affected neighbors - for (final ChunkAccess chunk : affectedNeighbors) - ((ServerLightingProviderInterface) this.lightEngine).removeLightData(chunk); - // Schedule relighting of neighbors - - for (final ChunkAccess chunk : affectedNeighbors) - this.addRelightTicket(chunk.getPos()); - - this.tickTicketManager(); - - final List> lightFutures = new ArrayList<>(); - - for (final ChunkAccess chunk : affectedNeighbors) - { - final ChunkPos pos = chunk.getPos(); - - lightFutures.add(this.getChunkRangeFuture (this.updatingChunkMap.get(pos.toLong()), 1, (pos_) -> ChunkStatus.LIGHT).thenCompose( - either -> either.map( - list -> ((ServerLightingProviderInterface) this.lightEngine).relight(chunk), - unloaded -> { - this.releaseRelightTicket(pos); - return CompletableFuture.completedFuture(null); - } - ) - )); - } // Force generation to previous states // This ensures that the world is in a consistent state after this method @@ -473,7 +447,42 @@ public abstract class ChunkMap_scarpetChunkCreationMixin implements ThreadedAnvi report.put("layer_time_" + status.getName(), (int) (System.currentTimeMillis() - start)); } - report.put("relight_count", lightFutures.size()); + + + + + report.put("relight_count", affectedNeighbors.size()); + + // Remove light for affected neighbors + + for (final ChunkAccess chunk : affectedNeighbors) + ((ServerLightingProviderInterface) this.lightEngine).removeLightData(chunk); + + // Schedule relighting of neighbors + + for (final ChunkAccess chunk : affectedNeighbors) + this.addRelightTicket(chunk.getPos()); + + this.tickTicketManager(); + + final List> lightFutures = new ArrayList<>(); + + for (final ChunkAccess chunk : affectedNeighbors) + { + final ChunkPos pos = chunk.getPos(); + + lightFutures.add(this.getChunkRangeFuture (this.updatingChunkMap.get(pos.toLong()), 1, (pos_) -> ChunkStatus.LIGHT).thenCompose( + either -> either.map( + list -> ((ServerLightingProviderInterface) this.lightEngine).relight(chunk), + unloaded -> { + this.releaseRelightTicket(pos); + return CompletableFuture.completedFuture(null); + } + ) + )); + } + + final long relightStart = System.currentTimeMillis(); this.waitFor(lightFutures); diff --git a/src/main/java/carpet/mixins/LayerLightEngine_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/LayerLightEngine_scarpetChunkCreationMixin.java index 7b86b7b7..a4e7c6a7 100644 --- a/src/main/java/carpet/mixins/LayerLightEngine_scarpetChunkCreationMixin.java +++ b/src/main/java/carpet/mixins/LayerLightEngine_scarpetChunkCreationMixin.java @@ -1,45 +1,23 @@ package carpet.mixins; -import carpet.fakes.LightStorageInterface; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import carpet.fakes.ChunkLightProviderInterface; import carpet.fakes.Lighting_scarpetChunkCreationInterface; -import net.minecraft.world.level.chunk.DataLayer; import net.minecraft.world.level.lighting.LightEngine; import net.minecraft.world.level.lighting.LayerLightSectionStorage; @Mixin(LightEngine.class) -public abstract class LayerLightEngine_scarpetChunkCreationMixin implements Lighting_scarpetChunkCreationInterface, ChunkLightProviderInterface +public abstract class LayerLightEngine_scarpetChunkCreationMixin implements Lighting_scarpetChunkCreationInterface { @Shadow @Final protected LayerLightSectionStorage storage; - //@Shadow protected abstract void clearQueuedSectionBlocks(final long l); - @Override public void removeLightData(final long pos) { ((Lighting_scarpetChunkCreationInterface) this.storage).removeLightData(pos); } - - @Override - public void relight(final long pos) - { - ((Lighting_scarpetChunkCreationInterface) this.storage).relight(pos); - } - - @Override - public int callGetCurrentLevelFromSection(DataLayer array, long blockPos) { - return ((LightStorageInterface)storage).getLightLevelByLong(blockPos); - }; - - @Override - public void clearQueuedSectionBlocksPublicAccess(long sectionPos) - { - //clearQueuedSectionBlocks(sectionPos); - } } diff --git a/src/main/java/carpet/mixins/LayerLightSectionStorage_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/LayerLightSectionStorage_scarpetChunkCreationMixin.java index 72d793cd..7f41c737 100644 --- a/src/main/java/carpet/mixins/LayerLightSectionStorage_scarpetChunkCreationMixin.java +++ b/src/main/java/carpet/mixins/LayerLightSectionStorage_scarpetChunkCreationMixin.java @@ -6,29 +6,19 @@ import carpet.fakes.Lighting_scarpetChunkCreationInterface; import net.minecraft.core.SectionPos; import net.minecraft.world.level.chunk.DataLayer; import net.minecraft.world.level.lighting.DataLayerStorageMap; -import net.minecraft.world.level.lighting.LightEngine; import net.minecraft.world.level.lighting.LayerLightSectionStorage; 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.callback.CallbackInfo; -import carpet.fakes.LightStorageInterface; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; @Mixin(LayerLightSectionStorage.class) -public abstract class LayerLightSectionStorage_scarpetChunkCreationMixin implements LightStorageInterface +public abstract class LayerLightSectionStorage_scarpetChunkCreationMixin implements Lighting_scarpetChunkCreationInterface { @Shadow - protected abstract DataLayer getDataLayer(final long sectionPos, final boolean cached); - - //@Shadow - //protected abstract void clearQueuedSectionBlocks(final LightEngine storage, final long blockChunkPos); + protected abstract DataLayer getDataLayer(long sectionPos, boolean cached); @Shadow @Final @@ -38,79 +28,29 @@ public abstract class LayerLightSectionStorage_scarpetChunkCreationMixin impleme @Final protected DataLayerStorageMap updatingSectionData; - @Shadow protected abstract boolean storingLightForSection(final long sectionPos); + @Shadow protected abstract boolean storingLightForSection(long sectionPos); @Shadow @Final protected Long2ObjectMap queuedSections; - //@Shadow protected abstract void enableLightSources(final long l, final boolean bl); - - @Unique - private final LongSet removedChunks = new LongOpenHashSet(); - - @Unique - private final LongSet relightChunks = new LongOpenHashSet(); - @Override - public void removeLightData(final long pos) + public void removeLightData(long cPos) { - this.removedChunks.add(pos); - } - @Override - public void relight(final long pos) - { - this.relightChunks.add(pos); - } - - @Inject( - method = "markNewInconsistencies", - at = @At("HEAD") - ) - private void processData(final LightEngine lightProvider, final CallbackInfo ci) - { - // Process light removal - - for (final long cPos : this.removedChunks) + for (int y = -1; y < 17; ++y) { - for (int y = -1; y < 17; ++y) + long sectionPos = SectionPos.asLong(SectionPos.x(cPos), y, SectionPos.z(cPos)); + + this.queuedSections.remove(sectionPos); + + if (this.storingLightForSection(sectionPos)) { - final long sectionPos = SectionPos.asLong(SectionPos.x(cPos), y, SectionPos.z(cPos)); + if (this.changedSections.add(sectionPos)) + this.updatingSectionData.copyDataLayer(sectionPos); - this.queuedSections.remove(sectionPos); - - if (this.storingLightForSection(sectionPos)) - { - //((Lighting_scarpetChunkCreationInterface)lightProvider).clearQueuedSectionBlocksPublicAccess(sectionPos); - - if (this.changedSections.add(sectionPos)) - this.updatingSectionData.copyDataLayer(sectionPos); - - Arrays.fill(this.getDataLayer(sectionPos, true).getData(), (byte) 0); - } + Arrays.fill(this.getDataLayer(sectionPos, true).getData(), (byte) 0); } - - this.processRemoveLightData(cPos); } - - this.removedChunks.clear(); - - // Process relighting - - for (final long cPos : this.relightChunks) - this.processRelight(lightProvider, cPos); - - this.relightChunks.clear(); - } - - @Override - public void processRemoveLightData(final long pos) - { - } - - @Override - public void processRelight(final LightEngine lightProvider, final long pos) - { } } diff --git a/src/main/java/carpet/mixins/LevelLightEngine_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/LevelLightEngine_scarpetChunkCreationMixin.java index cfcbd2ba..55bb324c 100644 --- a/src/main/java/carpet/mixins/LevelLightEngine_scarpetChunkCreationMixin.java +++ b/src/main/java/carpet/mixins/LevelLightEngine_scarpetChunkCreationMixin.java @@ -28,14 +28,4 @@ public abstract class LevelLightEngine_scarpetChunkCreationMixin implements Ligh if (this.skyEngine != null) ((Lighting_scarpetChunkCreationInterface) this.skyEngine).removeLightData(pos); } - - @Override - public void relight(final long pos) - { - if (this.blockEngine != null) - ((Lighting_scarpetChunkCreationInterface) this.blockEngine).relight(pos); - - if (this.skyEngine != null) - ((Lighting_scarpetChunkCreationInterface) this.skyEngine).relight(pos); - } } diff --git a/src/main/java/carpet/mixins/SkyLightSectionStorage_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/SkyLightSectionStorage_scarpetChunkCreationMixin.java deleted file mode 100644 index 579a1cd4..00000000 --- a/src/main/java/carpet/mixins/SkyLightSectionStorage_scarpetChunkCreationMixin.java +++ /dev/null @@ -1,127 +0,0 @@ -package carpet.mixins; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -import carpet.fakes.ChunkLightProviderInterface; -import carpet.fakes.LightStorageInterface; -import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.SectionPos; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.chunk.DataLayer; -import net.minecraft.world.level.chunk.LightChunkGetter; -import net.minecraft.world.level.lighting.BlockLightSectionStorage.BlockDataLayerStorageMap; -import net.minecraft.world.level.lighting.LightEngine; -import net.minecraft.world.level.lighting.LayerLightSectionStorage; -import net.minecraft.world.level.lighting.SkyLightSectionStorage; - -@Mixin(SkyLightSectionStorage.class) -public abstract class SkyLightSectionStorage_scarpetChunkCreationMixin extends LayerLightSectionStorage implements LightStorageInterface -{ - protected SkyLightSectionStorage_scarpetChunkCreationMixin(final LightLayer lightType, final LightChunkGetter chunkProvider, final BlockDataLayerStorageMap lightData) - { - super(lightType, chunkProvider, lightData); - } - - /*@Shadow - @Final - private LongSet sectionsToAddSourcesTo; - - @Shadow - @Final - private LongSet sectionsToRemoveSourcesFrom; - - @Shadow - @Final - private LongSet sectionsWithSources; - */ - - @Shadow protected abstract boolean isAboveData(final long pos); - - //@Shadow protected abstract boolean lightOnInSection(final long sectionPos); - - @Override - public void processRemoveLightData(final long cPos) - { - for (int y = -1; y < 17; ++y) - { - final long sectionPos = SectionPos.asLong(SectionPos.x(cPos), y, SectionPos.z(cPos)); -/* do something with this later - this.sectionsToAddSourcesTo.remove(sectionPos); - this.sectionsToRemoveSourcesFrom.remove(sectionPos); - - this.sectionsWithSources.remove(sectionPos); - - */ - } - } - - @Override - public void processRelight(final LightEngine lightProvider, final long cPos) - { - //final DynamicGraphMinFixedPoint_resetChunkInterface levelPropagator = (DynamicGraphMinFixedPoint_resetChunkInterface) lightProvider; - - for (int y = -1; y < 17; ++y) - { - final long sectionPos = SectionPos.asLong(SectionPos.x(cPos), y, SectionPos.z(cPos)); - final long pos = BlockPos.asLong(SectionPos.sectionToBlockCoord(SectionPos.x(sectionPos)), SectionPos.sectionToBlockCoord(y), SectionPos.sectionToBlockCoord(SectionPos.z(sectionPos))); - - if (!this.storingLightForSection(sectionPos)) - continue; - - for (final Direction dir : Direction.Plane.HORIZONTAL) - { - long neighborCeilingSectionPos = SectionPos.offset(sectionPos, dir); - final DataLayer neighborLightArray = this.getDataLayerData(neighborCeilingSectionPos); - - DataLayer neighborCeilingLightArray = neighborLightArray; - - while (neighborCeilingLightArray == null && !this.isAboveData(neighborCeilingSectionPos)) - { - neighborCeilingSectionPos = SectionPos.offset(neighborCeilingSectionPos, Direction.UP); - neighborCeilingLightArray = this.getDataLayerData(neighborCeilingSectionPos); - } - - final int ox = 15 * Math.max(dir.getStepX(), 0); - final int oz = 15 * Math.max(dir.getStepZ(), 0); - - final int dx = Math.abs(dir.getStepZ()); - final int dz = Math.abs(dir.getStepX()); - - int emptyLightLevel = (neighborCeilingLightArray == null) - ? (this.lightOnInSection(SectionPos.getZeroNode(neighborCeilingSectionPos)) ? 0 : 15) - : 0; - int neighbourY = (neighborLightArray == null) - ? SectionPos.sectionToBlockCoord(SectionPos.y(neighborCeilingSectionPos)) - : 0; - - for (int t = 0; t < 16; ++t) - for (int dy = 0; dy < 16; ++dy) - { - final long dst = BlockPos.offset(pos, ox + t * dx, dy, oz + t * dz); - //long src = BlockPos.offset(dst, dir); - - //long adj_src = (neighborLightArray != null) - // ? src - // : BlockPos.asLong(BlockPos.getX(src), neighbourY, BlockPos.getZ(src)); - - //final int srcLevel = neighborCeilingLightArray != null - // ? ((ChunkLightProviderInterface) lightProvider).callGetCurrentLevelFromSection(neighborCeilingLightArray, adj_src) - // : emptyLightLevel; - - lightProvider.checkBlock(BlockPos.of(dst)); - //levelPropagator.cmInvokeUpdateLevel(src, dst, levelPropagator.cmCallGetPropagatedLevel(src, dst, srcLevel), true); - } - } - } - } - - @Override - public int getLightLevelByLong(long blockPos) - { - return getLightValue(blockPos); - } -} diff --git a/src/main/java/carpet/mixins/ThreadedLevelLightEngine_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/ThreadedLevelLightEngine_scarpetChunkCreationMixin.java index 71eeec3c..964fa8ed 100644 --- a/src/main/java/carpet/mixins/ThreadedLevelLightEngine_scarpetChunkCreationMixin.java +++ b/src/main/java/carpet/mixins/ThreadedLevelLightEngine_scarpetChunkCreationMixin.java @@ -3,6 +3,7 @@ package carpet.mixins; import java.util.concurrent.CompletableFuture; import java.util.function.IntSupplier; import net.minecraft.Util; +import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ThreadedLevelLightEngine; @@ -42,7 +43,7 @@ public abstract class ThreadedLevelLightEngine_scarpetChunkCreationMixin extends @Override public void removeLightData(final ChunkAccess chunk) { - final ChunkPos pos = chunk.getPos(); + ChunkPos pos = chunk.getPos(); chunk.setLightCorrect(false); this.addTask(pos.x, pos.z, () -> 0, ThreadedLevelLightEngine.TaskType.PRE_UPDATE, Util.name(() -> { @@ -54,15 +55,32 @@ public abstract class ThreadedLevelLightEngine_scarpetChunkCreationMixin extends } @Override - public CompletableFuture relight(final ChunkAccess chunk) + public CompletableFuture relight(ChunkAccess chunk) { - final ChunkPos pos = chunk.getPos(); + ChunkPos pos = chunk.getPos(); - propagateLightSources(pos); this.addTask(pos.x, pos.z, () -> 0, ThreadedLevelLightEngine.TaskType.PRE_UPDATE, Util.name(() -> { - - - ((Lighting_scarpetChunkCreationInterface) this).relight(SectionPos.getZeroNode(SectionPos.asLong(pos.x, 0, pos.z))); + super.propagateLightSources(pos); + int minY = chunk.getMinBuildHeight(); + int maxY = chunk.getMaxBuildHeight(); + int minX = pos.getMinBlockX(); + int minZ = pos.getMinBlockZ(); + BlockPos.MutableBlockPos poss = new BlockPos.MutableBlockPos(); + for (int x = -1; x < 17; ++x) + { + for (int z = -1; z < 17; ++z) + { + if (x > 0 && x < 16 && z > 0 && z < 16) + {// not really efficient way to do it, but hey, we have bigger problems with this + continue; + } + for (int y = minY; y < maxY; ++y) + { + poss.set(x + minX, y, z + minZ); + super.checkBlock(poss); + } + } + } }, () -> "Relight chunk " + pos )); diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 537aed2a..82bc4b93 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -48,8 +48,6 @@ "LevelLightEngine_scarpetChunkCreationMixin", "LayerLightEngine_scarpetChunkCreationMixin", "LayerLightSectionStorage_scarpetChunkCreationMixin", - "BlockLightSectionStorage_scarpetChunkCreationMixin", - "SkyLightSectionStorage_scarpetChunkCreationMixin", "DistanceManager_spawnChunksMixin", "ServerLevel_spawnChunksMixin", "ThreadedLevelLightEngine_scarpetChunkCreationMixin",