Implement CuboidClipboard

Dieser Commit ist enthalten in:
Jesse Boyd 2018-08-17 01:54:13 +10:00
Ursprung 50fce3147f
Commit d85ad6e116
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 59F1DE6293AF6E1F
4 geänderte Dateien mit 535 neuen und 680 gelöschten Zeilen

Datei anzeigen

@ -37,6 +37,7 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.function.Consumer;
import javax.annotation.Nullable; 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 * Paste this schematic in a world
* *
@ -117,7 +122,7 @@ public class Schematic {
* @param transform * @param transform
* @return * @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(world);
checkNotNull(to); checkNotNull(to);
Region region = clipboard.getRegion(); Region region = clipboard.getRegion();
@ -145,6 +150,7 @@ public class Schematic {
if (transform != null && !transform.isIdentity()) { if (transform != null && !transform.isIdentity()) {
copy.setTransform(transform); copy.setTransform(transform);
} }
copy.setCopyEntities(copyEntities);
if (sourceMask != null) { if (sourceMask != null) {
new MaskTraverser(sourceMask).reset(extent); new MaskTraverser(sourceMask).reset(extent);
copy.setSourceMask(sourceMask); copy.setSourceMask(sourceMask);

Datei anzeigen

@ -23,7 +23,9 @@ import com.boydti.fawe.jnbt.anvil.generator.*;
import com.boydti.fawe.object.PseudoRandom; import com.boydti.fawe.object.PseudoRandom;
import com.sk89q.worldedit.*; import com.sk89q.worldedit.*;
import com.sk89q.worldedit.blocks.BaseBlock; 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.BaseEntity;
import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.mask.Mask; 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.regions.Region;
import com.sk89q.worldedit.world.biome.BaseBiome; import com.sk89q.worldedit.world.biome.BaseBiome;
import com.sk89q.worldedit.world.block.BlockState; 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 javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.ThreadLocalRandom; 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); 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 @Nullable
@Override @Override
default Operation commit() { default Operation commit() {

Datei anzeigen

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