mirror of
https://github.com/plexusorg/Plex-FAWE.git
synced 2024-12-23 01:37:37 +00:00
fix: add chunk loc to tile entity location when trimming (#2500)
- fixes #2499
This commit is contained in:
parent
fe626a92e1
commit
d4b68b384b
@ -6,12 +6,11 @@ import com.fastasyncworldedit.core.queue.IChunkGet;
|
|||||||
import com.fastasyncworldedit.core.queue.IChunkSet;
|
import com.fastasyncworldedit.core.queue.IChunkSet;
|
||||||
import com.fastasyncworldedit.core.regions.RegionWrapper;
|
import com.fastasyncworldedit.core.regions.RegionWrapper;
|
||||||
import com.sk89q.worldedit.extent.Extent;
|
import com.sk89q.worldedit.extent.Extent;
|
||||||
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
import java.util.concurrent.Future;
|
|
||||||
|
|
||||||
public class HeightBoundExtent extends FaweRegionExtent {
|
public class HeightBoundExtent extends FaweRegionExtent {
|
||||||
|
|
||||||
@ -50,7 +49,8 @@ public class HeightBoundExtent extends FaweRegionExtent {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IChunkSet processSet(IChunk chunk, IChunkGet get, IChunkSet set) {
|
public IChunkSet processSet(IChunk chunk, IChunkGet get, IChunkSet set) {
|
||||||
if (trimY(set, min, max, true) | trimNBT(set, this::contains)) {
|
BlockVector3 chunkPos = chunk.getChunkBlockCoord().withY(0);
|
||||||
|
if (trimY(set, min, max, true) | trimNBT(set, this::contains, pos -> this.contains(pos.add(chunkPos)))) {
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -155,7 +155,9 @@ public interface IBatchProcessor {
|
|||||||
* Utility method to trim entity and blocks with a provided contains function.
|
* Utility method to trim entity and blocks with a provided contains function.
|
||||||
*
|
*
|
||||||
* @return false if chunk is empty of NBT
|
* @return false if chunk is empty of NBT
|
||||||
|
* @deprecated tiles are stored in chunk-normalised coordinate space and thus cannot use the same function as entities
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(forRemoval = true, since = "TODO")
|
||||||
default boolean trimNBT(IChunkSet set, Function<BlockVector3, Boolean> contains) {
|
default boolean trimNBT(IChunkSet set, Function<BlockVector3, Boolean> contains) {
|
||||||
Set<CompoundTag> ents = set.getEntities();
|
Set<CompoundTag> ents = set.getEntities();
|
||||||
if (!ents.isEmpty()) {
|
if (!ents.isEmpty()) {
|
||||||
@ -169,6 +171,26 @@ public interface IBatchProcessor {
|
|||||||
return !tiles.isEmpty() || !ents.isEmpty();
|
return !tiles.isEmpty() || !ents.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility method to trim entity and blocks with a provided contains function.
|
||||||
|
*
|
||||||
|
* @return false if chunk is empty of NBT
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
default boolean trimNBT(
|
||||||
|
IChunkSet set, Function<BlockVector3, Boolean> containsEntity, Function<BlockVector3, Boolean> containsTile
|
||||||
|
) {
|
||||||
|
Set<CompoundTag> ents = set.getEntities();
|
||||||
|
if (!ents.isEmpty()) {
|
||||||
|
ents.removeIf(ent -> !containsEntity.apply(ent.getEntityPosition().toBlockPoint()));
|
||||||
|
}
|
||||||
|
Map<BlockVector3, CompoundTag> tiles = set.getTiles();
|
||||||
|
if (!tiles.isEmpty()) {
|
||||||
|
tiles.entrySet().removeIf(blockVector3CompoundTagEntry -> !containsTile.apply(blockVector3CompoundTagEntry.getKey()));
|
||||||
|
}
|
||||||
|
return !tiles.isEmpty() || !ents.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Join two processors and return the result.
|
* Join two processors and return the result.
|
||||||
*/
|
*/
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.fastasyncworldedit.core.queue;
|
package com.fastasyncworldedit.core.queue;
|
||||||
|
|
||||||
import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock;
|
import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock;
|
||||||
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@ -33,6 +34,16 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
|
|||||||
*/
|
*/
|
||||||
int getZ();
|
int getZ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the minimum block coordinate of the chunk
|
||||||
|
*
|
||||||
|
* @return BlockVector3 of minimum block coordinate
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
default BlockVector3 getChunkBlockCoord() {
|
||||||
|
return BlockVector3.at(getX() << 4, getMinY(), getZ() << 4);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the chunk is a delegate, returns its parent's root
|
* If the chunk is a delegate, returns its parent's root
|
||||||
*
|
*
|
||||||
|
@ -22,7 +22,6 @@ package com.sk89q.worldedit.regions;
|
|||||||
import com.fastasyncworldedit.core.configuration.Settings;
|
import com.fastasyncworldedit.core.configuration.Settings;
|
||||||
import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock;
|
import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock;
|
||||||
import com.fastasyncworldedit.core.math.BlockVectorSet;
|
import com.fastasyncworldedit.core.math.BlockVectorSet;
|
||||||
import com.fastasyncworldedit.core.math.MutableBlockVector2;
|
|
||||||
import com.fastasyncworldedit.core.math.MutableBlockVector3;
|
import com.fastasyncworldedit.core.math.MutableBlockVector3;
|
||||||
import com.fastasyncworldedit.core.queue.Filter;
|
import com.fastasyncworldedit.core.queue.Filter;
|
||||||
import com.fastasyncworldedit.core.queue.IChunk;
|
import com.fastasyncworldedit.core.queue.IChunk;
|
||||||
@ -805,7 +804,8 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
|
|||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
trimY(set, minY, maxY, true);
|
trimY(set, minY, maxY, true);
|
||||||
trimNBT(set, this::contains);
|
BlockVector3 chunkPos = chunk.getChunkBlockCoord().withY(0);
|
||||||
|
trimNBT(set, this::contains, pos -> this.contains(pos.add(chunkPos)));
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
if (tx >= minX && bx <= maxX && tz >= minZ && bz <= maxZ) {
|
if (tx >= minX && bx <= maxX && tz >= minZ && bz <= maxZ) {
|
||||||
@ -868,8 +868,8 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
|
|||||||
}
|
}
|
||||||
set.setBlocks(layer, arr);
|
set.setBlocks(layer, arr);
|
||||||
}
|
}
|
||||||
|
final BlockVector3 chunkPos = BlockVector3.at(chunk.getX() << 4, 0, chunk.getZ() << 4);
|
||||||
trimNBT(set, this::contains);
|
trimNBT(set, this::contains, pos -> this.contains(pos.add(chunkPos)));
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -893,7 +893,8 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
trimY(set, minY, maxY, false);
|
trimY(set, minY, maxY, false);
|
||||||
trimNBT(set, this::contains);
|
BlockVector3 chunkPos = chunk.getChunkBlockCoord().withY(0);
|
||||||
|
trimNBT(set, this::contains, pos -> this.contains(pos.add(chunkPos)));
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
if (tx >= minX && bx <= maxX && tz >= minZ && bz <= maxZ) {
|
if (tx >= minX && bx <= maxX && tz >= minZ && bz <= maxZ) {
|
||||||
@ -943,7 +944,8 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
|
|||||||
}
|
}
|
||||||
set.setBlocks(layer, arr);
|
set.setBlocks(layer, arr);
|
||||||
}
|
}
|
||||||
trimNBT(set, bv3 -> !this.contains(bv3));
|
BlockVector3 chunkPos = chunk.getChunkBlockCoord().withY(0);
|
||||||
|
trimNBT(set, bv3 -> !this.contains(bv3), bv3 -> !this.contains(bv3.add(chunkPos)));
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
return set;
|
return set;
|
||||||
|
@ -425,7 +425,8 @@ public interface Region extends Iterable<BlockVector3>, Cloneable, IBatchProcess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (processExtra) {
|
if (processExtra) {
|
||||||
trimNBT(set, this::contains);
|
BlockVector3 chunkPos = chunk.getChunkBlockCoord().withY(0);
|
||||||
|
trimNBT(set, this::contains, pos -> this.contains(pos.add(chunkPos)));
|
||||||
}
|
}
|
||||||
return set;
|
return set;
|
||||||
} else {
|
} else {
|
||||||
@ -477,7 +478,8 @@ public interface Region extends Iterable<BlockVector3>, Cloneable, IBatchProcess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (processExtra) {
|
if (processExtra) {
|
||||||
trimNBT(set, bv3 -> !this.contains(bv3));
|
BlockVector3 chunkPos = chunk.getChunkBlockCoord().withY(0);
|
||||||
|
trimNBT(set, bv3 -> !this.contains(bv3), bv3 -> !this.contains(bv3.add(chunkPos)));
|
||||||
}
|
}
|
||||||
return set;
|
return set;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user