diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/CrudeIncrementalIntIdentityHashBiMapMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/CrudeIncrementalIntIdentityHashBiMapMixin.java index abec090..fa3736b 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/CrudeIncrementalIntIdentityHashBiMapMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/CrudeIncrementalIntIdentityHashBiMapMixin.java @@ -22,7 +22,7 @@ public abstract class CrudeIncrementalIntIdentityHashBiMapMixin implements Id private FastPaletteData reference; @Override - public K[] moonrise$getRawPalette(final FastPaletteData src) { + public final K[] moonrise$getRawPalette(final FastPaletteData src) { this.reference = src; return this.byId; } diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/HashMapPaletteMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/HashMapPaletteMixin.java index 1562501..b057d25 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/HashMapPaletteMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/HashMapPaletteMixin.java @@ -17,7 +17,7 @@ public abstract class HashMapPaletteMixin implements Palette, FastPalette< private CrudeIncrementalIntIdentityHashBiMap values; @Override - public T[] moonrise$getRawPalette(final FastPaletteData container) { + public final T[] moonrise$getRawPalette(final FastPaletteData container) { return ((FastPalette)this.values).moonrise$getRawPalette(container); } } diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/LinearPaletteMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/LinearPaletteMixin.java index 5c3e985..d936acd 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/LinearPaletteMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/LinearPaletteMixin.java @@ -16,7 +16,7 @@ public abstract class LinearPaletteMixin implements Palette, FastPalette container) { + public final T[] moonrise$getRawPalette(final FastPaletteData container) { return this.values; } } diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/SingleValuePaletteMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/SingleValuePaletteMixin.java index 91d6e95..57bf1f8 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/SingleValuePaletteMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/fast_palette/SingleValuePaletteMixin.java @@ -2,10 +2,18 @@ package ca.spottedleaf.moonrise.mixin.fast_palette; import ca.spottedleaf.moonrise.patches.fast_palette.FastPalette; import ca.spottedleaf.moonrise.patches.fast_palette.FastPaletteData; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.level.chunk.Palette; import net.minecraft.world.level.chunk.SingleValuePalette; +import org.objectweb.asm.Opcodes; 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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(SingleValuePalette.class) public abstract class SingleValuePaletteMixin implements Palette, FastPalette { @@ -13,8 +21,51 @@ public abstract class SingleValuePaletteMixin implements Palette, FastPale @Shadow private T value; + @Unique + private T[] rawPalette; + @Override - public T[] moonrise$getRawPalette(final FastPaletteData container) { - return (T[])new Object[] { this.value }; + public final T[] moonrise$getRawPalette(final FastPaletteData container) { + if (this.rawPalette != null) { + return this.rawPalette; + } + return this.rawPalette = (T[])new Object[] { this.value }; + } + + /** + * @reason Hook for updating the raw palette array on value update + * @author Spottedleaf + */ + @Inject( + method = "idFor", + at = @At( + value = "FIELD", + opcode = Opcodes.PUTFIELD, + target = "Lnet/minecraft/world/level/chunk/SingleValuePalette;value:Ljava/lang/Object;" + ) + ) + private void updateRawPalette1(final T object, final CallbackInfoReturnable cir) { + if (this.rawPalette != null) { + this.rawPalette[0] = object; + } + } + + /** + * @reason Hook for updating the raw palette array on section read + * @author Spottedleaf + */ + @Redirect( + method = "read", + at = @At( + value = "FIELD", + opcode = Opcodes.PUTFIELD, + target = "Lnet/minecraft/world/level/chunk/SingleValuePalette;value:Ljava/lang/Object;" + ) + ) + private void updateRawPalette2(final SingleValuePalette instance, final T value) { + ((SingleValuePaletteMixin)(Object)instance).value = value; + if (this.rawPalette != null) { + this.rawPalette[0] = value; + } } }