Support for non cuboid regions + add #liquid mask

This commit is contained in:
Jesse Boyd 2018-02-27 01:58:12 +11:00
parent 09addf9073
commit 77cf4ec34c
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
39 changed files with 1391 additions and 369 deletions

View File

@ -3,11 +3,22 @@ package com.boydti.fawe.bukkit.regions;
import com.boydti.fawe.bukkit.FaweBukkit;
import com.boydti.fawe.bukkit.filter.WorldGuardFilter;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.regions.general.RegionFilter;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.regions.AbstractRegion;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Polygonal2DRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.GlobalProtectedRegion;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@ -81,7 +92,7 @@ public class Worldguard extends BukkitMaskManager implements Listener {
}
@Override
public BukkitMask getMask(final FawePlayer<Player> fp) {
public FaweMask getMask(FawePlayer<Player> fp, MaskType type) {
final Player player = fp.parent;
final com.sk89q.worldguard.LocalPlayer localplayer = this.worldguard.wrapPlayer(player);
final Location location = player.getLocation();
@ -93,8 +104,17 @@ public class Worldguard extends BukkitMaskManager implements Listener {
pos1 = new Location(location.getWorld(), Integer.MIN_VALUE, 0, Integer.MIN_VALUE);
pos2 = new Location(location.getWorld(), Integer.MAX_VALUE, 255, Integer.MAX_VALUE);
} else {
pos1 = new Location(location.getWorld(), myregion.getMinimumPoint().getBlockX(), myregion.getMinimumPoint().getBlockY(), myregion.getMinimumPoint().getBlockZ());
pos2 = new Location(location.getWorld(), myregion.getMaximumPoint().getBlockX(), myregion.getMaximumPoint().getBlockY(), myregion.getMaximumPoint().getBlockZ());
if (myregion instanceof ProtectedCuboidRegion) {
pos1 = new Location(location.getWorld(), myregion.getMinimumPoint().getBlockX(), myregion.getMinimumPoint().getBlockY(), myregion.getMinimumPoint().getBlockZ());
pos2 = new Location(location.getWorld(), myregion.getMaximumPoint().getBlockX(), myregion.getMaximumPoint().getBlockY(), myregion.getMaximumPoint().getBlockZ());
} else {
return new FaweMask(adapt(myregion), myregion.getId()) {
@Override
public boolean isValid(FawePlayer player, MaskType type) {
return isAllowed(worldguard.wrapPlayer((Player) player.parent), myregion);
}
};
}
}
return new BukkitMask(pos1, pos2) {
@Override
@ -116,4 +136,54 @@ public class Worldguard extends BukkitMaskManager implements Listener {
public RegionFilter getFilter(String world) {
return new WorldGuardFilter(Bukkit.getWorld(world));
}
private static class AdaptedRegion extends AbstractRegion {
private final ProtectedRegion region;
public AdaptedRegion(ProtectedRegion region) {
super(null);
this.region = region;
}
@Override
public Vector getMinimumPoint() {
return region.getMinimumPoint();
}
@Override
public Vector getMaximumPoint() {
return region.getMaximumPoint();
}
@Override
public void expand(Vector... changes) {
throw new UnsupportedOperationException("Region is immutable");
}
@Override
public void contract(Vector... changes) {
throw new UnsupportedOperationException("Region is immutable");
}
@Override
public boolean contains(Vector position) {
return region.contains(position);
}
}
private static Region adapt(ProtectedRegion region) {
if (region instanceof ProtectedCuboidRegion) {
return new CuboidRegion(region.getMinimumPoint(), region.getMaximumPoint());
}
if (region instanceof GlobalProtectedRegion) {
return RegionWrapper.GLOBAL();
}
if (region instanceof ProtectedPolygonalRegion) {
ProtectedPolygonalRegion casted = (ProtectedPolygonalRegion) region;
BlockVector max = region.getMaximumPoint();
BlockVector min = region.getMinimumPoint();
return new Polygonal2DRegion(null, casted.getPoints(), min.getBlockY(), max.getBlockY());
}
return new AdaptedRegion(region);
}
}

View File

@ -267,7 +267,7 @@ public class FaweAPI {
* @param player
* @return
*/
public static RegionWrapper[] getRegions(FawePlayer player) {
public static Region[] getRegions(FawePlayer player) {
return WEManager.IMP.getMask(player);
}

View File

@ -27,4 +27,4 @@ public interface Relighter {
public static final byte AIR = 1;
public static final byte SOLID = 2;
}
}
}

View File

@ -9,46 +9,29 @@ import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard;
import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.regions.FaweMaskManager;
import com.boydti.fawe.util.EditSessionBuilder;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.SetQueue;
import com.boydti.fawe.util.TaskManager;
import com.boydti.fawe.util.WEManager;
import com.boydti.fawe.util.*;
import com.boydti.fawe.wrappers.FakePlayer;
import com.boydti.fawe.wrappers.LocationMaskedPlayerWrapper;
import com.boydti.fawe.wrappers.PlayerWrapper;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.EmptyClipboardException;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.*;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.command.tool.BrushTool;
import com.sk89q.worldedit.command.tool.Tool;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.event.platform.CommandEvent;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extension.platform.Capability;
import com.sk89q.worldedit.extension.platform.CommandManager;
import com.sk89q.worldedit.extension.platform.PlatformManager;
import com.sk89q.worldedit.extension.platform.PlayerProxy;
import com.sk89q.worldedit.extension.platform.*;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionOperationException;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.*;
import com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector;
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
import com.sk89q.worldedit.regions.selector.CylinderRegionSelector;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.registry.WorldData;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.atomic.AtomicInteger;
@ -181,13 +164,9 @@ public abstract class FawePlayer<T> extends Metadatable {
}
}
public void checkAllowedRegion(Region selection) {
checkAllowedRegion(new RegionWrapper(selection.getMinimumPoint(), selection.getMaximumPoint()));
}
public void checkAllowedRegion(RegionWrapper wrappedSelection) {
RegionWrapper[] allowed = WEManager.IMP.getMask(this, FaweMaskManager.MaskType.OWNER);
HashSet<RegionWrapper> allowedSet = new HashSet<>(Arrays.asList(allowed));
public void checkAllowedRegion(Region wrappedSelection) {
Region[] allowed = WEManager.IMP.getMask(this, FaweMaskManager.MaskType.OWNER);
HashSet<Region> allowedSet = new HashSet<>(Arrays.asList(allowed));
if (allowed.length == 0) {
throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_NO_REGION);
} else if (!WEManager.IMP.regionContains(wrappedSelection, allowedSet)) {
@ -371,7 +350,7 @@ public abstract class FawePlayer<T> extends Metadatable {
public FaweQueue getMaskedFaweQueue(boolean autoQueue) {
FaweQueue queue = getFaweQueue(autoQueue);
RegionWrapper[] allowedRegions = getCurrentRegions();
Region[] allowedRegions = getCurrentRegions();
if (allowedRegions.length == 1 && allowedRegions[0].isGlobal()) {
return queue;
}
@ -507,11 +486,13 @@ public abstract class FawePlayer<T> extends Metadatable {
*
* @return
*/
public RegionWrapper[] getCurrentRegions() {
@Deprecated
public Region[] getCurrentRegions() {
return WEManager.IMP.getMask(this);
}
public RegionWrapper[] getCurrentRegions(FaweMaskManager.MaskType type) {
@Deprecated
public Region[] getCurrentRegions(FaweMaskManager.MaskType type) {
return WEManager.IMP.getMask(this, type);
}
@ -520,11 +501,34 @@ public abstract class FawePlayer<T> extends Metadatable {
*
* @param region
*/
@Deprecated
public void setSelection(final RegionWrapper region) {
final Player player = this.getPlayer();
Vector top = region.getTopVector();
Vector top = region.getMaximumPoint();
top.mutY(getWorld().getMaxY());
final RegionSelector selector = new CuboidRegionSelector(player.getWorld(), region.getBottomVector(), top);
final RegionSelector selector = new CuboidRegionSelector(player.getWorld(), region.getMinimumPoint(), top);
this.getSession().setRegionSelector(player.getWorld(), selector);
}
public void setSelection(Region region) {
RegionSelector selector;
switch (region.getClass().getName()) {
case "ConvexPolyhedralRegion":
selector = new ConvexPolyhedralRegionSelector((ConvexPolyhedralRegion) region);
break;
case "CylinderRegion":
selector = new CylinderRegionSelector((CylinderRegion) region);
break;
case "Polygonal2DRegion":
selector = new com.sk89q.worldedit.regions.selector.Polygonal2DRegionSelector((Polygonal2DRegion) region);
break;
default:
selector = new CuboidRegionSelector(null, region.getMinimumPoint(), region.getMaximumPoint());
break;
}
selector.setWorld(region.getWorld());
final Player player = this.getPlayer();
this.getSession().setRegionSelector(player.getWorld(), selector);
}
@ -542,11 +546,11 @@ public abstract class FawePlayer<T> extends Metadatable {
*
* @return
*/
public RegionWrapper getLargestRegion() {
public Region getLargestRegion() {
int area = 0;
RegionWrapper max = null;
for (final RegionWrapper region : this.getCurrentRegions()) {
final int tmp = (region.maxX - region.minX) * (region.maxZ - region.minZ);
Region max = null;
for (final Region region : this.getCurrentRegions()) {
final int tmp = region.getArea();
if (tmp > area) {
area = tmp;
max = region;

View File

@ -10,17 +10,18 @@ import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.biome.BaseBiome;
public class MaskedFaweQueue extends DelegateFaweQueue {
private FaweRegionExtent region;
public MaskedFaweQueue(FaweQueue parent, RegionWrapper[] mask) {
public MaskedFaweQueue(FaweQueue parent, Region[] mask) {
super(parent);
setMask(mask);
}
public void setMask(RegionWrapper[] mask) {
public void setMask(Region[] mask) {
switch (mask.length) {
case 0:
region = new HeightBoundExtent(this, FaweLimit.MAX.copy(), Integer.MIN_VALUE, Integer.MAX_VALUE);

View File

@ -1,17 +1,20 @@
package com.boydti.fawe.object;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.regions.CuboidRegion;
public class RegionWrapper {
public final int minX;
public final int maxX;
public final int minY;
public final int maxY;
public final int minZ;
public final int maxZ;
public class RegionWrapper extends CuboidRegion {
private final static RegionWrapper GLOBAL = new RegionWrapper(Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
public int minX;
public int maxX;
public int minY;
public int maxY;
public int minZ;
public int maxZ;
public static RegionWrapper GLOBAL() {
return new RegionWrapper(Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
return GLOBAL;
}
public RegionWrapper(final int minX, final int maxX, final int minZ, final int maxZ) {
@ -19,15 +22,24 @@ public class RegionWrapper {
}
public RegionWrapper(final int minX, final int maxX, final int minY, final int maxY, final int minZ, final int maxZ) {
this.maxX = maxX;
this.minX = minX;
this.maxZ = maxZ;
this.minZ = minZ;
this.minY = minY;
this.maxY = Math.min(255, maxY);
this(new Vector(minX, 0, minZ), new Vector(maxX, 255, maxZ));
}
public RegionWrapper(final Vector pos1, final Vector pos2) {
super(pos1, pos2);
this.minX = Math.min(pos1.getBlockX(), pos2.getBlockX());
this.minZ = Math.min(pos1.getBlockZ(), pos2.getBlockZ());
this.maxX = Math.max(pos1.getBlockX(), pos2.getBlockX());
this.maxZ = Math.max(pos1.getBlockZ(), pos2.getBlockZ());
this.minY = Math.min(pos1.getBlockY(), pos2.getBlockY());
this.maxY = Math.max(pos1.getBlockY(), pos2.getBlockY());
}
@Override
protected void recalculate() {
super.recalculate();
Vector pos1 = getMinimumPoint();
Vector pos2 = getMaximumPoint();
this.minX = Math.min(pos1.getBlockX(), pos2.getBlockX());
this.minZ = Math.min(pos1.getBlockZ(), pos2.getBlockZ());
this.maxX = Math.max(pos1.getBlockX(), pos2.getBlockX());
@ -112,14 +124,6 @@ public class RegionWrapper {
return this.minX + "," + this.minY + "," + this.minZ + "->" + this.maxX + "," + this.maxY + "," + this.maxZ;
}
public Vector getBottomVector() {
return new Vector(this.minX, 1, this.minZ);
}
public Vector getTopVector() {
return new Vector(this.maxX, 255, this.maxZ);
}
public boolean isGlobal() {
return minX == Integer.MIN_VALUE && minZ == Integer.MIN_VALUE && maxX == Integer.MAX_VALUE && maxZ == Integer.MAX_VALUE && minY <= 0 && maxY >= 255;
}

View File

@ -12,6 +12,7 @@ import com.boydti.fawe.util.MainUtil;
import com.sk89q.jnbt.NBTInputStream;
import com.sk89q.jnbt.NBTOutputStream;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.World;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.io.DataOutput;
@ -136,7 +137,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
enttFile.delete();
}
public void undo(FawePlayer fp, RegionWrapper[] regions) {
public void undo(FawePlayer fp, Region[] regions) {
EditSession session = toEditSession(fp, regions);
session.undo(session);
deleteFiles();

View File

@ -7,7 +7,6 @@ import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.FaweChunk;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.object.RunnableVal2;
import com.boydti.fawe.util.EditSessionBuilder;
import com.boydti.fawe.util.MainUtil;
@ -23,6 +22,7 @@ import com.sk89q.worldedit.history.change.Change;
import com.sk89q.worldedit.history.change.EntityCreate;
import com.sk89q.worldedit.history.change.EntityRemove;
import com.sk89q.worldedit.history.changeset.ChangeSet;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.biome.BaseBiome;
import java.util.Iterator;
@ -151,7 +151,7 @@ public abstract class FaweChangeSet implements ChangeSet {
return toEditSession(player, null);
}
public EditSession toEditSession(FawePlayer player, RegionWrapper[] regions) {
public EditSession toEditSession(FawePlayer player, Region[] regions) {
EditSessionBuilder builder = new EditSessionBuilder(getWorld()).player(player).autoQueue(false).fastmode(false).checkMemory(false).changeSet(this).limitUnlimited();
if (regions != null) {
builder.allowedRegions(regions);

View File

@ -2,7 +2,6 @@ package com.boydti.fawe.object.extent;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.object.FaweLimit;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.util.WEManager;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.Vector;
@ -12,6 +11,7 @@ import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.biome.BaseBiome;
import java.util.Collection;
@ -34,10 +34,10 @@ public abstract class FaweRegionExtent extends ResettableExtent {
public abstract boolean contains(int x, int z);
public abstract Collection<RegionWrapper> getRegions();
public abstract Collection<Region> getRegions();
public boolean isGlobal() {
for (RegionWrapper region : getRegions()) {
for (Region region : getRegions()) {
if (region.isGlobal()) {
return true;
}

View File

@ -3,6 +3,7 @@ package com.boydti.fawe.object.extent;
import com.boydti.fawe.object.FaweLimit;
import com.boydti.fawe.object.RegionWrapper;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.regions.Region;
import java.util.Arrays;
import java.util.Collection;
@ -33,7 +34,7 @@ public class HeightBoundExtent extends FaweRegionExtent {
}
@Override
public Collection<RegionWrapper> getRegions() {
public Collection<Region> getRegions() {
return Arrays.asList(new RegionWrapper(Integer.MIN_VALUE, Integer.MAX_VALUE, min, max, Integer.MIN_VALUE, Integer.MAX_VALUE));
}
}

View File

@ -1,15 +1,15 @@
package com.boydti.fawe.object.extent;
import com.boydti.fawe.object.FaweLimit;
import com.boydti.fawe.object.RegionWrapper;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.regions.Region;
import java.util.Arrays;
import java.util.Collection;
public class MultiRegionExtent extends FaweRegionExtent {
private RegionWrapper region;
private final RegionWrapper[] regions;
private Region region;
private final Region[] regions;
private int index;
/**
@ -17,7 +17,7 @@ public class MultiRegionExtent extends FaweRegionExtent {
*
* @param extent the extent
*/
public MultiRegionExtent(Extent extent, FaweLimit limit, RegionWrapper[] regions) {
public MultiRegionExtent(Extent extent, FaweLimit limit, Region[] regions) {
super(extent, limit);
this.index = 0;
this.region = regions[0];
@ -26,13 +26,13 @@ public class MultiRegionExtent extends FaweRegionExtent {
@Override
public boolean contains(int x, int y, int z) {
if (region.isIn(x, y, z)) {
if (region.contains(x, y, z)) {
return true;
}
for (int i = 0; i < regions.length; i++) {
if (i != index) {
RegionWrapper current = regions[i];
if (current.isIn(x, y, z)) {
Region current = regions[i];
if (current.contains(x, y, z)) {
region = current;
index = i;
return true;
@ -44,13 +44,13 @@ public class MultiRegionExtent extends FaweRegionExtent {
@Override
public boolean contains(int x, int z) {
if (region.isIn(x, z)) {
if (region.contains(x, z)) {
return true;
}
for (int i = 0; i < regions.length; i++) {
if (i != index) {
RegionWrapper current = regions[i];
if (current.isIn(x, z)) {
Region current = regions[i];
if (current.contains(x, z)) {
region = current;
index = i;
return true;
@ -61,7 +61,7 @@ public class MultiRegionExtent extends FaweRegionExtent {
}
@Override
public Collection<RegionWrapper> getRegions() {
public Collection<Region> getRegions() {
return Arrays.asList(regions);
}
}

View File

@ -2,7 +2,6 @@ package com.boydti.fawe.object.extent;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.object.FaweLimit;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.object.exception.FaweException;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D;
@ -115,7 +114,7 @@ public class NullExtent extends FaweRegionExtent {
}
@Override
public Collection<RegionWrapper> getRegions() {
public Collection<Region> getRegions() {
return Collections.emptyList();
}

View File

@ -1,37 +1,37 @@
package com.boydti.fawe.object.extent;
import com.boydti.fawe.object.FaweLimit;
import com.boydti.fawe.object.RegionWrapper;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.regions.Region;
import java.util.Arrays;
import java.util.Collection;
public class SingleRegionExtent extends FaweRegionExtent {
private final RegionWrapper region;
private final Region region;
/**
* Create a new instance.
*
* @param extent the extent
*/
public SingleRegionExtent(Extent extent, FaweLimit limit, RegionWrapper region) {
public SingleRegionExtent(Extent extent, FaweLimit limit, Region region) {
super(extent, limit);
this.region = region;
}
@Override
public boolean contains(int x, int y, int z) {
return region.isIn(x, y, z);
return region.contains(x, y, z);
}
@Override
public boolean contains(int x, int z) {
return region.isIn(x, z);
return region.contains(x, z);
}
@Override
public Collection<RegionWrapper> getRegions() {
public Collection<Region> getRegions() {
return Arrays.asList(region);
}
}

View File

@ -0,0 +1,110 @@
package com.boydti.fawe.object.io;
import java.io.*;
/**
* A positionable file output stream.
* <p>
* Threading Design : [x] Single Threaded [ ] Threadsafe [ ] Immutable [ ] Isolated
*/
public class RandomFileOutputStream extends OutputStream
{
// *****************************************************************************
// INSTANCE PROPERTIES
// *****************************************************************************
protected RandomAccessFile randomFile; // the random file to write to
protected boolean sync; // whether to synchronize every write
protected boolean closeParent;
// *****************************************************************************
// INSTANCE CONSTRUCTION/INITIALIZATON/FINALIZATION, OPEN/CLOSE
// *****************************************************************************
public RandomFileOutputStream(String fnm) throws IOException {
this(fnm,false);
}
public RandomFileOutputStream(String fnm, boolean syn) throws IOException {
this(new File(fnm),syn);
}
public RandomFileOutputStream(File fil) throws IOException {
this(fil,false);
}
public RandomFileOutputStream(File fil, boolean syn) throws IOException {
super();
File par; // parent file
fil=fil.getAbsoluteFile();
if((par=fil.getParentFile())!=null) { par.mkdirs(); }
randomFile=new RandomAccessFile(fil,"rw");
sync=syn;
this.closeParent = true;
}
public RandomFileOutputStream(RandomAccessFile randomFile, boolean syn, boolean closeParent) {
super();
this.randomFile = randomFile;
sync=syn;
this.closeParent = closeParent;
}
// *****************************************************************************
// INSTANCE METHODS - OUTPUT STREAM IMPLEMENTATION
// *****************************************************************************
public void write(int val) throws IOException {
randomFile.write(val);
if(sync) { randomFile.getFD().sync(); }
}
public void write(byte[] val) throws IOException {
randomFile.write(val);
if(sync) { randomFile.getFD().sync(); }
}
public void write(byte[] val, int off, int len) throws IOException {
randomFile.write(val,off,len);
if(sync) { randomFile.getFD().sync(); }
}
public void flush() throws IOException {
if(sync) { randomFile.getFD().sync(); }
}
public void close() throws IOException {
if (closeParent) {
randomFile.close();
}
}
// *****************************************************************************
// INSTANCE METHODS - RANDOM ACCESS EXTENSIONS
// *****************************************************************************
public long getFilePointer() throws IOException {
return randomFile.getFilePointer();
}
public void setFilePointer(long pos) throws IOException {
randomFile.seek(pos);
}
public long getFileSize() throws IOException {
return randomFile.length();
}
public void setFileSize(long len) throws IOException {
randomFile.setLength(len);
}
public FileDescriptor getFD() throws IOException {
return randomFile.getFD();
}
} // END PUBLIC CLASS

View File

@ -1,25 +1,21 @@
package com.boydti.fawe.regions;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.RegionWrapper;
import com.sk89q.worldedit.BlockVector;
import java.util.Arrays;
import java.util.HashSet;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.IDelegateRegion;
import com.sk89q.worldedit.regions.Region;
public class FaweMask {
public class FaweMask implements IDelegateRegion {
private final Region region;
private String description = null;
private BlockVector position1;
private BlockVector position2;
@Deprecated
public FaweMask(final BlockVector pos1, final BlockVector pos2, final String id) {
if ((pos1 == null) || (pos2 == null)) {
throw new IllegalArgumentException("BlockVectors cannot be null!");
}
this.description = id;
this.position1 = new BlockVector(Math.min(pos1.getBlockX(), pos2.getBlockX()), pos1.getBlockY(), Math.min(pos1.getBlockZ(), pos2.getBlockZ()));
this.position2 = new BlockVector(Math.max(pos1.getBlockX(), pos2.getBlockX()), pos2.getBlockY(), Math.max(pos1.getBlockZ(), pos2.getBlockZ()));
this(new CuboidRegion(pos1, pos2), id);
}
@Deprecated
public FaweMask(final BlockVector pos1, final BlockVector pos2) {
this(pos1, pos2, null);
if ((pos1 == null) || (pos2 == null)) {
@ -27,60 +23,26 @@ public class FaweMask {
}
}
public HashSet<RegionWrapper> getRegions() {
final BlockVector lower = this.getLowerBound();
final BlockVector upper = this.getUpperBound();
return new HashSet<>(Arrays.asList(new RegionWrapper(lower.getBlockX(), upper.getBlockX(), lower.getBlockY(), upper.getBlockY(), lower.getBlockZ(), upper.getBlockZ())));
public FaweMask(Region region, String id) {
this.region = region;
this.description = id;
}
@Override
public Region getRegion() {
return region;
}
public String getName() {
return this.description;
}
public BlockVector getLowerBound() {
return this.position1;
}
public BlockVector getUpperBound() {
return this.position2;
}
public void setBounds(final BlockVector pos1, final BlockVector pos2) {
if ((pos1 == null) || (pos2 == null)) {
throw new IllegalArgumentException("BlockVectors cannot be null!");
}
this.position1 = new BlockVector(Math.min(pos1.getBlockX(), pos2.getBlockX()), 0, Math.min(pos1.getBlockZ(), pos2.getBlockZ()));
this.position2 = new BlockVector(Math.max(pos1.getBlockX(), pos2.getBlockX()), 256, Math.max(pos1.getBlockZ(), pos2.getBlockZ()));
}
public boolean isValid(FawePlayer player, FaweMaskManager.MaskType type) {
return false;
}
public BlockVector[] getBounds() {
final BlockVector[] BlockVectors = {this.position1, this.position2};
return BlockVectors;
}
public boolean contains(final BlockVector loc) {
if (loc.getBlockX() < this.position1.getBlockX()) {
return false;
}
if (loc.getBlockX() > this.position2.getBlockX()) {
return false;
}
if (loc.getBlockZ() < this.position1.getBlockZ()) {
return false;
}
if (loc.getBlockZ() > this.position2.getBlockZ()) {
return false;
}
if (loc.getBlockY() < this.position1.getBlockY()) {
return false;
}
if (loc.getBlockY() > this.position2.getBlockY()) {
return false;
}
return true;
@Override
public Region clone() {
throw new UnsupportedOperationException("Clone not supported");
}
}

View File

@ -25,6 +25,7 @@ public abstract class FaweMaskManager<T> {
return this.key;
}
@Deprecated
public FaweMask getMask(final FawePlayer<T> player) {
return getMask(player, MaskType.MEMBER);
}

View File

@ -0,0 +1,48 @@
package com.boydti.fawe.regions;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.regions.AbstractRegion;
import com.sk89q.worldedit.regions.RegionOperationException;
import com.sk89q.worldedit.world.World;
public abstract class SimpleRegion extends AbstractRegion {
private final Vector max;
private final Vector min;
public SimpleRegion(World world, Vector min, Vector max) {
super(world);
this.min = min;
this.max = max;
}
@Override
public Vector getMinimumPoint() {
return min;
}
@Override
public Vector getMaximumPoint() {
return max;
}
@Override
public void expand(Vector... changes) throws RegionOperationException {
throw new UnsupportedOperationException("Region is immutable");
}
@Override
public void contract(Vector... changes) throws RegionOperationException {
throw new UnsupportedOperationException("Region is immutable");
}
@Override
public boolean contains(Vector p) {
return contains(p.getBlockX(), p.getBlockY(), p.getBlockZ());
}
@Override
public abstract boolean contains(int x, int y, int z);
@Override
public abstract boolean contains(int x, int z);
}

View File

@ -1,9 +1,11 @@
package com.boydti.fawe.regions.general.plot;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweAPI;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.regions.FaweMaskManager;
import com.boydti.fawe.regions.SimpleRegion;
import com.boydti.fawe.regions.general.RegionFilter;
import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.commands.MainCommand;
@ -21,6 +23,8 @@ import com.intellectualcrafters.plot.util.block.GlobalBlockQueue;
import com.intellectualcrafters.plot.util.block.QueueProvider;
import com.plotsquared.listener.WEManager;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import java.util.HashSet;
import java.util.UUID;
@ -123,21 +127,28 @@ public class PlotSquaredFeature extends FaweMaskManager {
final BlockVector pos1 = new BlockVector(region.minX, min, region.minZ);
final BlockVector pos2 = new BlockVector(region.maxX, max, region.maxZ);
final Plot finalPlot = plot;
if (Settings.Done.RESTRICT_BUILDING && Flags.DONE.isSet(finalPlot)) {
if (Settings.Done.RESTRICT_BUILDING && Flags.DONE.isSet(finalPlot) || regions.isEmpty()) {
return null;
}
return new FaweMask(pos1, pos2) {
@Override
public String getName() {
return "PLOT^2";
}
Region maskedRegion;
if (regions.size() == 1) {
maskedRegion = new CuboidRegion(pos1, pos2);
} else {
maskedRegion = new SimpleRegion(FaweAPI.getWorld(area.worldname), pos1, pos2) {
@Override
public boolean contains(int x, int y, int z) {
return WEManager.maskContains(regions, x, y, z);
}
@Override
public boolean contains(BlockVector loc) {
return WEManager.maskContains(regions, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
}
@Override
public boolean contains(int x, int z) {
return WEManager.maskContains(regions, x, z);
}
};
}
return new FaweMask(maskedRegion, "PLOT^2") {
@Override
public boolean isValid(FawePlayer player, MaskType type) {
if (Settings.Done.RESTRICT_BUILDING && Flags.DONE.isSet(finalPlot)) {
@ -145,11 +156,6 @@ public class PlotSquaredFeature extends FaweMaskManager {
}
return isAllowed(player, finalPlot, type);
}
@Override
public HashSet<com.boydti.fawe.object.RegionWrapper> getRegions() {
return faweRegions;
}
};
}

View File

@ -4,17 +4,14 @@ import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweAPI;
import com.boydti.fawe.config.Settings;
import com.boydti.fawe.logging.rollback.RollbackOptimizedHistory;
import com.boydti.fawe.object.FaweLimit;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.object.NullChangeSet;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.object.*;
import com.boydti.fawe.object.changeset.DiskStorageHistory;
import com.boydti.fawe.object.changeset.FaweChangeSet;
import com.boydti.fawe.object.changeset.MemoryOptimizedHistory;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.event.extent.EditSessionEvent;
import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.eventbus.EventBus;
import com.sk89q.worldedit.world.World;
import java.util.UUID;
@ -31,7 +28,7 @@ public class EditSessionBuilder {
private FawePlayer player;
private FaweLimit limit;
private FaweChangeSet changeSet;
private RegionWrapper[] allowedRegions;
private Region[] allowedRegions;
private Boolean autoQueue;
private Boolean fastmode;
private Boolean checkMemory;
@ -134,6 +131,12 @@ public class EditSessionBuilder {
return this;
}
public EditSessionBuilder allowedRegions(@Nullable Region[] allowedRegions) {
this.allowedRegions = allowedRegions;
return this;
}
@Deprecated
public EditSessionBuilder allowedRegions(@Nullable RegionWrapper[] allowedRegions) {
this.allowedRegions = allowedRegions;
return this;

View File

@ -50,11 +50,8 @@ public class MathMan {
return ANGLES[(int) (paramFloat * 10430.378F + 16384.0F) & 0xFFFF];
}
public static int log2nlz( int bits )
{
if( bits == 0 )
return 0; // or throw exception
return 31 - Integer.numberOfLeadingZeros( bits );
public static int log2nlz( int bits ) {
return Integer.SIZE - Integer.numberOfLeadingZeros(bits);
}
public static int floorZero(double d0) {

View File

@ -9,12 +9,13 @@ import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.object.extent.NullExtent;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.regions.FaweMaskManager;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.regions.Region;
import java.lang.reflect.Field;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
@ -68,15 +69,13 @@ public class WEManager {
}
@Deprecated
public RegionWrapper[] getMask(final FawePlayer<?> player) {
public Region[] getMask(final FawePlayer<?> player) {
return getMask(player, FaweMaskManager.MaskType.MEMBER);
}
public boolean isIn(int x, int y, int z, Collection<RegionWrapper> regions) {
for (RegionWrapper region : regions) {
if (region.isIn(x, y, z)) {
return true;
}
public boolean isIn(int x, int y, int z, Region region) {
if (region.contains(x, y, z)) {
return true;
}
return false;
}
@ -87,9 +86,9 @@ public class WEManager {
* @param player
* @return
*/
public RegionWrapper[] getMask(final FawePlayer<?> player, FaweMaskManager.MaskType type) {
public Region[] getMask(final FawePlayer<?> player, FaweMaskManager.MaskType type) {
if (!Settings.IMP.REGION_RESTRICTIONS || player.hasPermission("fawe.bypass") || player.hasPermission("fawe.bypass.regions")) {
return new RegionWrapper[]{RegionWrapper.GLOBAL()};
return new Region[]{RegionWrapper.GLOBAL()};
}
FaweLocation loc = player.getLocation();
String world = loc.world;
@ -99,7 +98,7 @@ public class WEManager {
}
player.setMeta("lastMaskWorld", world);
Set<FaweMask> masks = player.getMeta("lastMask");
HashSet<RegionWrapper> regions = new HashSet<>();
HashSet<Region> regions = new HashSet<>();
if (masks == null) {
masks = new HashSet<>();
} else {
@ -108,18 +107,15 @@ public class WEManager {
removed = true;
} else {
for (FaweMask mask : masks) {
HashSet<RegionWrapper> curRegions = mask.getRegions();
for (RegionWrapper region : curRegions) {
if (!isIn(loc.x, loc.y, loc.z, curRegions)) {
removed = true;
break;
}
Region region = mask.getRegion();
if (!region.contains(loc.x, loc.y, loc.z)) {
removed = true;
}
if (!mask.isValid(player, type)) {
removed = true;
break;
}
regions.addAll(curRegions);
regions.add(region);
}
}
if (removed) {
@ -132,11 +128,10 @@ public class WEManager {
for (final FaweMaskManager manager : managers) {
if (player.hasPermission("fawe." + manager.getKey())) {
try {
final FaweMask fm = manager.getMask(player);
if (fm != null) {
HashSet<RegionWrapper> cur = fm.getRegions();
regions.addAll(cur);
masks.add(fm);
final FaweMask mask = manager.getMask(player, FaweMaskManager.MaskType.MEMBER);
if (mask != null) {
regions.add(mask.getRegion());
masks.add(mask);
}
} catch (Throwable e) {
e.printStackTrace();
@ -152,12 +147,17 @@ public class WEManager {
}
public boolean intersects(final RegionWrapper region1, final RegionWrapper region2) {
return (region1.minX <= region2.maxX) && (region1.maxX >= region2.minX) && (region1.minZ <= region2.maxZ) && (region1.maxZ >= region2.minZ);
public boolean intersects(final Region region1, final Region region2) {
Vector rg1P1 = region1.getMinimumPoint();
Vector rg1P2 = region1.getMaximumPoint();
Vector rg2P1 = region2.getMinimumPoint();
Vector rg2P2 = region2.getMaximumPoint();
return (rg1P1.getBlockX() <= rg2P2.getBlockX()) && (rg1P2.getBlockX() >= rg2P1.getBlockX()) && (rg1P1.getBlockZ() <= rg2P2.getBlockZ()) && (rg1P2.getBlockZ() >= rg2P1.getBlockZ());
}
public boolean regionContains(final RegionWrapper selection, final HashSet<RegionWrapper> mask) {
for (final RegionWrapper region : mask) {
public boolean regionContains(final Region selection, final HashSet<Region> mask) {
for (final Region region : mask) {
if (this.intersects(region, selection)) {
return true;
}

View File

@ -52,7 +52,7 @@ public class BStats implements Closeable {
private Gson gson = new Gson();
// Is bStats enabled on this server?
private boolean enabled;
private volatile boolean enabled;
// The uuid of the server
private UUID serverUUID;

View File

@ -38,4 +38,6 @@ public abstract class Tag {
public static Class<?> inject() {
return Tag.class;
}
}

View File

@ -30,44 +30,18 @@ import com.boydti.fawe.jnbt.anvil.MCAQueue;
import com.boydti.fawe.jnbt.anvil.MCAWorld;
import com.boydti.fawe.logging.LoggingChangeSet;
import com.boydti.fawe.logging.rollback.RollbackOptimizedHistory;
import com.boydti.fawe.object.FaweLimit;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.object.HasFaweQueue;
import com.boydti.fawe.object.HistoryExtent;
import com.boydti.fawe.object.NullChangeSet;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.object.RunnableVal;
import com.boydti.fawe.object.changeset.BlockBagChangeSet;
import com.boydti.fawe.object.changeset.CPUOptimizedChangeSet;
import com.boydti.fawe.object.changeset.DiskStorageHistory;
import com.boydti.fawe.object.changeset.FaweChangeSet;
import com.boydti.fawe.object.changeset.MemoryOptimizedHistory;
import com.boydti.fawe.object.*;
import com.boydti.fawe.object.changeset.*;
import com.boydti.fawe.object.clipboard.WorldCopyClipboard;
import com.boydti.fawe.object.collection.LocalBlockVectorSet;
import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.object.extent.FastWorldEditExtent;
import com.boydti.fawe.object.extent.FaweRegionExtent;
import com.boydti.fawe.object.extent.HeightBoundExtent;
import com.boydti.fawe.object.extent.MultiRegionExtent;
import com.boydti.fawe.object.extent.NullExtent;
import com.boydti.fawe.object.extent.ProcessedWEExtent;
import com.boydti.fawe.object.extent.ResettableExtent;
import com.boydti.fawe.object.extent.SingleRegionExtent;
import com.boydti.fawe.object.extent.SlowExtent;
import com.boydti.fawe.object.extent.SourceMaskExtent;
import com.boydti.fawe.object.extent.*;
import com.boydti.fawe.object.function.SurfaceRegionFunction;
import com.boydti.fawe.object.mask.ResettableMask;
import com.boydti.fawe.object.pattern.ExistingPattern;
import com.boydti.fawe.object.progress.ChatProgressTracker;
import com.boydti.fawe.object.progress.DefaultProgressTracker;
import com.boydti.fawe.util.ExtentTraverser;
import com.boydti.fawe.util.MaskTraverser;
import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.MemUtil;
import com.boydti.fawe.util.Perm;
import com.boydti.fawe.util.SetQueue;
import com.boydti.fawe.util.TaskManager;
import com.boydti.fawe.util.*;
import com.boydti.fawe.wrappers.WorldWrapper;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.blocks.BaseBlock;
@ -91,27 +65,13 @@ import com.sk89q.worldedit.function.RegionMaskingFilter;
import com.sk89q.worldedit.function.block.BlockReplace;
import com.sk89q.worldedit.function.block.Naturalizer;
import com.sk89q.worldedit.function.generator.GardenPatchGenerator;
import com.sk89q.worldedit.function.mask.BlockMask;
import com.sk89q.worldedit.function.mask.BoundedHeightMask;
import com.sk89q.worldedit.function.mask.ExistingBlockMask;
import com.sk89q.worldedit.function.mask.FuzzyBlockMask;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.mask.MaskIntersection;
import com.sk89q.worldedit.function.mask.Masks;
import com.sk89q.worldedit.function.mask.NoiseFilter2D;
import com.sk89q.worldedit.function.mask.RegionMask;
import com.sk89q.worldedit.function.mask.*;
import com.sk89q.worldedit.function.operation.ChangeSetExecutor;
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.pattern.BlockPattern;
import com.sk89q.worldedit.function.util.RegionOffset;
import com.sk89q.worldedit.function.visitor.DirectionalVisitor;
import com.sk89q.worldedit.function.visitor.DownwardVisitor;
import com.sk89q.worldedit.function.visitor.FlatRegionVisitor;
import com.sk89q.worldedit.function.visitor.LayerVisitor;
import com.sk89q.worldedit.function.visitor.NonRisingVisitor;
import com.sk89q.worldedit.function.visitor.RecursiveVisitor;
import com.sk89q.worldedit.function.visitor.RegionVisitor;
import com.sk89q.worldedit.function.visitor.*;
import com.sk89q.worldedit.history.UndoContext;
import com.sk89q.worldedit.history.change.BlockChange;
import com.sk89q.worldedit.history.changeset.ChangeSet;
@ -124,11 +84,7 @@ import com.sk89q.worldedit.math.interpolation.Node;
import com.sk89q.worldedit.math.noise.RandomNoise;
import com.sk89q.worldedit.math.transform.AffineTransform;
import com.sk89q.worldedit.patterns.Pattern;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.EllipsoidRegion;
import com.sk89q.worldedit.regions.FlatRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.Regions;
import com.sk89q.worldedit.regions.*;
import com.sk89q.worldedit.regions.shape.ArbitraryBiomeShape;
import com.sk89q.worldedit.regions.shape.ArbitraryShape;
import com.sk89q.worldedit.regions.shape.RegionShape;
@ -140,15 +96,7 @@ import com.sk89q.worldedit.world.SimpleWorld;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.biome.BaseBiome;
import com.sk89q.worldedit.world.registry.WorldData;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@ -213,7 +161,12 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
this(null, world, queue, player, limit, changeSet, allowedRegions, autoQueue, fastmode, checkMemory, combineStages, blockBag, bus, event);
}
@Deprecated
public EditSession(@Nullable String worldName, @Nullable World world, @Nullable FaweQueue queue, @Nullable FawePlayer player, @Nullable FaweLimit limit, @Nullable FaweChangeSet changeSet, @Nullable RegionWrapper[] allowedRegions, @Nullable Boolean autoQueue, @Nullable Boolean fastmode, @Nullable Boolean checkMemory, @Nullable Boolean combineStages, @Nullable BlockBag blockBag, @Nullable EventBus bus, @Nullable EditSessionEvent event) {
this(worldName, world, queue, player, limit, changeSet, (Region[]) allowedRegions, autoQueue, fastmode, checkMemory, combineStages, blockBag, bus, event);
}
public EditSession(@Nullable String worldName, @Nullable World world, @Nullable FaweQueue queue, @Nullable FawePlayer player, @Nullable FaweLimit limit, @Nullable FaweChangeSet changeSet, @Nullable Region[] allowedRegions, @Nullable Boolean autoQueue, @Nullable Boolean fastmode, @Nullable Boolean checkMemory, @Nullable Boolean combineStages, @Nullable BlockBag blockBag, @Nullable EventBus bus, @Nullable EditSessionEvent event) {
super(world);
this.worldName = worldName == null ? world == null ? queue == null ? "" : queue.getWorldName() : Fawe.imp().getWorldName(world) : worldName;
if (world == null && this.worldName != null) world = FaweAPI.getWorld(this.worldName);
@ -355,7 +308,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
} else {
this.extent = new ProcessedWEExtent(this.extent, this.limit);
if (allowedRegions.length == 1) {
RegionWrapper region = allowedRegions[0];
Region region = allowedRegions[0];
this.extent = new SingleRegionExtent(this.extent, this.limit, allowedRegions[0]);
} else {
this.extent = new MultiRegionExtent(this.extent, this.limit, allowedRegions);
@ -1080,50 +1033,6 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
return bypassAll.getLazyBlock(position);
}
/**
* Returns the highest solid 'terrain' block which can occur naturally.
*
* @param x the X coordinate
* @param z the Z cooridnate
* @param minY minimal height
* @param maxY maximal height
* @return height of highest block found or 'minY'
*/
public int getHighestTerrainBlock(final int x, final int z, final int minY, final int maxY) {
return this.getHighestTerrainBlock(x, z, minY, maxY, false);
}
/**
* Returns the highest solid 'terrain' block which can occur naturally.
*
* @param x the X coordinate
* @param z the Z coordinate
* @param minY minimal height
* @param maxY maximal height
* @param naturalOnly look at natural blocks or all blocks
* @return height of highest block found or 'minY'
*/
public int getHighestTerrainBlock(final int x, final int z, int minY, int maxY, final boolean naturalOnly) {
maxY = Math.min(maxY, Math.max(0, maxY));
minY = Math.max(0, minY);
if (naturalOnly) {
for (int y = maxY; y >= minY; --y) {
BaseBlock block = getLazyBlock(x, y, z);
if (BlockType.isNaturalTerrainBlock(block.getId(), block.getData())) {
return y;
}
}
} else {
for (int y = maxY; y >= minY; --y) {
BaseBlock block = getLazyBlock(x, y, z);
if (!FaweCache.canPassThrough(block.getId(), block.getData())) {
return y;
}
}
}
return minY;
}
/**
* Set a block, bypassing both history and block re-ordering.
*
@ -1667,8 +1576,8 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
Vector pos1 = region.getMinimumPoint();
Vector pos2 = region.getMaximumPoint();
boolean contains = false;
for (RegionWrapper current : regionExtent.getRegions()) {
if (current.isIn((int) pos1.getX(), pos1.getBlockY(), pos1.getBlockZ()) && current.isIn(pos2.getBlockX(), pos2.getBlockY(), pos2.getBlockZ())) {
for (Region current : regionExtent.getRegions()) {
if (current.contains((int) pos1.getX(), pos1.getBlockY(), pos1.getBlockZ()) && current.contains(pos2.getBlockX(), pos2.getBlockY(), pos2.getBlockZ())) {
contains = true;
break;
}

View File

@ -3,7 +3,7 @@ package com.sk89q.worldedit;
import java.io.IOException;
import java.io.Serializable;
public final class MutableBlockVector2D extends Vector2D implements Serializable {
public final class MutableBlockVector2D extends BlockVector2D implements Serializable {
private static ThreadLocal<MutableBlockVector2D> MUTABLE_CACHE = new ThreadLocal<MutableBlockVector2D>() {
@Override
protected MutableBlockVector2D initialValue() {
@ -18,6 +18,7 @@ public final class MutableBlockVector2D extends Vector2D implements Serializable
private transient int x, z;
public MutableBlockVector2D() {
super(0, 0);
this.x = 0;
this.z = 0;
}

View File

@ -37,13 +37,9 @@ import com.boydti.fawe.util.MathMan;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.WorldVector;
import com.sk89q.worldedit.*;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.command.binding.Range;
import com.sk89q.worldedit.util.command.parametric.Optional;
import com.sk89q.worldedit.world.World;
@ -181,7 +177,7 @@ public class HistoryCommands {
final FawePlayer fp = FawePlayer.wrap(player);
final FaweQueue finalQueue;
RegionWrapper[] allowedRegions = fp.getCurrentRegions(FaweMaskManager.MaskType.OWNER);
Region[] allowedRegions = fp.getCurrentRegions(FaweMaskManager.MaskType.OWNER);
if (allowedRegions == null) {
BBC.NO_REGION.send(fp);
return;

View File

@ -1,25 +1,7 @@
package com.sk89q.worldedit.command;
import com.boydti.fawe.object.mask.AdjacentAnyMask;
import com.boydti.fawe.object.mask.AdjacentMask;
import com.boydti.fawe.object.mask.AngleMask;
import com.boydti.fawe.object.mask.BiomeMask;
import com.boydti.fawe.object.mask.BlockLightMask;
import com.boydti.fawe.object.mask.BrightnessMask;
import com.boydti.fawe.object.mask.DataMask;
import com.boydti.fawe.object.mask.IdDataMask;
import com.boydti.fawe.object.mask.IdMask;
import com.boydti.fawe.object.mask.LightMask;
import com.boydti.fawe.object.mask.OpacityMask;
import com.boydti.fawe.object.mask.RadiusMask;
import com.boydti.fawe.object.mask.RandomMask;
import com.boydti.fawe.object.mask.SimplexMask;
import com.boydti.fawe.object.mask.SkyLightMask;
import com.boydti.fawe.object.mask.SurfaceMask;
import com.boydti.fawe.object.mask.WallMask;
import com.boydti.fawe.object.mask.XAxisMask;
import com.boydti.fawe.object.mask.YAxisMask;
import com.boydti.fawe.object.mask.ZAxisMask;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.object.mask.*;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession;
@ -28,16 +10,7 @@ import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.BlockMask;
import com.sk89q.worldedit.function.mask.ExistingBlockMask;
import com.sk89q.worldedit.function.mask.ExpressionMask;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.mask.MaskIntersection;
import com.sk89q.worldedit.function.mask.MaskUnion;
import com.sk89q.worldedit.function.mask.Masks;
import com.sk89q.worldedit.function.mask.OffsetMask;
import com.sk89q.worldedit.function.mask.RegionMask;
import com.sk89q.worldedit.function.mask.SolidBlockMask;
import com.sk89q.worldedit.function.mask.*;
import com.sk89q.worldedit.internal.expression.Expression;
import com.sk89q.worldedit.internal.expression.ExpressionException;
import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment;
@ -188,6 +161,19 @@ public class MaskCommands extends MethodCommands {
return new SolidBlockMask(extent);
}
@Command(
aliases = {"#liquid"},
desc = "If there is a solid block"
)
public Mask liquid(Extent extent) {
return new ConditionalMask(extent) {
@Override
public boolean applies(BaseBlock block) {
return FaweCache.isLiquid(block.getId());
}
};
}
@Command(
aliases = {"#dregion", "#dselection", "#dsel"},
desc = "inside the player's selection"

View File

@ -157,7 +157,7 @@ public class UtilityCommands extends MethodCommands {
@Command(
aliases = {"/fill"},
usage = "<pattern> <radius> [depth]",
usage = "<pattern> <radius> [depth] [direction]",
desc = "Fill a hole",
min = 2,
max = 4

View File

@ -1,15 +1,12 @@
package com.sk89q.worldedit.extent;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.jnbt.anvil.generator.CavesGen;
import com.boydti.fawe.jnbt.anvil.generator.GenBase;
import com.boydti.fawe.jnbt.anvil.generator.OreGen;
import com.boydti.fawe.jnbt.anvil.generator.Resource;
import com.boydti.fawe.jnbt.anvil.generator.SchemGen;
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.blocks.BlockID;
import com.sk89q.worldedit.blocks.BlockType;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.mask.Mask;
@ -71,6 +68,50 @@ public interface Extent extends InputExtent, OutputExtent {
return setBiome(MutableBlockVector2D.get(x, z), biome);
}
/**
* Returns the highest solid 'terrain' block which can occur naturally.
*
* @param x the X coordinate
* @param z the Z cooridnate
* @param minY minimal height
* @param maxY maximal height
* @return height of highest block found or 'minY'
*/
default int getHighestTerrainBlock(final int x, final int z, final int minY, final int maxY) {
return this.getHighestTerrainBlock(x, z, minY, maxY, false);
}
/**
* Returns the highest solid 'terrain' block which can occur naturally.
*
* @param x the X coordinate
* @param z the Z coordinate
* @param minY minimal height
* @param maxY maximal height
* @param naturalOnly look at natural blocks or all blocks
* @return height of highest block found or 'minY'
*/
default int getHighestTerrainBlock(final int x, final int z, int minY, int maxY, final boolean naturalOnly) {
maxY = Math.min(maxY, Math.max(0, maxY));
minY = Math.max(0, minY);
if (naturalOnly) {
for (int y = maxY; y >= minY; --y) {
BaseBlock block = getLazyBlock(x, y, z);
if (BlockType.isNaturalTerrainBlock(block.getId(), block.getData())) {
return y;
}
}
} else {
for (int y = maxY; y >= minY; --y) {
BaseBlock block = getLazyBlock(x, y, z);
if (!FaweCache.canPassThrough(block.getId(), block.getData())) {
return y;
}
}
}
return minY;
}
default public int getNearestSurfaceLayer(int x, int z, int y, int minY, int maxY) {
int clearanceAbove = maxY - y;
int clearanceBelow = y - minY;

View File

@ -0,0 +1,553 @@
package com.sk89q.worldedit.extent.clipboard.io;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.object.collection.SoftHashMap;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.world.registry.WorldData;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
import javax.imageio.ImageIO;
public class WavefrontReader implements ClipboardReader {
private final InputStream inputStream;
private final File root;
private final Map<String, BufferedImage> textures = new SoftHashMap<>();
private final Map<String, Map<String, Material>> materialFiles = new HashMap<>();
private final Map<String, Material> materials = new HashMap<>();
public WavefrontReader(File file) throws FileNotFoundException {
this.inputStream = new BufferedInputStream(new FileInputStream(file));
File parent = file.getParentFile();
this.root = parent == null ? new File(".") : parent;
}
private final static double parse(String s) {
int len = s.length();
int index;
int numIndex = 1;
double neg;
if (s.charAt(0) == '-') {
neg = -1;
index = 1;
} else {
index = 0;
neg = 1;
}
double val = 0;
outer:
for (; index < len; index++) {
char c = s.charAt(index);
switch (c) {
case ' ': break outer;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
val = val * 10 + (c - 48);
continue;
case '.': {
double factor = 0.1;
for (; index < len; index++) {
c = s.charAt(index);
switch (c) {
case ' ': break outer;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
val += ((c - 48) * factor);
factor *= 0.1;
}
}
}
break;
}
}
return val * neg;
}
@Override
public Clipboard read(WorldData data) throws IOException {
try (InputStream finalStream = inputStream) {
load(finalStream);
}
return null;
}
private final BufferedImage getTexture(String file) throws IOException {
BufferedImage texture = textures.get(file);
if (texture == null) {
texture = ImageIO.read(new File(root, file));
textures.put(file, texture);
}
return texture;
}
private void readLines(InputStream stream, Consumer<String> onEachLine, boolean nullTerminate) throws IOException {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
if (line.isEmpty() || line.charAt(0) == '#') continue;
onEachLine.accept(line);
}
if (nullTerminate) onEachLine.accept(null);
}
}
private final int toIntColor(float color) {
return (int) (color * 256 + 0.5);
}
private String getFileName(String arg) {
String[] pathSplit = arg.split("[/|\\\\]");
return pathSplit[pathSplit.length - 1];
}
private class Material {
private double dissolve = 1;
private int color = Integer.MIN_VALUE;
private String texture;
}
private final void loadMaterials(String fileName) throws IOException {
File file = new File(root, fileName);
if (!file.exists()) {
Fawe.debug(".mtl not found: " + fileName);
return;
}
Map<String, Material> mtl = materialFiles.get(fileName);
if (mtl == null) {
final Map<String, Material> tmp = mtl = new HashMap<>();
materialFiles.put(fileName, tmp);
readLines(new FileInputStream(file), new Consumer<String>() {
private String name;
private Material material;
private int index;
private void add() {
if (material != null) {
if (material.color == Integer.MIN_VALUE) {
material.color = -1;
}
tmp.put(name, material);
material = null;
name = null;
}
}
@Override
public void accept(String s) {
if (s == null) {
add();
return;
}
String[] args = s.split("[ ]+");
switch (args[0]) {
// Name
case "newmtl": {
add();
material = new Material();
name = args[1];
break;
}
// Color
case "Ka":
if (material.color != Integer.MIN_VALUE) break;
case "Kd": {
float r = Float.parseFloat(args[1]);
float g = Float.parseFloat(args[2]);
float b = Float.parseFloat(args[3]);
material.color = (toIntColor(r) << 16) + (toIntColor(g) << 8) + toIntColor(b);
break;
}
// Density
case "d": {
material.dissolve = Double.parseDouble(args[1]);
break;
}
case "Tr": {
material.dissolve = 1.0 - Double.parseDouble(args[1]);
break;
}
case "map_Ka":
if (material.texture != null) break;
case "map_Kd": {
material.texture = getFileName(args[1]);
break;
}
}
}
}, true);
}
materials.putAll(mtl);
}
private final Material getMaterial(String name) {
Material mtl = materials.get(name);
return mtl != null ? mtl : new Material();
}
private void load(InputStream in) throws IOException {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
if (line.isEmpty()) continue;
char char0 = line.charAt(0);
switch (char0) {
case '#': continue;
case 'v':
switch (line.charAt(1)) {
case ' ':
case 'n': {
Double.parseDouble("");
break;
}
case 't': {
}
}
break;
case 'f': {
break;
}
case 'l':
case 's':
case 'o':
case 'g':
// Ignore
break;
default:
String[] args = line.split(" ");
switch (args[0]) {
case "mtllib": {
String[] pathSplit = args[1].split("[/|\\\\]");
String fileName = pathSplit[pathSplit.length - 1];
loadMaterials(fileName);
break;
}
}
}
}
}
//
// final File directory = file.getParentFile();
// final Map<String, SimpleMaterial> materials = new HashMap<String, SimpleMaterial>();
// final Map<Face, BufferedImage> textures = new HashMap<Face, BufferedImage>();
// final Map<Face, Color> colors = new HashMap<Face, Color>();
// final List<Vertex> v = new LinkedList<Vertex>();
// final List<VertexTexture> vt = new LinkedList<VertexTexture>();
// final List<Vertex> vn = new LinkedList<Vertex>();
// final List<Face> f = new LinkedList<Face>();
// final List<String[]> obj = new LinkedList<String[]>();
// for (final String[] entry : obj) {
// if (entry[0].equals("v") || entry[0].equals("vn")) {
// if (entry.length == 1) {
// VLogger.log("[ERROR] Invalid vertex or vertex normal entry found (no data)");
// return null;
// }
// double x;
// double y;
// double z;
// try {
// x = Double.parseDouble(entry[1]);
// y = Double.parseDouble(entry[2]);
// z = Double.parseDouble(entry[3]);
// }
// catch (NumberFormatException | ArrayIndexOutOfBoundsException ex8) {
// final RuntimeException ex5;
// final RuntimeException ex = ex5;
// VLogger.log("[ERROR] Invalid vertex or vertex normal entry found (not parseable data)");
// return null;
// }
// if (entry[0].equals("v")) {
// if (entry.length >= 6) {
// try {
// final float r = Float.parseFloat(entry[4]);
// final float g = Float.parseFloat(entry[5]);
// final float b = Float.parseFloat(entry[6]);
// final Color c = new Color(r, g, b);
// v.add(new Vertex(x, y, z, v.size() + 1, c));
// continue;
// }
// catch (NumberFormatException | ArrayIndexOutOfBoundsException ex9) {
// final RuntimeException ex6;
// final RuntimeException ex = ex6;
// VLogger.log("[ERROR] Invalid vertex color (not parseable data)");
// return null;
// }
// }
// v.add(new Vertex(x, y, z, v.size() + 1));
// }
// else {
// vn.add(new Vertex(x, y, z, vn.size() + 1));
// }
// }
// else {
// if (!entry[0].equals("vt")) {
// continue;
// }
// if (entry.length == 1) {
// VLogger.log("[ERROR] Invalid vertex texture entry found (no data)");
// return null;
// }
// double vt_u;
// double vt_v;
// try {
// vt_u = Double.parseDouble(entry[1]);
// vt_v = Double.parseDouble(entry[2]);
// if (vt_u < 0.0 || vt_v < 0.0 || vt_u > 1.0 || vt_v > 1.0) {
// VLogger.log("[ERROR] UV of vertex texture out of bounds");
// return null;
// }
// }
// catch (NumberFormatException | ArrayIndexOutOfBoundsException ex10) {
// final RuntimeException ex7;
// final RuntimeException ex2 = ex7;
// VLogger.log("[ERROR] Invalid vertex texture entry found (not parseable data)");
// return null;
// }
// vt.add(new VertexTexture(vt_u, vt_v, vn.size() + 1));
// }
// }
// VLogger.log("[IMPORT] Loaded " + v.size() + " vertexes");
// VLogger.log("[IMPORT] Loaded " + vt.size() + " vertex textures");
// VLogger.log("[IMPORT] Loaded " + vn.size() + " vertex normals");
// BufferedImage usemtl_texture = null;
// Color usemtl_color = null;
// for (final String[] entry2 : obj) {
// if (entry2[0].equals("usemtl")) {
// if (entry2.length == 1) {
// VLogger.log("[ERROR] Invalid usemtl entry");
// return null;
// }
// SimpleMaterial material = (SimpleMaterial)materials.get(entry2[1]);
// if (material == null) {
// VLogger.log("[WARN] Material '" + entry2[1] + "' does not exist");
// material = getFallbackMaterial();
// VLogger.log("[WARN] Replacing with fallback material");
// }
// usemtl_texture = material.texture;
// usemtl_color = material.color;
// VLogger.log("[IMPORT] Now using material '" + entry2[1] + "'");
// }
// else {
// if (!entry2[0].equals("f")) {
// continue;
// }
// if (entry2.length == 1) {
// VLogger.log("[ERROR] Invalid face entry (no arguments)");
// return null;
// }
// if (usemtl_texture == null && usemtl_color == null) {
// VLogger.log("[WARN] Current Material has neither a texture nor a color");
// usemtl_color = Colors.getGray(1.0f);
// VLogger.log("[WARN] Using fallback color");
// }
// final Collection<FacePoint> points = new LinkedList<FacePoint>();
// for (int i = 1; i < entry2.length; ++i) {
// final String[] comp = entry2[i].split("/");
// Integer comp_v;
// Integer comp_vt;
// Integer comp_vn;
// try {
// comp_v = Integer.parseInt(comp[0]);
// comp_vt = ((comp.length <= 1 || comp[1].isEmpty()) ? null : Integer.parseInt(comp[1]));
// comp_vn = ((comp.length <= 2 || comp[2].isEmpty()) ? null : Integer.parseInt(comp[2]));
// }
// catch (NumberFormatException ex3) {
// final StringBuilder debug = new StringBuilder();
// String[] array;
// for (int length = (array = comp).length, j = 0; j < length; ++j) {
// final String segment = array[j];
// debug.append(segment);
// debug.append("/");
// }
// VLogger.log("[ERROR] Face point failed to load (" + (Object)debug + ")");
// return null;
// }
// try {
// final FacePoint point = new FacePoint();
// point.v = v.get((int)comp_v - 1);
// point.vt = ((comp_vt == null) ? null : ((VertexTexture)vt.get((int)comp_vt - 1)));
// point.vn = ((comp_vn == null) ? null : ((Vertex)vn.get((int)comp_vn - 1)));
// points.add(point);
// }
// catch (IndexOutOfBoundsException ex4) {
// VLogger.log("[ERROR] Face point reference to missing vertex");
// return null;
// }
// }
// final Face face = new Face(points);
// f.add(face);
// if (usemtl_texture != null) {
// textures.put(face, usemtl_texture);
// }
// if (usemtl_color == null) {
// continue;
// }
// colors.put(face, usemtl_color);
// }
// }
// double minX = Double.MAX_VALUE;
// double minY = Double.MAX_VALUE;
// double minZ = Double.MAX_VALUE;
// double maxX = -1.7976931348623157E308;
// double maxY = -1.7976931348623157E308;
// double maxZ = -1.7976931348623157E308;
// for (final Face face2 : f) {
// for (final FacePoint point2 : face2.points) {
// final double x2 = point2.v.getX();
// final double y2 = point2.v.getY();
// final double z2 = point2.v.getZ();
// if (x2 < minX) {
// minX = x2;
// }
// else if (x2 > maxX) {
// maxX = x2;
// }
// if (y2 < minY) {
// minY = y2;
// }
// else if (y2 > maxY) {
// maxY = y2;
// }
// if (z2 < minZ) {
// minZ = z2;
// }
// else {
// if (z2 <= maxZ) {
// continue;
// }
// maxZ = z2;
// }
// }
// }
// final double size = Math.max(maxX - minX, Math.max(maxY - minY, maxZ - minZ));
// final double scale = size / (resolution - 1.0);
// final List<Face> polygons = new LinkedList<Face>();
// for (final Face face3 : f) {
// polygons.addAll(shatterFace(face3, colors, textures));
// }
// VLogger.log("[IMPORT] " + f.size() + " faces -> " + polygons.size() + " polygons");
// final Map<Position3D, Color> colormap = new HashMap<Position3D, Color>();
// for (final Face poly : polygons) {
// final FacePoint a = (FacePoint)poly.points.get(0);
// final FacePoint b2 = (FacePoint)poly.points.get(1);
// final FacePoint c2 = (FacePoint)poly.points.get(2);
// final Vector3D vAB = new Vector3D((Point3D)a.v, (Point3D)b2.v);
// final Vector3D vAC = new Vector3D((Point3D)a.v, (Point3D)c2.v);
// final float lAB = (float)vAB.length();
// final float lAC = (float)vAC.length();
// double[] array3;
// if (a.vt == null || b2.vt == null) {
// final double[] array2 = array3 = new double[2];
// array2[1] = (array2[0] = 0.0);
// }
// else {
// final double[] array4 = array3 = new double[2];
// array4[0] = b2.vt.u - a.vt.u;
// array4[1] = b2.vt.v - a.vt.v;
// }
// final double[] uvAB = array3;
// double[] array6;
// if (a.vt == null || c2.vt == null) {
// final double[] array5 = array6 = new double[2];
// array5[1] = (array5[0] = 0.0);
// }
// else {
// final double[] array7 = array6 = new double[2];
// array7[0] = c2.vt.u - a.vt.u;
// array7[1] = c2.vt.v - a.vt.v;
// }
// final double[] uvAC = array6;
// double[] array9;
// if (a.vt == null) {
// final double[] array8 = array9 = new double[2];
// array8[1] = (array8[0] = 0.0);
// }
// else {
// final double[] array10 = array9 = new double[2];
// array10[0] = a.vt.u;
// array10[1] = a.vt.v;
// }
// final double[] uvA = array9;
// final Vector3D i2 = vAB.clone();
// i2.normalize();
// i2.multiply(scale);
// final Vector3D i3 = vAC.clone();
// i3.normalize();
// i3.multiply(scale);
// final BufferedImage texture = (BufferedImage)textures.get(poly);
// final Color poly_color = (Color)colors.get(poly);
// final int maxW = (texture == null) ? 0 : (texture.getWidth() - 1);
// final int maxH = (texture == null) ? 0 : (texture.getHeight() - 1);
// final double l = scale / 2.0;
// for (float aloop = 0.0f; aloop < lAB; aloop += l) {
// for (float bloop = 0.0f; bloop < lAC; bloop += l) {
// final float ratio1 = aloop / lAB;
// final float ratio2 = bloop / lAC;
// if (ratio1 + ratio2 > 1.0f) {
// break;
// }
// final Point3D point3 = a.v.clone();
// point3.add(vAB.clone().multiply((double)ratio1));
// point3.add(vAC.clone().multiply((double)ratio2));
// final double colorU = uvA[0] + uvAB[0] * ratio1 + uvAC[0] * ratio2;
// final double colorV = uvA[1] + uvAB[1] * ratio1 + uvAC[1] * ratio2;
// Color pointcolor = null;
// if (texture == null) {
// if (poly.hasVertexColors()) {
// final WeightedColor cA = new WeightedColor(a.v.getColor().getRGB(), 1.0f - ratio1 - ratio2);
// final WeightedColor cB = new WeightedColor(b2.v.getColor().getRGB(), ratio1);
// final WeightedColor cC = new WeightedColor(c2.v.getColor().getRGB(), ratio2);
// pointcolor = Colors.blendColors(new WeightedColor[] { cA, cB, cC });
// }
// else {
// pointcolor = poly_color;
// }
// }
// else {
// pointcolor = new Color(texture.getRGB((int)Math.floor((double)maxW * colorU), (int)Math.floor((double)maxH - maxH * colorV)), true);
// }
// if (pointcolor.getAlpha() != 0) {
// point3.divide(scale);
// colormap.put(point3.toPositionRound(), pointcolor);
// colormap.put(point3.toPositionFloor(), pointcolor);
// }
// }
// }
// }
// VLogger.log("[IMPORT] Import complete, loaded " + f.size() + " faces");
// VLogger.log("[IMPORT] Import complete, created " + colormap.size() + " voxels");
// return new VoxelBox(colormap);
}
}

View File

@ -0,0 +1,18 @@
package com.sk89q.worldedit.function.mask;
import com.boydti.fawe.FaweCache;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.extent.Extent;
public abstract class ConditionalMask extends BlockMask {
public ConditionalMask(Extent extent) {
super(extent);
for (BaseBlock block : FaweCache.CACHE_BLOCK) {
if (applies(block)) {
add(block);
}
}
}
public abstract boolean applies(BaseBlock block);
}

View File

@ -133,7 +133,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
/**
* Clamps the cuboid according to boundaries of the world.
*/
private void recalculate() {
protected void recalculate() {
if (pos1 == null || pos2 == null) {
return;
}
@ -413,6 +413,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
// private int lz = Integer.MIN_VALUE;
// private boolean lr, lry, lrz;
@Override
public boolean contains(int x, int y, int z) {
return x >= this.minX && x <= this.maxX && z >= this.minZ && z <= this.maxZ && y >= this.minY && y <= this.maxY;
// if (z != lz) {
@ -431,6 +432,11 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
// return lr && (x >= this.minX && x <= this.maxX);
}
@Override
public boolean contains(int x, int z) {
return x >= this.minX && x <= this.maxX && z >= this.minZ && z <= this.maxZ;
}
@Override
public Iterator<BlockVector> iterator() {
if (Settings.IMP.HISTORY.COMPRESSION_LEVEL >= 9 || useOldIterator) {

View File

@ -0,0 +1,110 @@
package com.sk89q.worldedit.regions;
import com.sk89q.worldedit.*;
import com.sk89q.worldedit.world.World;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
public interface IDelegateRegion extends Region {
public Region getRegion();
@Override
default Iterator<BlockVector> iterator() {
return getRegion().iterator();
}
@Override
default Vector getMinimumPoint() {
return getRegion().getMinimumPoint();
}
@Override
default Vector getMaximumPoint() {
return getRegion().getMaximumPoint();
}
@Override
default Vector getCenter() {
return getRegion().getCenter();
}
@Override
default int getArea() {
return getRegion().getArea();
}
@Override
default int getWidth() {
return getRegion().getWidth();
}
@Override
default int getHeight() {
return getRegion().getHeight();
}
@Override
default int getLength() {
return getRegion().getLength();
}
@Override
default void expand(Vector... changes) throws RegionOperationException {
getRegion().expand(changes);
}
@Override
default void contract(Vector... changes) throws RegionOperationException {
getRegion().contract(changes);
}
@Override
default void shift(Vector change) throws RegionOperationException {
getRegion().shift(change);
}
@Override
default boolean contains(Vector position) {
return getRegion().contains(position);
}
@Override
default Set<Vector2D> getChunks() {
return getRegion().getChunks();
}
@Override
default Set<Vector> getChunkCubes() {
return getRegion().getChunkCubes();
}
@Override
@Nullable
default World getWorld() {
return getRegion().getWorld();
}
@Override
default void setWorld(@Nullable World world) {
getRegion().setWorld(world);
}
@Override
@Deprecated
default void setWorld(@Nullable LocalWorld world) {
getRegion().setWorld(world);
}
@Override
default Region clone() {
return getRegion().clone();
}
@Override
default List<BlockVector2D> polygonize(int maxPoints) {
return getRegion().polygonize(maxPoints);
}
}

View File

@ -0,0 +1,182 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.regions;
import com.sk89q.worldedit.*;
import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Set;
/**
* Represents a physical shape.
*/
public interface Region extends Iterable<BlockVector>, Cloneable {
/**
* Get the lower point of a region.
*
* @return min. point
*/
public Vector getMinimumPoint();
/**
* Get the upper point of a region.
*
* @return max. point
*/
public Vector getMaximumPoint();
/**
* Get the center point of a region.
* Note: Coordinates will not be integers
* if the corresponding lengths are even.
*
* @return center point
*/
public Vector getCenter();
/**
* Get the number of blocks in the region.
*
* @return number of blocks
*/
public int getArea();
/**
* Get X-size.
*
* @return width
*/
public int getWidth();
/**
* Get Y-size.
*
* @return height
*/
public int getHeight();
/**
* Get Z-size.
*
* @return length
*/
public int getLength();
/**
* Expand the region.
*
* @param changes array/arguments with multiple related changes
* @throws RegionOperationException
*/
public void expand(Vector... changes) throws RegionOperationException;
/**
* Contract the region.
*
* @param changes array/arguments with multiple related changes
* @throws RegionOperationException
*/
public void contract(Vector... changes) throws RegionOperationException;
/**
* Shift the region.
*
* @param change the change
* @throws RegionOperationException
*/
public void shift(Vector change) throws RegionOperationException;
/**
* Returns true based on whether the region contains the point.
*
* @param position the position
* @return true if contained
*/
public boolean contains(Vector position);
default boolean contains(int x, int y, int z) {
return contains(MutableBlockVector.get(x, y, z));
}
default boolean contains(int x, int z) {
return contains(MutableBlockVector.get(x, 0, z));
}
default boolean isGlobal() {
Vector pos1 = getMinimumPoint();
Vector pos2 = getMaximumPoint();
return pos1.getBlockX() == Integer.MIN_VALUE && pos1.getBlockZ() == Integer.MIN_VALUE && pos2.getBlockX() == Integer.MAX_VALUE && pos2.getBlockZ() == Integer.MAX_VALUE && pos1.getBlockY() <= 0 && pos2.getBlockY() >= 255;
}
/**
* Get a list of chunks.
*
* @return a list of chunk coordinates
*/
public Set<Vector2D> getChunks();
/**
* Return a list of 16*16*16 chunks in a region
*
* @return the chunk cubes this region overlaps with
*/
public Set<Vector> getChunkCubes();
/**
* Sets the world that the selection is in.
*
* @return the world, or null
*/
@Nullable
public World getWorld();
/**
* Sets the world that the selection is in.
*
* @param world the world, which may be null
*/
public void setWorld(@Nullable World world);
/**
* Sets the world that the selection is in.
*
* @param world the world, which may be null
*/
@Deprecated
public void setWorld(@Nullable LocalWorld world);
/**
* Make a clone of the region.
*
* @return a cloned version
*/
public Region clone();
/**
* Polygonizes a cross-section or a 2D projection of the region orthogonal to the Y axis.
*
* @param maxPoints maximum number of points to generate. -1 for no limit.
* @return the points.
*/
public List<BlockVector2D> polygonize(int maxPoints);
}

View File

@ -70,6 +70,11 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.
region = new ConvexPolyhedralRegion(world);
}
public ConvexPolyhedralRegionSelector(ConvexPolyhedralRegion region) {
checkNotNull(region);
this.region = region;
}
/**
* Create a new selector.
*

View File

@ -63,6 +63,11 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder
this((World) null);
}
public CylinderRegionSelector(CylinderRegion region) {
checkNotNull(region);
this.region = region;
}
/**
* Create a new region selector.
*

View File

@ -68,6 +68,11 @@ public class Polygonal2DRegionSelector extends com.sk89q.worldedit.regions.Polyg
region = new Polygonal2DRegion(world);
}
public Polygonal2DRegionSelector(Polygonal2DRegion region) {
this.region = region;
}
/**
* Create a new selector from another one.
*

View File

@ -30,12 +30,7 @@ import com.boydti.fawe.bukkit.wrapper.AsyncWorld;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.config.Settings;
import com.boydti.fawe.logging.LoggingChangeSet;
import com.boydti.fawe.object.ChangeSetFaweQueue;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.object.MaskedFaweQueue;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.object.RunnableVal;
import com.boydti.fawe.object.*;
import com.boydti.fawe.object.changeset.FaweChangeSet;
import com.boydti.fawe.object.extent.ResettableExtent;
import com.boydti.fawe.object.extent.SourceMaskExtent;
@ -45,11 +40,7 @@ import com.boydti.fawe.util.SetQueue;
import com.boydti.fawe.util.TaskManager;
import com.boydti.fawe.util.WEManager;
import com.google.common.base.Preconditions;
import com.google.common.collect.BiMap;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.MutableClassToInstanceMap;
import com.google.common.collect.*;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.extent.MaskingExtent;
@ -83,6 +74,8 @@ public class Sniper {
private Map<String, SniperTool> tools = new HashMap<>();
public Sniper(VoxelSniper plugin, Player player) {
Preconditions.checkNotNull(plugin);
Preconditions.checkNotNull(player);
this.plugin = plugin;
this.player = player.getUniqueId();
SniperTool sniperTool = new SniperTool(this);
@ -554,6 +547,8 @@ public class Sniper {
}
private SniperTool(Class<? extends IBrush> currentBrush, SnipeData snipeData) {
Preconditions.checkNotNull(currentBrush);
Preconditions.checkNotNull(snipeData);
this.snipeData = snipeData;
messageHelper = new Message(snipeData);
snipeData.setVoxelMessage(messageHelper);

View File

@ -1,9 +1,10 @@
repositories {
flatDir {dirs 'lib'}
maven {url "https://repo.potestas.xyz/main/"}
}
dependencies {
compile project(':core')
compile name: 'nukkit-1.0-SNAPSHOT'
compile 'cn.nukkit:nukkit:1.0-SNAPSHOT'
compile name: 'worldedit-core-6.1.4-SNAPSHOT-dist'
}