Small changes

This commit is contained in:
MattBDev 2019-06-26 20:14:00 -04:00
parent 1932c96d4f
commit d0a31691e1
61 changed files with 382 additions and 577 deletions

View File

@ -107,7 +107,7 @@ public class FaweBukkit implements IFawe, Listener {
throwable.printStackTrace();
}
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
Bukkit.getServer().shutdown();
}
@ -411,7 +411,7 @@ public class FaweBukkit implements IFawe, Listener {
managers.add(new WorldguardFlag(worldguardPlugin, this));
Fawe.debug("Plugin 'WorldGuard' found. Using it now.");
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
final Plugin townyPlugin = Bukkit.getServer().getPluginManager().getPlugin("Towny");
@ -420,7 +420,7 @@ public class FaweBukkit implements IFawe, Listener {
managers.add(new TownyFeature(townyPlugin, this));
Fawe.debug("Plugin 'Towny' found. Using it now.");
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
final Plugin factionsPlugin = Bukkit.getServer().getPluginManager().getPlugin("Factions");
@ -437,7 +437,7 @@ public class FaweBukkit implements IFawe, Listener {
managers.add(new FactionsOneFeature(factionsPlugin));
Fawe.debug("Plugin 'FactionsUUID' found. Using it now.");
} catch (Throwable e3) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -449,7 +449,7 @@ public class FaweBukkit implements IFawe, Listener {
managers.add(new ResidenceFeature(residencePlugin, this));
Fawe.debug("Plugin 'Residence' found. Using it now.");
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
final Plugin griefpreventionPlugin = Bukkit.getServer().getPluginManager().getPlugin("GriefPrevention");
@ -458,7 +458,7 @@ public class FaweBukkit implements IFawe, Listener {
managers.add(new GriefPreventionFeature(griefpreventionPlugin));
Fawe.debug("Plugin 'GriefPrevention' found. Using it now.");
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
final Plugin preciousstonesPlugin = Bukkit.getServer().getPluginManager().getPlugin("PreciousStones");
@ -467,7 +467,7 @@ public class FaweBukkit implements IFawe, Listener {
managers.add(new PreciousStonesFeature(preciousstonesPlugin, this));
Fawe.debug("Plugin 'PreciousStones' found. Using it now.");
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -478,7 +478,7 @@ public class FaweBukkit implements IFawe, Listener {
managers.add(new ASkyBlockHook(aSkyBlock));
Fawe.debug("Plugin 'ASkyBlock' found. Using it now.");
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
if (Settings.IMP.EXPERIMENTAL.FREEBUILD) {
@ -486,7 +486,7 @@ public class FaweBukkit implements IFawe, Listener {
managers.add(new FreeBuildRegion());
Fawe.debug("Plugin '<internal.freebuild>' found. Using it now.");
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}

View File

@ -3,7 +3,6 @@ package com.boydti.fawe.bukkit.regions;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.Perm;
import com.massivecraft.factions.FLocation;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
@ -107,7 +106,7 @@ public class FactionsOneFeature extends BukkitMaskManager implements Listener {
}
return true;
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
return false;
}
}

View File

@ -1,6 +1,5 @@
package com.boydti.fawe.bukkit.util;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.ReflectionUtils;
import org.bukkit.Bukkit;
import org.bukkit.Server;
@ -38,7 +37,7 @@ public class BukkitReflectionUtils {
preClassM = "net.minecraft.server." + verM;
}
} catch (final Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}

View File

@ -334,7 +334,7 @@ public class BukkitChunk_All extends IntFaweChunk<Chunk, BukkitQueue_All> {
index = 0;
}
} catch (final Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
} while (System.currentTimeMillis() - start < recommended);
if (more || place) {

View File

@ -284,7 +284,7 @@ public class BukkitChunk_1_13 extends IntFaweChunk<Chunk, BukkitQueue_1_13> {
copy.sectionPalettes[i] = copy(current);
}
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
return copy;
@ -620,7 +620,7 @@ public class BukkitChunk_1_13 extends IntFaweChunk<Chunk, BukkitQueue_1_13> {
getParent().getChangeTask().run(copy, this);
}
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return this;
}

View File

@ -13,7 +13,6 @@ import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.object.brush.visualization.VisualChunk;
import com.boydti.fawe.object.visitor.FaweChunkVisitor;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.TaskManager;
@ -701,7 +700,7 @@ public class BukkitQueue_1_13 extends BukkitQueue_0<net.minecraft.server.v1_13_R
tile.save(tag); // readTagIntoEntity
return (CompoundTag) toNative(tag);
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
return null;
}
}

View File

@ -26,6 +26,7 @@ import org.bukkit.OfflinePlayer;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@ -58,7 +59,7 @@ public class ConfigurationPermissionsResolver implements PermissionsResolver {
Map<String, Set<String>> userGroupPermissions = new HashMap<>();
List<String> groupKeys = config.getStringList("permissions.groups", null);
List<String> groupKeys = config.getKeys("permissions.groups");
if (groupKeys != null) {
for (String key : groupKeys) {
@ -76,7 +77,7 @@ public class ConfigurationPermissionsResolver implements PermissionsResolver {
}
}
List<String> userKeys = config.getStringList("permissions.users", null);
List<String> userKeys = config.getKeys("permissions.users");
if (userKeys != null) {
for (String key : userKeys) {
@ -102,8 +103,8 @@ public class ConfigurationPermissionsResolver implements PermissionsResolver {
}
}
userPermissionsCache.put(key.toLowerCase(), permsCache);
userGroups.put(key.toLowerCase(), new HashSet<>(groups));
userPermissionsCache.put(key.toLowerCase(Locale.ROOT), permsCache);
userGroups.put(key.toLowerCase(Locale.ROOT), new HashSet<>(groups));
}
}
}
@ -117,7 +118,7 @@ public class ConfigurationPermissionsResolver implements PermissionsResolver {
}
}
Set<String> perms = userPermissionsCache.get(player.toLowerCase());
Set<String> perms = userPermissionsCache.get(player.toLowerCase(Locale.ROOT));
if (perms == null) {
return defaultPermissionsCache.contains(permission)
|| defaultPermissionsCache.contains("*");
@ -134,7 +135,7 @@ public class ConfigurationPermissionsResolver implements PermissionsResolver {
@Override
public boolean inGroup(String player, String group) {
Set<String> groups = userGroups.get(player.toLowerCase());
Set<String> groups = userGroups.get(player.toLowerCase(Locale.ROOT));
if (groups == null) {
return false;
}
@ -144,12 +145,12 @@ public class ConfigurationPermissionsResolver implements PermissionsResolver {
@Override
public String[] getGroups(String player) {
Set<String> groups = userGroups.get(player.toLowerCase());
Set<String> groups = userGroups.get(player.toLowerCase(Locale.ROOT));
if (groups == null) {
return new String[0];
}
return groups.toArray(new String[groups.size()]);
return groups.toArray(new String[0]);
}
@Override

View File

@ -382,7 +382,7 @@ public class Fawe {
}
} catch (Throwable e) {
debug("====== MEMORY LISTENER ERROR ======");
MainUtil.handleError(e);
e.printStackTrace();
debug("===================================");
debug("FAWE needs access to the JVM memory system:");
debug(" - Change your Java security settings");

View File

@ -5,7 +5,6 @@ import com.boydti.fawe.configuration.MemorySection;
import com.boydti.fawe.configuration.file.YamlConfiguration;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.RunnableVal3;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.StringMan;
import com.boydti.fawe.util.chat.Message;
import com.google.gson.Gson;
@ -472,7 +471,7 @@ public enum BBC {
yml.save(file);
}
} catch (final Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}

View File

@ -10,7 +10,6 @@ import com.boydti.fawe.object.RunnableVal;
import com.boydti.fawe.object.RunnableVal2;
import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.object.extent.LightingExtent;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.SetQueue;
import com.boydti.fawe.util.TaskManager;
@ -229,7 +228,7 @@ public abstract class MappedFaweQueue<WORLD, CHUNK, CHUNKSECTIONS, SECTION> impl
try {
task.run();
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
}
@ -246,7 +245,7 @@ public abstract class MappedFaweQueue<WORLD, CHUNK, CHUNKSECTIONS, SECTION> impl
try {
run.run();
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
}

View File

@ -1,17 +1,10 @@
package com.boydti.fawe.example;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.object.FaweChunk;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.TaskManager;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public abstract class NMSMappedFaweQueue<WORLD, CHUNK, CHUNKSECTION, SECTION> extends MappedFaweQueue<WORLD, CHUNK, CHUNKSECTION, SECTION> {
private final int maxY;
@ -104,7 +97,7 @@ public abstract class NMSMappedFaweQueue<WORLD, CHUNK, CHUNKSECTION, SECTION> ex
try {
refreshChunk(fc);
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}

View File

@ -1,14 +1,13 @@
package com.boydti.fawe.object;
import com.boydti.fawe.object.visitor.FaweChunkVisitor;
import com.boydti.fawe.util.MainUtil;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.util.ArrayDeque;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@ -121,7 +120,7 @@ public abstract class FaweChunk<T> implements Callable<FaweChunk> {
return BaseBlock.getFromInternalId(combined, tile).toImmutableState();
}
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return BlockState.getFromInternalId(combined);
}

View File

@ -1,7 +1,6 @@
package com.boydti.fawe.object;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.TaskManager;
public abstract class FaweCommand<T> {
@ -36,7 +35,7 @@ public abstract class FaweCommand<T> {
}
return true;
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return false;
}

View File

@ -42,6 +42,7 @@ import com.sk89q.worldedit.regions.RegionSelector;
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.regions.selector.Polygonal2DRegionSelector;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.world.World;
@ -353,7 +354,7 @@ public abstract class FawePlayer<T> extends Metadatable {
}
} catch (Exception event) {
Fawe.debug("====== INVALID CLIPBOARD ======");
MainUtil.handleError(event);
event.printStackTrace();
Fawe.debug("===============---=============");
Fawe.debug("This shouldn't result in any failure");
Fawe.debug("File: " + file.getName() + " (len:" + file.length() + ")");
@ -560,19 +561,14 @@ public abstract class FawePlayer<T> extends Metadatable {
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;
if (region instanceof ConvexPolyhedralRegion) {
selector = new ConvexPolyhedralRegionSelector((ConvexPolyhedralRegion) region);
} else if (region instanceof CylinderRegion) {
selector = new CylinderRegionSelector((CylinderRegion) region);
} else if (region instanceof Polygonal2DRegion) {
selector = new Polygonal2DRegionSelector((Polygonal2DRegion) region);
} else {
selector = new CuboidRegionSelector(null, region.getMinimumPoint(), region.getMaximumPoint());
}
selector.setWorld(region.getWorld());

View File

@ -77,7 +77,7 @@ public interface FaweQueue extends HasFaweQueue, Extent {
try {
return BlockState.getFromInternalId(combinedId4Data);
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
return BlockTypes.AIR.getDefaultState();
}
}
@ -100,7 +100,7 @@ public interface FaweQueue extends HasFaweQueue, Extent {
}
return block;
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
return BlockTypes.AIR.getDefaultState().toBaseBlock();
}
}

View File

@ -1,6 +1,5 @@
package com.boydti.fawe.object.brush.heightmap;
import com.boydti.fawe.util.MainUtil;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.function.mask.Mask;
@ -14,21 +13,19 @@ import com.sk89q.worldedit.util.Location;
import java.util.concurrent.ThreadLocalRandom;
public interface HeightMap {
public double getHeight(int x, int z);
double getHeight(int x, int z);
public void setSize(int size);
void setSize(int size);
default void perform(EditSession session, Mask mask, BlockVector3 pos, int size, int rotationMode, double yscale, boolean smooth, boolean towards, boolean layers) throws MaxChangedBlocksException {
int[][] data = generateHeightData(session, mask, pos, size, rotationMode, yscale, smooth, towards, layers);
applyHeightMapData(data, session, mask, pos, size, rotationMode, yscale, smooth, towards, layers);
applyHeightMapData(data, session, pos, size, yscale, smooth, towards, layers);
}
default void applyHeightMapData(int[][] data, EditSession session, Mask mask, BlockVector3 pos, int size, int rotationMode, double yscale, boolean smooth, boolean towards, boolean layers) throws MaxChangedBlocksException {
default void applyHeightMapData(int[][] data, EditSession session, BlockVector3 pos, int size, double yscale, boolean smooth, boolean towards, boolean layers) throws MaxChangedBlocksException {
BlockVector3 top = session.getMaximumPoint();
int maxY = top.getBlockY();
int diameter = 2 * size + 1;
int iterations = 1;
Location min = new Location(session.getWorld(), pos.subtract(size, maxY, size).toVector3());
BlockVector3 max = pos.add(size, maxY, size);
Region region = new CuboidRegion(session.getWorld(), min.toBlockPoint(), max);
@ -36,19 +33,16 @@ public interface HeightMap {
if (smooth) {
try {
HeightMapFilter filter = (HeightMapFilter) HeightMapFilter.class.getConstructors()[0].newInstance(GaussianKernel.class.getConstructors()[0].newInstance(5, 1));
int diameter = 2 * size + 1;
data[1] = filter.filter(data[1], diameter, diameter);
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
try {
if (layers) {
heightMap.applyLayers(data[1]);
} else {
heightMap.apply(data[1]);
}
} catch (MaxChangedBlocksException e) {
throw e;
if (layers) {
heightMap.applyLayers(data[1]);
} else {
heightMap.apply(data[1]);
}
}
@ -59,22 +53,18 @@ public interface HeightMap {
int centerX = pos.getBlockX();
int centerZ = pos.getBlockZ();
int centerY = pos.getBlockY();
int endY = pos.getBlockY() + size;
int startY = pos.getBlockY() - size;
int[] oldData = new int[diameter * diameter];
int[] newData = new int[oldData.length];
if (layers) { // Pixel accuracy
centerY <<= 3;
maxY <<= 3;
}
// Vector mutablePos = new Vector(0, 0, 0);
if (towards) {
double sizePowInv = 1d / Math.pow(size, yscale);
int targetY = pos.getBlockY();
int tmpY = targetY;
for (int x = -size; x <= size; x++) {
int xx = centerX + x;
// mutablePos.mutX(xx);
for (int z = -size; z <= size; z++) {
int index = (z + size) * diameter + (x + size);
int zz = centerZ + z;
@ -118,7 +108,6 @@ public interface HeightMap {
int height = pos.getBlockY();
for (int x = -size; x <= size; x++) {
int xx = centerX + x;
// mutablePos.mutX(xx);
for (int z = -size; z <= size; z++) {
int index = (z + size) * diameter + (x + size);
int zz = centerZ + z;

View File

@ -13,13 +13,12 @@ import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypes;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.io.DataOutput;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@ -181,7 +180,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
if (osENTCF != null) osENTCF.flush();
if (osENTCT != null) osENTCT.flush();
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return flushed;
}
@ -218,7 +217,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
osENTCT = null;
}
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return flushed;
}
@ -418,7 +417,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
}
return summary;
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
return null;
@ -439,7 +438,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
fis.close();
gis.close();
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
return new IntegerPair(ox, oz);

View File

@ -107,7 +107,7 @@ public abstract class FaweChangeSet implements ChangeSet {
}
}
} catch (InterruptedException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return true;
}
@ -194,7 +194,7 @@ public abstract class FaweChangeSet implements ChangeSet {
BaseBlock to = change.getCurrent();
add(loc, from, to);
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -222,7 +222,7 @@ public abstract class FaweChangeSet implements ChangeSet {
add(x, y, z, combinedFrom, combinedTo);
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -241,7 +241,7 @@ public abstract class FaweChangeSet implements ChangeSet {
add(x, y, z, combinedFrom, combinedTo);
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -343,7 +343,7 @@ public abstract class FaweChangeSet implements ChangeSet {
}
}
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
} finally {
if (FaweChangeSet.this.waitingCombined.decrementAndGet() <= 0) {
synchronized (FaweChangeSet.this.waitingAsync) {

View File

@ -320,7 +320,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
posDel.write(stream, x - originX, y, z - originZ);
idDel.writeChange(stream, combinedFrom, combinedTo);
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -340,7 +340,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
os.writeVarInt(from.getInternalId());
os.writeVarInt(to.getInternalId());
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -353,7 +353,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
NBTOutputStream nbtos = getTileCreateOS();
nbtos.writeTag(tag);
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -366,7 +366,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
NBTOutputStream nbtos = getTileRemoveOS();
nbtos.writeTag(tag);
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -379,7 +379,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
NBTOutputStream nbtos = getEntityRemoveOS();
nbtos.writeTag(tag);
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -392,7 +392,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
NBTOutputStream nbtos = getEntityCreateOS();
nbtos.writeTag(tag);
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -415,12 +415,12 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} catch (EOFException ignored) {
} catch (Exception e) {
e.printStackTrace();
MainUtil.handleError(e);
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return null;
}
@ -470,12 +470,12 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} catch (EOFException ignored) {
} catch (Exception e) {
e.printStackTrace();
MainUtil.handleError(e);
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return null;
}
@ -530,12 +530,12 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
} catch (EOFException ignored) {
} catch (Exception e) {
e.printStackTrace();
MainUtil.handleError(e);
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return null;
}
@ -562,7 +562,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
};
}
public Iterator<MutableEntityChange> getEntityIterator(final NBTInputStream is, final boolean create, final boolean dir) {
public Iterator<MutableEntityChange> getEntityIterator(final NBTInputStream is, final boolean create) {
if (is == null) {
return new ArrayList<MutableEntityChange>().iterator();
}
@ -580,7 +580,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
try {
is.close();
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return null;
}
@ -606,12 +606,12 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
}
};
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
return null;
}
}
public Iterator<MutableTileChange> getTileIterator(final NBTInputStream is, final boolean create, final boolean dir) {
public Iterator<MutableTileChange> getTileIterator(final NBTInputStream is, final boolean create) {
if (is == null) {
return new ArrayList<MutableTileChange>().iterator();
}
@ -629,7 +629,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
try {
is.close();
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return null;
}
@ -655,7 +655,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
}
};
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
return null;
}
}
@ -663,11 +663,11 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
public Iterator<Change> getIterator(final boolean dir) {
close();
try {
final Iterator<MutableTileChange> tileCreate = getTileIterator(getTileCreateIS(), true, dir);
final Iterator<MutableTileChange> tileRemove = getTileIterator(getTileRemoveIS(), false, dir);
final Iterator<MutableTileChange> tileCreate = getTileIterator(getTileCreateIS(), true);
final Iterator<MutableTileChange> tileRemove = getTileIterator(getTileRemoveIS(), false);
final Iterator<MutableEntityChange> entityCreate = getEntityIterator(getEntityCreateIS(), true, dir);
final Iterator<MutableEntityChange> entityRemove = getEntityIterator(getEntityRemoveIS(), false, dir);
final Iterator<MutableEntityChange> entityCreate = getEntityIterator(getEntityCreateIS(), true);
final Iterator<MutableEntityChange> entityRemove = getEntityIterator(getEntityRemoveIS(), false);
final Iterator<MutableBlockChange> blockChange = getBlockIterator(dir);
@ -709,7 +709,7 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
}
};
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return new ArrayList<Change>().iterator();
}

View File

@ -9,9 +9,9 @@ import com.boydti.fawe.util.MainUtil;
import com.sk89q.jnbt.NBTInputStream;
import com.sk89q.jnbt.NBTOutputStream;
import com.sk89q.worldedit.world.World;
import java.io.DataOutput;
import java.io.IOException;
import java.io.OutputStream;
/**
* ChangeSet optimized for low memory usage
@ -66,7 +66,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
if (tileRStream != null) tileRStreamZip.flush();
return true;
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
return false;
@ -115,7 +115,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
}
return true;
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
return false;
@ -248,6 +248,6 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
@Override
public void setRecordChanges(boolean recordChanges) {
// TODO Auto-generated method stub
}
}

View File

@ -78,9 +78,9 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
this.braf = new RandomAccessFile(file, "rw");
braf.setLength(file.length());
init();
width = (int) mbb.getChar(2);
height = (int) mbb.getChar(4);
length = (int) mbb.getChar(6);
width = mbb.getChar(2);
height = mbb.getChar(4);
length = mbb.getChar(6);
area = width * length;
this.volume = length * width * height;
@ -180,7 +180,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
clipboard.setOrigin(BlockVector3.at(ox, oy, oz));
return clipboard;
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return null;
}
@ -204,7 +204,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
file.createNewFile();
}
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
this.braf = new RandomAccessFile(file, "rw");
long volume = (long) width * (long) height * (long) length * 4L + (long) HEADER_SIZE;
@ -229,7 +229,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
mbb.putShort(10, (short) offset.getBlockY());
mbb.putShort(12, (short) offset.getBlockZ());
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -252,7 +252,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
mbb.putChar(4, (char) height);
mbb.putChar(6, (char) length);
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -289,7 +289,6 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
System.gc();
}
}
cb = null;
}
@Override
@ -311,7 +310,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
braf = null;
}
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -350,7 +349,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
}
}
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -441,7 +440,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
} catch (IndexOutOfBoundsException ignore) {
} catch (Exception e) {
e.printStackTrace();
MainUtil.handleError(e);
e.printStackTrace();
}
return BlockTypes.AIR.getDefaultState().toBaseBlock();
}
@ -480,7 +479,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
return base;
} catch (IndexOutOfBoundsException ignore) {
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return BlockTypes.AIR.getDefaultState().toBaseBlock();
}
@ -501,13 +500,13 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
int index = (HEADER_SIZE) + ((getIndex(x, y, z) << 2));
int combined = block.getInternalId();
mbb.putInt(index, combined);
boolean hasNbt = block instanceof BaseBlock && ((BaseBlock)block).hasNbtData();
boolean hasNbt = block instanceof BaseBlock && block.hasNbtData();
if (hasNbt) {
setTile(x, y, z, block.getNbtData());
}
return true;
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return false;
}
@ -528,7 +527,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
}
return true;
} catch (Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
return false;
}

View File

@ -2,6 +2,7 @@ package com.boydti.fawe.util;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
import java.lang.reflect.Field;
public class ExtentTraverser<T extends Extent> {
@ -75,7 +76,7 @@ public class ExtentTraverser<T extends Extent> {
}
return null;
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
return null;
}
}
@ -91,7 +92,7 @@ public class ExtentTraverser<T extends Extent> {
}
return null;
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
return null;
}
}

View File

@ -609,18 +609,12 @@ public class MainUtil {
return newFile;
}
} catch (IOException e) {
MainUtil.handleError(e);
e.printStackTrace();
Fawe.debug("&cCould not save " + resource);
}
return null;
}
public static void handleError(Throwable e) {
if (e == null) {
return;
}
e.printStackTrace(); }
public static int[] regionNameToCoords(String fileName) {
int[] res = new int[2];
int len = fileName.length() - 4;

View File

@ -150,7 +150,7 @@ public class ReflectionUtils {
m.setAccessible(true);
return (Map<T, V>) m.get(map);
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
return map;
}
}
@ -163,7 +163,7 @@ public class ReflectionUtils {
m.setAccessible(true);
return (List<T>) m.get(list);
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
return list;
}
}

View File

@ -5,6 +5,7 @@ import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.wrappers.WorldWrapper;
import com.sk89q.worldedit.world.World;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@ -273,7 +274,7 @@ public class SetQueue {
} catch (Throwable e) {
pool.awaitQuiescence(Settings.IMP.QUEUE.DISCARD_AFTER_MS, TimeUnit.MILLISECONDS);
completer = new ExecutorCompletionService(pool);
MainUtil.handleError(e);
e.printStackTrace();
} finally {
queue.endSet(Settings.IMP.QUEUE.PARALLEL_THREADS > 1);
queue.setStage(QueueStage.NONE);

View File

@ -4,15 +4,16 @@ import com.boydti.fawe.Fawe;
import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.object.RunnableVal;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
import javax.annotation.Nullable;
public abstract class TaskManager {
@ -283,7 +284,7 @@ public abstract class TaskManager {
}
}
} catch (InterruptedException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -330,7 +331,7 @@ public abstract class TaskManager {
} catch (RuntimeException e) {
this.value = e;
} catch (Throwable neverHappens) {
MainUtil.handleError(neverHappens);
neverHappens.printStackTrace();
} finally {
running.set(false);
}
@ -347,7 +348,7 @@ public abstract class TaskManager {
}
}
} catch (InterruptedException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
if (run.value != null) {
throw run.value;
@ -382,7 +383,7 @@ public abstract class TaskManager {
} catch (RuntimeException e) {
this.value = e;
} catch (Throwable neverHappens) {
MainUtil.handleError(neverHappens);
neverHappens.printStackTrace();
} finally {
running.set(false);
synchronized (function) {
@ -399,7 +400,7 @@ public abstract class TaskManager {
}
}
} catch (InterruptedException e) {
MainUtil.handleError(e);
e.printStackTrace();
}
if (run.value instanceof RuntimeException) {
throw (RuntimeException) run.value;

View File

@ -14,9 +14,9 @@ import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
public class WEManager {
@ -33,7 +33,7 @@ public class WEManager {
field.set(parent, new NullExtent((Extent) field.get(parent), reason));
}
} catch (final Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
throw new FaweException(reason);
}
@ -189,7 +189,7 @@ public class WEManager {
}), 2);
});
} catch (final Exception e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}, false, false);
}

View File

@ -19,6 +19,8 @@
package com.sk89q.jnbt;
import java.util.Locale;
/**
* The {@code TAG_Byte_Array} tag.
*/
@ -45,7 +47,7 @@ public final class ByteArrayTag extends Tag {
public String toString() {
StringBuilder hex = new StringBuilder();
for (byte b : value) {
String hexDigits = Integer.toHexString(b).toUpperCase();
String hexDigits = Integer.toHexString(b).toUpperCase(Locale.ROOT);
if (hexDigits.length() == 1) {
hex.append("0");
}

View File

@ -22,6 +22,7 @@ package com.sk89q.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
@ -34,7 +35,7 @@ public final class StringUtil {
/**
* Trim a string if it is longer than a certain length.
*
*
* @param str the stirng
* @param len the length to trim to
* @return a new string
@ -49,7 +50,7 @@ public final class StringUtil {
/**
* Join an array of strings into a string.
*
*
* @param str the string array
* @param delimiter the delimiter
* @param initialIndex the initial index to start form
@ -68,7 +69,7 @@ public final class StringUtil {
/**
* Join an array of strings into a string.
*
*
* @param str the string array
* @param delimiter the delimiter
* @param initialIndex the initial index to start form
@ -92,7 +93,7 @@ public final class StringUtil {
/**
* Join an array of strings into a string.
*
*
* @param str the string array
* @param delimiter the delimiter
* @return a new string
@ -103,7 +104,7 @@ public final class StringUtil {
/**
* Join an array of strings into a string.
*
*
* @param str an array of objects
* @param delimiter the delimiter
* @param initialIndex the initial index to start form
@ -122,7 +123,7 @@ public final class StringUtil {
/**
* Join an array of strings into a string.
*
*
* @param str a list of integers
* @param delimiter the delimiter
* @param initialIndex the initial index to start form
@ -219,7 +220,7 @@ public final class StringUtil {
* calculated). (Note that the arrays aren't really copied anymore, just
* switched...this is clearly much better than cloning an array or doing
* a System.arraycopy() each time through the outer loop.)
*
*
* Effectively, the difference between the two implementations is this
* one does not cause an out of memory condition when calculating the LD
* over two very large strings.
@ -274,7 +275,7 @@ public final class StringUtil {
}
public static <T extends Enum<?>> T lookup(Map<String, T> lookup, String name, boolean fuzzy) {
String testName = name.replaceAll("[ _]", "").toLowerCase();
String testName = name.replaceAll("[ _]", "").toLowerCase(Locale.ROOT);
T type = lookup.get(testName);
if (type != null) {
@ -305,6 +306,10 @@ public final class StringUtil {
}
public static List<String> parseListInQuotes(String[] input, char delimiter, char quoteOpen, char quoteClose) {
return parseListInQuotes(input, delimiter, quoteOpen, quoteClose, false);
}
public static List<String> parseListInQuotes(String[] input, char delimiter, char quoteOpen, char quoteClose, boolean appendLeftover) {
List<String> parsableBlocks = new ArrayList<>();
StringBuilder buffer = new StringBuilder();
for (String split : input) {
@ -320,6 +325,9 @@ public final class StringUtil {
buffer.append(split).append(delimiter);
}
}
if (appendLeftover && buffer.length() != 0) {
parsableBlocks.add(buffer.delete(buffer.length() - 1, buffer.length()).toString());
}
return parsableBlocks;
}

View File

@ -1,99 +0,0 @@
/*
* 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.blocks;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
/**
* The colors for wool.
*
* <p>This class may be removed in the future.</p>
*/
public enum ClothColor {
WHITE("White", "white"),
ORANGE("Orange", "orange"),
MAGENTA("Magenta", "magenta"),
LIGHT_BLUE("Light blue", "lightblue"),
YELLOW("Yellow", "yellow"),
LIGHT_GREEN("Light green", "lightgreen"),
PINK("Pink", "pink", "lightred"),
GRAY("Gray", "grey", "gray"),
LIGHT_GRAY("Light gray", "lightgrey", "lightgray"),
CYAN("Cyan", "cyan", "turquoise"),
PURPLE("Purple", "purple", "violet"),
BLUE("Blue", "blue"),
BROWN("Brown", "brown", "cocoa", "coffee"),
DARK_GREEN("Dark green", "green", "darkgreen", "cactusgreen", "cactigreen"),
RED("Red", "red"),
BLACK("Black", "black");
/**
* Stores a map of the names for fast access.
*/
private static final Map<String, ClothColor> lookup = new HashMap<>();
private final String name;
private final String[] lookupKeys;
static {
for (ClothColor type : EnumSet.allOf(ClothColor.class)) {
for (String key : type.lookupKeys) {
lookup.put(key, type);
}
}
}
/**
* Construct the type.
*
* @param name the name of the color
* @param lookupKeys a name to refer to the color by
*/
ClothColor(String name, String ... lookupKeys) {
this.name = name;
this.lookupKeys = lookupKeys;
}
/**
* Return type from name. May return null.
*
* @param name the name of the color
* @return a color or null
*/
@Nullable
public static ClothColor lookup(String name) {
return lookup.get(name.toLowerCase());
}
/**
* Get user-friendly item name.
*
* @return the name
*/
public String getName() {
return name;
}
}

View File

@ -149,7 +149,7 @@ public class SelectionCommand extends SimpleCommand<Operation> {
return null;
}
} catch (Throwable e) {
MainUtil.handleError(e);
e.printStackTrace();
}
}
}

View File

@ -19,33 +19,32 @@
package com.sk89q.worldedit.event.extent;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.EditSession;
import static com.sk89q.worldedit.EditSession.Stage;
import com.sk89q.worldedit.event.Cancellable;
import com.sk89q.worldedit.event.Event;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.sk89q.worldedit.EditSession.Stage;
/**
* Raised (several times) when a new {@link EditSession} is being instantiated.
* <p>
*
* <p></p>Block loggers, as well as block set interceptors, can use this event to wrap
* the given {@link Extent} with their own, which would allow them to intercept
* all changes made to the world. For example, the code below would wrap the
* existing extent with a custom one, and the custom extent would receive
* all method calls <strong>before</strong> the extent fetched from
* {@link #getExtent()} would.</p>
* <p>
*
* <pre>
* event.setExtent(new MyExtent(event.getExtent())
* </pre>
* <p>
*
* <p></p>This event is fired several times during the creation of a single
* {@link EditSession}, but {@link #getStage()} will differ each time.
* The stage determines at which point {@link Extent}s added to this event

View File

@ -56,6 +56,7 @@ import com.sk89q.worldedit.world.block.FuzzyBlockState;
import com.sk89q.worldedit.world.registry.LegacyMapper;
import java.util.Arrays;
import java.util.Locale;
/**
* Parses block input strings.
@ -112,8 +113,9 @@ public class DefaultBlockParser extends InputParser<BaseBlock> {
* @param string Input string
* @return Mapped string
*/
@SuppressWarnings("ConstantConditions")
private String woolMapper(String string) {
switch (string.toLowerCase()) {
switch (string.toLowerCase(Locale.ROOT)) {
case "white":
return BlockTypes.WHITE_WOOL.getId();
case "black":

View File

@ -21,13 +21,19 @@ package com.sk89q.worldedit.extension.factory.parser;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.blocks.BaseItem;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.util.HandSide;
import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes;
import com.sk89q.worldedit.world.registry.LegacyMapper;
import java.util.Locale;
public class DefaultItemParser extends InputParser<BaseItem> {
public DefaultItemParser(WorldEdit worldEdit) {
@ -42,18 +48,22 @@ public class DefaultItemParser extends InputParser<BaseItem> {
try {
String[] split = input.split(":");
ItemType type;
if (split.length == 1) {
if (split.length == 0) {
throw new InputParseException("Invalid colon.");
} else if (split.length == 1) {
type = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0]));
} else {
type = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
}
item = new BaseItem(type);
} catch (NumberFormatException e) {
if (type != null) {
item = new BaseItem(type);
}
} catch (NumberFormatException ignored) {
}
}
if (item == null) {
ItemType type = ItemTypes.get(input.toLowerCase());
ItemType type = ItemTypes.get(input.toLowerCase(Locale.ROOT));
if (type != null) {
item = new BaseItem(type);
}
@ -66,4 +76,11 @@ public class DefaultItemParser extends InputParser<BaseItem> {
}
}
private BaseItemStack getItemInHand(Actor actor, HandSide handSide) throws InputParseException {
if (actor instanceof Player) {
return ((Player) actor).getItemInHand(handSide);
} else {
throw new InputParseException("The user is not a player!");
}
}
}

View File

@ -24,7 +24,6 @@ import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.brush.visualization.VirtualWorld;
import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.object.pattern.PatternTraverser;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.wrappers.LocationMaskedPlayerWrapper;
import com.boydti.fawe.wrappers.PlayerWrapper;
import com.boydti.fawe.wrappers.WorldWrapper;
@ -434,7 +433,7 @@ public class PlatformManager {
} else {
actor.printError("Please report this error: [See console]");
actor.printRaw(e.getClass().getName() + ": " + e.getMessage());
MainUtil.handleError(e);
e.printStackTrace();
}
}
@ -518,7 +517,7 @@ public class PlatformManager {
} else {
player.printError("Please report this error: [See console]");
player.printRaw(e.getClass().getName() + ": " + e.getMessage());
MainUtil.handleError(e);
e.printStackTrace();
}
} finally {
Request.reset();

View File

@ -65,7 +65,7 @@ public interface InputExtent {
* modifiable copy is required, then the block should be cloned.</p>
*
* <p>This method exists because it is sometimes important to inspect the block
* at a given location, but {@link #getBlock(Vector)} may be too expensive in
* at a given location, but {@link #getBlock(BlockVector3)} may be too expensive in
* the underlying implementation. It is also not possible to implement
* caching if the returned object is mutable, so this methods allows caching
* implementations to be used.</p>

View File

@ -25,8 +25,9 @@ import com.boydti.fawe.object.clipboard.FaweClipboard;
import com.boydti.fawe.object.clipboard.FaweClipboard.ClipboardEntity;
import com.boydti.fawe.object.clipboard.MemoryOptimizedClipboard;
import com.boydti.fawe.object.extent.LightingExtent;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
@ -36,6 +37,7 @@ import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.biome.BiomeTypes;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
@ -48,8 +50,6 @@ import java.util.Collections;
import java.util.List;
import java.util.UUID;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Stores block data as a multi-dimensional array of {@link BlockState}s and
* other data as lists or maps.
@ -58,7 +58,8 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
private Region region;
private BlockVector3 origin;
private BlockStateHolder[][][] blocks;
private BaseBlock[][][] blocks;
private BiomeType[][] biomes = null;
public FaweClipboard IMP;
private BlockVector3 size;
private final List<ClipboardEntity> entities = new ArrayList<>();
@ -69,7 +70,7 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
this.size = getDimensions();
this.IMP = Settings.IMP.CLIPBOARD.USE_DISK ? new DiskOptimizedClipboard(size.getBlockX(), size.getBlockY(), size.getBlockZ()) : new MemoryOptimizedClipboard(size.getBlockX(), size.getBlockY(), size.getBlockZ());
this.origin = region.getMinimumPoint();
this.blocks = new BlockStateHolder[size.getBlockX()][size.getBlockY()][size.getBlockZ()];
this.blocks = new BaseBlock[size.getBlockX()][size.getBlockY()][size.getBlockZ()];
}
/**
@ -85,7 +86,7 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
this.size = getDimensions();
this.IMP = Settings.IMP.CLIPBOARD.USE_DISK ? new DiskOptimizedClipboard(size.getBlockX(), size.getBlockY(), size.getBlockZ(), clipboardId) : new MemoryOptimizedClipboard(size.getBlockX(), size.getBlockY(), size.getBlockZ());
this.origin = region.getMinimumPoint();
this.blocks = new BlockStateHolder[size.getBlockX()][size.getBlockY()][size.getBlockZ()];
this.blocks = new BaseBlock[size.getBlockX()][size.getBlockY()][size.getBlockZ()];
}
public BlockArrayClipboard(Region region, FaweClipboard clipboard) {
@ -94,7 +95,7 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
this.size = getDimensions();
this.origin = region.getMinimumPoint();
this.IMP = clipboard;
this.blocks = new BlockStateHolder[size.getBlockX()][size.getBlockY()][size.getBlockZ()];
this.blocks = new BaseBlock[size.getBlockX()][size.getBlockY()][size.getBlockZ()];
}
public void init(Region region, FaweClipboard fc) {
@ -104,7 +105,7 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
this.size = getDimensions();
this.IMP = fc;
this.origin = region.getMinimumPoint();
this.blocks = new BlockStateHolder[size.getBlockX()][size.getBlockY()][size.getBlockZ()];
this.blocks = new BaseBlock[size.getBlockX()][size.getBlockY()][size.getBlockZ()];
}
@Override
@ -157,7 +158,7 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
public List<? extends Entity> getEntities(Region region) {
List<Entity> filtered = new ArrayList<>();
for (Entity entity : getEntities()) {
if (region.contains(entity.getLocation().toBlockPoint())) {
if (region.contains(entity.getLocation().toVector().toBlockPoint())) {
filtered.add(entity);
}
}
@ -185,10 +186,6 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
return BlockTypes.AIR.getDefaultState();
}
public BlockState getBlockAbs(int x, int y, int z) {
return IMP.getBlock(x, y, z).toImmutableState();
}
@Override
public BlockState getLazyBlock(BlockVector3 position) {
return getBlock(position);
@ -205,11 +202,11 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
}
@Override
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B block) throws WorldEditException {
if (region.contains(location)) {
final int x = location.getBlockX();
final int y = location.getBlockY();
final int z = location.getBlockZ();
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block) throws WorldEditException {
if (region.contains(position)) {
final int x = position.getBlockX();
final int y = position.getBlockY();
final int z = position.getBlockZ();
return setBlock(x, y, z, block);
}
return false;
@ -227,17 +224,38 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent, Closeable
return IMP.setBlock(v.getX(), v.getY(), v.getZ(), block);
}
@Override
public boolean hasBiomes() {
return biomes != null;
}
@Override
public BiomeType getBiome(BlockVector2 position) {
BlockVector2 v = position.subtract(region.getMinimumPoint().toBlockVector2());
return IMP.getBiome(v.getX(), v.getZ());
if (biomes != null
&& position.containedWithin(getMinimumPoint().toBlockVector2(), getMaximumPoint().toBlockVector2())) {
BlockVector2 v = position.subtract(region.getMinimumPoint().toBlockVector2());
BiomeType biomeType = biomes[v.getBlockX()][v.getBlockZ()];
if (biomeType != null) {
return IMP.getBiome(v.getX(), v.getZ());
//TODO Remove the line above and replace with this: return biomeType;
}
return IMP.getBiome(v.getX(), v.getZ());
}
return BiomeTypes.OCEAN;
}
@Override
public boolean setBiome(BlockVector2 position, BiomeType biome) {
BlockVector2 v = position.subtract(region.getMinimumPoint().toBlockVector2());
IMP.setBiome(v.getX(), v.getZ(), biome);
return true;
if (position.containedWithin(getMinimumPoint().toBlockVector2(), getMaximumPoint().toBlockVector2())) {
BlockVector2 v = position.subtract(region.getMinimumPoint().toBlockVector2());
IMP.setBiome(v.getX(), v.getZ(), biome);
if (biomes == null) {
biomes = new BiomeType[region.getWidth()][region.getLength()];
}
biomes[v.getBlockX()][v.getBlockZ()] = biome;
return true;
}
return false;
}
@Nullable

View File

@ -58,4 +58,15 @@ public interface Clipboard extends Extent {
*/
void setOrigin(BlockVector3 origin);
/**
* Returns true if the clipboard has biome data. This can be checked since {@link Extent#getBiome(BlockVector2)}
* strongly suggests returning {@link com.sk89q.worldedit.world.biome.BiomeTypes.OCEAN} instead of {@code null}
* if biomes aren't present. However, it might not be desired to set areas to ocean if the clipboard is defaulting
* to ocean, instead of having biomes explicitly set.
*
* @return true if the clipboard has biome data set
*/
default boolean hasBiomes() {
return false;
}
}

View File

@ -85,6 +85,7 @@ public class GroundFunction implements LayerFunction {
if (depth == 0) {
if (function.apply(position)) {
affected++;
return true;
}
}

View File

@ -20,13 +20,13 @@
package com.sk89q.worldedit.function.block;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.function.LayerFunction;
import com.sk89q.worldedit.function.mask.BlockTypeMask;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypes;
/**
@ -65,21 +65,32 @@ public class Naturalizer implements LayerFunction {
return mask.test(position);
}
private BlockState getTargetBlock(int depth) {
switch (depth) {
case 0:
return BlockTypes.GRASS_BLOCK.getDefaultState();
case 1:
case 2:
case 3:
return BlockTypes.DIRT.getDefaultState();
default:
return BlockTypes.STONE.getDefaultState();
}
}
private boolean naturalize(BlockVector3 position, int depth) throws WorldEditException {
BlockState block = editSession.getBlock(position);
BlockState targetBlock = getTargetBlock(depth);
if (block.equalsFuzzy(targetBlock)) {
return false;
}
return editSession.setBlock(position, targetBlock);
}
@Override
public boolean apply(BlockVector3 position, int depth) throws WorldEditException {
if (mask.test(position)) {
affected++;
switch (depth) {
case 0:
editSession.setBlock(position, BlockTypes.GRASS_BLOCK.getDefaultState());
break;
case 1:
case 2:
case 3:
editSession.setBlock(position, BlockTypes.DIRT.getDefaultState());
break;
default:
editSession.setBlock(position, BlockTypes.STONE.getDefaultState());
if (naturalize(position, depth)) {
++affected;
}
}

View File

@ -80,7 +80,7 @@ public class NoiseFilter extends AbstractMask {
*/
public void setDensity(double density) {
checkArgument(density >= 0, "density must be >= 0");
checkArgument(density <= 1, "density must be >= 1");
checkArgument(density <= 1, "density must be <= 1");
this.density = density;
}

View File

@ -78,7 +78,7 @@ public class NoiseFilter2D extends AbstractMask2D {
*/
public void setDensity(double density) {
checkArgument(density >= 0, "density must be >= 0");
checkArgument(density <= 1, "density must be >= 1");
checkArgument(density <= 1, "density must be <= 1");
this.density = density;
}

View File

@ -99,7 +99,6 @@ public class ChangeSetExecutor implements Operation {
* @param context an undo context
* @return an operation
*/
@Deprecated
public static ChangeSetExecutor createUndo(ChangeSet changeSet, UndoContext context) {
return new ChangeSetExecutor(changeSet, Type.UNDO, context, null, 0);
}
@ -111,7 +110,6 @@ public class ChangeSetExecutor implements Operation {
* @param context an undo context
* @return an operation
*/
@Deprecated
public static ChangeSetExecutor createRedo(ChangeSet changeSet, UndoContext context) {
return new ChangeSetExecutor(changeSet, Type.REDO, context, null, 0);
}

View File

@ -58,7 +58,7 @@ import java.util.stream.Collectors;
/**
* Makes a copy of a portion of one extent to another extent or another point.
*
* <p>
* <p>This is a forward extent copy, meaning that it iterates over the blocks
* in the source extent, and will copy as many blocks as there are in the
* source. Therefore, interpolation will not occur to fill in the gaps.</p>
@ -73,11 +73,11 @@ public class ForwardExtentCopy implements Operation {
private int repetitions = 1;
private Mask sourceMask = Masks.alwaysTrue();
private boolean removingEntities;
private boolean copyingEntities = true; // default to true for backwards compatibility, sort of
private RegionFunction sourceFunction = null;
private Transform transform = new Identity();
private Transform currentTransform = null;
private int affected;
private boolean copyEntities = true;
private boolean copyBiomes = false;
private RegionFunction filterFunction;
@ -119,7 +119,7 @@ public class ForwardExtentCopy implements Operation {
/**
* Get the transformation that will occur on every point.
*
* <p>
* <p>The transformation will stack with each repetition.</p>
*
* @return a transformation
@ -141,7 +141,7 @@ public class ForwardExtentCopy implements Operation {
/**
* Get the mask that gets applied to the source extent.
*
* <p>
* <p>This mask can be used to filter what will be copied from the source.</p>
*
* @return a source mask
@ -150,6 +150,24 @@ public class ForwardExtentCopy implements Operation {
return sourceMask;
}
/**
* Set whether entities should be copied along with blocks.
*
* @param copyEntities true if copying
*/
public void setCopyingEntities(boolean copyEntities) {
this.copyEntities = copyEntities;
}
/**
* Return whether entities should be copied along with blocks.
*
* @return true if copying
*/
public boolean isCopyingEntities() {
return copyEntities;
}
public void setCopyBiomes(boolean copyBiomes) {
this.copyBiomes = copyBiomes;
}
@ -189,6 +207,7 @@ public class ForwardExtentCopy implements Operation {
*
* @param function a source function, or null if none is to be applied
*/
@Deprecated
public void setSourceFunction(RegionFunction function) {
this.sourceFunction = function;
}
@ -212,24 +231,6 @@ public class ForwardExtentCopy implements Operation {
this.repetitions = repetitions;
}
/**
* Return whether entities should be copied along with blocks.
*
* @return true if copying
*/
public boolean isCopyingEntities() {
return copyingEntities;
}
/**
* Set whether entities should be copied along with blocks.
*
* @param copyingEntities true if copying
*/
public void setCopyingEntities(boolean copyingEntities) {
this.copyingEntities = copyingEntities;
}
/**
* Return whether entities that are copied should be removed.
*

View File

@ -28,5 +28,5 @@ public interface ExtentPattern extends Pattern {
*
* @return the extent for this pattern
*/
public Extent getExtent();
Extent getExtent();
}

View File

@ -89,11 +89,11 @@ public class RepeatingExtentPattern extends AbstractExtentPattern {
}
@Override
public BaseBlock apply(BlockVector3 p) {
int x = Math.abs(p.getX() + offset.getX()) % size.getBlockX() + origin.getX();
int y = Math.abs(p.getY() + offset.getY()) % size.getBlockY() + origin.getY();
int z = Math.abs(p.getZ() + offset.getZ()) % size.getBlockZ() + origin.getZ();
return getExtent().getFullBlock(mutable.setComponents(x, y, z));
public BaseBlock apply(BlockVector3 position) {
int x = Math.abs(position.getX() + offset.getX()) % size.getBlockX();
int y = Math.abs(position.getY() + offset.getY()) % size.getBlockY();
int z = Math.abs(position.getZ() + offset.getZ()) % size.getBlockZ();
return getExtent().getFullBlock(mutable.setComponents(x, y, z).add(origin));
}
}

View File

@ -77,7 +77,7 @@ public abstract class BreadthFirstSearch implements Operation {
}
}
list.sort((o1, o2) -> (int) Math.signum(o1.lengthSq() - o2.lengthSq()));
DIAGONAL_DIRECTIONS = list.toArray(new BlockVector3[list.size()]);
DIAGONAL_DIRECTIONS = list.toArray(new BlockVector3[0]);
}
private final RegionFunction function;

View File

@ -1,33 +0,0 @@
/*
* 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.internal.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Marks features that should be replaced with Google Guava but cannot
* yet because Bukkit uses such an old version of Guava.
*/
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface RequiresNewerGuava {
}

View File

@ -104,12 +104,12 @@ public class Expression {
}
private Expression(List<Token> tokens, String... variableNames) throws ExpressionException {
this.variableNames = variableNames;
variables.put("e", new Constant(-1, Math.E));
variables.put("pi", new Constant(-1, Math.PI));
variables.put("true", new Constant(-1, 1));
variables.put("false", new Constant(-1, 0));
this.variableNames = variableNames;
variableArray = new Variable[variableNames.length];
for (int i = 0; i < variableNames.length; i++) {
String variableName = variableNames[i];

View File

@ -170,7 +170,8 @@ public class HeightMap {
int originZ = minY.getBlockZ();
int maxY = region.getMaximumPoint().getBlockY();
BlockStateHolder fillerAir = BlockTypes.AIR.getDefaultState();
BlockState fillerAir = BlockTypes.AIR.getDefaultState();
int blocksChanged = 0;
@ -181,14 +182,19 @@ public class HeightMap {
// Apply heightmap
for (int z = 0; z < height; ++z) {
int zr = z + originZ;
for (int x = 0; x < width; ++x) {
int curHeight = this.data[index];
if (this.invalid != null && this.invalid[index]) continue;
//Clamp newHeight within the selection area
int newHeight = Math.min(maxY4, data[index++]);
int curBlock = (curHeight) >> 4;
int newBlock = (newHeight + 15) >> 4;
// Offset x,z to be 'real' coordinates
int xr = x + originX;
int zr = z + originZ;
// Depending on growing or shrinking we need to start at the bottom or top
if (newHeight > curHeight) {
@ -239,6 +245,13 @@ public class HeightMap {
return blocksChanged;
}
/**
* Apply a raw heightmap to the region
*
* @param data the data
* @return number of blocks affected
* @throws MaxChangedBlocksException
*/
public int apply(int[] data) throws MaxChangedBlocksException {
checkNotNull(data);
@ -256,14 +269,17 @@ public class HeightMap {
// Apply heightmap
int index = 0;
for (int z = 0; z < height; ++z) {
int zr = z + originZ;
for (int x = 0; x < width; ++x, index++) {
int curHeight = this.data[index];
if (this.invalid != null && this.invalid[index]) continue;
int curHeight = this.data[index];
// Clamp newHeight within the selection area
int newHeight = Math.min(maxY, data[index]);
// Offset x,z to be 'real' coordinates
int xr = x + originX;
int zr = z + originZ;
// Depending on growing or shrinking we need to start at the bottom or top
if (newHeight > curHeight) {
@ -279,7 +295,7 @@ public class HeightMap {
session.setBlock(xr, setY, zr, tmpBlock);
++blocksChanged;
}
session.setBlock(xr, newHeight, zr, existing);
session.setBlock(BlockVector3.at(xr, newHeight, zr), existing);
++blocksChanged;
}
} else if (curHeight > newHeight) {

View File

@ -44,7 +44,7 @@ public class KochanekBartelsInterpolation implements Interpolation {
private double scaling;
public KochanekBartelsInterpolation() {
setNodes(Collections.emptyList());
setNodes(Collections.<Node>emptyList());
}
@Override

View File

@ -182,19 +182,19 @@ public class AffineTransform implements Transform, Serializable {
public AffineTransform inverse() {
if (inverse != null) return inverse;
double det = this.determinant();
return inverse = new AffineTransform(
return new AffineTransform(
(m11 * m22 - m21 * m12) / det,
(m02 * m21 - m22 * m01) / det,
(m21 * m02 - m01 * m22) / det,
(m01 * m12 - m11 * m02) / det,
(m01 * (m22 * m13 - m12 * m23) + m02 * (m11 * m23 - m21 * m13)
- m03 * (m11 * m22 - m21 * m12)) / det,
(m12 * m20 - m22 * m10) / det,
(m20 * m12 - m10 * m22) / det,
(m00 * m22 - m20 * m02) / det,
(m02 * m10 - m12 * m00) / det,
(m10 * m02 - m00 * m12) / det,
(m00 * (m12 * m23 - m22 * m13) - m02 * (m10 * m23 - m20 * m13)
+ m03 * (m10 * m22 - m20 * m12)) / det,
(m10 * m21 - m20 * m11) / det,
(m01 * m20 - m21 * m00) / det,
(m20 * m01 - m00 * m21) / det,
(m00 * m11 - m10 * m01) / det,
(m00 * (m21 * m13 - m11 * m23) + m01 * (m10 * m23 - m20 * m13)
- m03 * (m10 * m21 - m20 * m11)) / det);
@ -348,9 +348,5 @@ public class AffineTransform implements Transform, Serializable {
return String.format("Affine[%g %g %g %g, %g %g %g %g, %g %g %g %g]}", m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23);
}
private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.defaultReadObject();
}
}

View File

@ -20,10 +20,9 @@
package com.sk89q.worldedit.regions;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector2;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.math.geom.Polygons;
@ -34,8 +33,6 @@ import com.sk89q.worldedit.world.World;
import java.util.Iterator;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Represents a cylindrical region.
*/
@ -206,7 +203,7 @@ public class CylinderRegion extends AbstractRegion implements FlatRegion {
@Override
public int getHeight() {
return getMaximumY() - getMinimumY() + 1;
return maxY - minY + 1;
}
@Override
@ -299,6 +296,7 @@ public class CylinderRegion extends AbstractRegion implements FlatRegion {
if (blockY < minY || blockY > maxY) {
return false;
}
//todo the following lines can possibly be removed and replaced with upstream
int px = position.getBlockX();
int pz = position.getBlockZ();

View File

@ -64,7 +64,7 @@ public class WorldEditExpressionEnvironment implements ExpressionEnvironment {
@Override
public int getBlockTypeAbs(double x, double y, double z) {
return extent.getBlock(toWorld(x, y, z)).getBlockType().getLegacyCombinedId() >> 4;
return extent.getBlock(BlockVector3.at(x, y, z)).getBlockType().getLegacyCombinedId() >> 4;
}
@Override
@ -74,7 +74,7 @@ public class WorldEditExpressionEnvironment implements ExpressionEnvironment {
@Override
public int getBlockTypeRel(double x, double y, double z) {
return extent.getBlock(toWorld(x, y, z)).getBlockType().getLegacyCombinedId() >> 4;
return extent.getBlock(toWorldRel(x, y, z).toBlockPoint()).getBlockType().getLegacyCombinedId() >> 4;
}
@Override

View File

@ -20,17 +20,12 @@
package com.sk89q.worldedit.registry.state;
import com.boydti.fawe.util.MathMan;
import com.sk89q.worldedit.internal.expression.runtime.Function;
import com.sk89q.worldedit.math.MathUtils;
import static com.google.common.base.Preconditions.checkState;
import com.sk89q.worldedit.world.block.BlockTypes;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkState;
public class AbstractProperty<T> implements Property<T> {

View File

@ -19,6 +19,7 @@
package com.sk89q.worldedit.session;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
@ -48,10 +49,6 @@ import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Session manager for WorldEdit.
@ -245,12 +242,7 @@ public class SessionManager {
* @return the key object
*/
protected UUID getKey(SessionKey key) {
// String forcedKey = System.getProperty("worldedit.session.uuidOverride");
// if (forcedKey != null) {
// return UUID.fromString(forcedKey);
// } else {
return key.getUniqueId();
// }
}
/**
@ -268,6 +260,7 @@ public class SessionManager {
*/
public synchronized void unload() {
clear();
timer.cancel();
}
/**
@ -290,7 +283,7 @@ public class SessionManager {
if (stored.session.compareAndResetDirty()) {
// Don't save unless player disconnects
// saveQueue.put(stored.key, stored.session);
// saveQueue.put(stored.key, stored.session);
}
} else {
if (now - stored.lastActive > EXPIRATION_GRACE) {

View File

@ -22,13 +22,14 @@ package com.sk89q.worldedit.util;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.OptionalInt;
import javax.annotation.Nullable;
/**
* A collection of cardinal, ordinal, and secondary-ordinal directions.
*/

View File

@ -38,7 +38,8 @@ import javax.annotation.Nullable;
*/
public class TargetBlock {
private World world;
private final World world;
private int maxDistance;
private double checkDistance, curDistance;
private BlockVector3 targetPos = BlockVector3.ZERO;
@ -121,7 +122,7 @@ public class TargetBlock {
this.checkDistance = checkDistance;
this.curDistance = 0;
xRotation = (xRotation + 90) % 360;
yRotation = yRotation * -1;
yRotation *= -1;
double h = (checkDistance * Math.cos(Math.toRadians(yRotation)));
@ -144,15 +145,15 @@ public class TargetBlock {
boolean searchForLastBlock = true;
Location lastBlock = null;
while (getNextBlock() != null) {
if (!stopMask.test(targetPos)) {
if (stopMask.test(targetPos)) {
break;
} else {
if (searchForLastBlock) {
lastBlock = getCurrentBlock();
if (lastBlock.getBlockY() <= 0 || lastBlock.getBlockY() >= world.getMaxY()) {
searchForLastBlock = false;
}
}
} else {
break;
}
}
Location currentBlock = getCurrentBlock();

View File

@ -19,11 +19,10 @@
package com.sk89q.worldedit.util.eventbus;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
import com.google.common.collect.SetMultimap;
import com.google.common.eventbus.DeadEvent;
import com.sk89q.worldedit.internal.annotation.RequiresNewerGuava;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -31,13 +30,11 @@ import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Dispatches events to listeners, and provides ways for listeners to register
@ -46,17 +43,15 @@ import static com.google.common.base.Preconditions.checkNotNull;
* <p>This class is based on Guava's {@link EventBus} but priority is supported
* and events are dispatched at the time of call, rather than being queued up.
* This does allow dispatching during an in-progress dispatch.</p>
*
* <p>This implementation utilizes naive synchronization on all getter and
* setter methods. Dispatch does not occur when a lock has been acquired,
* however.</p>
*/
public class EventBus {
public final class EventBus {
private final Logger logger = LoggerFactory.getLogger(EventBus.class);
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final SetMultimap<Class<?>, EventHandler> handlersByType =
Multimaps.newSetMultimap(new HashMap<>(), this::newHandlerSet);
HashMultimap.create();
/**
* Strategy for finding handler methods in registered objects. Currently,
@ -65,7 +60,6 @@ public class EventBus {
*/
private final SubscriberFindingStrategy finder = new AnnotatedSubscriberFinder();
@RequiresNewerGuava
private HierarchyCache flattenHierarchyCache = new HierarchyCache();
/**
@ -74,10 +68,15 @@ public class EventBus {
* @param clazz the event class to register
* @param handler the handler to register
*/
public synchronized void subscribe(Class<?> clazz, EventHandler handler) {
public void subscribe(Class<?> clazz, EventHandler handler) {
checkNotNull(clazz);
checkNotNull(handler);
handlersByType.put(clazz, handler);
lock.writeLock().lock();
try {
handlersByType.put(clazz, handler);
} finally {
lock.writeLock().unlock();
}
}
/**
@ -85,9 +84,14 @@ public class EventBus {
*
* @param handlers a map of handlers
*/
public synchronized void subscribeAll(Multimap<Class<?>, EventHandler> handlers) {
public void subscribeAll(Multimap<Class<?>, EventHandler> handlers) {
checkNotNull(handlers);
handlersByType.putAll(handlers);
lock.writeLock().lock();
try {
handlersByType.putAll(handlers);
} finally {
lock.writeLock().unlock();
}
}
/**
@ -96,10 +100,15 @@ public class EventBus {
* @param clazz the class
* @param handler the handler
*/
public synchronized void unsubscribe(Class<?> clazz, EventHandler handler) {
public void unsubscribe(Class<?> clazz, EventHandler handler) {
checkNotNull(clazz);
checkNotNull(handler);
handlersByType.remove(clazz, handler);
lock.writeLock().lock();
try {
handlersByType.remove(clazz, handler);
} finally {
lock.writeLock().unlock();
}
}
/**
@ -107,15 +116,15 @@ public class EventBus {
*
* @param handlers a map of handlers
*/
public synchronized void unsubscribeAll(Multimap<Class<?>, EventHandler> handlers) {
public void unsubscribeAll(Multimap<Class<?>, EventHandler> handlers) {
checkNotNull(handlers);
for (Map.Entry<Class<?>, Collection<EventHandler>> entry : handlers.asMap().entrySet()) {
Set<EventHandler> currentHandlers = getHandlersForEventType(entry.getKey());
Collection<EventHandler> eventMethodsInListener = entry.getValue();
if (currentHandlers != null &&!currentHandlers.containsAll(entry.getValue())) {
currentHandlers.removeAll(eventMethodsInListener);
lock.writeLock().lock();
try {
for (Map.Entry<Class<?>, Collection<EventHandler>> entry : handlers.asMap().entrySet()) {
handlersByType.get(entry.getKey()).removeAll(entry.getValue());
}
} finally {
lock.writeLock().unlock();
}
}
@ -146,25 +155,23 @@ public class EventBus {
* successfully after the event has been posted to all handlers, and
* regardless of any exceptions thrown by handlers.
*
* <p>If no handlers have been subscribed for {@code event}'s class, and
* {@code event} is not already a {@link DeadEvent}, it will be wrapped in a
* DeadEvent and reposted.
*
* @param event event to post.
*/
public void post(Object event) {
List<EventHandler> dispatching = new ArrayList<>();
synchronized (this) {
Set<Class<?>> dispatchTypes = flattenHierarchy(event.getClass());
Set<Class<?>> dispatchTypes = flattenHierarchyCache.get(event.getClass());
lock.readLock().lock();
try {
for (Class<?> eventType : dispatchTypes) {
Set<EventHandler> wrappers = getHandlersForEventType(eventType);
Set<EventHandler> wrappers = handlersByType.get(eventType);
if (wrappers != null && !wrappers.isEmpty()) {
dispatching.addAll(wrappers);
}
}
} finally {
lock.readLock().unlock();
}
Collections.sort(dispatching);
@ -175,14 +182,12 @@ public class EventBus {
}
/**
* Dispatches {@code event} to the handler in {@code handler}. This method
* is an appropriate override point for subclasses that wish to make
* event delivery asynchronous.
* Dispatches {@code event} to the handler in {@code handler}.
*
* @param event event to dispatch.
* @param handler handler that will call the handler.
*/
protected void dispatch(Object event, EventHandler handler) {
private void dispatch(Object event, EventHandler handler) {
try {
handler.handleEvent(event);
} catch (InvocationTargetException e) {
@ -190,39 +195,4 @@ public class EventBus {
}
}
/**
* Retrieves a mutable set of the currently registered handlers for
* {@code type}. If no handlers are currently registered for {@code type},
* this method may either return {@code null} or an empty set.
*
* @param type type of handlers to retrieve.
* @return currently registered handlers, or {@code null}.
*/
synchronized Set<EventHandler> getHandlersForEventType(Class<?> type) {
return handlersByType.get(type);
}
/**
* Creates a new Set for insertion into the handler map. This is provided
* as an override point for subclasses. The returned set should support
* concurrent access.
*
* @return a new, mutable set for handlers.
*/
protected synchronized Set<EventHandler> newHandlerSet() {
return new HashSet<>();
}
/**
* Flattens a class's type hierarchy into a set of Class objects. The set
* will include all superclasses (transitively), and all interfaces
* implemented by these superclasses.
*
* @param concreteClass class whose type hierarchy will be retrieved.
* @return {@code clazz}'s complete type hierarchy, flattened and uniqued.
*/
Set<Class<?>> flattenHierarchy(Class<?> concreteClass) {
return flattenHierarchyCache.get(concreteClass);
}
}

View File

@ -19,34 +19,27 @@
package com.sk89q.worldedit.util.eventbus;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.sk89q.worldedit.internal.annotation.RequiresNewerGuava;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
/**
* Holds a cache of class hierarchy.
*
* <p>This exists because Bukkit has an ancient version of Guava and the cache
* library in Guava has since changed.</>
*/
@RequiresNewerGuava
class HierarchyCache {
private final Map<Class<?>, Set<Class<?>>> cache = new WeakHashMap<>();
private final LoadingCache<Class<?>, Set<Class<?>>> cache = CacheBuilder.newBuilder()
.weakKeys()
.build(CacheLoader.from(this::build));
public Set<Class<?>> get(Class<?> concreteClass) {
Set<Class<?>> ret = cache.get(concreteClass);
if (ret == null) {
ret = build(concreteClass);
cache.put(concreteClass, ret);
}
return ret;
return cache.getUnchecked(concreteClass);
}
protected Set<Class<?>> build(Class<?> concreteClass) {

View File

@ -1,60 +0,0 @@
/*
* 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.util.logging;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
/**
* Adds a WorldEdit prefix to WorldEdit's logger messages using a handler.
*/
public final class WorldEditPrefixHandler extends Handler {
private WorldEditPrefixHandler() {
}
@Override
public void publish(LogRecord record) {
String message = record.getMessage();
if (!message.startsWith("WorldEdit: ") && !message.startsWith("[WorldEdit] ")) {
record.setMessage("[WorldEdit] " + message);
}
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
}
/**
* Add the handler to the following logger name.
*
* @param name the logger name
*/
public static void register(String name) {
//todo fix this
//Logger.getLogger(name).addHandler(new WorldEditPrefixHandler());
}
}