diff --git a/SpongeAPI b/SpongeAPI index fa59da123a7..6dbbd37f2de 160000 --- a/SpongeAPI +++ b/SpongeAPI @@ -1 +1 @@ -Subproject commit fa59da123a7f6f362e58d0c12f405f221faa6c14 +Subproject commit 6dbbd37f2de8538c8292f5fd71a83b661fbf3d85 diff --git a/src/main/java/org/spongepowered/common/world/level/chunk/SpongeEmptyChunk.java b/src/main/java/org/spongepowered/common/world/level/chunk/SpongeEmptyChunk.java index 01009ed3367..d6efe44e263 100644 --- a/src/main/java/org/spongepowered/common/world/level/chunk/SpongeEmptyChunk.java +++ b/src/main/java/org/spongepowered/common/world/level/chunk/SpongeEmptyChunk.java @@ -56,6 +56,7 @@ import org.spongepowered.api.world.chunk.ChunkState; import org.spongepowered.api.world.chunk.ChunkStates; import org.spongepowered.api.world.chunk.WorldChunk; +import org.spongepowered.api.world.schematic.Palette; import org.spongepowered.api.world.volume.stream.StreamOptions; import org.spongepowered.api.world.volume.stream.VolumeStream; import org.spongepowered.common.util.VecHelper; @@ -84,9 +85,14 @@ public SpongeEmptyChunk(Level level, ChunkAccess chunk) { private @Nullable Vector3i blockMin; private @Nullable Vector3i blockMax; + @Override + public Palette blockPalette() { + return ((World) this.level).blockPalette(); + } + @Override public World world() { - return (World) this.level; + return (World) this.level; } @Override diff --git a/src/main/java/org/spongepowered/common/world/schematic/PaletteWrapper.java b/src/main/java/org/spongepowered/common/world/schematic/PaletteWrapper.java new file mode 100644 index 00000000000..b643c418bc1 --- /dev/null +++ b/src/main/java/org/spongepowered/common/world/schematic/PaletteWrapper.java @@ -0,0 +1,116 @@ +/* + * This file is part of Sponge, licensed under the MIT License (MIT). + * + * Copyright (c) SpongePowered + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package org.spongepowered.common.world.schematic; + +import net.minecraft.core.IdMapper; +import org.spongepowered.api.registry.Registry; +import org.spongepowered.api.registry.RegistryHolder; +import org.spongepowered.api.world.schematic.Palette; +import org.spongepowered.api.world.schematic.PaletteReference; +import org.spongepowered.api.world.schematic.PaletteType; + +import java.util.Map; +import java.util.Optional; +import java.util.OptionalInt; +import java.util.Spliterator; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +public class PaletteWrapper implements Palette.Immutable { + + public static PaletteWrapper of(PaletteType type, IdMapper proxy, Registry registry) { + return new PaletteWrapper<>(type, proxy, registry); + } + + private final PaletteType type; + private final IdMapper proxy; + private final Registry registry; + + private PaletteWrapper(PaletteType type, IdMapper proxy, Registry registry) { + this.type = type; + this.proxy = proxy; + this.registry = registry; + } + + @Override + public PaletteType type() { + return this.type; + } + + @Override + public int highestId() { + return this.proxy.size(); + } + + @SuppressWarnings("unchecked") + @Override + public Optional> get(int id) { + final var n = this.proxy.byId(id); + if (n == null) { + return Optional.empty(); + } + final var apply = this.type.stringifier().apply(this.registry, (T) n); + return Optional.of(PaletteReference.byString(this.registry.type(), apply)); + } + + @SuppressWarnings("unchecked") + @Override + public OptionalInt get(T type) { + final var id = this.proxy.getId((NT) type); + if (id <= 0) { + return OptionalInt.empty(); + } + return OptionalInt.of(id); + } + + @SuppressWarnings("unchecked") + @Override + public Stream stream() { + return StreamSupport.stream(this.proxy::spliterator, + Spliterator.SIZED | Spliterator.ORDERED | Spliterator.IMMUTABLE, + false) + .map(n -> (T) n); + } + + @Override + public Stream> streamWithIds() { + return Stream.empty(); + } + + @SuppressWarnings("unchecked") + @Override + public Mutable asMutable(RegistryHolder registry) { + final var mutable = new MutableBimapPalette(this.type, (Registry) this.registry); + for (NT nt : this.proxy) { + mutable.orAssign((T) nt); + } + return mutable; + } + + @Override + public Immutable asImmutable() { + return this; + } +} diff --git a/src/main/java/org/spongepowered/common/world/schematic/SpongeSchematic.java b/src/main/java/org/spongepowered/common/world/schematic/SpongeSchematic.java index abc86ef8eff..3c4712aac9c 100644 --- a/src/main/java/org/spongepowered/common/world/schematic/SpongeSchematic.java +++ b/src/main/java/org/spongepowered/common/world/schematic/SpongeSchematic.java @@ -66,7 +66,7 @@ public SpongeSchematic(final Vector3i start, final Vector3i size, @Override public Palette blockPalette() { - return this.volume.getBlockPalette(); + return this.volume.blockPalette(); } @Override diff --git a/src/main/java/org/spongepowered/common/world/volume/block/SpongeBlockVolumeFactory.java b/src/main/java/org/spongepowered/common/world/volume/block/SpongeBlockVolumeFactory.java index 6339ce1f3ab..76b66320a7f 100644 --- a/src/main/java/org/spongepowered/common/world/volume/block/SpongeBlockVolumeFactory.java +++ b/src/main/java/org/spongepowered/common/world/volume/block/SpongeBlockVolumeFactory.java @@ -88,7 +88,7 @@ public BlockVolume.Immutable immutableOf(final BlockVolume.Streamable<@NonNull ? private ArrayImmutableBlockBuffer createImmutableFromBufferData(final ArrayMutableBlockBuffer arrayBuffer) { final BlockBackingData data = arrayBuffer.getCopiedBackingData(); - final Palette.Immutable immutablePalette = arrayBuffer.getPalette().asImmutable(); + final Palette.Immutable immutablePalette = arrayBuffer.blockPalette().asImmutable(); return new ArrayImmutableBlockBuffer(immutablePalette, arrayBuffer.min(), arrayBuffer.size(), data); } diff --git a/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/AbstractReferentArchetypeVolume.java b/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/AbstractReferentArchetypeVolume.java index 91f303a9ae4..042bfd98460 100644 --- a/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/AbstractReferentArchetypeVolume.java +++ b/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/AbstractReferentArchetypeVolume.java @@ -26,6 +26,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.block.BlockType; import org.spongepowered.api.block.entity.BlockEntityArchetype; import org.spongepowered.api.entity.EntityArchetype; import org.spongepowered.api.fluid.FluidState; @@ -35,6 +36,7 @@ import org.spongepowered.api.util.rotation.Rotation; import org.spongepowered.api.util.transformation.Transformation; import org.spongepowered.api.world.biome.Biome; +import org.spongepowered.api.world.schematic.Palette; import org.spongepowered.api.world.volume.Volume; import org.spongepowered.api.world.volume.archetype.ArchetypeVolume; import org.spongepowered.api.world.volume.archetype.block.entity.BlockEntityArchetypeVolume; @@ -118,6 +120,11 @@ protected Vector3d transformStreamBlockPosition(final Vector3d blockPosition) { return this.transformation.transformPosition(blockPosition); } + @Override + public Palette blockPalette() { + return this.reference.get().blockPalette(); + } + @Override public Vector3i min() { return this.transformBlockSize(Vector3i::min); diff --git a/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/SpongeArchetypeVolume.java b/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/SpongeArchetypeVolume.java index 1b358a6161e..5980ac35abf 100644 --- a/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/SpongeArchetypeVolume.java +++ b/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/SpongeArchetypeVolume.java @@ -105,6 +105,11 @@ private SpongeArchetypeVolume(final Vector3i start, final Vector3i size, final P this.entities = new ObjectArrayMutableEntityArchetypeBuffer(start, size); } + @Override + public Palette blockPalette() { + return this.blocks.blockPalette(); + } + @Override public Optional blockEntityArchetype(final int x, final int y, final int z) { return this.blockEntities.blockEntityArchetype(x, y, z); @@ -217,10 +222,6 @@ public void removeBlockEntity(final int x, final int y, final int z) { this.blockEntities.removeBlockEntity(x, y, z); } - public Palette getBlockPalette() { - return this.blocks.getPalette(); - } - public Palette getBiomePalette() { return this.biomes.getPalette(); } diff --git a/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/blockentity/AbstractMutableBlockEntityArchetypeBuffer.java b/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/blockentity/AbstractMutableBlockEntityArchetypeBuffer.java index 34d15b845b4..ce1c33049e6 100644 --- a/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/blockentity/AbstractMutableBlockEntityArchetypeBuffer.java +++ b/src/main/java/org/spongepowered/common/world/volume/buffer/archetype/blockentity/AbstractMutableBlockEntityArchetypeBuffer.java @@ -79,8 +79,8 @@ public boolean removeBlock(final int x, final int y, final int z) { @Override - public Palette getPalette() { - return this.blockBuffer.getPalette(); + public Palette blockPalette() { + return this.blockBuffer.blockPalette(); } @Override diff --git a/src/main/java/org/spongepowered/common/world/volume/buffer/block/AbstractBlockBuffer.java b/src/main/java/org/spongepowered/common/world/volume/buffer/block/AbstractBlockBuffer.java index e21445bc4e6..5e14e26aa1c 100644 --- a/src/main/java/org/spongepowered/common/world/volume/buffer/block/AbstractBlockBuffer.java +++ b/src/main/java/org/spongepowered/common/world/volume/buffer/block/AbstractBlockBuffer.java @@ -40,7 +40,8 @@ protected AbstractBlockBuffer(final Vector3i start, final Vector3i size) { super(start, size); } - public abstract Palette getPalette(); + @Override + public abstract Palette blockPalette(); } diff --git a/src/main/java/org/spongepowered/common/world/volume/buffer/block/ArrayImmutableBlockBuffer.java b/src/main/java/org/spongepowered/common/world/volume/buffer/block/ArrayImmutableBlockBuffer.java index b17d55955fa..6f000477a92 100644 --- a/src/main/java/org/spongepowered/common/world/volume/buffer/block/ArrayImmutableBlockBuffer.java +++ b/src/main/java/org/spongepowered/common/world/volume/buffer/block/ArrayImmutableBlockBuffer.java @@ -79,7 +79,7 @@ public ArrayImmutableBlockBuffer(final Palette.Immutable } @Override - public Palette getPalette() { + public Palette blockPalette() { return this.palette; } diff --git a/src/main/java/org/spongepowered/common/world/volume/buffer/block/ArrayMutableBlockBuffer.java b/src/main/java/org/spongepowered/common/world/volume/buffer/block/ArrayMutableBlockBuffer.java index 39cd5eda522..cdad4844220 100644 --- a/src/main/java/org/spongepowered/common/world/volume/buffer/block/ArrayMutableBlockBuffer.java +++ b/src/main/java/org/spongepowered/common/world/volume/buffer/block/ArrayMutableBlockBuffer.java @@ -118,7 +118,7 @@ public ArrayMutableBlockBuffer(final Palette palette, fin } @Override - public Palette getPalette() { + public Palette blockPalette() { return this.palette; } diff --git a/src/main/java/org/spongepowered/common/world/volume/buffer/blockentity/AbstractMutableBlockEntityBuffer.java b/src/main/java/org/spongepowered/common/world/volume/buffer/blockentity/AbstractMutableBlockEntityBuffer.java index 9d66b8b0fe9..4d77e47ebd2 100644 --- a/src/main/java/org/spongepowered/common/world/volume/buffer/blockentity/AbstractMutableBlockEntityBuffer.java +++ b/src/main/java/org/spongepowered/common/world/volume/buffer/blockentity/AbstractMutableBlockEntityBuffer.java @@ -74,8 +74,8 @@ public boolean removeBlock(final int x, final int y, final int z) { @Override - public Palette getPalette() { - return this.blockBuffer.getPalette(); + public Palette blockPalette() { + return this.blockBuffer.blockPalette(); } @Override diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelAccessorMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelAccessorMixin_API.java index 72bd036e578..8fbcb34e6c5 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelAccessorMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelAccessorMixin_API.java @@ -25,19 +25,24 @@ package org.spongepowered.common.mixin.api.minecraft.world.level; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.storage.LevelData; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.api.block.BlockType; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.util.PositionOutOfBoundsException; import org.spongepowered.api.world.BlockChangeFlag; import org.spongepowered.api.world.WorldLike; import org.spongepowered.api.world.difficulty.Difficulty; +import org.spongepowered.api.world.schematic.Palette; +import org.spongepowered.api.world.schematic.PaletteTypes; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Interface.Remap; @@ -50,6 +55,7 @@ import org.spongepowered.common.event.tracking.phase.plugin.PluginPhase; import org.spongepowered.common.util.Constants; import org.spongepowered.common.world.SpongeBlockChangeFlag; +import org.spongepowered.common.world.schematic.PaletteWrapper; import org.spongepowered.common.world.volume.VolumeStreamUtils; import org.spongepowered.math.vector.Vector3i; @@ -68,6 +74,18 @@ public interface LevelAccessorMixin_API

> extends WorldLik @Shadow LevelData shadow$getLevelData(); //@formatter:on + // BlockVolume + + @SuppressWarnings("unchecked") + @Override + default Palette blockPalette() { + return PaletteWrapper.of( + PaletteTypes.BLOCK_STATE_PALETTE.get(), + Block.BLOCK_STATE_REGISTRY, + (org.spongepowered.api.registry.Registry) ((LevelAccessor) (Object) this).registryAccess().registryOrThrow(Registries.BLOCK) + ); + } + // MutableBiomeVolume @Override diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelReaderMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelReaderMixin_API.java index 38f527bd840..236f5c76662 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelReaderMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/LevelReaderMixin_API.java @@ -26,36 +26,44 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.CollisionGetter; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.levelgen.Heightmap; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.block.BlockType; import org.spongepowered.api.block.entity.BlockEntity; import org.spongepowered.api.entity.Entity; +import org.spongepowered.api.registry.Registry; import org.spongepowered.api.util.AABB; import org.spongepowered.api.world.HeightType; import org.spongepowered.api.world.WorldType; import org.spongepowered.api.world.biome.Biome; import org.spongepowered.api.world.border.WorldBorder; import org.spongepowered.api.world.chunk.Chunk; +import org.spongepowered.api.world.schematic.Palette; +import org.spongepowered.api.world.schematic.PaletteTypes; import org.spongepowered.api.world.volume.game.Region; import org.spongepowered.api.world.volume.stream.StreamOptions; import org.spongepowered.api.world.volume.stream.VolumeStream; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.common.bridge.world.level.border.WorldBorderBridge; +import org.spongepowered.common.world.schematic.PaletteWrapper; import org.spongepowered.common.world.volume.VolumeStreamUtils; import org.spongepowered.math.vector.Vector3d; import org.spongepowered.math.vector.Vector3i; import java.util.Objects; -@SuppressWarnings({"RedundantTypeArguments", "unchecked", "RedundantCast"}) +@SuppressWarnings({"RedundantTypeArguments", "RedundantCast"}) @Mixin(LevelReader.class) public interface LevelReaderMixin_API> extends Region { @@ -70,8 +78,21 @@ public interface LevelReaderMixin_API> extends Region { @Shadow net.minecraft.world.level.dimension.DimensionType shadow$dimensionType(); @Shadow boolean shadow$containsAnyLiquid(net.minecraft.world.phys.AABB bb); @Shadow Holder shadow$getBiome(BlockPos p_226691_1_); + @Shadow RegistryAccess shadow$registryAccess(); // @formatter:on + // BlockVolume + + @SuppressWarnings("unchecked") + @Override + default Palette blockPalette() { + return PaletteWrapper.of( + PaletteTypes.BLOCK_STATE_PALETTE.get(), + Block.BLOCK_STATE_REGISTRY, + (Registry) this.shadow$registryAccess().registryOrThrow(Registries.BLOCK) + ); + } + // Region @Override diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/ChunkAccessMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/ChunkAccessMixin_API.java index 5ccc1a3555c..2821db02344 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/ChunkAccessMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/ChunkAccessMixin_API.java @@ -24,12 +24,15 @@ */ package org.spongepowered.common.mixin.api.minecraft.world.level.chunk; +import net.minecraft.core.registries.Registries; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunkSection; -import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.levelgen.Heightmap; +import org.spongepowered.api.block.BlockState; import org.spongepowered.api.block.BlockType; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.fluid.FluidType; @@ -40,11 +43,14 @@ import org.spongepowered.api.world.biome.Biome; import org.spongepowered.api.world.chunk.Chunk; import org.spongepowered.api.world.chunk.ChunkState; +import org.spongepowered.api.world.schematic.Palette; +import org.spongepowered.api.world.schematic.PaletteTypes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.common.util.MissingImplementationException; import org.spongepowered.common.util.SpongeTicks; import org.spongepowered.common.util.VecHelper; +import org.spongepowered.common.world.schematic.PaletteWrapper; import org.spongepowered.common.world.volume.VolumeStreamUtils; import org.spongepowered.math.vector.Vector3i; @@ -63,6 +69,15 @@ public abstract class ChunkAccessMixin_API

> implements Chunk< @Shadow public abstract LevelChunkSection shadow$getSection(int p_187657_); @Shadow public abstract void shadow$setUnsaved(boolean p_62094_); // @formatter:on + @SuppressWarnings("unchecked") + @Override + public Palette blockPalette() { + return PaletteWrapper.of( + PaletteTypes.BLOCK_STATE_PALETTE.get(), + Block.BLOCK_STATE_REGISTRY, + (org.spongepowered.api.registry.Registry) Registries.BLOCK + ); + } @Override public void addEntity(final Entity entity) { diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/LevelChunkMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/LevelChunkMixin_API.java index e9e09161808..eb2f28f511c 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/LevelChunkMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/LevelChunkMixin_API.java @@ -34,6 +34,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunkSection; @@ -44,6 +45,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.block.BlockType; import org.spongepowered.api.block.entity.BlockEntity; import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.entity.Entity; @@ -57,6 +59,8 @@ import org.spongepowered.api.world.WorldLike; import org.spongepowered.api.world.biome.Biome; import org.spongepowered.api.world.chunk.WorldChunk; +import org.spongepowered.api.world.schematic.Palette; +import org.spongepowered.api.world.schematic.PaletteTypes; import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.api.world.volume.stream.StreamOptions; @@ -76,6 +80,7 @@ import org.spongepowered.common.util.MissingImplementationException; import org.spongepowered.common.util.SpongeTicks; import org.spongepowered.common.util.VecHelper; +import org.spongepowered.common.world.schematic.PaletteWrapper; import org.spongepowered.common.world.storage.SpongeChunkLayout; import org.spongepowered.common.world.volume.VolumeStreamUtils; import org.spongepowered.common.world.volume.buffer.biome.ObjectArrayMutableBiomeBuffer; @@ -118,6 +123,16 @@ public LevelChunkMixin_API( super($$0, $$1, $$2, $$3, $$4, $$5, $$6); } + @SuppressWarnings("unchecked") + @Override + public Palette blockPalette() { + return PaletteWrapper.of( + PaletteTypes.BLOCK_STATE_PALETTE.get(), + Block.BLOCK_STATE_REGISTRY, + (org.spongepowered.api.registry.Registry) this.level.registryAccess().registry(Registries.BLOCK).get() + ); + } + @Override public Biome biome(final int x, final int y, final int z) { if (!this.contains(x, y, z)) { diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/ProtoChunkMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/ProtoChunkMixin_API.java index 714cdd0702b..ebc6e4ad0df 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/ProtoChunkMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/chunk/ProtoChunkMixin_API.java @@ -27,8 +27,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.ProtoChunk; @@ -38,20 +40,25 @@ import net.minecraft.world.level.levelgen.blending.BlendingData; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.block.BlockType; import org.spongepowered.api.block.entity.BlockEntity; import org.spongepowered.api.util.PositionOutOfBoundsException; import org.spongepowered.api.util.Ticks; import org.spongepowered.api.world.biome.Biome; import org.spongepowered.api.world.generation.GenerationChunk; +import org.spongepowered.api.world.schematic.Palette; +import org.spongepowered.api.world.schematic.PaletteTypes; import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.api.world.volume.stream.StreamOptions; import org.spongepowered.api.world.volume.stream.VolumeStream; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.common.SpongeCommon; import org.spongepowered.common.data.holder.SpongeServerLocationBaseDataHolder; import org.spongepowered.common.util.Constants; import org.spongepowered.common.util.MissingImplementationException; import org.spongepowered.common.util.SpongeTicks; +import org.spongepowered.common.world.schematic.PaletteWrapper; import org.spongepowered.common.world.storage.SpongeChunkLayout; import org.spongepowered.common.world.volume.VolumeStreamUtils; import org.spongepowered.math.vector.Vector3i; @@ -83,6 +90,16 @@ public ProtoChunkMixin_API( super($$0, $$1, $$2, $$3, $$4, $$5, $$6); } + @SuppressWarnings("unchecked") + @Override + public Palette blockPalette() { + return PaletteWrapper.of( + PaletteTypes.BLOCK_STATE_PALETTE.get(), + Block.BLOCK_STATE_REGISTRY, + (org.spongepowered.api.registry.Registry) SpongeCommon.vanillaRegistry(Registries.BLOCK) + ); + } + @Override public VolumeStream biomeStream(final Vector3i min, final Vector3i max, final StreamOptions options) { throw new UnsupportedOperationException("Cannot stream biomes on ProtoChunk"); diff --git a/src/test/java/org/spongepowered/common/world/volume/archetype/ArchetypeVolumeTest.java b/src/test/java/org/spongepowered/common/world/volume/archetype/ArchetypeVolumeTest.java index 28d802a8844..9df57e20f71 100644 --- a/src/test/java/org/spongepowered/common/world/volume/archetype/ArchetypeVolumeTest.java +++ b/src/test/java/org/spongepowered/common/world/volume/archetype/ArchetypeVolumeTest.java @@ -29,11 +29,13 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.spongepowered.api.block.BlockState; +import org.spongepowered.api.block.BlockType; import org.spongepowered.api.block.entity.BlockEntityArchetype; import org.spongepowered.api.entity.EntityArchetype; import org.spongepowered.api.fluid.FluidState; import org.spongepowered.api.util.transformation.Transformation; import org.spongepowered.api.world.biome.Biome; +import org.spongepowered.api.world.schematic.Palette; import org.spongepowered.api.world.volume.archetype.ArchetypeVolume; import org.spongepowered.api.world.volume.archetype.entity.EntityArchetypeEntry; import org.spongepowered.api.world.volume.stream.StreamOptions; @@ -178,6 +180,11 @@ public boolean setBiome(final int x, final int y, final int z, final Biome biome return false; } + @Override + public Palette blockPalette() { + return null; + } + @Override public BlockState block(final int x, final int y, final int z) { return null;