Mirror von
https://github.com/IntellectualSites/FastAsyncWorldEdit.git
synchronisiert 2024-12-25 10:30:04 +01:00
Added support for non-128 worldheights
Dieser Commit ist enthalten in:
Ursprung
e01aad00d8
Commit
98216e2762
@ -168,7 +168,7 @@ public class EditSession {
|
|||||||
public boolean rawSetBlock(Vector pt, BaseBlock block) {
|
public boolean rawSetBlock(Vector pt, BaseBlock block) {
|
||||||
final int y = pt.getBlockY();
|
final int y = pt.getBlockY();
|
||||||
final int type = block.getType();
|
final int type = block.getType();
|
||||||
if (y < 0 || y > 127) {
|
if (y < 0 || y > world.getMaxY()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1046,7 +1046,7 @@ public class EditSession {
|
|||||||
*/
|
*/
|
||||||
public int removeAbove(Vector pos, int size, int height)
|
public int removeAbove(Vector pos, int size, int height)
|
||||||
throws MaxChangedBlocksException {
|
throws MaxChangedBlocksException {
|
||||||
int maxY = Math.min(127, pos.getBlockY() + height - 1);
|
int maxY = Math.min(world.getMaxY(), pos.getBlockY() + height - 1);
|
||||||
--size;
|
--size;
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
|
|
||||||
@ -1122,7 +1122,7 @@ public class EditSession {
|
|||||||
int minX = pos.getBlockX() - size;
|
int minX = pos.getBlockX() - size;
|
||||||
int maxX = pos.getBlockX() + size;
|
int maxX = pos.getBlockX() + size;
|
||||||
int minY = Math.max(0, pos.getBlockY() - size);
|
int minY = Math.max(0, pos.getBlockY() - size);
|
||||||
int maxY = Math.min(127, pos.getBlockY() + size);
|
int maxY = Math.min(world.getMaxY(), pos.getBlockY() + size);
|
||||||
int minZ = pos.getBlockZ() - size;
|
int minZ = pos.getBlockZ() - size;
|
||||||
int maxZ = pos.getBlockZ() + size;
|
int maxZ = pos.getBlockZ() + size;
|
||||||
|
|
||||||
@ -1584,7 +1584,7 @@ public class EditSession {
|
|||||||
Vector min = region.getMinimumPoint();
|
Vector min = region.getMinimumPoint();
|
||||||
Vector max = region.getMaximumPoint();
|
Vector max = region.getMaximumPoint();
|
||||||
|
|
||||||
int upperY = Math.min(127, max.getBlockY() + 1);
|
int upperY = Math.min(world.getMaxY(), max.getBlockY() + 1);
|
||||||
int lowerY = Math.max(0, min.getBlockY() - 1);
|
int lowerY = Math.max(0, min.getBlockY() - 1);
|
||||||
|
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
@ -1599,7 +1599,7 @@ public class EditSession {
|
|||||||
for (int y = upperY; y >= lowerY; --y) {
|
for (int y = upperY; y >= lowerY; --y) {
|
||||||
Vector above = new Vector(x, y + 1, z);
|
Vector above = new Vector(x, y + 1, z);
|
||||||
|
|
||||||
if (y + 1 <= 127 && !getBlock(new Vector(x, y, z)).isAir()
|
if (y + 1 <= world.getMaxY() && !getBlock(new Vector(x, y, z)).isAir()
|
||||||
&& getBlock(above).isAir()) {
|
&& getBlock(above).isAir()) {
|
||||||
if (setBlock(above, block)) {
|
if (setBlock(above, block)) {
|
||||||
++affected;
|
++affected;
|
||||||
@ -1626,7 +1626,7 @@ public class EditSession {
|
|||||||
Vector min = region.getMinimumPoint();
|
Vector min = region.getMinimumPoint();
|
||||||
Vector max = region.getMaximumPoint();
|
Vector max = region.getMaximumPoint();
|
||||||
|
|
||||||
int upperY = Math.min(127, max.getBlockY() + 1);
|
int upperY = Math.min(world.getMaxY(), max.getBlockY() + 1);
|
||||||
int lowerY = Math.max(0, min.getBlockY() - 1);
|
int lowerY = Math.max(0, min.getBlockY() - 1);
|
||||||
|
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
@ -1641,7 +1641,7 @@ public class EditSession {
|
|||||||
for (int y = upperY; y >= lowerY; --y) {
|
for (int y = upperY; y >= lowerY; --y) {
|
||||||
Vector above = new Vector(x, y + 1, z);
|
Vector above = new Vector(x, y + 1, z);
|
||||||
|
|
||||||
if (y + 1 <= 127 && !getBlock(new Vector(x, y, z)).isAir()
|
if (y + 1 <= world.getMaxY() && !getBlock(new Vector(x, y, z)).isAir()
|
||||||
&& getBlock(above).isAir()) {
|
&& getBlock(above).isAir()) {
|
||||||
if (setBlock(above, pattern.next(above))) {
|
if (setBlock(above, pattern.next(above))) {
|
||||||
++affected;
|
++affected;
|
||||||
@ -1668,7 +1668,7 @@ public class EditSession {
|
|||||||
Vector min = region.getMinimumPoint();
|
Vector min = region.getMinimumPoint();
|
||||||
Vector max = region.getMaximumPoint();
|
Vector max = region.getMaximumPoint();
|
||||||
|
|
||||||
int upperY = Math.min(127, max.getBlockY() + 1);
|
int upperY = Math.min(world.getMaxY(), max.getBlockY() + 1);
|
||||||
int lowerY = Math.max(0, min.getBlockY() - 1);
|
int lowerY = Math.max(0, min.getBlockY() - 1);
|
||||||
|
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
@ -2020,8 +2020,8 @@ public class EditSession {
|
|||||||
|
|
||||||
if (pos.getBlockY() - height - 1 < 0) {
|
if (pos.getBlockY() - height - 1 < 0) {
|
||||||
height = pos.getBlockY() + 1;
|
height = pos.getBlockY() + 1;
|
||||||
} else if (pos.getBlockY() + height - 1 > 127) {
|
} else if (pos.getBlockY() + height - 1 > world.getMaxY()) {
|
||||||
height = 127 - pos.getBlockY() + 1;
|
height = world.getMaxY() - pos.getBlockY() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
final double invRadiusX = 1 / radiusX;
|
final double invRadiusX = 1 / radiusX;
|
||||||
@ -2253,7 +2253,7 @@ public class EditSession {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int y = 127; y >= 1; --y) {
|
for (int y = world.getMaxY(); y >= 1; --y) {
|
||||||
Vector pt = new Vector(x, y, z);
|
Vector pt = new Vector(x, y, z);
|
||||||
int id = getBlockType(pt);
|
int id = getBlockType(pt);
|
||||||
|
|
||||||
@ -2312,7 +2312,7 @@ public class EditSession {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int y = 127; y >= 1; --y) {
|
for (int y = world.getMaxY(); y >= 1; --y) {
|
||||||
Vector pt = new Vector(x, y, z);
|
Vector pt = new Vector(x, y, z);
|
||||||
int id = getBlockType(pt);
|
int id = getBlockType(pt);
|
||||||
|
|
||||||
@ -2334,7 +2334,7 @@ public class EditSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Too high?
|
// Too high?
|
||||||
if (y == 127) {
|
if (y == world.getMaxY()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2376,7 +2376,7 @@ public class EditSession {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
loop: for (int y = 127; y >= 1; --y) {
|
loop: for (int y = world.getMaxY(); y >= 1; --y) {
|
||||||
final Vector pt = new Vector(x, y, z);
|
final Vector pt = new Vector(x, y, z);
|
||||||
final int id = getBlockType(pt);
|
final int id = getBlockType(pt);
|
||||||
|
|
||||||
|
@ -230,7 +230,7 @@ public abstract class LocalPlayer extends LocalCommandSender {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (y <= 127) {
|
while (y <= world.getMaxY()) {
|
||||||
// Found a ceiling!
|
// Found a ceiling!
|
||||||
if (!BlockType.canPassThrough(world.getBlockType(new Vector(x, y, z)))) {
|
if (!BlockType.canPassThrough(world.getBlockType(new Vector(x, y, z)))) {
|
||||||
int platformY = Math.max(initialY, y - 3 - clearance);
|
int platformY = Math.max(initialY, y - 3 - clearance);
|
||||||
@ -257,7 +257,7 @@ public abstract class LocalPlayer extends LocalCommandSender {
|
|||||||
int initialY = Math.max(0, pos.getBlockY());
|
int initialY = Math.max(0, pos.getBlockY());
|
||||||
int y = Math.max(0, pos.getBlockY() + 1);
|
int y = Math.max(0, pos.getBlockY() + 1);
|
||||||
int z = pos.getBlockZ();
|
int z = pos.getBlockZ();
|
||||||
int maxY = Math.min(128, initialY + distance);
|
int maxY = Math.min(getWorld().getMaxY() + 1, initialY + distance);
|
||||||
LocalWorld world = getPosition().getWorld();
|
LocalWorld world = getPosition().getWorld();
|
||||||
|
|
||||||
while (y <= 129) {
|
while (y <= 129) {
|
||||||
|
@ -56,7 +56,6 @@ public class LocalSession {
|
|||||||
private LocalConfiguration config;
|
private LocalConfiguration config;
|
||||||
|
|
||||||
private long expirationTime = 0;
|
private long expirationTime = 0;
|
||||||
private LocalWorld selectionWorld;
|
|
||||||
private RegionSelector selector = new CuboidRegionSelector();
|
private RegionSelector selector = new CuboidRegionSelector();
|
||||||
private boolean placeAtPos1 = false;
|
private boolean placeAtPos1 = false;
|
||||||
private LinkedList<EditSession> history = new LinkedList<EditSession>();
|
private LinkedList<EditSession> history = new LinkedList<EditSession>();
|
||||||
@ -183,10 +182,10 @@ public class LocalSession {
|
|||||||
* @return position
|
* @return position
|
||||||
*/
|
*/
|
||||||
public RegionSelector getRegionSelector(LocalWorld world) {
|
public RegionSelector getRegionSelector(LocalWorld world) {
|
||||||
if (selectionWorld == null) {
|
if (selector.getIncompleteRegion().getWorld() == null) {
|
||||||
selectionWorld = world;
|
selector = new CuboidRegionSelector(world);
|
||||||
} else if (!selectionWorld.equals(world)) {
|
} else if (!selector.getIncompleteRegion().getWorld().equals(world)) {
|
||||||
selectionWorld = world;
|
selector.getIncompleteRegion().setWorld(world);
|
||||||
selector.clear();
|
selector.clear();
|
||||||
}
|
}
|
||||||
return selector;
|
return selector;
|
||||||
@ -198,6 +197,7 @@ public class LocalSession {
|
|||||||
*
|
*
|
||||||
* @return position
|
* @return position
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public RegionSelector getRegionSelector() {
|
public RegionSelector getRegionSelector() {
|
||||||
return selector;
|
return selector;
|
||||||
}
|
}
|
||||||
@ -209,7 +209,7 @@ public class LocalSession {
|
|||||||
* @param selector
|
* @param selector
|
||||||
*/
|
*/
|
||||||
public void setRegionSelector(LocalWorld world, RegionSelector selector) {
|
public void setRegionSelector(LocalWorld world, RegionSelector selector) {
|
||||||
selectionWorld = world;
|
selector.getIncompleteRegion().setWorld(world);
|
||||||
this.selector = selector;
|
this.selector = selector;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,7 +230,7 @@ public class LocalSession {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean isSelectionDefined(LocalWorld world) {
|
public boolean isSelectionDefined(LocalWorld world) {
|
||||||
if (selectionWorld == null || !selectionWorld.equals(world)) {
|
if (selector.getIncompleteRegion().getWorld() == null || !selector.getIncompleteRegion().getWorld().equals(world)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return selector.isDefined();
|
return selector.isDefined();
|
||||||
@ -258,7 +258,7 @@ public class LocalSession {
|
|||||||
* @throws IncompleteRegionException
|
* @throws IncompleteRegionException
|
||||||
*/
|
*/
|
||||||
public Region getSelection(LocalWorld world) throws IncompleteRegionException {
|
public Region getSelection(LocalWorld world) throws IncompleteRegionException {
|
||||||
if (selectionWorld == null || !selectionWorld.equals(world)) {
|
if (selector.getIncompleteRegion().getWorld() == null || !selector.getIncompleteRegion().getWorld().equals(world)) {
|
||||||
throw new IncompleteRegionException();
|
throw new IncompleteRegionException();
|
||||||
}
|
}
|
||||||
return selector.getRegion();
|
return selector.getRegion();
|
||||||
@ -270,7 +270,7 @@ public class LocalSession {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public LocalWorld getSelectionWorld() {
|
public LocalWorld getSelectionWorld() {
|
||||||
return selectionWorld;
|
return selector.getIncompleteRegion().getWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -357,7 +357,7 @@ public abstract class LocalWorld {
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public int getHeight() {
|
public int getMaxY() {
|
||||||
return 127;
|
return 127;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,14 +226,14 @@ public class BukkitWorld extends LocalWorld {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean regenerate(Region region, EditSession editSession) {
|
public boolean regenerate(Region region, EditSession editSession) {
|
||||||
BaseBlock[] history = new BaseBlock[16 * 16 * 128];
|
BaseBlock[] history = new BaseBlock[16 * 16 * (getMaxY() + 1)];
|
||||||
|
|
||||||
for (Vector2D chunk : region.getChunks()) {
|
for (Vector2D chunk : region.getChunks()) {
|
||||||
Vector min = new Vector(chunk.getBlockX() * 16, 0, chunk.getBlockZ() * 16);
|
Vector min = new Vector(chunk.getBlockX() * 16, 0, chunk.getBlockZ() * 16);
|
||||||
|
|
||||||
// First save all the blocks inside
|
// First save all the blocks inside
|
||||||
for (int x = 0; x < 16; ++x) {
|
for (int x = 0; x < 16; ++x) {
|
||||||
for (int y = 0; y < 128; ++y) {
|
for (int y = 0; y < (getMaxY() + 1); ++y) {
|
||||||
for (int z = 0; z < 16; ++z) {
|
for (int z = 0; z < 16; ++z) {
|
||||||
Vector pt = min.add(x, y, z);
|
Vector pt = min.add(x, y, z);
|
||||||
int index = y * 16 * 16 + z * 16 + x;
|
int index = y * 16 * 16 + z * 16 + x;
|
||||||
@ -250,7 +250,7 @@ public class BukkitWorld extends LocalWorld {
|
|||||||
|
|
||||||
// Then restore
|
// Then restore
|
||||||
for (int x = 0; x < 16; ++x) {
|
for (int x = 0; x < 16; ++x) {
|
||||||
for (int y = 0; y < 128; ++y) {
|
for (int y = 0; y < (getMaxY() + 1); ++y) {
|
||||||
for (int z = 0; z < 16; ++z) {
|
for (int z = 0; z < 16; ++z) {
|
||||||
Vector pt = min.add(x, y, z);
|
Vector pt = min.add(x, y, z);
|
||||||
int index = y * 16 * 16 + z * 16 + x;
|
int index = y * 16 * 16 + z * 16 + x;
|
||||||
@ -761,7 +761,7 @@ public class BukkitWorld extends LocalWorld {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getHeight() {
|
public int getMaxY() {
|
||||||
return world.getMaxHeight() - 1;
|
return world.getMaxHeight() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -775,7 +775,6 @@ public class BukkitWorld extends LocalWorld {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final int chunkSizeX = 16;
|
private static final int chunkSizeX = 16;
|
||||||
private static final int chunkSizeY = 128;
|
|
||||||
private static final int chunkSizeZ = 16;
|
private static final int chunkSizeZ = 16;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -810,8 +809,8 @@ public class BukkitWorld extends LocalWorld {
|
|||||||
boolean xBorder = x == 0 || x == chunkSizeX - 1;
|
boolean xBorder = x == 0 || x == chunkSizeX - 1;
|
||||||
for (int z = 0; z < chunkSizeZ; ++z) {
|
for (int z = 0; z < chunkSizeZ; ++z) {
|
||||||
boolean zBorder = z == 0 || z == chunkSizeZ - 1;
|
boolean zBorder = z == 0 || z == chunkSizeZ - 1;
|
||||||
for (int y = 0; y < chunkSizeY; ++y) {
|
for (int y = 0; y < world.getMaxHeight(); ++y) {
|
||||||
final int index = y + z * chunkSizeY + x * chunkSizeY * chunkSizeZ;
|
final int index = y + z * world.getMaxHeight() + x * world.getMaxHeight() * chunkSizeZ;
|
||||||
byte blockID = blocks[index];
|
byte blockID = blocks[index];
|
||||||
if (!BlockType.emitsLight(blockID)) {
|
if (!BlockType.emitsLight(blockID)) {
|
||||||
if (xBorder || zBorder && BlockType.isTranslucent(blockID)) {
|
if (xBorder || zBorder && BlockType.isTranslucent(blockID)) {
|
||||||
|
@ -58,6 +58,6 @@ public class EditSessionBlockChangeDelegate implements BlockChangeDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getHeight() {
|
public int getHeight() {
|
||||||
return editSession.getWorld().getHeight();
|
return editSession.getWorld().getMaxY();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -378,7 +378,7 @@ public class WorldEditPlugin extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LocalSession session = controller.getSession(wrapPlayer(player));
|
LocalSession session = controller.getSession(wrapPlayer(player));
|
||||||
RegionSelector selector = session.getRegionSelector();
|
RegionSelector selector = session.getRegionSelector(BukkitUtil.getLocalWorld(player.getWorld()));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Region region = selector.getRegion();
|
Region region = selector.getRegion();
|
||||||
|
@ -45,7 +45,7 @@ public class CuboidSelection extends RegionSelection {
|
|||||||
throw new IllegalArgumentException("Null point 2 not permitted");
|
throw new IllegalArgumentException("Null point 2 not permitted");
|
||||||
}
|
}
|
||||||
|
|
||||||
CuboidRegionSelector sel = new CuboidRegionSelector();
|
CuboidRegionSelector sel = new CuboidRegionSelector(BukkitUtil.getLocalWorld(world));
|
||||||
sel.selectPrimary(pt1);
|
sel.selectPrimary(pt1);
|
||||||
sel.selectSecondary(pt2);
|
sel.selectSecondary(pt2);
|
||||||
|
|
||||||
|
@ -21,8 +21,11 @@ package com.sk89q.worldedit.bukkit.selections;
|
|||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import com.sk89q.worldedit.BlockVector2D;
|
import com.sk89q.worldedit.BlockVector2D;
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitUtil;
|
||||||
import com.sk89q.worldedit.regions.*;
|
import com.sk89q.worldedit.regions.*;
|
||||||
|
|
||||||
public class Polygonal2DSelection extends RegionSelection {
|
public class Polygonal2DSelection extends RegionSelection {
|
||||||
@ -36,13 +39,13 @@ public class Polygonal2DSelection extends RegionSelection {
|
|||||||
|
|
||||||
public Polygonal2DSelection(World world, List<BlockVector2D> points, int minY, int maxY) {
|
public Polygonal2DSelection(World world, List<BlockVector2D> points, int minY, int maxY) {
|
||||||
super(world);
|
super(world);
|
||||||
|
LocalWorld lWorld = BukkitUtil.getLocalWorld(world);
|
||||||
|
|
||||||
minY = Math.min(Math.max(0, minY), 127);
|
minY = Math.min(Math.max(0, minY), world.getMaxHeight());
|
||||||
maxY = Math.min(Math.max(0, maxY), 127);
|
maxY = Math.min(Math.max(0, maxY), world.getMaxHeight());
|
||||||
|
|
||||||
Polygonal2DRegionSelector sel = new Polygonal2DRegionSelector();
|
|
||||||
poly2d = new Polygonal2DRegion(points, minY, maxY);
|
|
||||||
|
|
||||||
|
Polygonal2DRegionSelector sel = new Polygonal2DRegionSelector(BukkitUtil.getLocalWorld(world));
|
||||||
|
poly2d = new Polygonal2DRegion(lWorld, points, minY, maxY);
|
||||||
sel.learnChanges();
|
sel.learnChanges();
|
||||||
|
|
||||||
setRegionSelector(sel);
|
setRegionSelector(sel);
|
||||||
|
@ -264,8 +264,8 @@ public class RegionCommands {
|
|||||||
region.expand(dir.multiply(count));
|
region.expand(dir.multiply(count));
|
||||||
region.contract(dir.multiply(count));
|
region.contract(dir.multiply(count));
|
||||||
|
|
||||||
session.getRegionSelector().learnChanges();
|
session.getRegionSelector(player.getWorld()).learnChanges();
|
||||||
session.getRegionSelector().explainRegionAdjust(player, session);
|
session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session);
|
||||||
} catch (RegionOperationException e) {
|
} catch (RegionOperationException e) {
|
||||||
player.printError(e.getMessage());
|
player.printError(e.getMessage());
|
||||||
}
|
}
|
||||||
@ -309,8 +309,8 @@ public class RegionCommands {
|
|||||||
region.expand(shiftVector);
|
region.expand(shiftVector);
|
||||||
region.contract(shiftVector);
|
region.contract(shiftVector);
|
||||||
|
|
||||||
session.getRegionSelector().learnChanges();
|
session.getRegionSelector(player.getWorld()).learnChanges();
|
||||||
session.getRegionSelector().explainRegionAdjust(player, session);
|
session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session);
|
||||||
} catch (RegionOperationException e) {
|
} catch (RegionOperationException e) {
|
||||||
player.printError(e.getMessage());
|
player.printError(e.getMessage());
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,7 @@ public class SelectionCommands {
|
|||||||
final Vector2D max2D = ChunkStore.toChunk(region.getMaximumPoint());
|
final Vector2D max2D = ChunkStore.toChunk(region.getMaximumPoint());
|
||||||
|
|
||||||
min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
|
min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
|
||||||
max = new Vector(max2D.getBlockX() * 16 + 15, 127, max2D.getBlockZ() * 16 + 15);
|
max = new Vector(max2D.getBlockX() * 16 + 15, player.getWorld().getMaxY(), max2D.getBlockZ() * 16 + 15);
|
||||||
|
|
||||||
player.print("Chunks selected: ("
|
player.print("Chunks selected: ("
|
||||||
+ min2D.getBlockX() + ", " + min2D.getBlockZ() + ") - ("
|
+ min2D.getBlockX() + ", " + min2D.getBlockZ() + ") - ("
|
||||||
@ -203,13 +203,13 @@ public class SelectionCommands {
|
|||||||
final Vector2D min2D = ChunkStore.toChunk(player.getBlockIn());
|
final Vector2D min2D = ChunkStore.toChunk(player.getBlockIn());
|
||||||
|
|
||||||
min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
|
min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
|
||||||
max = min.add(15, 127, 15);
|
max = min.add(15, player.getWorld().getMaxY(), 15);
|
||||||
|
|
||||||
player.print("Chunk selected: "
|
player.print("Chunk selected: "
|
||||||
+ min2D.getBlockX() + ", " + min2D.getBlockZ());
|
+ min2D.getBlockX() + ", " + min2D.getBlockZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
CuboidRegionSelector selector = new CuboidRegionSelector();
|
CuboidRegionSelector selector = new CuboidRegionSelector(player.getWorld());
|
||||||
selector.selectPrimary(min);
|
selector.selectPrimary(min);
|
||||||
selector.selectSecondary(max);
|
selector.selectSecondary(max);
|
||||||
session.setRegionSelector(player.getWorld(), selector);
|
session.setRegionSelector(player.getWorld(), selector);
|
||||||
@ -276,11 +276,11 @@ public class SelectionCommands {
|
|||||||
Region region = session.getSelection(player.getWorld());
|
Region region = session.getSelection(player.getWorld());
|
||||||
try {
|
try {
|
||||||
int oldSize = region.getArea();
|
int oldSize = region.getArea();
|
||||||
region.expand(new Vector(0, 128, 0));
|
region.expand(new Vector(0, (player.getWorld().getMaxY() + 1), 0));
|
||||||
region.expand(new Vector(0, -128, 0));
|
region.expand(new Vector(0, -(player.getWorld().getMaxY() + 1), 0));
|
||||||
session.getRegionSelector().learnChanges();
|
session.getRegionSelector(player.getWorld()).learnChanges();
|
||||||
int newSize = region.getArea();
|
int newSize = region.getArea();
|
||||||
session.getRegionSelector().explainRegionAdjust(player, session);
|
session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session);
|
||||||
player.print("Region expanded " + (newSize - oldSize)
|
player.print("Region expanded " + (newSize - oldSize)
|
||||||
+ " blocks [top-to-bottom].");
|
+ " blocks [top-to-bottom].");
|
||||||
} catch (RegionOperationException e) {
|
} catch (RegionOperationException e) {
|
||||||
@ -323,10 +323,10 @@ public class SelectionCommands {
|
|||||||
region.expand(dir.multiply(reverseChange));
|
region.expand(dir.multiply(reverseChange));
|
||||||
}
|
}
|
||||||
|
|
||||||
session.getRegionSelector().learnChanges();
|
session.getRegionSelector(player.getWorld()).learnChanges();
|
||||||
int newSize = region.getArea();
|
int newSize = region.getArea();
|
||||||
|
|
||||||
session.getRegionSelector().explainRegionAdjust(player, session);
|
session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session);
|
||||||
|
|
||||||
player.print("Region expanded " + (newSize - oldSize) + " blocks.");
|
player.print("Region expanded " + (newSize - oldSize) + " blocks.");
|
||||||
}
|
}
|
||||||
@ -374,10 +374,11 @@ public class SelectionCommands {
|
|||||||
if (reverseChange != 0) {
|
if (reverseChange != 0) {
|
||||||
region.contract(dir.multiply(reverseChange));
|
region.contract(dir.multiply(reverseChange));
|
||||||
}
|
}
|
||||||
session.getRegionSelector().learnChanges();
|
session.getRegionSelector(player.getWorld()).learnChanges();
|
||||||
int newSize = region.getArea();
|
int newSize = region.getArea();
|
||||||
|
|
||||||
session.getRegionSelector().explainRegionAdjust(player, session);
|
session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session);
|
||||||
|
|
||||||
|
|
||||||
player.print("Region contracted " + (oldSize - newSize) + " blocks.");
|
player.print("Region contracted " + (oldSize - newSize) + " blocks.");
|
||||||
} catch (RegionOperationException e) {
|
} catch (RegionOperationException e) {
|
||||||
@ -409,9 +410,9 @@ public class SelectionCommands {
|
|||||||
Region region = session.getSelection(player.getWorld());
|
Region region = session.getSelection(player.getWorld());
|
||||||
region.expand(dir.multiply(change));
|
region.expand(dir.multiply(change));
|
||||||
region.contract(dir.multiply(change));
|
region.contract(dir.multiply(change));
|
||||||
session.getRegionSelector().learnChanges();
|
session.getRegionSelector(player.getWorld()).learnChanges();
|
||||||
|
|
||||||
session.getRegionSelector().explainRegionAdjust(player, session);
|
session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session);
|
||||||
|
|
||||||
player.print("Region shifted.");
|
player.print("Region shifted.");
|
||||||
} catch (RegionOperationException e) {
|
} catch (RegionOperationException e) {
|
||||||
@ -453,9 +454,9 @@ public class SelectionCommands {
|
|||||||
region.expand((new Vector(0, 0, -1)).multiply(change));
|
region.expand((new Vector(0, 0, -1)).multiply(change));
|
||||||
}
|
}
|
||||||
|
|
||||||
session.getRegionSelector().learnChanges();
|
session.getRegionSelector(player.getWorld()).learnChanges();
|
||||||
|
|
||||||
session.getRegionSelector().explainRegionAdjust(player, session);
|
session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session);
|
||||||
|
|
||||||
player.print("Region outset.");
|
player.print("Region outset.");
|
||||||
} catch (RegionOperationException e) {
|
} catch (RegionOperationException e) {
|
||||||
@ -496,9 +497,9 @@ public class SelectionCommands {
|
|||||||
region.contract((new Vector(0, 0, -1)).multiply(change));
|
region.contract((new Vector(0, 0, -1)).multiply(change));
|
||||||
}
|
}
|
||||||
|
|
||||||
session.getRegionSelector().learnChanges();
|
session.getRegionSelector(player.getWorld()).learnChanges();
|
||||||
|
|
||||||
session.getRegionSelector().explainRegionAdjust(player, session);
|
session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session);
|
||||||
|
|
||||||
player.print("Region inset.");
|
player.print("Region inset.");
|
||||||
}
|
}
|
||||||
@ -520,9 +521,9 @@ public class SelectionCommands {
|
|||||||
.subtract(region.getMinimumPoint())
|
.subtract(region.getMinimumPoint())
|
||||||
.add(1, 1, 1);
|
.add(1, 1, 1);
|
||||||
|
|
||||||
player.print("Type: " + session.getRegionSelector().getTypeName());
|
player.print("Type: " + session.getRegionSelector(player.getWorld()).getTypeName());
|
||||||
|
|
||||||
for (String line : session.getRegionSelector().getInformationLines()) {
|
for (String line : session.getRegionSelector(player.getWorld()).getInformationLines()) {
|
||||||
player.print(line);
|
player.print(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,7 +626,7 @@ public class SelectionCommands {
|
|||||||
selector = new ExtendingCuboidRegionSelector(oldSelector);
|
selector = new ExtendingCuboidRegionSelector(oldSelector);
|
||||||
player.print("Cuboid: left click for a starting point, right click to extend");
|
player.print("Cuboid: left click for a starting point, right click to extend");
|
||||||
} else if (typeName.equalsIgnoreCase("poly")) {
|
} else if (typeName.equalsIgnoreCase("poly")) {
|
||||||
selector = new Polygonal2DRegionSelector();
|
selector = new Polygonal2DRegionSelector(world);
|
||||||
player.print("2D polygon selector: Left/right click to add a point.");
|
player.print("2D polygon selector: Left/right click to add a point.");
|
||||||
} else {
|
} else {
|
||||||
player.printError("Only 'cuboid', 'extend' and 'poly' are accepted.");
|
player.printError("Only 'cuboid', 'extend' and 'poly' are accepted.");
|
||||||
|
@ -173,7 +173,8 @@ public class UtilityCommands {
|
|||||||
|
|
||||||
int size = args.argsLength() > 0 ? Math.max(1, args.getInteger(0)) : 1;
|
int size = args.argsLength() > 0 ? Math.max(1, args.getInteger(0)) : 1;
|
||||||
we.checkMaxRadius(size);
|
we.checkMaxRadius(size);
|
||||||
int height = args.argsLength() > 1 ? Math.min(128, args.getInteger(1) + 2) : 128;
|
LocalWorld world = player.getWorld();
|
||||||
|
int height = args.argsLength() > 1 ? Math.min((world.getMaxY() + 1), args.getInteger(1) + 2) : (world.getMaxY() + 1);
|
||||||
|
|
||||||
int affected = editSession.removeAbove(
|
int affected = editSession.removeAbove(
|
||||||
session.getPlacementPosition(player), size, height);
|
session.getPlacementPosition(player), size, height);
|
||||||
@ -195,7 +196,8 @@ public class UtilityCommands {
|
|||||||
|
|
||||||
int size = args.argsLength() > 0 ? Math.max(1, args.getInteger(0)) : 1;
|
int size = args.argsLength() > 0 ? Math.max(1, args.getInteger(0)) : 1;
|
||||||
we.checkMaxRadius(size);
|
we.checkMaxRadius(size);
|
||||||
int height = args.argsLength() > 1 ? Math.min(128, args.getInteger(1) + 2) : 128;
|
LocalWorld world = player.getWorld();
|
||||||
|
int height = args.argsLength() > 1 ? Math.min((world.getMaxY() + 1), args.getInteger(1) + 2) : (world.getMaxY() + 1);
|
||||||
|
|
||||||
int affected = editSession.removeBelow(session.getPlacementPosition(player), size, height);
|
int affected = editSession.removeBelow(session.getPlacementPosition(player), size, height);
|
||||||
player.print(affected + " block(s) have been removed.");
|
player.print(affected + " block(s) have been removed.");
|
||||||
@ -251,7 +253,7 @@ public class UtilityCommands {
|
|||||||
Vector base = session.getPlacementPosition(player);
|
Vector base = session.getPlacementPosition(player);
|
||||||
Vector min = base.subtract(size, size, size);
|
Vector min = base.subtract(size, size, size);
|
||||||
Vector max = base.add(size, size, size);
|
Vector max = base.add(size, size, size);
|
||||||
Region region = new CuboidRegion(min, max);
|
Region region = new CuboidRegion(player.getWorld(), min, max);
|
||||||
|
|
||||||
if (to instanceof SingleBlockPattern) {
|
if (to instanceof SingleBlockPattern) {
|
||||||
affected = editSession.replaceBlocks(region, from, ((SingleBlockPattern) to).getBlock());
|
affected = editSession.replaceBlocks(region, from, ((SingleBlockPattern) to).getBlock());
|
||||||
|
@ -37,7 +37,9 @@ public class Chunk {
|
|||||||
private byte[] data;
|
private byte[] data;
|
||||||
private int rootX;
|
private int rootX;
|
||||||
private int rootZ;
|
private int rootZ;
|
||||||
|
|
||||||
private Map<BlockVector, Map<String,Tag>> tileEntities;
|
private Map<BlockVector, Map<String,Tag>> tileEntities;
|
||||||
|
private LocalWorld world;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct the chunk with a compound tag.
|
* Construct the chunk with a compound tag.
|
||||||
@ -45,8 +47,9 @@ public class Chunk {
|
|||||||
* @param tag
|
* @param tag
|
||||||
* @throws DataException
|
* @throws DataException
|
||||||
*/
|
*/
|
||||||
public Chunk(CompoundTag tag) throws DataException {
|
public Chunk(LocalWorld world, CompoundTag tag) throws DataException {
|
||||||
rootTag = tag;
|
rootTag = tag;
|
||||||
|
this.world = world;
|
||||||
|
|
||||||
blocks = getChildTag(
|
blocks = getChildTag(
|
||||||
rootTag.getValue(), "Blocks", ByteArrayTag.class).getValue();
|
rootTag.getValue(), "Blocks", ByteArrayTag.class).getValue();
|
||||||
@ -57,14 +60,14 @@ public class Chunk {
|
|||||||
rootZ = getChildTag(
|
rootZ = getChildTag(
|
||||||
rootTag.getValue(), "zPos", IntTag.class).getValue();
|
rootTag.getValue(), "zPos", IntTag.class).getValue();
|
||||||
|
|
||||||
if (blocks.length != 32768) {
|
if (blocks.length != 16*16*(world.getMaxY() + 1)) {
|
||||||
throw new InvalidFormatException("Chunk blocks byte array expected "
|
throw new InvalidFormatException("Chunk blocks byte array expected "
|
||||||
+ "to be 32,768 bytes; found " + blocks.length);
|
+ "to be " + 16*16*(world.getMaxY() + 1) + " bytes; found " + blocks.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.length != 16384) {
|
if (data.length != 16*16*((world.getMaxY() + 1)/2)) {
|
||||||
throw new InvalidFormatException("Chunk block data byte array "
|
throw new InvalidFormatException("Chunk block data byte array "
|
||||||
+ "expected to be 16,384 bytes; found " + data.length);
|
+ "expected to be " + 16*16*((world.getMaxY() + 1)/2) + " bytes; found " + data.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +82,7 @@ public class Chunk {
|
|||||||
int x = pos.getBlockX() - rootX * 16;
|
int x = pos.getBlockX() - rootX * 16;
|
||||||
int y = pos.getBlockY();
|
int y = pos.getBlockY();
|
||||||
int z = pos.getBlockZ() - rootZ * 16;
|
int z = pos.getBlockZ() - rootZ * 16;
|
||||||
int index = y + (z * 128 + (x * 128 * 16));
|
int index = y + (z * (world.getMaxY() + 1) + (x * (world.getMaxY() + 1) * 16));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return blocks[index];
|
return blocks[index];
|
||||||
@ -99,7 +102,7 @@ public class Chunk {
|
|||||||
int x = pos.getBlockX() - rootX * 16;
|
int x = pos.getBlockX() - rootX * 16;
|
||||||
int y = pos.getBlockY();
|
int y = pos.getBlockY();
|
||||||
int z = pos.getBlockZ() - rootZ * 16;
|
int z = pos.getBlockZ() - rootZ * 16;
|
||||||
int index = y + (z * 128 + (x * 128 * 16));
|
int index = y + (z * (world.getMaxY() + 1) + (x * (world.getMaxY() + 1) * 16));
|
||||||
boolean shift = index % 2 == 0;
|
boolean shift = index % 2 == 0;
|
||||||
index /= 2;
|
index /= 2;
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ public abstract class ChunkStore {
|
|||||||
* @throws DataException
|
* @throws DataException
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public abstract CompoundTag getChunkTag(Vector2D pos, String world)
|
public abstract CompoundTag getChunkTag(Vector2D pos, LocalWorld world)
|
||||||
throws DataException, IOException;
|
throws DataException, IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -62,9 +62,9 @@ public abstract class ChunkStore {
|
|||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @throws DataException
|
* @throws DataException
|
||||||
*/
|
*/
|
||||||
public Chunk getChunk(Vector2D pos, String world)
|
public Chunk getChunk(Vector2D pos, LocalWorld world)
|
||||||
throws DataException, IOException {
|
throws DataException, IOException {
|
||||||
return new Chunk(getChunkTag(pos, world));
|
return new Chunk(world, getChunkTag(pos, world));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,7 +74,7 @@ public abstract class LegacyChunkStore extends ChunkStore {
|
|||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public CompoundTag getChunkTag(Vector2D pos, String world)
|
public CompoundTag getChunkTag(Vector2D pos, LocalWorld world)
|
||||||
throws DataException, IOException {
|
throws DataException, IOException {
|
||||||
int x = pos.getBlockX();
|
int x = pos.getBlockX();
|
||||||
int z = pos.getBlockZ();
|
int z = pos.getBlockZ();
|
||||||
|
@ -25,6 +25,7 @@ import java.util.Map;
|
|||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.jnbt.NBTInputStream;
|
import com.sk89q.jnbt.NBTInputStream;
|
||||||
import com.sk89q.jnbt.Tag;
|
import com.sk89q.jnbt.Tag;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
import com.sk89q.worldedit.Vector2D;
|
import com.sk89q.worldedit.Vector2D;
|
||||||
|
|
||||||
public abstract class McRegionChunkStore extends ChunkStore {
|
public abstract class McRegionChunkStore extends ChunkStore {
|
||||||
@ -65,10 +66,11 @@ public abstract class McRegionChunkStore extends ChunkStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompoundTag getChunkTag(Vector2D pos, String worldname) throws DataException,
|
public CompoundTag getChunkTag(Vector2D pos, LocalWorld world) throws DataException,
|
||||||
IOException {
|
IOException {
|
||||||
|
|
||||||
McRegionReader reader = getReader(pos, worldname);
|
McRegionReader reader = getReader(pos, world.getName());
|
||||||
|
|
||||||
InputStream stream = reader.getChunkInputStream(pos);
|
InputStream stream = reader.getChunkInputStream(pos);
|
||||||
NBTInputStream nbt = new NBTInputStream(stream);
|
NBTInputStream nbt = new NBTInputStream(stream);
|
||||||
Tag tag;
|
Tag tag;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package com.sk89q.worldedit.regions;
|
package com.sk89q.worldedit.regions;
|
||||||
|
|
||||||
import com.sk89q.worldedit.BlockVector;
|
import com.sk89q.worldedit.BlockVector;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.Vector2D;
|
import com.sk89q.worldedit.Vector2D;
|
||||||
import com.sk89q.worldedit.data.ChunkStore;
|
import com.sk89q.worldedit.data.ChunkStore;
|
||||||
@ -40,6 +41,10 @@ public class CuboidRegion implements Region {
|
|||||||
* Store the second point.
|
* Store the second point.
|
||||||
*/
|
*/
|
||||||
private Vector pos2;
|
private Vector pos2;
|
||||||
|
/**
|
||||||
|
* Stores the world.
|
||||||
|
*/
|
||||||
|
private LocalWorld world;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new instance of this cuboid region.
|
* Construct a new instance of this cuboid region.
|
||||||
@ -48,7 +53,19 @@ public class CuboidRegion implements Region {
|
|||||||
* @param pos2
|
* @param pos2
|
||||||
*/
|
*/
|
||||||
public CuboidRegion(Vector pos1, Vector pos2) {
|
public CuboidRegion(Vector pos1, Vector pos2) {
|
||||||
|
this(null, pos1, pos2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new instance of this cuboid region.
|
||||||
|
*
|
||||||
|
* @param world
|
||||||
|
* @param pos1
|
||||||
|
* @param pos2
|
||||||
|
*/
|
||||||
|
public CuboidRegion(LocalWorld world, Vector pos1, Vector pos2) {
|
||||||
this.pos1 = pos1;
|
this.pos1 = pos1;
|
||||||
|
this.world = world;
|
||||||
this.pos2 = pos2;
|
this.pos2 = pos2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,8 +189,8 @@ public class CuboidRegion implements Region {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pos1 = pos1.clampY(0, 127);
|
pos1 = pos1.clampY(0, world.getMaxY());
|
||||||
pos2 = pos2.clampY(0, 127);
|
pos2 = pos2.clampY(0, world.getMaxY());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -224,8 +241,8 @@ public class CuboidRegion implements Region {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pos1 = pos1.clampY(0, 127);
|
pos1 = pos1.clampY(0, world == null ? 127 : world.getMaxY());
|
||||||
pos2 = pos2.clampY(0, 127);
|
pos2 = pos2.clampY(0, world == null ? 127 : world.getMaxY());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -353,4 +370,12 @@ public class CuboidRegion implements Region {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return getMinimumPoint() + " - " + getMaximumPoint();
|
return getMinimumPoint() + " - " + getMaximumPoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LocalWorld getWorld() {
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWorld(LocalWorld world) {
|
||||||
|
this.world = world;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import com.sk89q.worldedit.BlockVector;
|
|||||||
import com.sk89q.worldedit.IncompleteRegionException;
|
import com.sk89q.worldedit.IncompleteRegionException;
|
||||||
import com.sk89q.worldedit.LocalPlayer;
|
import com.sk89q.worldedit.LocalPlayer;
|
||||||
import com.sk89q.worldedit.LocalSession;
|
import com.sk89q.worldedit.LocalSession;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.cui.CUIPointBasedRegion;
|
import com.sk89q.worldedit.cui.CUIPointBasedRegion;
|
||||||
import com.sk89q.worldedit.cui.SelectionPointEvent;
|
import com.sk89q.worldedit.cui.SelectionPointEvent;
|
||||||
@ -37,12 +38,18 @@ import com.sk89q.worldedit.cui.SelectionPointEvent;
|
|||||||
public class CuboidRegionSelector implements RegionSelector, CUIPointBasedRegion {
|
public class CuboidRegionSelector implements RegionSelector, CUIPointBasedRegion {
|
||||||
protected BlockVector pos1;
|
protected BlockVector pos1;
|
||||||
protected BlockVector pos2;
|
protected BlockVector pos2;
|
||||||
protected CuboidRegion region = new CuboidRegion(new Vector(), new Vector());
|
protected CuboidRegion region;
|
||||||
|
|
||||||
|
public CuboidRegionSelector(LocalWorld world) {
|
||||||
|
region = new CuboidRegion(world, new Vector(), new Vector());
|
||||||
|
}
|
||||||
|
|
||||||
public CuboidRegionSelector() {
|
public CuboidRegionSelector() {
|
||||||
|
this((LocalWorld)null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CuboidRegionSelector(RegionSelector oldSelector) {
|
public CuboidRegionSelector(RegionSelector oldSelector) {
|
||||||
|
region = new CuboidRegion(oldSelector.getIncompleteRegion().getWorld(), new Vector(), new Vector());
|
||||||
if (oldSelector instanceof CuboidRegionSelector) {
|
if (oldSelector instanceof CuboidRegionSelector) {
|
||||||
final CuboidRegionSelector cuboidRegionSelector = (CuboidRegionSelector) oldSelector;
|
final CuboidRegionSelector cuboidRegionSelector = (CuboidRegionSelector) oldSelector;
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import com.sk89q.worldedit.BlockVector;
|
import com.sk89q.worldedit.BlockVector;
|
||||||
import com.sk89q.worldedit.BlockVector2D;
|
import com.sk89q.worldedit.BlockVector2D;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.Vector2D;
|
import com.sk89q.worldedit.Vector2D;
|
||||||
import com.sk89q.worldedit.data.ChunkStore;
|
import com.sk89q.worldedit.data.ChunkStore;
|
||||||
@ -43,30 +44,43 @@ public class Polygonal2DRegion implements Region {
|
|||||||
protected int minY;
|
protected int minY;
|
||||||
protected int maxY;
|
protected int maxY;
|
||||||
protected boolean hasY = false;
|
protected boolean hasY = false;
|
||||||
|
protected LocalWorld world;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the region
|
||||||
|
*/
|
||||||
|
public Polygonal2DRegion() {
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct the region.
|
* Construct the region.
|
||||||
|
*
|
||||||
|
* @param world
|
||||||
*/
|
*/
|
||||||
public Polygonal2DRegion() {
|
public Polygonal2DRegion(LocalWorld world) {
|
||||||
points = new ArrayList<BlockVector2D>();
|
points = new ArrayList<BlockVector2D>();
|
||||||
minY = 0;
|
minY = 0;
|
||||||
maxY = 0;
|
maxY = 0;
|
||||||
hasY = false;
|
hasY = false;
|
||||||
|
this.world = world;
|
||||||
recalculate();
|
recalculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct the region.
|
* Construct the region.
|
||||||
*
|
*
|
||||||
|
* @param world
|
||||||
* @param points
|
* @param points
|
||||||
* @param minY
|
* @param minY
|
||||||
* @param maxY
|
* @param maxY
|
||||||
*/
|
*/
|
||||||
public Polygonal2DRegion(List<BlockVector2D> points, int minY, int maxY) {
|
public Polygonal2DRegion(LocalWorld world, List<BlockVector2D> points, int minY, int maxY) {
|
||||||
this.points = points;
|
this.points = points;
|
||||||
this.minY = minY;
|
this.minY = minY;
|
||||||
this.maxY = maxY;
|
this.maxY = maxY;
|
||||||
hasY = true;
|
hasY = true;
|
||||||
|
this.world = world;
|
||||||
recalculate();
|
recalculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,6 +123,9 @@ public class Polygonal2DRegion implements Region {
|
|||||||
minY = Math.min(oldMinY, oldMaxY);
|
minY = Math.min(oldMinY, oldMaxY);
|
||||||
maxY = Math.max(oldMinY, oldMaxY);
|
maxY = Math.max(oldMinY, oldMaxY);
|
||||||
|
|
||||||
|
minY = Math.min(Math.max(0, minY), world == null ? 127 : world.getMaxY());
|
||||||
|
maxY = Math.min(Math.max(0, maxY), world == null ? 127 : world.getMaxY());
|
||||||
|
|
||||||
min = new BlockVector(minX, minY, minZ);
|
min = new BlockVector(minX, minY, minZ);
|
||||||
max = new BlockVector(maxX, maxY, maxZ);
|
max = new BlockVector(maxX, maxY, maxZ);
|
||||||
}
|
}
|
||||||
@ -567,4 +584,12 @@ public class Polygonal2DRegion implements Region {
|
|||||||
throw new UnsupportedOperationException("Not supported");
|
throw new UnsupportedOperationException("Not supported");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LocalWorld getWorld() {
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWorld(LocalWorld world) {
|
||||||
|
this.world = world;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ import com.sk89q.worldedit.BlockVector2D;
|
|||||||
import com.sk89q.worldedit.IncompleteRegionException;
|
import com.sk89q.worldedit.IncompleteRegionException;
|
||||||
import com.sk89q.worldedit.LocalPlayer;
|
import com.sk89q.worldedit.LocalPlayer;
|
||||||
import com.sk89q.worldedit.LocalSession;
|
import com.sk89q.worldedit.LocalSession;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.cui.CUIPointBasedRegion;
|
import com.sk89q.worldedit.cui.CUIPointBasedRegion;
|
||||||
import com.sk89q.worldedit.cui.SelectionMinMaxEvent;
|
import com.sk89q.worldedit.cui.SelectionMinMaxEvent;
|
||||||
@ -39,7 +40,11 @@ import com.sk89q.worldedit.cui.SelectionShapeEvent;
|
|||||||
*/
|
*/
|
||||||
public class Polygonal2DRegionSelector implements RegionSelector, CUIPointBasedRegion {
|
public class Polygonal2DRegionSelector implements RegionSelector, CUIPointBasedRegion {
|
||||||
protected BlockVector pos1;
|
protected BlockVector pos1;
|
||||||
protected Polygonal2DRegion region = new Polygonal2DRegion();
|
protected Polygonal2DRegion region;
|
||||||
|
|
||||||
|
public Polygonal2DRegionSelector(LocalWorld world) {
|
||||||
|
region = new Polygonal2DRegion(world);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean selectPrimary(Vector pos) {
|
public boolean selectPrimary(Vector pos) {
|
||||||
if (pos.equals(pos1)) {
|
if (pos.equals(pos1)) {
|
||||||
@ -47,7 +52,7 @@ public class Polygonal2DRegionSelector implements RegionSelector, CUIPointBasedR
|
|||||||
}
|
}
|
||||||
|
|
||||||
pos1 = pos.toBlockVector();
|
pos1 = pos.toBlockVector();
|
||||||
region = new Polygonal2DRegion();
|
region = new Polygonal2DRegion(region.getWorld());
|
||||||
region.addPoint(pos);
|
region.addPoint(pos);
|
||||||
region.expandY(pos.getBlockY());
|
region.expandY(pos.getBlockY());
|
||||||
|
|
||||||
@ -124,7 +129,7 @@ public class Polygonal2DRegionSelector implements RegionSelector, CUIPointBasedR
|
|||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
pos1 = null;
|
pos1 = null;
|
||||||
region = new Polygonal2DRegion();
|
region = new Polygonal2DRegion(region.getWorld());
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTypeName() {
|
public String getTypeName() {
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package com.sk89q.worldedit.regions;
|
package com.sk89q.worldedit.regions;
|
||||||
|
|
||||||
import com.sk89q.worldedit.BlockVector;
|
import com.sk89q.worldedit.BlockVector;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.Vector2D;
|
import com.sk89q.worldedit.Vector2D;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -101,4 +102,18 @@ public interface Region extends Iterable<BlockVector> {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Set<Vector2D> getChunks();
|
public Set<Vector2D> getChunks();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the world the selection is in
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public LocalWorld getWorld();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the world the selection is in
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void setWorld(LocalWorld world);
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ public class SnapshotRestore {
|
|||||||
Chunk chunk;
|
Chunk chunk;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
chunk = chunkStore.getChunk(chunkPos, editSession.getWorld().getName());
|
chunk = chunkStore.getChunk(chunkPos, editSession.getWorld());
|
||||||
// Good, the chunk could be at least loaded
|
// Good, the chunk could be at least loaded
|
||||||
|
|
||||||
// Now just copy blocks!
|
// Now just copy blocks!
|
||||||
|
@ -23,6 +23,7 @@ import com.sk89q.worldedit.EditSession;
|
|||||||
import com.sk89q.worldedit.HeightMap;
|
import com.sk89q.worldedit.HeightMap;
|
||||||
import com.sk89q.worldedit.MaxChangedBlocksException;
|
import com.sk89q.worldedit.MaxChangedBlocksException;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
|
import com.sk89q.worldedit.WorldVector;
|
||||||
import com.sk89q.worldedit.filtering.GaussianKernel;
|
import com.sk89q.worldedit.filtering.GaussianKernel;
|
||||||
import com.sk89q.worldedit.filtering.HeightMapFilter;
|
import com.sk89q.worldedit.filtering.HeightMapFilter;
|
||||||
import com.sk89q.worldedit.patterns.Pattern;
|
import com.sk89q.worldedit.patterns.Pattern;
|
||||||
@ -45,9 +46,9 @@ public class SmoothBrush implements Brush {
|
|||||||
public void build(EditSession editSession, Vector pos, Pattern mat, double size)
|
public void build(EditSession editSession, Vector pos, Pattern mat, double size)
|
||||||
throws MaxChangedBlocksException {
|
throws MaxChangedBlocksException {
|
||||||
double rad = size;
|
double rad = size;
|
||||||
Vector min = pos.subtract(rad, rad, rad);
|
WorldVector min = new WorldVector(editSession.getWorld(), pos.subtract(rad, rad, rad));
|
||||||
Vector max = pos.add(rad, rad + 10, rad);
|
Vector max = pos.add(rad, rad + 10, rad);
|
||||||
Region region = new CuboidRegion(min, max);
|
Region region = new CuboidRegion(editSession.getWorld(), min, max);
|
||||||
HeightMap heightMap = new HeightMap(editSession, region, naturalOnly);
|
HeightMap heightMap = new HeightMap(editSession, region, naturalOnly);
|
||||||
HeightMapFilter filter = new HeightMapFilter(new GaussianKernel(5, 1.0));
|
HeightMapFilter filter = new HeightMapFilter(new GaussianKernel(5, 1.0));
|
||||||
heightMap.applyFilter(filter, iterations);
|
heightMap.applyFilter(filter, iterations);
|
||||||
|
@ -115,7 +115,7 @@ public class TargetBlock {
|
|||||||
if (world.getBlockType(getCurrentBlock()) == BlockID.AIR) {
|
if (world.getBlockType(getCurrentBlock()) == BlockID.AIR) {
|
||||||
if (searchForLastBlock) {
|
if (searchForLastBlock) {
|
||||||
lastBlock = getCurrentBlock();
|
lastBlock = getCurrentBlock();
|
||||||
if (lastBlock.getBlockY() <= 0 || lastBlock.getBlockY() >= 127) {
|
if (lastBlock.getBlockY() <= 0 || lastBlock.getBlockY() >= world.getMaxY()) {
|
||||||
searchForLastBlock = false;
|
searchForLastBlock = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren