Implement CuboidClipboard

This commit is contained in:
Jesse Boyd 2018-08-17 01:54:13 +10:00
parent 50fce3147f
commit d85ad6e116
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
4 changed files with 535 additions and 680 deletions

View File

@ -37,6 +37,7 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.function.Consumer;
import javax.annotation.Nullable;
@ -107,6 +108,10 @@ public class Schematic {
}
}
public EditSession paste(World world, Vector to, boolean allowUndo, boolean pasteAir, @Nullable Transform transform) {
return paste(world, to, allowUndo, pasteAir, true, transform);
}
/**
* Paste this schematic in a world
*
@ -117,7 +122,7 @@ public class Schematic {
* @param transform
* @return
*/
public EditSession paste(World world, Vector to, boolean allowUndo, boolean pasteAir, @Nullable Transform transform) {
public EditSession paste(World world, Vector to, boolean allowUndo, boolean pasteAir, boolean copyEntities, @Nullable Transform transform) {
checkNotNull(world);
checkNotNull(to);
Region region = clipboard.getRegion();
@ -145,6 +150,7 @@ public class Schematic {
if (transform != null && !transform.isIdentity()) {
copy.setTransform(transform);
}
copy.setCopyEntities(copyEntities);
if (sourceMask != null) {
new MaskTraverser(sourceMask).reset(extent);
copy.setSourceMask(sourceMask);

View File

@ -23,7 +23,9 @@ import com.boydti.fawe.jnbt.anvil.generator.*;
import com.boydti.fawe.object.PseudoRandom;
import com.sk89q.worldedit.*;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.util.Countable;
import com.sk89q.worldedit.world.block.*;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.mask.Mask;
@ -35,10 +37,9 @@ import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.biome.BaseBiome;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockTypes;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
@ -297,6 +298,67 @@ public interface Extent extends InputExtent, OutputExtent {
addOre(region, mask, BlockTypes.EMERALD_ORE.getDefaultState(), 5, 1, 100, 4, 31);
}
/**
* Get the block distribution inside a region.
*
* @param region a region
* @return the results
*/
default List<Countable<BlockType>> getBlockDistribution(final Region region) {
int[] counter = new int[BlockTypes.size()];
for (final Vector pt : region) {
BlockType type = getBlockType(pt);
counter[type.getInternalId()]++;
}
List<Countable<BlockType>> distribution = new ArrayList<>();
for (int i = 0; i < counter.length; i++) {
int count = counter[i];
if (count != 0) {
distribution.add(new Countable<>(BlockTypes.get(i), count));
}
}
Collections.sort(distribution);
return distribution;
}
/**
* Get the block distribution (with data values) inside a region.
*
* @param region a region
* @return the results
*/
default List<Countable<BlockStateHolder>> getBlockDistributionWithData(final Region region) {
int[][] counter = new int[BlockTypes.size()][];
for (final Vector pt : region) {
BlockStateHolder blk = this.getBlock(pt);
BlockType type = blk.getBlockType();
int[] stateCounter = counter[type.getInternalId()];
if (stateCounter == null) {
counter[type.getInternalId()] = stateCounter = new int[type.getMaxStateId() + 1];
}
stateCounter[blk.getInternalPropertiesId()]++;
}
List<Countable<BlockStateHolder>> distribution = new ArrayList<>();
for (int typeId = 0; typeId < counter.length; typeId++) {
BlockType type = BlockTypes.get(typeId);
int[] stateCount = counter[typeId];
if (stateCount != null) {
for (int propId = 0; propId < stateCount.length; propId++) {
int count = stateCount[propId];
if (count != 0) {
BlockStateHolder state = type.withPropertyId(propId);
distribution.add(new Countable<>(state, count));
}
}
}
}
// Collections.reverse(distribution);
return distribution;
}
@Nullable
@Override
default Operation commit() {

View File

@ -132,6 +132,10 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
return region.clone();
}
public void setRegion(Region region) {
this.region = region;
}
@Override
public Vector getOrigin() {
return origin;