/* * WorldEdit, a Minecraft world manipulation toolkit * Copyright (C) sk89q * Copyright (C) WorldEdit team and contributors * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ package com.sk89q.worldedit.extent.clipboard; import static com.google.common.base.Preconditions.checkNotNull; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.biome.BaseBiome; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockTypes; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.Nullable; /** * Stores block data as a multi-dimensional array of {@link BaseBlock}s and * other data as lists or maps. */ public class BlockArrayClipboard implements Clipboard { private final Region region; private BlockVector3 origin; private final BaseBlock[][][] blocks; private final List entities = new ArrayList<>(); /** * Create a new instance. * *

The origin will be placed at the region's lowest minimum point.

* * @param region the bounding region */ public BlockArrayClipboard(Region region) { checkNotNull(region); this.region = region.clone(); this.origin = region.getMinimumPoint(); BlockVector3 dimensions = getDimensions(); blocks = new BaseBlock[dimensions.getBlockX()][dimensions.getBlockY()][dimensions.getBlockZ()]; } @Override public Region getRegion() { return region; } @Override public BlockVector3 getOrigin() { return origin; } @Override public void setOrigin(BlockVector3 origin) { this.origin = origin; } @Override public BlockVector3 getDimensions() { return region.getMaximumPoint().subtract(region.getMinimumPoint()).add(1, 1, 1); } @Override public BlockVector3 getMinimumPoint() { return region.getMinimumPoint(); } @Override public BlockVector3 getMaximumPoint() { return region.getMaximumPoint(); } @Override public List getEntities(Region region) { List filtered = new ArrayList<>(); for (Entity entity : entities) { if (region.contains(entity.getLocation().toVector().toBlockPoint())) { filtered.add(entity); } } return Collections.unmodifiableList(filtered); } @Override public List getEntities() { return Collections.unmodifiableList(entities); } @Nullable @Override public Entity createEntity(Location location, BaseEntity entity) { ClipboardEntity ret = new ClipboardEntity(location, entity); entities.add(ret); return ret; } @Override public BlockState getBlock(BlockVector3 position) { if (region.contains(position)) { BlockVector3 v = position.subtract(region.getMinimumPoint()); BaseBlock block = blocks[v.getBlockX()][v.getBlockY()][v.getBlockZ()]; if (block != null) { return block.toImmutableState(); } } return BlockTypes.AIR.getDefaultState(); } @Override public BaseBlock getFullBlock(BlockVector3 position) { if (region.contains(position)) { BlockVector3 v = position.subtract(region.getMinimumPoint()); BaseBlock block = blocks[v.getBlockX()][v.getBlockY()][v.getBlockZ()]; if (block != null) { return block; } } return BlockTypes.AIR.getDefaultState().toBaseBlock(); } @Override public > boolean setBlock(BlockVector3 position, B block) throws WorldEditException { if (region.contains(position)) { BlockVector3 v = position.subtract(region.getMinimumPoint()); blocks[v.getBlockX()][v.getBlockY()][v.getBlockZ()] = block.toBaseBlock(); return true; } else { return false; } } @Override public BaseBiome getBiome(BlockVector2 position) { return new BaseBiome(0); } @Override public boolean setBiome(BlockVector2 position, BaseBiome biome) { return false; } @Nullable @Override public Operation commit() { return null; } /** * Stores entity data. */ private class ClipboardEntity extends StoredEntity { ClipboardEntity(Location location, BaseEntity entity) { super(location, entity); } @Override public boolean remove() { return entities.remove(this); } @Nullable @Override public T getFacet(Class cls) { return null; } } }