From a5038c08564e3ccaae85ca96a3d73b89c2b56b6a Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 16 Oct 2023 15:51:31 -0700 Subject: [PATCH] Initialise default nibble arrays in ChunkAccess directly When ChunkAccess was converted to an abstract class some versions ago, the code to initialise nibble arrays should have been moved. However, the code was not moved and so now mods constructing their own implementations of ChunkAccess would not have the nibble arrays initialised. Fixes https://github.com/PaperMC/Starlight/issues/186 --- .../starlight/chunk/ChunkAccessMixin.java | 18 +++++++++++-- .../starlight/chunk/LevelChunkMixin.java | 20 -------------- .../starlight/chunk/ProtoChunkMixin.java | 27 ------------------- 3 files changed, 16 insertions(+), 49 deletions(-) diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/ChunkAccessMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/ChunkAccessMixin.java index 50f9d28..e996902 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/ChunkAccessMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/ChunkAccessMixin.java @@ -2,7 +2,15 @@ package ca.spottedleaf.moonrise.mixin.starlight.chunk; import ca.spottedleaf.moonrise.patches.starlight.chunk.StarlightChunk; import ca.spottedleaf.moonrise.patches.starlight.light.SWMRNibbleArray; +import ca.spottedleaf.moonrise.patches.starlight.light.StarLightEngine; +import net.minecraft.core.Registry; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ImposterProtoChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.UpgradeData; +import net.minecraft.world.level.levelgen.blending.BlendingData; import net.minecraft.world.level.lighting.ChunkSkyLightSources; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -72,7 +80,7 @@ public abstract class ChunkAccessMixin implements StarlightChunk { } /** - * @reason Remove unused skylight sources + * @reason Remove unused skylight sources, and initialise nibble arrays. * @author Spottedleaf */ @Inject( @@ -81,8 +89,14 @@ public abstract class ChunkAccessMixin implements StarlightChunk { value = "RETURN" ) ) - private void nullSources(final CallbackInfo ci) { + private void nullSources(ChunkPos chunkPos, UpgradeData upgradeData, LevelHeightAccessor levelHeightAccessor, + Registry registry, long l, LevelChunkSection[] levelChunkSections, BlendingData blendingData, + CallbackInfo ci) { this.skyLightSources = null; + if (!((Object)this instanceof ImposterProtoChunk)) { + this.setBlockNibbles(StarLightEngine.getFilledEmptyLight(levelHeightAccessor)); + this.setSkyNibbles(StarLightEngine.getFilledEmptyLight(levelHeightAccessor)); + } } /** diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/LevelChunkMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/LevelChunkMixin.java index ef3232e..51366db 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/LevelChunkMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/LevelChunkMixin.java @@ -1,18 +1,11 @@ package ca.spottedleaf.moonrise.mixin.starlight.chunk; import ca.spottedleaf.moonrise.patches.starlight.chunk.StarlightChunk; -import ca.spottedleaf.moonrise.patches.starlight.light.StarLightEngine; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.ProtoChunk; -import net.minecraft.world.level.chunk.UpgradeData; -import net.minecraft.world.level.levelgen.blending.BlendingData; import net.minecraft.world.level.lighting.ChunkSkyLightSources; -import net.minecraft.world.ticks.LevelChunkTicks; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -37,19 +30,6 @@ public abstract class LevelChunkMixin implements StarlightChunk { this.setBlockEmptinessMap(((StarlightChunk)protoChunk).getBlockEmptinessMap()); } - /** - * Initialises the nibble arrays to default values. - * TODO since this is a constructor inject, check for new constructors on update. - */ - @Inject( - method = "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/world/level/chunk/UpgradeData;Lnet/minecraft/world/ticks/LevelChunkTicks;Lnet/minecraft/world/ticks/LevelChunkTicks;J[Lnet/minecraft/world/level/chunk/LevelChunkSection;Lnet/minecraft/world/level/chunk/LevelChunk$PostLoadProcessor;Lnet/minecraft/world/level/levelgen/blending/BlendingData;)V", - at = @At("TAIL") - ) - public void onConstruct(Level level, ChunkPos chunkPos, UpgradeData upgradeData, LevelChunkTicks levelChunkTicks, LevelChunkTicks levelChunkTicks2, long l, LevelChunkSection[] levelChunkSections, LevelChunk.PostLoadProcessor postLoadProcessor, BlendingData blendingData, CallbackInfo ci) { - this.setBlockNibbles(StarLightEngine.getFilledEmptyLight(level)); - this.setSkyNibbles(StarLightEngine.getFilledEmptyLight(level)); - } - /** * @reason Remove unused skylight sources * @author Spottedleaf diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/ProtoChunkMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/ProtoChunkMixin.java index 25785bf..f90bb5e 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/ProtoChunkMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/chunk/ProtoChunkMixin.java @@ -1,43 +1,16 @@ package ca.spottedleaf.moonrise.mixin.starlight.chunk; import ca.spottedleaf.moonrise.patches.starlight.chunk.StarlightChunk; -import ca.spottedleaf.moonrise.patches.starlight.light.StarLightEngine; -import net.minecraft.core.Registry; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.chunk.ImposterProtoChunk; -import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.ProtoChunk; -import net.minecraft.world.level.chunk.UpgradeData; -import net.minecraft.world.level.levelgen.blending.BlendingData; import net.minecraft.world.level.lighting.ChunkSkyLightSources; -import net.minecraft.world.ticks.ProtoChunkTicks; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ProtoChunk.class) public abstract class ProtoChunkMixin implements StarlightChunk { - /** - * Initialises the nibble arrays to default values. - * TODO since this is a constructor inject, check for new constructors on update. - */ - @Inject( - method = "(Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/world/level/chunk/UpgradeData;[Lnet/minecraft/world/level/chunk/LevelChunkSection;Lnet/minecraft/world/ticks/ProtoChunkTicks;Lnet/minecraft/world/ticks/ProtoChunkTicks;Lnet/minecraft/world/level/LevelHeightAccessor;Lnet/minecraft/core/Registry;Lnet/minecraft/world/level/levelgen/blending/BlendingData;)V", - at = @At("TAIL") - ) - public void onConstruct(ChunkPos chunkPos, UpgradeData upgradeData, LevelChunkSection[] levelChunkSections, ProtoChunkTicks protoChunkTicks, ProtoChunkTicks protoChunkTicks2, LevelHeightAccessor levelHeightAccessor, Registry registry, BlendingData blendingData, CallbackInfo ci) { - if ((Object)this instanceof ImposterProtoChunk) { - return; - } - this.setBlockNibbles(StarLightEngine.getFilledEmptyLight(levelHeightAccessor)); - this.setSkyNibbles(StarLightEngine.getFilledEmptyLight(levelHeightAccessor)); - } - /** * @reason Remove unused skylight sources * @author Spottedleaf