Undo/Settings

Fix some disk and undo issues
FaweQueue uses Settings instance
This commit is contained in:
Jesse Boyd 2017-01-15 18:45:12 +11:00
parent 9d2e9212fa
commit 812c12fce4
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
53 changed files with 389 additions and 298 deletions

View File

@ -203,8 +203,8 @@ public class FaweBukkit implements IFawe, Listener {
return plugin.getQueue(world);
} catch (Throwable ignore) {
// Disable incompatible settings
Settings.QUEUE.PARALLEL_THREADS = 1; // BukkitAPI placer is too slow to parallel thread at the chunk level
Settings.HISTORY.COMBINE_STAGES = false; // Performing a chunk copy (if possible) wouldn't be faster using the BukkitAPI
Settings.IMP.QUEUE.PARALLEL_THREADS = 1; // BukkitAPI placer is too slow to parallel thread at the chunk level
Settings.IMP.HISTORY.COMBINE_STAGES = false; // Performing a chunk copy (if possible) wouldn't be faster using the BukkitAPI
if (hasNMS) {
ignore.printStackTrace();
debug("====== NO NMS BLOCK PLACER FOUND ======");
@ -256,8 +256,8 @@ public class FaweBukkit implements IFawe, Listener {
} catch (Throwable ignore) {
}
// Disable incompatible settings
Settings.QUEUE.PARALLEL_THREADS = 1; // BukkitAPI placer is too slow to parallel thread at the chunk level
Settings.HISTORY.COMBINE_STAGES = false; // Performing a chunk copy (if possible) wouldn't be faster using the BukkitAPI
Settings.IMP.QUEUE.PARALLEL_THREADS = 1; // BukkitAPI placer is too slow to parallel thread at the chunk level
Settings.IMP.HISTORY.COMBINE_STAGES = false; // Performing a chunk copy (if possible) wouldn't be faster using the BukkitAPI
if (hasNMS) {
debug("====== NO NMS BLOCK PLACER FOUND ======");
debug("FAWE couldn't find a fast block placer");

View File

@ -206,7 +206,7 @@ public class BukkitChunk_All extends CharFaweChunk<Chunk, BukkitQueue_All> {
continue;
}
if (light != place) {
light = light && Settings.LIGHTING.MODE != 0;
light = light && Settings.IMP.LIGHTING.MODE != 0;
if (light) {
parent.enableLighting(disableResult);
}

View File

@ -21,19 +21,19 @@ public class BukkitQueue_All extends BukkitQueue_0<Chunk, Chunk, Chunk> {
public BukkitQueue_All(com.sk89q.worldedit.world.World world) {
super(world);
if (Settings.QUEUE.EXTRA_TIME_MS != Integer.MIN_VALUE) {
ALLOCATE = Settings.QUEUE.EXTRA_TIME_MS;
Settings.QUEUE.EXTRA_TIME_MS = Integer.MIN_VALUE;
Settings.QUEUE.PARALLEL_THREADS = 1;
if (Settings.IMP.QUEUE.EXTRA_TIME_MS != Integer.MIN_VALUE) {
ALLOCATE = Settings.IMP.QUEUE.EXTRA_TIME_MS;
Settings.IMP.QUEUE.EXTRA_TIME_MS = Integer.MIN_VALUE;
Settings.IMP.QUEUE.PARALLEL_THREADS = 1;
}
}
public BukkitQueue_All(String world) {
super(world);
if (Settings.QUEUE.EXTRA_TIME_MS != Integer.MIN_VALUE) {
ALLOCATE = Settings.QUEUE.EXTRA_TIME_MS;
Settings.QUEUE.EXTRA_TIME_MS = Integer.MIN_VALUE;
Settings.QUEUE.PARALLEL_THREADS = 1;
if (Settings.IMP.QUEUE.EXTRA_TIME_MS != Integer.MIN_VALUE) {
ALLOCATE = Settings.IMP.QUEUE.EXTRA_TIME_MS;
Settings.IMP.QUEUE.EXTRA_TIME_MS = Integer.MIN_VALUE;
Settings.IMP.QUEUE.PARALLEL_THREADS = 1;
}
}

View File

@ -27,7 +27,7 @@ public class ChunkListener implements Listener {
int rateLimit = 0;
public ChunkListener() {
if (Settings.TICK_LIMITER.ENABLED) {
if (Settings.IMP.TICK_LIMITER.ENABLED) {
Bukkit.getPluginManager().registerEvents(ChunkListener.this, Fawe.<FaweBukkit>imp().getPlugin());
TaskManager.IMP.repeat(new Runnable() {
@Override
@ -38,11 +38,11 @@ public class ChunkListener implements Listener {
counter.clear();
lastZ = Integer.MIN_VALUE;
for (Long badChunk : badChunks) {
counter.put(badChunk, new IntegerTrio(Settings.TICK_LIMITER.PHYSICS, Settings.TICK_LIMITER.ITEMS, Settings.TICK_LIMITER.FALLING));
counter.put(badChunk, new IntegerTrio(Settings.IMP.TICK_LIMITER.PHYSICS, Settings.IMP.TICK_LIMITER.ITEMS, Settings.IMP.TICK_LIMITER.FALLING));
}
badChunks.clear();
}
}, Settings.TICK_LIMITER.INTERVAL);
}, Settings.IMP.TICK_LIMITER.INTERVAL);
}
}
@ -92,7 +92,7 @@ public class ChunkListener implements Listener {
int cx = x >> 4;
int cz = z >> 4;
IntegerTrio count = getCount(cx, cz);
if (count.x >= Settings.TICK_LIMITER.PHYSICS) {
if (count.x >= Settings.IMP.TICK_LIMITER.PHYSICS) {
event.setCancelled(true);
return;
}
@ -100,7 +100,7 @@ public class ChunkListener implements Listener {
int y = block.getY();
if (y != lastPhysY) {
lastPhysY = y;
if (++count.x == Settings.TICK_LIMITER.PHYSICS) {
if (++count.x == Settings.IMP.TICK_LIMITER.PHYSICS) {
badChunks.add(MathMan.pairInt(cx, cz));
if (rateLimit <= 0) {
rateLimit = 120;
@ -127,9 +127,9 @@ public class ChunkListener implements Listener {
int cx = x >> 4;
int cz = z >> 4;
IntegerTrio count = getCount(cx, cz);
if (++count.y >= Settings.TICK_LIMITER.FALLING) {
if (count.y == Settings.TICK_LIMITER.FALLING) {
count.x = Settings.TICK_LIMITER.PHYSICS;
if (++count.y >= Settings.IMP.TICK_LIMITER.FALLING) {
if (count.y == Settings.IMP.TICK_LIMITER.FALLING) {
count.x = Settings.IMP.TICK_LIMITER.PHYSICS;
badChunks.add(MathMan.pairInt(cx, cz));
Fawe.debug("[Tick Limiter] Detected and cancelled falling block lag source at " + block.getLocation());
}
@ -149,9 +149,9 @@ public class ChunkListener implements Listener {
int cx = loc.getBlockX() >> 4;
int cz = loc.getBlockZ() >> 4;
IntegerTrio count = getCount(cx, cz);
if (++count.z >= Settings.TICK_LIMITER.ITEMS) {
if (count.z == Settings.TICK_LIMITER.ITEMS) {
count.x = Settings.TICK_LIMITER.PHYSICS;
if (++count.z >= Settings.IMP.TICK_LIMITER.ITEMS) {
if (count.z == Settings.IMP.TICK_LIMITER.ITEMS) {
count.x = Settings.IMP.TICK_LIMITER.PHYSICS;
cleanup(loc.getChunk());
badChunks.add(MathMan.pairInt(cx, cz));
if (rateLimit <= 0) {

View File

@ -80,6 +80,10 @@ public class AsyncWorld extends DelegateFaweQueue implements World, HasFaweQueue
this(parent, FaweAPI.createQueue(parent.getName(), autoQueue));
}
public AsyncWorld(String world, boolean autoQueue) {
this(Bukkit.getWorld(world), autoQueue);
}
/**
* @deprecated use {@link #wrap(org.bukkit.World)} instead
* @param parent

View File

@ -227,11 +227,11 @@ public class Fawe {
* Implementation dependent stuff
*/
this.setupConfigs();
MainUtil.deleteOlder(MainUtil.getFile(IMP.getDirectory(), Settings.PATHS.HISTORY), TimeUnit.DAYS.toMillis(Settings.HISTORY.DELETE_AFTER_DAYS));
MainUtil.deleteOlder(MainUtil.getFile(IMP.getDirectory(), Settings.PATHS.CLIPBOARD), TimeUnit.DAYS.toMillis(Settings.CLIPBOARD.DELETE_AFTER_DAYS));
MainUtil.deleteOlder(MainUtil.getFile(IMP.getDirectory(), Settings.IMP.PATHS.HISTORY), TimeUnit.DAYS.toMillis(Settings.IMP.HISTORY.DELETE_AFTER_DAYS));
MainUtil.deleteOlder(MainUtil.getFile(IMP.getDirectory(), Settings.IMP.PATHS.CLIPBOARD), TimeUnit.DAYS.toMillis(Settings.IMP.CLIPBOARD.DELETE_AFTER_DAYS));
TaskManager.IMP = this.IMP.getTaskManager();
if (Settings.METRICS) {
if (Settings.IMP.METRICS) {
this.IMP.startMetrics();
}
this.setupCommands();
@ -258,7 +258,7 @@ public class Fawe {
TaskManager.IMP.repeat(timer, 1);
if (Settings.UPDATE) {
if (Settings.IMP.UPDATE) {
// Delayed updating
TaskManager.IMP.async(new Runnable() {
@Override
@ -310,19 +310,18 @@ public class Fawe {
public void setupConfigs() {
// Setting up config.yml
File file = new File(this.IMP.getDirectory(), "config.yml");
Settings.PLATFORM = IMP.getPlatform().replace("\"", "");
Settings.IMP.PLATFORM = IMP.getPlatform().replace("\"", "");
try {
InputStream stream = getClass().getResourceAsStream("/fawe.properties");
java.util.Scanner scanner = new java.util.Scanner(stream).useDelimiter("\\A");
String versionString = scanner.next().trim();
scanner.close();
this.version = new FaweVersion(versionString);
Settings.DATE = new Date(100 + version.year, version.month, version.day).toGMTString();
Settings.BUILD = "https://ci.athion.net/job/FastAsyncWorldEdit/" + version.build;
Settings.COMMIT = "https://github.com/boy0001/FastAsyncWorldedit/commit/" + Integer.toHexString(version.hash);
Settings.IMP.DATE = new Date(100 + version.year, version.month, version.day).toGMTString();
Settings.IMP.BUILD = "https://ci.athion.net/job/FastAsyncWorldEdit/" + version.build;
Settings.IMP.COMMIT = "https://github.com/boy0001/FastAsyncWorldedit/commit/" + Integer.toHexString(version.hash);
} catch (Throwable ignore) {}
Settings.load(file);
Settings.save(file);
Settings.IMP.reload(file);
// Setting up message.yml
BBC.load(new File(this.IMP.getDirectory(), "message.yml"));
}
@ -483,9 +482,9 @@ public class Fawe {
try {
com.github.luben.zstd.util.Native.load();
} catch (Throwable e) {
if (Settings.CLIPBOARD.COMPRESSION_LEVEL > 6 || Settings.HISTORY.COMPRESSION_LEVEL > 6) {
Settings.CLIPBOARD.COMPRESSION_LEVEL = Math.min(6, Settings.CLIPBOARD.COMPRESSION_LEVEL);
Settings.HISTORY.COMPRESSION_LEVEL = Math.min(6, Settings.HISTORY.COMPRESSION_LEVEL);
if (Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL > 6 || Settings.IMP.HISTORY.COMPRESSION_LEVEL > 6) {
Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL = Math.min(6, Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL);
Settings.IMP.HISTORY.COMPRESSION_LEVEL = Math.min(6, Settings.IMP.HISTORY.COMPRESSION_LEVEL);
debug("====== ZSTD COMPRESSION BINDING NOT FOUND ======");
debug(e);
debug("===============================================");
@ -525,7 +524,7 @@ public class Fawe {
}
private void setupMemoryListener() {
if (Settings.MAX_MEMORY_PERCENT < 1 || Settings.MAX_MEMORY_PERCENT > 99) {
if (Settings.IMP.MAX_MEMORY_PERCENT < 1 || Settings.IMP.MAX_MEMORY_PERCENT > 99) {
return;
}
try {
@ -547,7 +546,7 @@ public class Fawe {
if (max < 0) {
continue;
}
final long alert = (max * Settings.MAX_MEMORY_PERCENT) / 100;
final long alert = (max * Settings.IMP.MAX_MEMORY_PERCENT) / 100;
mp.setUsageThreshold(alert);
}
}

View File

@ -231,7 +231,7 @@ public class FaweAPI {
if (!file.getName().toLowerCase().endsWith(".bd")) {
throw new IllegalArgumentException("Not a BD file!");
}
if (Settings.HISTORY.USE_DISK) {
if (Settings.IMP.HISTORY.USE_DISK) {
throw new IllegalArgumentException("History on disk not enabled!");
}
String[] path = file.getPath().split(File.separator);
@ -261,12 +261,12 @@ public class FaweAPI {
* @param user - The uuid (may be null)
* @param radius - The radius from the origin of the edit
* @param timediff - The max age of the file in milliseconds
* @param shallow - If shallow is true, FAWE will only read the first Settings.BUFFER_SIZE bytes to obtain history info<br>
* @param shallow - If shallow is true, FAWE will only read the first Settings.IMP.BUFFER_SIZE bytes to obtain history info<br>
* Reading only part of the file will result in unreliable bounds info for large edits
* @return
*/
public static List<DiskStorageHistory> getBDFiles(FaweLocation origin, UUID user, int radius, long timediff, boolean shallow) {
File history = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY + File.separator + origin.world);
File history = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + origin.world);
if (!history.exists()) {
return new ArrayList<>();
}

View File

@ -28,7 +28,7 @@ public class Rollback extends FaweCommand {
@Override
public boolean execute(final FawePlayer player, final String... args) {
if (!Settings.HISTORY.USE_DATABASE) {
if (!Settings.IMP.HISTORY.USE_DATABASE) {
BBC.SETTING_DISABLE.send(player, "history.use-database");
return false;
}

View File

@ -13,6 +13,7 @@ import java.lang.annotation.Target;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
@ -28,7 +29,7 @@ public class Config {
* @param <T>
* @return
*/
public static <T> T get(String key, Class root) {
private <T> T get(String key, Class root) {
String[] split = key.split("\\.");
Object instance = getInstance(split, root);
if (instance != null) {
@ -52,7 +53,7 @@ public class Config {
* @param value value
*
*/
public static void set(String key, Object value, Class root) {
private void set(String key, Object value, Class root) {
String[] split = key.split("\\.");
Object instance = getInstance(split, root);
if (instance != null) {
@ -75,7 +76,7 @@ public class Config {
Fawe.debug("Failed to set config option: " + key + ": " + value + " | " + instance + " | " + root.getSimpleName() + ".yml");
}
public static boolean load(File file, Class root) {
public boolean load(File file) {
if (!file.exists()) {
return false;
}
@ -85,7 +86,7 @@ public class Config {
if (value instanceof MemorySection) {
continue;
}
set(key, value, root);
set(key, value, getClass());
}
return true;
}
@ -94,16 +95,19 @@ public class Config {
* Set all values in the file (load first to avoid overwriting)
* @param file
*/
public static void save(File file, Class root) {
public void save(File file) {
Class<? extends Config> root = getClass();
try {
if (!file.exists()) {
File parent = file.getParentFile();
if (parent != null) {
file.getParentFile().mkdirs();
}
file.createNewFile();
}
PrintWriter writer = new PrintWriter(file);
Class clazz = root;
Object instance = root.newInstance();
save(writer, clazz, instance, 0);
Object instance = this;
save(writer, getClass(), instance, 0);
writer.close();
} catch (Throwable e) {
e.printStackTrace();
@ -180,7 +184,7 @@ public class Config {
* @param clazz
* @return
*/
public static Map<String, Object> getFields(Class clazz) {
private Map<String, Object> getFields(Class clazz) {
HashMap<String, Object> map = new HashMap<>();
for (Field field : clazz.getFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
@ -194,7 +198,7 @@ public class Config {
return map;
}
private static String toYamlString(Object value, String spacing) {
private String toYamlString(Object value, String spacing) {
if (value instanceof List) {
Collection<?> listValue = (Collection<?>) value;
if (listValue.isEmpty()) {
@ -216,11 +220,16 @@ public class Config {
return value != null ? value.toString() : "null";
}
private static void save(PrintWriter writer, Class clazz, Object instance, int indent) {
private void save(PrintWriter writer, Class clazz, Object instance, int indent) {
try {
String CTRF = System.lineSeparator();
String spacing = StringMan.repeat(" ", indent);
HashMap<Class, Object> instances = new HashMap<>();
for (Field field : clazz.getFields()) {
if (field.getAnnotation(Ignore.class) != null) {
continue;
}
Class<?> current = field.getType();
if (field.getAnnotation(Ignore.class) != null) {
continue;
}
@ -230,59 +239,56 @@ public class Config {
writer.write(spacing + "# " + commentLine + CTRF);
}
}
if (current == ConfigBlock.class) {
current = (Class<?>) ((ParameterizedType) (field.getGenericType())).getActualTypeArguments()[0];
comment = current.getAnnotation(Comment.class);
if (comment != null) {
for (String commentLine : comment.value()) {
writer.write(spacing + "# " + commentLine + CTRF);
}
}
BlockName blockNames = current.getAnnotation(BlockName.class);
if (blockNames != null) {
writer.write(spacing + toNodeName(current.getSimpleName()) + ":" + CTRF);
ConfigBlock configBlock = (ConfigBlock) field.get(instance);
if (configBlock == null || configBlock.getInstances().isEmpty()) {
configBlock = new ConfigBlock();
field.set(instance, configBlock);
for (String blockName : blockNames.value()) {
configBlock.put(blockName, current.newInstance());
}
}
// Save each instance
for (Map.Entry<String, Object> entry : ((Map<String, Object>) configBlock.getRaw()).entrySet()) {
String key = entry.getKey();
writer.write(spacing + " " + toNodeName(key) + ":" + CTRF);
save(writer, current, entry.getValue(), indent + 4);
}
}
continue;
}
Create create = field.getAnnotation(Create.class);
if (create != null) {
Object value = field.get(instance);
if (value == null && field.getType() != ConfigBlock.class) {
setAccessible(field);
Class<?>[] classes = clazz.getDeclaredClasses();
for (Class current : classes) {
if (StringMan.isEqual(current.getSimpleName(), field.getName())) {
field.set(instance, current.newInstance());
break;
}
}
}
continue;
} else {
writer.write(spacing + toNodeName(field.getName() + ": ") + toYamlString(field.get(instance), spacing) + CTRF);
}
}
for (Class<?> current : clazz.getClasses()) {
if (current.isInterface() || current.getAnnotation(Ignore.class) != null) {
continue;
}
if (indent == 0) {
writer.write(CTRF);
}
Comment comment = current.getAnnotation(Comment.class);
comment = current.getAnnotation(Comment.class);
if (comment != null) {
for (String commentLine : comment.value()) {
writer.write(spacing + "# " + commentLine + CTRF);
}
}
writer.write(spacing + toNodeName(current.getSimpleName()) + ":" + CTRF);
BlockName blockNames = current.getAnnotation(BlockName.class);
if (blockNames != null) {
Field instanceField = clazz.getDeclaredField(toFieldName(current.getSimpleName()));
setAccessible(instanceField);
ConfigBlock value = (ConfigBlock) instanceField.get(instance);
if (value == null) {
value = new ConfigBlock();
instanceField.set(instance, value);
for (String blockName : blockNames.value()) {
value.put(blockName, current.newInstance());
}
}
// Save each instance
for (Map.Entry<String, Object> entry: ((Map<String, Object>) value.getRaw()).entrySet()) {
String key = entry.getKey();
writer.write(spacing + " " + toNodeName(key) + ":" + CTRF);
save(writer, current, entry.getValue(), indent + 4);
field.set(instance, value = current.newInstance());
instances.put(current, value);
}
save(writer, current, value, indent + 2);
continue;
} else {
save(writer, current, current.newInstance(), indent + 2);
writer.write(spacing + toNodeName(field.getName() + ": ") + toYamlString(field.get(instance), spacing) + CTRF);
}
}
} catch (Throwable e) {
@ -295,7 +301,7 @@ public class Config {
* @param split the node (split by period)
* @return
*/
private static Field getField(String[] split, Class root) {
private Field getField(String[] split, Class root) {
Object instance = getInstance(split, root);
if (instance == null) {
return null;
@ -310,7 +316,7 @@ public class Config {
* @param instance the instance
* @return
*/
private static Field getField(String[] split, Object instance) {
private Field getField(String[] split, Object instance) {
try {
Field field = instance.getClass().getField(toFieldName(split[split.length - 1]));
setAccessible(field);
@ -321,15 +327,22 @@ public class Config {
}
}
private Object getInstance(Object instance, Class clazz) throws IllegalAccessException, InstantiationException {
try {
Field instanceField = clazz.getDeclaredField(clazz.getSimpleName());
} catch (Throwable ignore) {}
return clazz.newInstance();
}
/**
* Get the instance for a specific config node
* @param split the node (split by period)
* @return The instance or null
*/
private static Object getInstance(String[] split, Class root) {
private Object getInstance(String[] split, Class root) {
try {
Class<?> clazz = root == null ? MethodHandles.lookup().lookupClass() : root;
Object instance = clazz.newInstance();
Object instance = this;
while (split.length > 0) {
switch (split.length) {
case 1:
@ -391,7 +404,7 @@ public class Config {
* @param node
* @return
*/
private static String toFieldName(String node) {
private String toFieldName(String node) {
return node.toUpperCase().replaceAll("-","_");
}
@ -400,7 +413,7 @@ public class Config {
* @param field
* @return
*/
private static String toNodeName(String field) {
private String toNodeName(String field) {
return field.toLowerCase().replace("_","-");
}
@ -410,7 +423,7 @@ public class Config {
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
private static void setAccessible(Field field) throws NoSuchFieldException, IllegalAccessException {
private void setAccessible(Field field) throws NoSuchFieldException, IllegalAccessException {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);

View File

@ -9,49 +9,70 @@ import java.util.Collection;
import java.util.List;
public class Settings extends Config {
@Ignore
public static final Settings IMP = new Settings();
@Comment("These first 6 aren't configurable") // This is a comment
@Final // Indicates that this value isn't configurable
public static final String ISSUES = "https://github.com/boy0001/FastAsyncWorldedit/issues";
public final String ISSUES = "https://github.com/boy0001/FastAsyncWorldedit/issues";
@Final
public static final String WIKI = "https://github.com/boy0001/FastAsyncWorldedit/wiki/";
public final String WIKI = "https://github.com/boy0001/FastAsyncWorldedit/wiki/";
@Final
public static String DATE = null; // These values are set from FAWE before loading
public String DATE = null; // These values are set from FAWE before loading
@Final
public static String BUILD = null; // These values are set from FAWE before loading
public String BUILD = null; // These values are set from FAWE before loading
@Final
public static String COMMIT = null; // These values are set from FAWE before loading
public String COMMIT = null; // These values are set from FAWE before loading
@Final
public static String PLATFORM = null; // These values are set from FAWE before loading
public String PLATFORM = null; // These values are set from FAWE before loading
@Comment("Allow the plugin to update")
public static boolean UPDATE = true;
public boolean UPDATE = true;
@Comment("Send anonymous usage statistics to MCStats.org")
public static boolean METRICS = true;
public boolean METRICS = true;
@Comment("FAWE will skip chunks when there's not enough memory available")
public static boolean PREVENT_CRASHES = false;
public boolean PREVENT_CRASHES = false;
@Comment({
"Set true to enable WorldEdit restrictions per region (e.g. PlotSquared or WorldGuard).",
"To be allowed to WorldEdit in a region, users need the appropriate",
"fawe.<plugin> permission. See the Permissions page for supported region plugins."
})
public static boolean REGION_RESTRICTIONS = true;
public boolean REGION_RESTRICTIONS = true;
@Comment({
"FAWE will cancel non admin edits when memory consumption exceeds this %",
" - Bypass with `/wea` or `//fast` or `fawe.bypass`",
" - Disable with 100 or -1."
})
public static int MAX_MEMORY_PERCENT = 95;
public int MAX_MEMORY_PERCENT = 95;
@Create
public CLIPBOARD CLIPBOARD = null;
@Create
public LIGHTING LIGHTING = null;
@Create
public TICK_LIMITER TICK_LIMITER = null;
@Create
public WEB WEB = null;
@Create
public EXTENT EXTENT = null;
@Create
public EXPERIMENTAL EXPERIMENTAL = null;
@Create
public QUEUE QUEUE = null;
@Create
public HISTORY HISTORY = null;
@Create
public PATHS PATHS = null;
@Comment("Paths for various directories")
public static final class PATHS {
public static String HISTORY = "history";
public static String CLIPBOARD = "clipboard";
public String HISTORY = "history";
public String CLIPBOARD = "clipboard";
}
@Create // This value will be generated automatically
public static ConfigBlock<LIMITS> LIMITS = null;
public ConfigBlock<LIMITS> LIMITS = null;
@Comment({
"The \"default\" limit group affects those without a specific limit permission.",
@ -60,7 +81,7 @@ public class Settings extends Config {
"permission node with that limit name (e.g. fawe.limit.newbie )"
})
@BlockName("default") // The name for the default block
public static final class LIMITS extends ConfigBlock {
public static class LIMITS extends ConfigBlock {
@Comment("Max actions that can be run concurrently (i.e. commands)")
public int MAX_ACTIONS = 1;
@Comment("Max number of block changes (e.g. by `//set stone`).")
@ -96,11 +117,11 @@ public class Settings extends Config {
"1 = Inventory for removing and placing (freebuild)",
"2 = Inventory for placing (survival)",
})
public static int INVENTORY_MODE = 0;
public int INVENTORY_MODE = 0;
@Comment({
"Place chunks instead of individual blocks"
})
public static boolean FAST_PLACEMENT = true;
public boolean FAST_PLACEMENT = true;
}
public static class HISTORY {
@ -111,18 +132,18 @@ public class Settings extends Config {
" - Unlimited undo",
" - Enables the rollback command"
})
public static boolean USE_DISK = true;
public boolean USE_DISK = true;
@Comment({
"Use a database to store disk storage summaries:",
" - Faster lookups and rollback from disk",
})
public static boolean USE_DATABASE = true;
public boolean USE_DATABASE = true;
@Comment({
"Record history with dispatching:",
" - Faster as it avoids duplicate block checks",
" - Worse compression since dispatch order is different"
})
public static boolean COMBINE_STAGES = true;
public boolean COMBINE_STAGES = true;
@Comment({
"Higher compression reduces the size of history at the expense of CPU",
"0 = Uncompressed byte array (fastest)",
@ -137,12 +158,12 @@ public class Settings extends Config {
"9 = 1 x high, 1 x medium, 3 x fast (best compression)",
"NOTE: If using disk, do some compression (3+) as smaller files save faster"
})
public static int COMPRESSION_LEVEL = 3;
public int COMPRESSION_LEVEL = 3;
@Comment({
"The buffer size for compression:",
" - Larger = better ratio but uses more upfront memory"
})
public static int BUFFER_SIZE = 531441;
public int BUFFER_SIZE = 531441;
@Comment({
@ -161,46 +182,48 @@ public class Settings extends Config {
" or increase chunk-wait-ms.",
"A value of 0 is faster simply because it doesn't bother loading the chunks or waiting.",
})
public static int CHUNK_WAIT_MS = 1000;
public int CHUNK_WAIT_MS = 1000;
@Comment("Delete history on disk after a number of days")
public static int DELETE_AFTER_DAYS = 7;
public int DELETE_AFTER_DAYS = 7;
@Comment("Delete history in memory on logout (does not effect disk)")
public static boolean DELETE_ON_LOGOUT = true;
public boolean DELETE_ON_LOGOUT = true;
@Comment({
"If history should be enabled by default for plugins using WorldEdit:",
" - It is faster to have disabled",
" - Use of the FAWE API will not be effected"
})
public static boolean ENABLE_FOR_CONSOLE = true;
public boolean ENABLE_FOR_CONSOLE = true;
@Comment({
"Should redo information be stored:",
" - History is about 20% larger",
" - Enables use of /redo",
})
public static boolean STORE_REDO = true;
public boolean STORE_REDO = true;
@Comment({
"Assumes all edits are smaller than 4096x256x4096:",
" - Reduces history size by ~10%",
})
public static boolean SMALL_EDITS = false;
public boolean SMALL_EDITS = false;
}
public static class QUEUE {
@Create
public static PROGRESS PROGRESS = null;
@Comment({
"If no blocks from completed edits are queued, and if the global queue has more available ",
"chunks to place from still-processing edits than the target size setting, it will begin",
"placing available blocks from edits still in the preprocessing stage."
})
public static int TARGET_SIZE = 64;
public int TARGET_SIZE = 64;
@Comment({
"This should equal the number of processors you have"
})
public static int PARALLEL_THREADS = Math.max(1, Runtime.getRuntime().availableProcessors());
public int PARALLEL_THREADS = Math.max(1, Runtime.getRuntime().availableProcessors());
@Comment({
"The time in milliseconds that the global queue can be idle before it is forced to start",
"on edits which are still in the preprocessing stage."
})
public static int MAX_WAIT_MS = 1000;
public int MAX_WAIT_MS = 1000;
@Comment({
"Increase or decrease queue intensity (0 = balance of performance / stability)",
@ -208,7 +231,7 @@ public class Settings extends Config {
"will probably cause the server to freeze, and decreasing it (negative value)",
"may reduce load on the server but should not be necessary."
})
public static int EXTRA_TIME_MS = 0;
public int EXTRA_TIME_MS = 0;
@Comment({
"Discard edits which have been idle for a certain amount of time (ms) (e.g. a plugin creates",
@ -218,9 +241,9 @@ public class Settings extends Config {
public static class PROGRESS {
@Comment("Display constant titles about the progress of a user's edit")
public static boolean DISPLAY = false;
public boolean DISPLAY = false;
@Comment("How often edit progress is displayed")
public static int INTERVAL = 1;
public int INTERVAL = 1;
}
}
@ -229,41 +252,41 @@ public class Settings extends Config {
@Comment({
"Directly modify the region files.",
})
public static boolean ANVIL_QUEUE_MODE = false;
public boolean ANVIL_QUEUE_MODE = false;
}
public static class WEB {
@Comment("I am already hosting a web interface for you here")
public static String URL = "http://empcraft.com/fawe/";
public String URL = "http://empcraft.com/fawe/";
}
public static class EXTENT {
@Comment({
"Don't bug console when these plugins slow down WorldEdit operations"
})
public static List<String> ALLOWED_PLUGINS = new ArrayList<>();
public List<String> ALLOWED_PLUGINS = new ArrayList<>();
@Comment("Disable the messages completely")
public static boolean DEBUG = true;
public boolean DEBUG = true;
}
@Comment("Generic tick limiter (not necessarily WorldEdit related, but useful to stop abuse)")
public static class TICK_LIMITER {
@Comment("Enable the limiter")
public static boolean ENABLED = true;
public boolean ENABLED = true;
@Comment("The interval in ticks")
public static int INTERVAL = 1;
public int INTERVAL = 1;
@Comment("Max falling blocks per interval (per chunk)")
public static int FALLING = 512;
public int FALLING = 512;
@Comment("Max physics per interval (per chunk)")
public static int PHYSICS = 512;
public int PHYSICS = 512;
@Comment("Max item spawns per interval (per chunk)")
public static int ITEMS = 128;
public int ITEMS = 128;
}
public static class CLIPBOARD {
@Comment("Store the clipboard on disk instead of memory")
public static boolean USE_DISK = true;
public boolean USE_DISK = true;
@Comment({
"Compress the clipboard to reduce the size:",
" - TODO: Buffered random access with compression is not implemented on disk yet",
@ -271,16 +294,16 @@ public class Settings extends Config {
" - 1 = Fast compression",
" - 2-17 = Slower compression"
})
public static int COMPRESSION_LEVEL = 1;
public int COMPRESSION_LEVEL = 1;
@Comment("Number of days to keep history on disk before deleting it")
public static int DELETE_AFTER_DAYS = 1;
public int DELETE_AFTER_DAYS = 1;
}
public static class LIGHTING {
@Comment({
"If packet sending should be delayed until relight is finished",
})
public static boolean DELAY_PACKET_SENDING = true;
public boolean DELAY_PACKET_SENDING = true;
@Comment({
"The relighting mode to use:",
" - 0 = None (Do no relighting)",
@ -290,18 +313,15 @@ public class Settings extends Config {
public static int MODE = 1;
}
public static void save(File file) {
save(file, Settings.class);
}
public static void load(File file) {
load(file, Settings.class);
public void reload(File file) {
load(file);
save(file);
if (HISTORY.USE_DISK) {
LocalSession.MAX_HISTORY_SIZE = Integer.MAX_VALUE;
}
}
public static FaweLimit getLimit(FawePlayer player) {
public FaweLimit getLimit(FawePlayer player) {
FaweLimit limit;
if (player.hasWorldEditBypass()) {
limit = FaweLimit.MAX.copy();

View File

@ -50,7 +50,7 @@ public class RollbackDatabase {
this.prefix = "";
this.worldName = Fawe.imp().getWorldName(world);
this.world = world;
this.dbLocation = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + "summary.db");
this.dbLocation = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + "summary.db");
connection = openConnection();
CREATE_TABLE = "CREATE TABLE IF NOT EXISTS `" + prefix + "edits` (`player` BLOB(16) NOT NULL,`id` INT NOT NULL,`x1` INT NOT NULL,`y1` INT NOT NULL,`z1` INT NOT NULL,`x2` INT NOT NULL,`y2` INT NOT NULL,`z2` INT NOT NULL,`time` INT NOT NULL, PRIMARY KEY (player, id))";
INSERT_EDIT = "INSERT OR REPLACE INTO `" + prefix + "edits` (`player`,`id`,`x1`,`y1`,`z1`,`x2`,`y2`,`z2`,`time`) VALUES(?,?,?,?,?,?,?,?,?)";
@ -61,7 +61,7 @@ public class RollbackDatabase {
DELETE_EDITS_USER = "DELETE FROM `" + prefix + "edits` WHERE `x2`>=? AND `x1`<=? AND `y2`>=? AND `y1`<=? AND `z2`>=? AND `z1`<=? AND `time`>? AND `player`=?";
DELETE_EDIT_USER = "DELETE FROM `" + prefix + "edits` WHERE `player`=? AND `id`=?";
init();
purge((int) TimeUnit.DAYS.toMillis(Settings.HISTORY.DELETE_AFTER_DAYS));
purge((int) TimeUnit.DAYS.toMillis(Settings.IMP.HISTORY.DELETE_AFTER_DAYS));
TaskManager.IMP.async(new Runnable() {
@Override
public void run() {

View File

@ -38,13 +38,13 @@ public abstract class MappedFaweQueue<WORLD, CHUNK, SECTION> extends FaweQueue {
public MappedFaweQueue(final String world) {
super(world);
map = Settings.PREVENT_CRASHES ? new WeakFaweQueueMap(this) : new DefaultFaweQueueMap(this);
map = Settings.IMP.PREVENT_CRASHES ? new WeakFaweQueueMap(this) : new DefaultFaweQueueMap(this);
}
public MappedFaweQueue(final String world, IFaweQueueMap map) {
super(world);
if (map == null) {
map = Settings.PREVENT_CRASHES ? new WeakFaweQueueMap(this) : new DefaultFaweQueueMap(this);
map = Settings.IMP.PREVENT_CRASHES ? new WeakFaweQueueMap(this) : new DefaultFaweQueueMap(this);
}
this.map = map;
}
@ -52,7 +52,7 @@ public abstract class MappedFaweQueue<WORLD, CHUNK, SECTION> extends FaweQueue {
public MappedFaweQueue(final World world, IFaweQueueMap map) {
super(world);
if (map == null) {
map = Settings.PREVENT_CRASHES ? new WeakFaweQueueMap(this) : new DefaultFaweQueueMap(this);
map = Settings.IMP.PREVENT_CRASHES ? new WeakFaweQueueMap(this) : new DefaultFaweQueueMap(this);
}
this.map = map;
}
@ -281,9 +281,9 @@ public abstract class MappedFaweQueue<WORLD, CHUNK, SECTION> extends FaweQueue {
boolean sync = Thread.currentThread() == Fawe.get().getMainThread();
if (sync) {
loadChunk(getWorld(), cx, cz, true);
} else if (Settings.HISTORY.CHUNK_WAIT_MS > 0) {
} else if (Settings.IMP.HISTORY.CHUNK_WAIT_MS > 0) {
loadChunk.value = new IntegerPair(cx, cz);
TaskManager.IMP.syncWhenFree(loadChunk, Settings.HISTORY.CHUNK_WAIT_MS);
TaskManager.IMP.syncWhenFree(loadChunk, Settings.IMP.HISTORY.CHUNK_WAIT_MS);
if (!isChunkLoaded(cx, cz)) {
throw new FaweException.FaweChunkLoadException();
}

View File

@ -50,7 +50,7 @@ public abstract class NMSMappedFaweQueue<WORLD, CHUNK, CHUNKSECTION, SECTION> ex
}
}
private final Relighter relighter = Settings.LIGHTING.MODE > 0 ? new NMSRelighter(this) : NullRelighter.INSTANCE;
private final Relighter relighter = Settings.IMP.LIGHTING.MODE > 0 ? new NMSRelighter(this) : NullRelighter.INSTANCE;
@Override
public Relighter getRelighter() {
@ -60,11 +60,11 @@ public abstract class NMSMappedFaweQueue<WORLD, CHUNK, CHUNKSECTION, SECTION> ex
@Override
public void end(FaweChunk chunk) {
super.end(chunk);
if (Settings.LIGHTING.MODE == 0) {
if (Settings.IMP.LIGHTING.MODE == 0 || !Settings.IMP.LIGHTING.DELAY_PACKET_SENDING) {
sendChunk(chunk);
return;
}
if (Settings.LIGHTING.MODE == 2) {
if (Settings.IMP.LIGHTING.MODE == 2) {
relighter.addChunk(chunk.getX(), chunk.getZ(), null, chunk.getBitMask());
return;
}

View File

@ -85,9 +85,9 @@ public class CorruptSchematicStreamer {
if (width.get() == 0 || height.get() == 0 || length.get() == 0) {
Fawe.debug("No dimensions found! Estimating based on factors:" + dimensions);
}
if (Settings.CLIPBOARD.USE_DISK) {
if (Settings.IMP.CLIPBOARD.USE_DISK) {
fc = new DiskOptimizedClipboard(dimensions.getBlockX(), dimensions.getBlockY(), dimensions.getBlockZ(), uuid);
} else if (Settings.CLIPBOARD.COMPRESSION_LEVEL == 0) {
} else if (Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL == 0) {
fc = new CPUOptimizedClipboard(dimensions.getBlockX(), dimensions.getBlockY(), dimensions.getBlockZ());
} else {
fc = new MemoryOptimizedClipboard(dimensions.getBlockX(), dimensions.getBlockY(), dimensions.getBlockZ());

View File

@ -167,9 +167,9 @@ public class SchematicStreamer extends NBTStreamer {
}
return fc;
}
if (Settings.CLIPBOARD.USE_DISK) {
if (Settings.IMP.CLIPBOARD.USE_DISK) {
return fc = new DiskOptimizedClipboard(size, 1, 1, uuid);
} else if (Settings.CLIPBOARD.COMPRESSION_LEVEL == 0) {
} else if (Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL == 0) {
return fc = new CPUOptimizedClipboard(size, 1, 1);
} else {
return fc = new MemoryOptimizedClipboard(size, 1, 1);

View File

@ -298,7 +298,12 @@ public class MCAFile {
raf.write((offsetMedium >> 8));
raf.write((offsetMedium >> 0));
raf.write(sizeByte);
raf.seek(i + 4096);
if (offsetMedium == 0 && sizeByte == 0) {
raf.writeInt(0);
} else {
raf.writeInt((int) (System.currentTimeMillis() / 1000L));
}
int offset = (((locations[i] & 0xFF) << 16) + ((locations[i + 1] & 0xFF) << 8) + ((locations[i+ 2] & 0xFF))) << 12;
int size = (locations[i + 3] & 0xFF) << 12;
}

View File

@ -5,6 +5,7 @@ import com.boydti.fawe.FaweCache;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.changeset.AbstractDelegateChangeSet;
import com.boydti.fawe.object.changeset.FaweChangeSet;
import java.lang.reflect.Constructor;
import org.bukkit.entity.Player;
import org.primesoft.blockshub.IBlocksHubApi;
import org.primesoft.blockshub.api.IPlayer;
@ -12,6 +13,10 @@ import org.primesoft.blockshub.api.IWorld;
public class LoggingChangeSet extends AbstractDelegateChangeSet {
public static void main(String[] args) {
}
private static boolean initialized = false;
public static FaweChangeSet wrap(FawePlayer<Player> player, FaweChangeSet parent) {
@ -29,13 +34,24 @@ public class LoggingChangeSet extends AbstractDelegateChangeSet {
private final MutableVector loc;
private final IPlayer player;
private final IWorld world;
private IWorld world;
private final MutableBlockData oldBlock;
private final MutableBlockData newBlock;
private LoggingChangeSet(FawePlayer player, FaweChangeSet parent) {
super(parent);
this.world = api.getWorld(player.getLocation().world);
String world = player.getLocation().world;
try {
Class<?> classBukkitWorld = Class.forName("org.primesoft.blockshub.platform.bukkit.BukkitWorld");
Class<?> classAsyncWorld = Class.forName("com.boydti.fawe.bukkit.wrapper.AsyncWorld");
Object asyncWorld = classAsyncWorld.getConstructor(String.class, boolean.class).newInstance(world, false);
Constructor<?> constructor = classBukkitWorld.getDeclaredConstructors()[0];
constructor.setAccessible(true);
this.world = (IWorld) constructor.newInstance(asyncWorld);
} catch (Throwable ignore) {
ignore.printStackTrace();
this.world = api.getWorld(world);
}
this.loc = new MutableVector();
this.oldBlock = new MutableBlockData();
this.newBlock = new MutableBlockData();

View File

@ -100,7 +100,7 @@ public abstract class FawePlayer<T> extends Metadatable {
public FawePlayer(final T parent) {
this.parent = parent;
Fawe.get().register(this);
if (Settings.CLIPBOARD.USE_DISK) {
if (Settings.IMP.CLIPBOARD.USE_DISK) {
loadClipboardFromDisk();
}
}
@ -205,7 +205,7 @@ public abstract class FawePlayer<T> extends Metadatable {
* - Should already be called if history on disk is enabled
*/
public void loadClipboardFromDisk() {
File file = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.CLIPBOARD + File.separator + getUUID() + ".bd");
File file = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.CLIPBOARD + File.separator + getUUID() + ".bd");
try {
if (file.exists() && file.length() > 5) {
DiskOptimizedClipboard doc = new DiskOptimizedClipboard(file);
@ -280,7 +280,7 @@ public abstract class FawePlayer<T> extends Metadatable {
* @return
*/
public FaweLimit getLimit() {
return Settings.getLimit(this);
return Settings.IMP.getLimit(this);
}
/**
@ -420,7 +420,7 @@ public abstract class FawePlayer<T> extends Metadatable {
* - Usually called on logout
*/
public void unregister() {
if (Settings.HISTORY.DELETE_ON_LOGOUT) {
if (Settings.IMP.HISTORY.DELETE_ON_LOGOUT) {
session = getSession();
WorldEdit.getInstance().removeSession(getPlayer());
session.setClipboard(null);

View File

@ -41,6 +41,7 @@ public abstract class FaweQueue {
private RunnableVal2<FaweChunk, FaweChunk> changeTask;
private RunnableVal2<ProgressType, Integer> progressTask;
private SetQueue.QueueStage stage;
private Settings settings = Settings.IMP;
public FaweQueue(String world) {
this.world = world;
@ -69,6 +70,14 @@ public abstract class FaweQueue {
ALL,
}
public Settings getSettings() {
return settings;
}
public void setSettings(Settings settings) {
this.settings = settings == null ? Settings.IMP : settings;
}
public void setWorld(String world) {
this.world = world;
this.weWorld = null;
@ -300,7 +309,7 @@ public abstract class FaweQueue {
@Deprecated
public boolean next() {
int amount = Settings.QUEUE.PARALLEL_THREADS;
int amount = Settings.IMP.QUEUE.PARALLEL_THREADS;
ExecutorCompletionService service = SetQueue.IMP.getCompleterService();
long time = 20; // 30ms
return next(amount, service, time);

View File

@ -62,7 +62,7 @@ public class InspectBrush extends BrushTool implements DoubleActionTraceTool {
player.print(BBC.getPrefix() + BBC.NO_PERM.f("worldedit.tool.inspect"));
return false;
}
if (!Settings.HISTORY.USE_DATABASE) {
if (!Settings.IMP.HISTORY.USE_DATABASE) {
player.print(BBC.getPrefix() + BBC.SETTING_DISABLE.f("history.use-database"));
return false;
}

View File

@ -1,6 +1,9 @@
package com.boydti.fawe.object.changeset;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.FaweQueue;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.extent.inventory.BlockBag;
@ -10,7 +13,6 @@ import com.sk89q.worldedit.history.change.EntityCreate;
import com.sk89q.worldedit.history.change.EntityRemove;
import com.sk89q.worldedit.world.World;
import java.util.Iterator;
import java.util.UUID;
public class AbstractDelegateChangeSet extends FaweChangeSet {
public final FaweChangeSet parent;
@ -24,8 +26,14 @@ public class AbstractDelegateChangeSet extends FaweChangeSet {
return parent;
}
public static FaweChangeSet getDefaultChangeSet(World world, UUID uuid) {
return FaweChangeSet.getDefaultChangeSet(world, uuid);
@Override
public String getWorldName() {
return parent.getWorldName();
}
@Override
public World getWorld() {
return parent.getWorld();
}
@Override
@ -93,6 +101,11 @@ public class AbstractDelegateChangeSet extends FaweChangeSet {
parent.delete();
}
@Override
public EditSession toEditSession(FawePlayer player) {
return parent.toEditSession(player);
}
@Override
public void add(EntityCreate change) {
parent.add(change);
@ -123,8 +136,18 @@ public class AbstractDelegateChangeSet extends FaweChangeSet {
parent.add(x, y, z, from, to);
}
@Override
public boolean isEmpty() {
return parent.isEmpty();
}
@Override
public void add(int x, int y, int z, int combinedFrom, BaseBlock to) {
parent.add(x, y, z, combinedFrom, to);
}
@Override
public void addChangeTask(FaweQueue queue) {
parent.addChangeTask(queue);
}
}

View File

@ -71,7 +71,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
}
private void init(UUID uuid, String worldName) {
File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY + File.separator + worldName + File.separator + uuid);
File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + worldName + File.separator + uuid);
int max = 0;
if (folder.exists()) {
for (File file : folder.listFiles()) {
@ -122,14 +122,14 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
private void init(UUID uuid, int i) {
this.uuid = uuid;
this.index = i;
File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(getWorld()) + File.separator + uuid);
File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(getWorld()) + File.separator + uuid);
initFiles(folder);
}
public void delete() {
Fawe.debug("Deleting history: " + Fawe.imp().getWorldName(getWorld()) + "/" + uuid + "/" + index);
deleteFiles();
if (Settings.HISTORY.USE_DATABASE) {
if (Settings.IMP.HISTORY.USE_DATABASE) {
RollbackDatabase db = DBHandler.IMP.getDatabase(getWorld());
db.delete(uuid, index);
}
@ -348,7 +348,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
}
byte[] buffer = new byte[9];
int i = 0;
int amount = (Settings.HISTORY.BUFFER_SIZE - HEADER_SIZE) / 9;
int amount = (Settings.IMP.HISTORY.BUFFER_SIZE - HEADER_SIZE) / 9;
while (!shallow && ++i < amount) {
if (gis.read(buffer) == -1) {
fis.close();

View File

@ -35,13 +35,13 @@ public abstract class FaweChangeSet implements ChangeSet {
private final String worldName;
private final boolean mainThread;
private final int layers;
private AtomicInteger waitingCombined = new AtomicInteger(0);
private AtomicInteger waitingAsync = new AtomicInteger(0);
private Object lockCombined = new Object();
private Object lockAsync = new Object();
protected final AtomicInteger waitingCombined = new AtomicInteger(0);
private final AtomicInteger waitingAsync = new AtomicInteger(0);
// private Object lockCombined = new Object();
// private Object lockAsync = new Object();
public static FaweChangeSet getDefaultChangeSet(World world, UUID uuid) {
if (Settings.HISTORY.USE_DISK) {
if (Settings.IMP.HISTORY.USE_DISK) {
return new DiskStorageHistory(world, uuid);
} else {
return new MemoryOptimizedHistory(world);
@ -76,8 +76,8 @@ public abstract class FaweChangeSet implements ChangeSet {
@Override
public void run() {
waitingAsync.decrementAndGet();
synchronized (lockAsync) {
lockAsync.notifyAll();
synchronized (waitingAsync) {
waitingAsync.notifyAll();
}
flush();
}
@ -89,14 +89,14 @@ public abstract class FaweChangeSet implements ChangeSet {
try {
if (!Fawe.isMainThread()) {
while (waitingAsync.get() > 0) {
synchronized (lockAsync) {
lockAsync.wait(1000);
synchronized (waitingAsync) {
waitingAsync.wait(1000);
}
}
}
while (waitingCombined.get() > 0) {
synchronized (lockCombined) {
lockCombined.wait(1000);
synchronized (waitingCombined) {
waitingCombined.wait(1000);
}
}
} catch (InterruptedException e) {
@ -263,7 +263,7 @@ public abstract class FaweChangeSet implements ChangeSet {
default:
char combinedIdPrevious = previousLayer != null ? previousLayer[index] : 0;
if (combinedIdCurrent != combinedIdPrevious) {
synchronized (lockCombined) {
synchronized (this) {
add(xx, yy, zz, combinedIdPrevious, combinedIdCurrent);
}
}
@ -277,14 +277,14 @@ public abstract class FaweChangeSet implements ChangeSet {
// Tiles created
Map<Short, CompoundTag> tiles = next.getTiles();
for (Map.Entry<Short, CompoundTag> entry : tiles.entrySet()) {
synchronized (lockCombined) {
synchronized (this) {
addTileCreate(entry.getValue());
}
}
// Tiles removed
tiles = previous.getTiles();
for (Map.Entry<Short, CompoundTag> entry : tiles.entrySet()) {
synchronized (lockCombined) {
synchronized (this) {
addTileRemove(entry.getValue());
}
}
@ -294,14 +294,14 @@ public abstract class FaweChangeSet implements ChangeSet {
// Entities created
Set<CompoundTag> entities = next.getEntities();
for (CompoundTag entityTag : entities) {
synchronized (lockCombined) {
synchronized (this) {
addEntityCreate(entityTag);
}
}
// Entities removed
entities = previous.getEntities();
for (CompoundTag entityTag : entities) {
synchronized (lockCombined) {
synchronized (this) {
addEntityRemove(entityTag);
}
}

View File

@ -32,11 +32,11 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
private FaweStreamPositionDelegate posDel;
public FaweStreamChangeSet(World world) {
this(world, Settings.HISTORY.COMPRESSION_LEVEL, Settings.HISTORY.STORE_REDO, Settings.HISTORY.SMALL_EDITS);
this(world, Settings.IMP.HISTORY.COMPRESSION_LEVEL, Settings.IMP.HISTORY.STORE_REDO, Settings.IMP.HISTORY.SMALL_EDITS);
}
public FaweStreamChangeSet(String world) {
this(world, Settings.HISTORY.COMPRESSION_LEVEL, Settings.HISTORY.STORE_REDO, Settings.HISTORY.SMALL_EDITS);
this(world, Settings.IMP.HISTORY.COMPRESSION_LEVEL, Settings.IMP.HISTORY.STORE_REDO, Settings.IMP.HISTORY.SMALL_EDITS);
}
public FaweStreamChangeSet(String world, int compression, boolean storeRedo, boolean smallLoc) {
@ -376,8 +376,10 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
idDel.readCombined(is, change, dir);
return change;
} catch (EOFException ignoreOEF) {
ignoreOEF.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
MainUtil.handleError(e);
}
return null;

View File

@ -118,7 +118,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
}
synchronized (this) {
setOrigin(x, z);
idsStream = new FastByteArrayOutputStream(Settings.HISTORY.BUFFER_SIZE);
idsStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE);
idsStreamZip = getCompressedOS(idsStream);
writeHeader(idsStreamZip, x, y, z);
return idsStreamZip;
@ -140,7 +140,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
if (entCStreamZip != null) {
return entCStreamZip;
}
entCStream = new FastByteArrayOutputStream(Settings.HISTORY.BUFFER_SIZE);
entCStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE);
return entCStreamZip = new NBTOutputStream(getCompressedOS(entCStream));
}
@ -149,7 +149,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
if (entRStreamZip != null) {
return entRStreamZip;
}
entRStream = new FastByteArrayOutputStream(Settings.HISTORY.BUFFER_SIZE);
entRStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE);
return entRStreamZip = new NBTOutputStream(getCompressedOS(entRStream));
}
@ -158,7 +158,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
if (tileCStreamZip != null) {
return tileCStreamZip;
}
tileCStream = new FastByteArrayOutputStream(Settings.HISTORY.BUFFER_SIZE);
tileCStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE);
return tileCStreamZip = new NBTOutputStream(getCompressedOS(tileCStream));
}
@ -167,7 +167,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
if (tileRStreamZip != null) {
return tileRStreamZip;
}
tileRStream = new FastByteArrayOutputStream(Settings.HISTORY.BUFFER_SIZE);
tileRStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE);
return tileRStreamZip = new NBTOutputStream(getCompressedOS(tileRStream));
}

View File

@ -58,7 +58,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
private int last;
public DiskOptimizedClipboard(int width, int height, int length, UUID uuid) {
this(width, height, length, MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.CLIPBOARD + File.separator + uuid + ".bd"));
this(width, height, length, MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.CLIPBOARD + File.separator + uuid + ".bd"));
}
public DiskOptimizedClipboard(File file) {
@ -183,7 +183,7 @@ public class DiskOptimizedClipboard extends FaweClipboard implements Closeable {
}
public DiskOptimizedClipboard(int width, int height, int length) {
this(width, height, length, MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.CLIPBOARD + File.separator + UUID.randomUUID() + ".bd"));
this(width, height, length, MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.CLIPBOARD + File.separator + UUID.randomUUID() + ".bd"));
}
public void close() {

View File

@ -59,7 +59,7 @@ public class MemoryOptimizedClipboard extends FaweClipboard {
private int compressionLevel;
public MemoryOptimizedClipboard(int width, int height, int length) {
this(width, height, length, Settings.CLIPBOARD.COMPRESSION_LEVEL);
this(width, height, length, Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL);
}
public MemoryOptimizedClipboard(int width, int height, int length, int compressionLevel) {

View File

@ -64,7 +64,7 @@ public class DefaultProgressTracker extends RunnableVal2<FaweQueue.ProgressType,
private final void send() {
// Avoid duplicates
long currentTick = System.currentTimeMillis() / 50;
if (currentTick > lastTick + Settings.QUEUE.PROGRESS.INTERVAL) {
if (currentTick > lastTick + Settings.IMP.QUEUE.PROGRESS.INTERVAL) {
lastTick = currentTick;
TaskManager.IMP.task(new Runnable() { // Run on main thread
@Override

View File

@ -135,7 +135,7 @@ public class FaweFormat implements ClipboardReader, ClipboardWriter {
} else {
ox = in.readInt();
oz = in.readInt();
FaweOutputStream tmp = new FaweOutputStream(new FastByteArrayOutputStream(Settings.HISTORY.BUFFER_SIZE));
FaweOutputStream tmp = new FaweOutputStream(new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE));
int width = 0;
int height = 0;
int length = 0;

View File

@ -28,7 +28,7 @@ public class PlotSquaredFeature extends FaweMaskManager {
setupBlockQueue();
setupSchematicHandler();
setupChunkManager();
if (Settings.PLATFORM.equals("Bukkit")) {
if (Settings.PLATFORM.equalsIgnoreCase("bukkit")) {
new FaweTrim();
}
if (MainCommand.getInstance().getCommand("generatebiome") == null) {

View File

@ -114,7 +114,7 @@ public class EditSessionBuilder {
public EditSessionBuilder changeSet(boolean disk, @Nullable UUID uuid, int compression) {
if (world == null) {
if (disk) {
if (Settings.HISTORY.USE_DATABASE) {
if (Settings.IMP.HISTORY.USE_DATABASE) {
this.changeSet = new RollbackOptimizedHistory(worldName, uuid);
} else {
this.changeSet = new DiskStorageHistory(worldName, uuid);
@ -123,7 +123,7 @@ public class EditSessionBuilder {
this.changeSet = new MemoryOptimizedHistory(worldName);
}
} else if (disk) {
if (Settings.HISTORY.USE_DATABASE) {
if (Settings.IMP.HISTORY.USE_DATABASE) {
this.changeSet = new RollbackOptimizedHistory(world, uuid);
} else {
this.changeSet = new DiskStorageHistory(world, uuid);

View File

@ -192,7 +192,7 @@ public class MainUtil {
}
public static FaweOutputStream getCompressedOS(OutputStream os) throws IOException {
return getCompressedOS(os, Settings.HISTORY.COMPRESSION_LEVEL);
return getCompressedOS(os, Settings.IMP.HISTORY.COMPRESSION_LEVEL);
}
public static long getSize(ChangeSet changeSet) {
@ -209,7 +209,7 @@ public class MainUtil {
}
public static FaweOutputStream getCompressedOS(OutputStream os, int amount) throws IOException {
return getCompressedOS(os, amount, Settings.HISTORY.BUFFER_SIZE);
return getCompressedOS(os, amount, Settings.IMP.HISTORY.BUFFER_SIZE);
}
private static final LZ4Factory FACTORY = LZ4Factory.fastestInstance();
@ -273,7 +273,7 @@ public class MainUtil {
}
public static FaweInputStream getCompressedIS(InputStream is) throws IOException {
return getCompressedIS(is, Settings.HISTORY.BUFFER_SIZE);
return getCompressedIS(is, Settings.IMP.HISTORY.BUFFER_SIZE);
}
public static FaweInputStream getCompressedIS(InputStream is, int buffer) throws IOException {
@ -306,15 +306,15 @@ public class MainUtil {
final String website;
if (uuid == null) {
uuid = UUID.randomUUID();
website = Settings.WEB.URL + "upload.php?" + uuid;
website = Settings.IMP.WEB.URL + "upload.php?" + uuid;
filename = "plot." + extension;
} else {
website = Settings.WEB.URL + "save.php?" + uuid;
website = Settings.IMP.WEB.URL + "save.php?" + uuid;
filename = file + '.' + extension;
}
final URL url;
try {
url = new URL(Settings.WEB.URL + "?key=" + uuid + "&type=" + extension);
url = new URL(Settings.IMP.WEB.URL + "?key=" + uuid + "&type=" + extension);
String boundary = Long.toHexString(System.currentTimeMillis());
URLConnection con = new URL(website).openConnection();
con.setDoOutput(true);

View File

@ -35,7 +35,7 @@ public class MemUtil {
}
final long heapFreeSize = Runtime.getRuntime().freeMemory();
final int size = (int) ((heapFreeSize * 100) / heapMaxSize);
if (size > (100 - Settings.MAX_MEMORY_PERCENT)) {
if (size > (100 - Settings.IMP.MAX_MEMORY_PERCENT)) {
memoryPlentifulTask();
return Integer.MAX_VALUE;
}

View File

@ -73,7 +73,7 @@ public class SetQueue {
@Override
public void run() {
try {
targetTPS = 18 - Math.max(Settings.QUEUE.EXTRA_TIME_MS * 0.05, 0);
targetTPS = 18 - Math.max(Settings.IMP.QUEUE.EXTRA_TIME_MS * 0.05, 0);
do {
Runnable task = tasks.poll();
if (task != null) {
@ -90,7 +90,7 @@ public class SetQueue {
if (!MemUtil.isMemoryFree()) {
final int mem = MemUtil.calculateMemory();
if (mem != Integer.MAX_VALUE) {
if ((mem <= 1) && Settings.PREVENT_CRASHES) {
if ((mem <= 1) && Settings.IMP.PREVENT_CRASHES) {
for (FaweQueue queue : getAllQueues()) {
queue.saveMemory();
}
@ -111,17 +111,17 @@ public class SetQueue {
if (Thread.currentThread() != Fawe.get().getMainThread()) {
throw new IllegalStateException("This shouldn't be possible for placement to occur off the main thread");
}
long time = Settings.QUEUE.EXTRA_TIME_MS + 50 + Math.min((50 + SetQueue.this.last) - (SetQueue.this.last = System.currentTimeMillis()), SetQueue.this.secondLast - System.currentTimeMillis());
long time = Settings.IMP.QUEUE.EXTRA_TIME_MS + 50 + Math.min((50 + SetQueue.this.last) - (SetQueue.this.last = System.currentTimeMillis()), SetQueue.this.secondLast - System.currentTimeMillis());
// Disable the async catcher as it can't discern async vs parallel
boolean parallel = Settings.QUEUE.PARALLEL_THREADS > 1;
boolean parallel = Settings.IMP.QUEUE.PARALLEL_THREADS > 1;
queue.startSet(parallel);
try {
if (!queue.next(Settings.QUEUE.PARALLEL_THREADS, getCompleterService(), time) && queue.getStage() == QueueStage.ACTIVE) {
if (!queue.next(Settings.IMP.QUEUE.PARALLEL_THREADS, getCompleterService(), time) && queue.getStage() == QueueStage.ACTIVE) {
queue.setStage(QueueStage.NONE);
queue.runTasks();
}
} catch (Throwable e) {
pool.awaitQuiescence(Settings.QUEUE.DISCARD_AFTER_MS, TimeUnit.MILLISECONDS);
pool.awaitQuiescence(Settings.IMP.QUEUE.DISCARD_AFTER_MS, TimeUnit.MILLISECONDS);
completer = new ExecutorCompletionService(pool);
e.printStackTrace();
}
@ -214,11 +214,11 @@ public class SetQueue {
}
public void flush(FaweQueue queue) {
queue.startSet(Settings.QUEUE.PARALLEL_THREADS > 1);
queue.startSet(Settings.IMP.QUEUE.PARALLEL_THREADS > 1);
try {
queue.next(Settings.QUEUE.PARALLEL_THREADS, getCompleterService(), Long.MAX_VALUE);
queue.next(Settings.IMP.QUEUE.PARALLEL_THREADS, getCompleterService(), Long.MAX_VALUE);
} catch (Throwable e) {
pool.awaitQuiescence(Settings.QUEUE.DISCARD_AFTER_MS, TimeUnit.MILLISECONDS);
pool.awaitQuiescence(Settings.IMP.QUEUE.DISCARD_AFTER_MS, TimeUnit.MILLISECONDS);
completer = new ExecutorCompletionService(pool);
MainUtil.handleError(e);
} finally {
@ -251,7 +251,7 @@ public class SetQueue {
long age = now - queue.getModified();
total += queue.size();
if (queue.size() == 0) {
if (age > Settings.QUEUE.DISCARD_AFTER_MS) {
if (age > Settings.IMP.QUEUE.DISCARD_AFTER_MS) {
queue.setStage(QueueStage.NONE);
queue.runTasks();
iter.remove();
@ -261,11 +261,11 @@ public class SetQueue {
if (firstNonEmpty == null) {
firstNonEmpty = queue;
}
if (total > Settings.QUEUE.TARGET_SIZE) {
if (total > Settings.IMP.QUEUE.TARGET_SIZE) {
firstNonEmpty.setModified(now);
return firstNonEmpty;
}
if (age > Settings.QUEUE.MAX_WAIT_MS) {
if (age > Settings.IMP.QUEUE.MAX_WAIT_MS) {
queue.setModified(now);
return queue;
}
@ -293,20 +293,20 @@ public class SetQueue {
}
if (inactiveQueues.size() > 0) {
ArrayList<FaweQueue> tmp = new ArrayList<>(inactiveQueues);
if (Settings.QUEUE.MAX_WAIT_MS != -1) {
if (Settings.IMP.QUEUE.MAX_WAIT_MS != -1) {
long now = System.currentTimeMillis();
if (lastSuccess == 0) {
lastSuccess = now;
}
long diff = now - lastSuccess;
if (diff > Settings.QUEUE.MAX_WAIT_MS) {
if (diff > Settings.IMP.QUEUE.MAX_WAIT_MS) {
for (FaweQueue queue : tmp) {
boolean result = queue.next();
if (result) {
return result;
}
}
if (diff > Settings.QUEUE.DISCARD_AFTER_MS) {
if (diff > Settings.IMP.QUEUE.DISCARD_AFTER_MS) {
// These edits never finished
for (FaweQueue queue : tmp) {
queue.setStage(QueueStage.NONE);
@ -317,12 +317,12 @@ public class SetQueue {
return false;
}
}
if (Settings.QUEUE.TARGET_SIZE != -1) {
if (Settings.IMP.QUEUE.TARGET_SIZE != -1) {
int total = 0;
for (FaweQueue queue : tmp) {
total += queue.size();
}
if (total > Settings.QUEUE.TARGET_SIZE) {
if (total > Settings.IMP.QUEUE.TARGET_SIZE) {
for (FaweQueue queue : tmp) {
boolean result = queue.next();
if (result) {

View File

@ -92,7 +92,7 @@ public abstract class TaskManager {
return;
}
if (numThreads == null) {
numThreads = Settings.QUEUE.PARALLEL_THREADS;
numThreads = Settings.IMP.QUEUE.PARALLEL_THREADS;
}
if (numThreads <= 1) {
for (Runnable run : runnables) {
@ -274,7 +274,7 @@ public abstract class TaskManager {
synchronized (running) {
while (running.get()) {
running.wait(timout);
if (running.get() && System.currentTimeMillis() - start > Settings.QUEUE.DISCARD_AFTER_MS) {
if (running.get() && System.currentTimeMillis() - start > Settings.IMP.QUEUE.DISCARD_AFTER_MS) {
new RuntimeException("FAWE is taking a long time to execute a task (might just be a symptom): ").printStackTrace();
Fawe.debug("For full debug information use: /fawe threads");
}

View File

@ -72,7 +72,7 @@ public class WEManager {
* @return
*/
public RegionWrapper[] getMask(final FawePlayer<?> player, FaweMaskManager.MaskType type) {
if (player.hasPermission("fawe.bypass") || !Settings.REGION_RESTRICTIONS) {
if (player.hasPermission("fawe.bypass") || !Settings.IMP.REGION_RESTRICTIONS) {
return new RegionWrapper[] {new RegionWrapper(Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE)};
}
HashSet<RegionWrapper> mask = new HashSet<>();

View File

@ -218,14 +218,14 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
}
this.player = player;
if (changeSet == null) {
if (Settings.HISTORY.USE_DISK) {
if (Settings.IMP.HISTORY.USE_DISK) {
UUID uuid = player == null ? CONSOLE : player.getUUID();
if (Settings.HISTORY.USE_DATABASE) {
if (Settings.IMP.HISTORY.USE_DATABASE) {
changeSet = new RollbackOptimizedHistory(world, uuid);
} else {
changeSet = new DiskStorageHistory(world, uuid);
}
} else if (Settings.HISTORY.COMBINE_STAGES && Settings.HISTORY.COMPRESSION_LEVEL == 0 && !(queue instanceof MCAQueue)) {
} else if (Settings.IMP.HISTORY.COMBINE_STAGES && Settings.IMP.HISTORY.COMPRESSION_LEVEL == 0 && !(queue instanceof MCAQueue)) {
changeSet = new CPUOptimizedChangeSet(world);
} else {
changeSet = new MemoryOptimizedHistory(world);
@ -248,7 +248,7 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
}
if (fastmode == null) {
if (player == null) {
fastmode = Settings.HISTORY.ENABLE_FOR_CONSOLE;
fastmode = Settings.IMP.HISTORY.ENABLE_FOR_CONSOLE;
} else {
fastmode = player.getSession().hasFastMode();
}
@ -257,7 +257,7 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
checkMemory = player != null && !fastmode;
}
if (combineStages == null) {
combineStages = Settings.HISTORY.COMBINE_STAGES && !(queue instanceof MCAQueue);
combineStages = Settings.IMP.HISTORY.COMBINE_STAGES && !(queue instanceof MCAQueue);
}
if (checkMemory) {
if (MemUtil.isMemoryLimitedSlow()) {
@ -277,12 +277,12 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
queue = SetQueue.IMP.getNewQueue(this, fastmode || limit.FAST_PLACEMENT, autoQueue);
}
}
if (Settings.EXPERIMENTAL.ANVIL_QUEUE_MODE && !(queue instanceof MCAQueue)) {
if (Settings.IMP.EXPERIMENTAL.ANVIL_QUEUE_MODE && !(queue instanceof MCAQueue)) {
queue = new MCAQueue(queue);
}
this.queue = queue;
this.queue.addEditSession(this);
if (Settings.QUEUE.PROGRESS.DISPLAY && player != null) {
if (Settings.IMP.QUEUE.PROGRESS.DISPLAY && player != null) {
this.queue.setProgressTask(new DefaultProgressTracker(player));
}
this.bypassAll = wrapExtent(new FastWorldEditExtent(world, queue), bus, event, Stage.BEFORE_CHANGE);
@ -482,13 +482,13 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
}
if (toReturn != extent) {
String className = toReturn.getClass().getName().toLowerCase();
for (String allowed : Settings.EXTENT.ALLOWED_PLUGINS) {
for (String allowed : Settings.IMP.EXTENT.ALLOWED_PLUGINS) {
if (className.contains(allowed.toLowerCase())) {
this.wrapped = true;
return (AbstractDelegateExtent) toReturn;
}
}
if (Settings.EXTENT.DEBUG) {
if (Settings.IMP.EXTENT.DEBUG) {
Fawe.debug("&cPotentially unsafe extent blocked: " + toReturn.getClass().getName());
Fawe.debug("&8 - &7For area restrictions, it is recommended to use the FaweAPI");
Fawe.debug("&8 - &7For block logging, it is recommended to use use BlocksHub");
@ -1316,7 +1316,7 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting
queue.flush();
}
if (getChangeSet() != null) {
if (Settings.HISTORY.COMBINE_STAGES) {
if (Settings.IMP.HISTORY.COMBINE_STAGES) {
((FaweChangeSet) getChangeSet()).flushAsync();
} else {
((FaweChangeSet) getChangeSet()).flush();

View File

@ -198,7 +198,7 @@ public class LocalSession {
if (world == null || uuid == null) {
return false;
}
if (Settings.HISTORY.USE_DISK) {
if (Settings.IMP.HISTORY.USE_DISK) {
MAX_HISTORY_SIZE = Integer.MAX_VALUE;
}
if (!world.equals(currentWorld)) {
@ -219,7 +219,7 @@ public class LocalSession {
private boolean loadHistoryChangeSets(UUID uuid, World world) {
final List<Integer> editIds = new ArrayList<>();
final File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + uuid);
final File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + uuid);
if (folder.isDirectory()) {
final FileNameExtensionFilter filter = new FileNameExtensionFilter("BlockData files","bd");
folder.listFiles(new FileFilter() {
@ -249,7 +249,7 @@ public class LocalSession {
@Deprecated
private void deleteOldFiles(UUID uuid, World world, long maxBytes) throws IOException {
final File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + uuid);
final File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + uuid);
final ArrayList<Integer> ids = new ArrayList<Integer>();
final HashMap<Integer, ArrayDeque<Path>> paths = new HashMap<>();
@ -298,10 +298,10 @@ public class LocalSession {
}
private void loadHistoryNegativeIndex(UUID uuid, World world) {
if (!Settings.HISTORY.USE_DISK) {
if (!Settings.IMP.HISTORY.USE_DISK) {
return;
}
File file = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + uuid + File.separator + "index");
File file = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + uuid + File.separator + "index");
if (file.exists()) {
try {
FaweInputStream is = new FaweInputStream(new FileInputStream(file));
@ -316,10 +316,10 @@ public class LocalSession {
}
private void saveHistoryNegativeIndex(UUID uuid, World world) {
if (world == null || !Settings.HISTORY.USE_DISK) {
if (world == null || !Settings.IMP.HISTORY.USE_DISK) {
return;
}
File file = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + uuid + File.separator + "index");
File file = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + Fawe.imp().getWorldName(world) + File.separator + uuid + File.separator + "index");
if (getHistoryNegativeIndex() != 0) {
try {
if (!file.exists()) {
@ -487,7 +487,7 @@ public class LocalSession {
} else {
history.add(0, changeSet);
}
while (((!Settings.HISTORY.USE_DISK && history.size() > MAX_HISTORY_SIZE) || (historySize >> 20) > limitMb) && history.size() > 1) {
while (((!Settings.IMP.HISTORY.USE_DISK && history.size() > MAX_HISTORY_SIZE) || (historySize >> 20) > limitMb) && history.size() > 1) {
FaweChangeSet item = (FaweChangeSet) history.remove(0);
item.delete();
long size = MainUtil.getSize(item);
@ -517,7 +517,7 @@ public class LocalSession {
checkNotNull(player);
loadSessionHistoryFromDisk(player.getUniqueId(), player.getWorld());
if (getHistoryNegativeIndex() < history.size()) {
FaweChangeSet changeSet = (FaweChangeSet) history.get(getHistoryIndex());
FaweChangeSet changeSet = getChangeSet(history.get(getHistoryIndex()));
final FawePlayer fp = FawePlayer.wrap(player);
EditSession newEditSession = new EditSessionBuilder(changeSet.getWorld())
.allowedRegionsEverywhere()
@ -566,7 +566,7 @@ public class LocalSession {
if (getHistoryNegativeIndex() > 0) {
setDirty();
historyNegativeIndex--;
FaweChangeSet changeSet = (FaweChangeSet) history.get(getHistoryIndex());
FaweChangeSet changeSet = getChangeSet(history.get(getHistoryIndex()));
final FawePlayer fp = FawePlayer.wrap(player);
EditSession newEditSession = new EditSessionBuilder(changeSet.getWorld())
.allowedRegionsEverywhere()

View File

@ -294,7 +294,7 @@ public class BrushCommands {
worldEdit.checkMaxBrushRadius(radius);
FawePlayer fp = FawePlayer.wrap(player);
FaweLimit limit = Settings.getLimit(fp);
FaweLimit limit = Settings.IMP.getLimit(fp);
iterations = Math.min(limit.MAX_ITERATIONS, iterations);
BrushTool tool = session.getBrushTool(player.getItemInHand());
tool.setSize(radius);

View File

@ -81,7 +81,7 @@ public class HistoryCommands {
)
@CommandPermissions("worldedit.history.rollback")
public void faweRollback(final Player player, LocalSession session, final String user, @Optional("0") int radius, @Optional("0") String time) throws WorldEditException {
if (!Settings.HISTORY.USE_DATABASE) {
if (!Settings.IMP.HISTORY.USE_DATABASE) {
BBC.SETTING_DISABLE.send(player, "history.use-database");
return;
}
@ -92,7 +92,7 @@ public class HistoryCommands {
BBC.NO_PERM.send(player, "fawe.rollback.import");
return;
}
File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.PATHS.HISTORY);
File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY);
if (!folder.exists()) {
return;
}

View File

@ -105,7 +105,7 @@ public class SchematicCommands {
return;
}
UUID uuid = UUID.fromString(filename.substring(4));
URL base = new URL(Settings.WEB.URL);
URL base = new URL(Settings.IMP.WEB.URL);
URL url = new URL(base, "uploads/" + uuid + ".schematic");
ReadableByteChannel rbc = Channels.newChannel(url.openStream());
in = Channels.newInputStream(rbc);

View File

@ -67,7 +67,7 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent {
checkNotNull(region);
this.region = region.clone();
this.size = getDimensions();
this.IMP = Settings.CLIPBOARD.USE_DISK ? new DiskOptimizedClipboard(size.getBlockX(), size.getBlockY(), size.getBlockZ()) : new MemoryOptimizedClipboard(size.getBlockX(), size.getBlockY(), size.getBlockZ());
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.mx = origin.getBlockX();
this.my = origin.getBlockY();
@ -85,7 +85,7 @@ public class BlockArrayClipboard implements Clipboard, LightingExtent {
checkNotNull(region);
this.region = region.clone();
this.size = getDimensions();
this.IMP = Settings.CLIPBOARD.USE_DISK ? new DiskOptimizedClipboard(size.getBlockX(), size.getBlockY(), size.getBlockZ(), clipboardId) : new MemoryOptimizedClipboard(size.getBlockX(), size.getBlockY(), size.getBlockZ());
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.mx = origin.getBlockX();
this.my = origin.getBlockY();

View File

@ -357,7 +357,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion {
@Override
public Iterator<BlockVector> iterator() {
if (Settings.HISTORY.COMPRESSION_LEVEL >= 9) {
if (Settings.IMP.HISTORY.COMPRESSION_LEVEL >= 9) {
return iterator_old();
}
final MutableBlockVector mutable = new MutableBlockVector(0,0,0);

View File

@ -21,12 +21,12 @@ public class ForgePlayer extends FawePlayer<EntityPlayerMP> {
@Override
public void sendTitle(String head, String sub) { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override
public void resetTitle() { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override

View File

@ -21,12 +21,12 @@ public class ForgePlayer extends FawePlayer<EntityPlayerMP> {
@Override
public void sendTitle(String head, String sub) { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override
public void resetTitle() { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override

View File

@ -21,12 +21,12 @@ public class ForgePlayer extends FawePlayer<EntityPlayerMP> {
@Override
public void sendTitle(String head, String sub) { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override
public void resetTitle() { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override

View File

@ -22,12 +22,12 @@ public class ForgePlayer extends FawePlayer<EntityPlayerMP> {
@Override
public void sendTitle(String head, String sub) { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override
public void resetTitle() { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override

View File

@ -22,12 +22,12 @@ public class ForgePlayer extends FawePlayer<EntityPlayerMP> {
@Override
public void sendTitle(String head, String sub) { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override
public void resetTitle() { // Not supported
Settings.QUEUE.PROGRESS.DISPLAY = false;
Settings.IMP.QUEUE.PROGRESS.DISPLAY = false;
}
@Override

View File

@ -76,7 +76,7 @@ public class NukkitWorldEdit extends PluginBase {
try {
Fawe.set(new FaweNukkit(this));
Fawe.setupInjector();
Settings.HISTORY.COMBINE_STAGES = false;
Settings.IMP.HISTORY.COMBINE_STAGES = false;
logger = Logger.getLogger(NukkitWorldEdit.class.getCanonicalName());
createDefaultConfiguration("config-basic.yml");
config = new NukkitConfiguration(new YAMLProcessor(new File(getDataFolder(), "config-basic.yml"), true), this);

View File

@ -28,9 +28,9 @@ public class FaweNukkit implements IFawe, Listener {
private final NukkitWorldEdit plugin;
public FaweNukkit(NukkitWorldEdit mod) {
Settings.HISTORY.USE_DISK = true;
Settings.CLIPBOARD.USE_DISK = true;
Settings.HISTORY.COMPRESSION_LEVEL = 9;
Settings.IMP.HISTORY.USE_DISK = true;
Settings.IMP.CLIPBOARD.USE_DISK = true;
Settings.IMP.HISTORY.COMPRESSION_LEVEL = 9;
this.plugin = mod;
FaweChunk.HEIGHT = 128;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
@ -97,13 +97,13 @@ public class FaweNukkit implements IFawe, Listener {
@Override
public FaweQueue getNewQueue(World world, boolean fast) {
Settings.HISTORY.COMBINE_STAGES = false;
Settings.IMP.HISTORY.COMBINE_STAGES = false;
return new NukkitQueue(this, world);
}
@Override
public FaweQueue getNewQueue(String world, boolean fast) {
Settings.HISTORY.COMBINE_STAGES = false;
Settings.IMP.HISTORY.COMBINE_STAGES = false;
return new NukkitQueue(this, world);
}

View File

@ -50,9 +50,9 @@ public class NukkitQueue extends NMSMappedFaweQueue<Level, BaseFullChunk, BaseFu
private void init(FaweNukkit fn) {
this.faweNukkit = fn;
this.world = faweNukkit.getPlugin().getServer().getLevelByName(getWorldName());
if (Settings.QUEUE.EXTRA_TIME_MS != Integer.MIN_VALUE) {
ALLOCATE = Settings.QUEUE.EXTRA_TIME_MS;
Settings.QUEUE.EXTRA_TIME_MS = Integer.MIN_VALUE;
if (Settings.IMP.QUEUE.EXTRA_TIME_MS != Integer.MIN_VALUE) {
ALLOCATE = Settings.IMP.QUEUE.EXTRA_TIME_MS;
Settings.IMP.QUEUE.EXTRA_TIME_MS = Integer.MIN_VALUE;
}
}

View File

@ -49,7 +49,7 @@ public class SpongeMain {
public void onGamePreInit(GamePreInitializationEvent event) {
this.server = this.game.getServer();
new FaweSponge(this);
Settings.QUEUE.PARALLEL_THREADS = 1;
Settings.IMP.QUEUE.PARALLEL_THREADS = 1;
}
@Listener

View File

@ -238,7 +238,7 @@ public class SpongeQueue_ALL extends NMSMappedFaweQueue<World, net.minecraft.wor
@Override
public boolean setComponents(FaweChunk fc, RunnableVal<FaweChunk> changeTask) {
if (changeTask != null) {
Settings.HISTORY.COMBINE_STAGES = false;
Settings.IMP.HISTORY.COMBINE_STAGES = false;
throw new UnsupportedOperationException("Combine stages not supported");
}
SpongeChunk_1_8 fs = (SpongeChunk_1_8) fc;
@ -298,7 +298,7 @@ public class SpongeQueue_ALL extends NMSMappedFaweQueue<World, net.minecraft.wor
@Override
public CharFaweChunk getPrevious(CharFaweChunk fs, ExtendedBlockStorage[] sections, Map<?, ?> tilesGeneric, Collection<?>[] entitiesGeneric, Set<UUID> createdEntities, boolean all) throws Exception {
Settings.HISTORY.COMBINE_STAGES = false;
Settings.IMP.HISTORY.COMBINE_STAGES = false;
throw new UnsupportedOperationException("Combine stages not supported");
}