misc changes.

This commit is contained in:
MattBDev 2019-11-11 16:02:28 -05:00
parent 7aa0d9c122
commit a23a4e5496
71 changed files with 676 additions and 673 deletions

View File

@ -2,9 +2,9 @@ package com.boydti.fawe.bukkit;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.IFawe;
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
import com.boydti.fawe.beta.implementation.cache.preloader.AsyncPreloader;
import com.boydti.fawe.beta.implementation.cache.preloader.Preloader;
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
import com.boydti.fawe.bukkit.adapter.BukkitQueueHandler;
import com.boydti.fawe.bukkit.listener.BrushListener;
import com.boydti.fawe.bukkit.listener.BukkitImageListener;
@ -54,9 +54,13 @@ import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FaweBukkit implements IFawe, Listener {
private static final Logger log = LoggerFactory.getLogger(FaweBukkit.class);
private final Plugin plugin;
private VaultUtil vault;
private ItemUtil itemUtil;
@ -78,9 +82,7 @@ public class FaweBukkit implements IFawe, Listener {
try {
new BrushListener(plugin);
} catch (Throwable e) {
debug("====== BRUSH LISTENER FAILED ======");
e.printStackTrace();
debug("===================================");
log.debug("Brush Listener Failed", e);
}
if (PaperLib.isPaper() && Settings.IMP.EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING > 1) {
new RenderListener(plugin);
@ -220,9 +222,7 @@ public class FaweBukkit implements IFawe, Listener {
this.itemUtil = tmp = new ItemUtil();
} catch (Throwable e) {
Settings.IMP.EXPERIMENTAL.PERSISTENT_BRUSHES = false;
debug("===== PERSISTENT BRUSH FAILED =====");
e.printStackTrace();
debug("===================================");
log.debug("Persistent Brushes Failed", e);
}
}
return tmp;
@ -230,13 +230,12 @@ public class FaweBukkit implements IFawe, Listener {
/**
* Vault isn't required, but used for setting player permissions (WorldEdit bypass)
* @return
*/
@Override
public void setupVault() {
try {
this.vault = new VaultUtil();
} catch (final Throwable e) {
} catch (final Throwable ignored) {
}
}
@ -270,7 +269,7 @@ public class FaweBukkit implements IFawe, Listener {
}
/**
* A mask manager handles region restrictions e.g. PlotSquared plots / WorldGuard regions
* A mask manager handles region restrictions e.g., PlotSquared plots / WorldGuard regions
*/
@Override
public Collection<FaweMaskManager> getMaskManagers() {
@ -280,7 +279,7 @@ public class FaweBukkit implements IFawe, Listener {
try {
managers.add(new Worldguard(worldguardPlugin));
managers.add(new WorldguardFlag(worldguardPlugin));
Fawe.debug("Attempting to use plugin 'WorldGuard'");
log.debug("Attempting to use plugin 'WorldGuard'");
} catch (Throwable ignored) {
}
}
@ -288,7 +287,7 @@ public class FaweBukkit implements IFawe, Listener {
if (townyPlugin != null && townyPlugin.isEnabled()) {
try {
managers.add(new TownyFeature(townyPlugin));
Fawe.debug("Attempting to use plugin 'Towny'");
log.debug("Attempting to use plugin 'Towny'");
} catch (Throwable ignored) {
}
}
@ -296,11 +295,11 @@ public class FaweBukkit implements IFawe, Listener {
if (factionsPlugin != null && factionsPlugin.isEnabled()) {
try {
managers.add(new FactionsFeature(factionsPlugin));
Fawe.debug("Attempting to use plugin 'Factions'");
log.debug("Attempting to use plugin 'Factions'");
} catch (Throwable e) {
try {
managers.add(new FactionsUUIDFeature(factionsPlugin, this));
Fawe.debug("Attempting to use plugin 'FactionsUUID'");
log.debug("Attempting to use plugin 'FactionsUUID'");
} catch (Throwable ignored) {
}
}
@ -309,7 +308,7 @@ public class FaweBukkit implements IFawe, Listener {
if (residencePlugin != null && residencePlugin.isEnabled()) {
try {
managers.add(new ResidenceFeature(residencePlugin, this));
Fawe.debug("Attempting to use plugin 'Residence'");
log.debug("Attempting to use plugin 'Residence'");
} catch (Throwable ignored) {
}
}
@ -317,7 +316,7 @@ public class FaweBukkit implements IFawe, Listener {
if (griefpreventionPlugin != null && griefpreventionPlugin.isEnabled()) {
try {
managers.add(new GriefPreventionFeature(griefpreventionPlugin));
Fawe.debug("Attempting to use plugin 'GriefPrevention'");
log.debug("Attempting to use plugin 'GriefPrevention'");
} catch (Throwable ignored) {
}
}
@ -326,7 +325,7 @@ public class FaweBukkit implements IFawe, Listener {
if (aSkyBlock != null && aSkyBlock.isEnabled()) {
try {
managers.add(new ASkyBlockHook(aSkyBlock));
Fawe.debug("Attempting to use plugin 'ASkyBlock' found. Using it now.");
log.debug("Attempting to use plugin 'ASkyBlock' found. Using it now.");
} catch (Throwable e) {
e.printStackTrace();
}
@ -334,7 +333,7 @@ public class FaweBukkit implements IFawe, Listener {
if (Settings.IMP.EXPERIMENTAL.FREEBUILD) {
try {
managers.add(new FreeBuildRegion());
Fawe.debug("Attempting to use plugin '<internal.freebuild>'");
log.debug("Attempting to use plugin '<internal.freebuild>'");
} catch (Throwable ignored) {
}
}

View File

@ -1,9 +1,9 @@
package com.boydti.fawe.bukkit.adapter;
import com.boydti.fawe.Fawe;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
import com.boydti.fawe.bukkit.listener.ChunkListener;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@ -40,7 +40,7 @@ public class BukkitQueueHandler extends QueueHandler {
if (timingsEnabled) {
if (alertTimingsChange) {
alertTimingsChange = false;
Fawe.debug("Having `parallel-threads` > 1 interferes with the timings.");
getLogger(BukkitQueueHandler.class).debug("Having `parallel-threads` > 1 interferes with the timings.");
}
fieldTimingsEnabled.set(null, false);
methodCheck.invoke(null);
@ -69,4 +69,4 @@ public class BukkitQueueHandler extends QueueHandler {
}
}
}
}
}

View File

@ -1,10 +1,12 @@
package com.boydti.fawe.bukkit.adapter.mc1_14;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.beta.IChunkSet;
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks;
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
import com.boydti.fawe.bukkit.adapter.DelegateLock;
import com.boydti.fawe.object.collection.AdaptedMap;
import com.boydti.fawe.object.collection.BitArray4096;
@ -22,6 +24,19 @@ import com.sk89q.worldedit.internal.Constants;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.AbstractSet;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.function.Function;
import javax.annotation.Nullable;
import net.minecraft.server.v1_14_R1.BiomeBase;
import net.minecraft.server.v1_14_R1.BlockPosition;
import net.minecraft.server.v1_14_R1.Chunk;
@ -45,12 +60,6 @@ import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlock;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.function.Function;
public class BukkitGetBlocks_1_14 extends CharGetBlocks {
public ChunkSection[] sections;
public Chunk nmsChunk;
@ -363,7 +372,7 @@ public class BukkitGetBlocks_1_14 extends CharGetBlocks {
final ListTag posTag = (ListTag) entityTagMap.get("Pos");
final ListTag rotTag = (ListTag) entityTagMap.get("Rotation");
if (idTag == null || posTag == null || rotTag == null) {
Fawe.debug("Unknown entity tag: " + nativeTag);
getLogger(BukkitGetBlocks_1_14.class).debug("Unknown entity tag: " + nativeTag);
continue;
}
final double x = posTag.getDouble(0);

View File

@ -19,7 +19,8 @@
package com.boydti.fawe.bukkit.adapter.mc1_14;
import com.boydti.fawe.Fawe;
import static com.google.common.base.Preconditions.checkNotNull;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.beta.implementation.packet.ChunkPacket;
import com.google.common.cache.CacheBuilder;
@ -67,6 +68,20 @@ import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.world.block.BlockTypesCache;
import com.sk89q.worldedit.world.entity.EntityType;
import com.sk89q.worldedit.world.registry.BlockMaterial;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.OptionalInt;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import net.minecraft.server.v1_14_R1.Block;
import net.minecraft.server.v1_14_R1.BlockPosition;
import net.minecraft.server.v1_14_R1.BlockStateBoolean;
@ -130,23 +145,6 @@ import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.OptionalInt;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.google.common.base.Preconditions.checkNotNull;
public final class Spigot_v1_14_R4 extends CachedBukkitAdapter implements BukkitImplAdapter<NBTBase>{
private final Logger logger = LoggerFactory.getLogger(getClass());
@ -197,7 +195,7 @@ public final class Spigot_v1_14_R4 extends CachedBukkitAdapter implements Bukkit
try {
tileEntity.load(tag);
} catch (Throwable e) {
Fawe.debug("Invalid tag " + tag + " | " + tileEntity);
//Fawe.debug("Invalid tag " + tag + " | " + tileEntity);
}
}
@ -419,7 +417,7 @@ public final class Spigot_v1_14_R4 extends CachedBukkitAdapter implements Bukkit
worldServer.addEntity(createdEntity, SpawnReason.CUSTOM);
return createdEntity.getBukkitEntity();
} else {
Fawe.debug("Invalid entity " + state.getType().getId());
logger.debug("Invalid entity " + state.getType().getId());
return null;
}
}

View File

@ -1,8 +1,8 @@
package com.boydti.fawe.bukkit.filter;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweAPI;
import com.boydti.fawe.object.RunnableVal;
import com.boydti.fawe.regions.general.CuboidRegionFilter;
@ -34,7 +34,7 @@ public class WorldGuardFilter extends CuboidRegionFilter {
BlockVector3 min = region.getMinimumPoint();
BlockVector3 max = region.getMaximumPoint();
if (max.getBlockX() - min.getBlockX() > 1024 || max.getBlockZ() - min.getBlockZ() > 1024) {
Fawe.debug("Large or complex region shapes cannot be optimized. Filtering will be slower");
getLogger(WorldGuardFilter.class).debug("Large or complex region shapes cannot be optimized. Filtering will be slower");
large = true;
break;
}

View File

@ -1,5 +1,7 @@
package com.boydti.fawe.bukkit.listener;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.bukkit.FaweBukkit;
import com.boydti.fawe.config.Settings;
@ -61,7 +63,7 @@ public abstract class ChunkListener implements Listener {
TaskManager.IMP.repeat(() -> {
Location tmpLoc = lastCancelPos;
if (tmpLoc != null) {
Fawe.debug("[FAWE `tick-limiter`] Detected and cancelled physics lag source at "
getLogger(ChunkListener.class).debug("[FAWE `tick-limiter`] Detected and cancelled physics lag source at "
+ tmpLoc);
}
rateLimit--;
@ -351,7 +353,6 @@ public abstract class ChunkListener implements Listener {
lastCancelPos = block.getLocation();
}
event.setCancelled(true);
return;
} else {
count[1] = 0;
}
@ -391,7 +392,7 @@ public abstract class ChunkListener implements Listener {
double vertical = Math.abs(velocity.getY());
if (Math.abs(velocity.getX()) > vertical
|| Math.abs(velocity.getZ()) > vertical) {
Fawe.debug(
getLogger(ChunkListener.class).warn(
"[FAWE `tick-limiter`] Detected and cancelled rogue FireWork at "
+ ent.getLocation());
ent.remove();
@ -422,11 +423,10 @@ public abstract class ChunkListener implements Listener {
cancelNearby(cx, cz);
if (rateLimit <= 0) {
rateLimit = 20;
Fawe.debug(
getLogger(ChunkListener.class).warn(
"[FAWE `tick-limiter`] Detected and cancelled item lag source at " + loc);
}
event.setCancelled(true);
return;
}
}
}

View File

@ -125,9 +125,9 @@ public class WorldEditPlugin extends JavaPlugin { //implements TabCompleter
@Override
public boolean add(Plugin plugin) {
if (plugin.getName().startsWith("AsyncWorldEdit")) {
Fawe.debug("Disabling `" + plugin.getName() + "` as it is incompatible");
log.debug("Disabling `" + plugin.getName() + "` as it is incompatible");
} else if (plugin.getName().startsWith("BetterShutdown")) {
Fawe.debug("Disabling `" + plugin.getName() + "` as it is incompatible (Improperly shaded classes from com.sk89q.minecraft.util.commands)");
log.debug("Disabling `" + plugin.getName() + "` as it is incompatible (Improperly shaded classes from com.sk89q.minecraft.util.commands)");
} else {
return super.add(plugin);
}

View File

@ -36,6 +36,8 @@ import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
import javax.management.InstanceAlreadyExistsException;
import javax.management.NotificationEmitter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* [ WorldEdit action]
@ -62,19 +64,22 @@ import javax.management.NotificationEmitter;
* - The chunk is modified directly rather than through the API
* \ Removes some overhead, and means some processing can be done async
* - Lighting updates are performed on the chunk level rather than for every block
* \ e.g. A blob of stone: only the visible blocks need to have the lighting calculated
* \ e.g., A blob of stone: only the visible blocks need to have the lighting calculated
* - Block changes are sent with a chunk packet
* \ A chunk packet is generally quicker to create and smaller for large world edits
* - No physics updates
* \ Physics updates are slow, and are usually performed on each block
* - Block data shortcuts
* \ Some known blocks don't need to have the data set or accessed (e.g. air is never going to have data)
* \ Some known blocks don't need to have the data set or accessed (e.g., air is never going to have data)
* - Remove redundant extents
* \ Up to 11 layers of extents can be removed
* - History bypassing
* \ FastMode bypasses history and means blocks in the world don't need to be checked and recorded
*/
public class Fawe {
private static final Logger log = LoggerFactory.getLogger(Fawe.class);
/**
* The FAWE instance;
*/
@ -183,7 +188,7 @@ public class Fawe {
visualQueue = new VisualQueue(3);
WEManager.IMP.managers.addAll(Fawe.this.IMP.getMaskManagers());
WEManager.IMP.managers.add(new PlotSquaredFeature());
Fawe.debug("Plugin 'PlotSquared' found. Using it now.");
log.debug("Plugin 'PlotSquared' found. Using it now.");
} catch (Throwable ignored) {}
try {
imp().startMetrics();
@ -324,7 +329,7 @@ public class Fawe {
public static void setupInjector() {
/*
* Modify the sessions
* - EditSession supports custom queue and a lot of optimizations
* - EditSession supports a custom queue, and a lot of optimizations
* - LocalSession supports VirtualPlayers and undo on disk
*/
if (!Settings.IMP.EXPERIMENTAL.DISABLE_NATIVES) {

View File

@ -1,5 +1,8 @@
package com.boydti.fawe;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.beta.Trimable;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.config.Settings;
@ -27,10 +30,7 @@ import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.math.MutableBlockVector3;
import com.sk89q.worldedit.math.MutableVector3;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.world.block.BlockTypesCache;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
@ -50,8 +50,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
import static com.google.common.base.Preconditions.checkNotNull;
public enum FaweCache implements Trimable {
IMP
; // singleton
@ -141,7 +139,7 @@ public enum FaweCache implements Trimable {
synchronized (this) {
pool = REGISTERED_POOLS.get(clazz);
if (pool == null) {
Fawe.debug("Not registered " + clazz);
getLogger(FaweCache.class).debug("Not registered " + clazz);
Supplier<T> supplier = IOUtil.supplier(clazz::newInstance);
pool = supplier::get;
REGISTERED_POOLS.put(clazz, pool);
@ -162,7 +160,7 @@ public enum FaweCache implements Trimable {
synchronized (this) {
cache = REGISTERED_SINGLETONS.get(clazz);
if (cache == null) {
Fawe.debug("Not registered " + clazz);
getLogger(FaweCache.class).debug("Not registered " + clazz);
cache = new CleanableThreadLocal<>(IOUtil.supplier(clazz::newInstance));
REGISTERED_SINGLETONS.put(clazz, cache);
}

View File

@ -38,7 +38,7 @@ public interface Filter {
}
/**
* Make changes to the block here<br> - e.g. block.setId(...)<br> - Note: Performance is
* Make changes to the block here<br> - e.g., block.setId(...)<br> - Note: Performance is
* critical here<br>
*
* @param block
@ -50,7 +50,6 @@ public interface Filter {
* Do something with the IChunk after block filtering.
*
* @param chunk
* @return
*/
default void finishChunk(IChunk chunk) {
}

View File

@ -6,8 +6,6 @@ import com.boydti.fawe.beta.implementation.processors.MultiBatchProcessor;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
@ -84,20 +82,12 @@ public interface IBatchProcessor {
default boolean trimNBT(IChunkSet set, Function<BlockVector3, Boolean> contains) {
Set<CompoundTag> ents = set.getEntities();
if (!ents.isEmpty()) {
for (Iterator<CompoundTag> iter = ents.iterator(); iter.hasNext();) {
CompoundTag ent = iter.next();
if (!contains.apply(ent.getEntityPosition().toBlockPoint())) {
iter.remove();
}
}
ents.removeIf(ent -> !contains.apply(ent.getEntityPosition().toBlockPoint()));
}
Map<BlockVector3, CompoundTag> tiles = set.getTiles();
if (!tiles.isEmpty()) {
for (Iterator<Map.Entry<BlockVector3, CompoundTag>> iter = tiles.entrySet().iterator(); iter.hasNext();) {
if (!contains.apply(iter.next().getKey())) {
iter.remove();
}
}
tiles.entrySet().removeIf(blockVector3CompoundTagEntry -> !contains
.apply(blockVector3CompoundTagEntry.getKey()));
}
return !tiles.isEmpty() || !ents.isEmpty();
}

View File

@ -36,7 +36,7 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
int getZ();
/**
* If the chunk is a delegate, returns it's parent's root
* If the chunk is a delegate, returns its parent's root
*
* @return root IChunk
*/
@ -49,6 +49,7 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
*
* @return true if no changes are queued for this chunk
*/
@Override
boolean isEmpty();
/**
@ -56,7 +57,7 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
*
* @param filter the filter
* @param block The filter block
* @param region The region allowed to filter (may be null)
* @param region The region allowed to filter (maybe null)
*/
void filterBlocks(Filter filter, ChunkFilterBlock block, @Nullable Region region, boolean full);
@ -70,10 +71,13 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
// void flood(Flood flood, FilterBlockMask mask, ChunkFilterBlock block);
/* set - queues a change */
@Override
boolean setBiome(int x, int y, int z, BiomeType biome);
@Override
boolean setTile(int x, int y, int z, CompoundTag tag);
@Override
boolean setBlock(int x, int y, int z, BlockStateHolder block);
@Override

View File

@ -1,10 +1,8 @@
package com.boydti.fawe.beta;
import com.boydti.fawe.beta.Trimable;
/**
* IGetBlocks may be cached by the WorldChunkCache so that it can be used between multiple
* IQueueExtents - avoids conversion between palette and raw data on every block get
* IQueueExtents - avoids conversion between a palette and raw data on every block get
*/
public interface IChunkCache<T> extends Trimable {
T get(int chunkX, int chunkZ);

View File

@ -43,6 +43,7 @@ public interface IChunkGet extends IBlocks, Trimable, InputExtent {
<T extends Future<T>> T call(IChunkSet set, Runnable finalize);
@Override
char[] load(int layer);
CompoundTag getEntity(UUID uuid);

View File

@ -4,22 +4,15 @@ import com.boydti.fawe.FaweCache;
import com.boydti.fawe.beta.implementation.IChunkExtent;
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
import com.boydti.fawe.beta.implementation.processors.IBatchProcessorHolder;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import javax.annotation.Nullable;
import java.io.Flushable;
import java.util.Set;
import java.util.concurrent.Future;
import javax.annotation.Nullable;
/**
* TODO: implement Extent (need to refactor Extent first) Interface for a queue based extent which
@ -58,7 +51,6 @@ public interface IQueueExtent<T extends IChunk> extends Flushable, Trimable, ICh
* - Faster than getting it using NMS and allows for wrapping
* @param x
* @param z
* @param supplier
* @return
*/
IChunkGet getCachedGet(int x, int z);
@ -67,7 +59,6 @@ public interface IQueueExtent<T extends IChunk> extends Flushable, Trimable, ICh
* Get the cached chunk set object
* @param x
* @param z
* @param supplier
* @return
*/
IChunkSet getCachedSet(int x, int z);
@ -101,7 +92,7 @@ public interface IQueueExtent<T extends IChunk> extends Flushable, Trimable, ICh
T create(boolean isFull);
/**
* Wrap the chunk object (i.e. for region restrictions / limits etc.)
* Wrap the chunk object (i.e., for region restrictions / limits etc.)
*
* @param root
* @return wrapped chunk

View File

@ -1,15 +1,15 @@
package com.boydti.fawe.beta;
/**
* Interface for objects that can be trimmed (memory related)<br> - Trimming will reduce it's memory
* Interface for objects that can be trimmed (memory related)<br> - Trimming will reduce its memory
* footprint
*/
public interface Trimable {
/**
* Trim the object, reducing it's memory footprint
* Trims the object, reducing its memory footprint
*
* @param aggressive if trimming should be aggressive e.g. Not return early when the first
* @param aggressive if trimming should be aggressive e.g., Not return early when the first
* element cannot be trimmed
* @return if this object is empty at the end of the trim, and can therefore be deleted
*/

View File

@ -386,7 +386,7 @@ public class ChunkHolder<T extends Future<T>> implements IQueueChunk {
/**
* Create a wrapped set object
* - The purpose of wrapping is to allow different extents to intercept / alter behavior
* - E.g. caching, optimizations, filtering
* - e.g., caching, optimizations, filtering
* @return
*/
private IChunkSet newWrappedSet() {
@ -396,7 +396,7 @@ public class ChunkHolder<T extends Future<T>> implements IQueueChunk {
/**
* Create a wrapped get object
* - The purpose of wrapping is to allow different extents to intercept / alter behavior
* - E.g. caching, optimizations, filtering
* - e.g., caching, optimizations, filtering
* @return
*/
private IChunkGet newWrappedGet() {

View File

@ -1,13 +1,9 @@
package com.boydti.fawe.beta.implementation.chunk;
import com.boydti.fawe.beta.Filter;
import com.boydti.fawe.beta.IChunkSet;
import com.boydti.fawe.beta.IQueueChunk;
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
import com.boydti.fawe.beta.Filter;
import com.boydti.fawe.beta.FilterBlockMask;
import com.boydti.fawe.beta.Flood;
import com.boydti.fawe.beta.IChunk;
import com.boydti.fawe.beta.IChunkSet;
import com.boydti.fawe.beta.IQueueExtent;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
@ -16,20 +12,16 @@ import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockTypes;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Future;
import javax.annotation.Nullable;
public enum NullChunk implements IQueueChunk {
INSTANCE;
@Override
public void init(IQueueExtent extent, int x, int z) {}
@Override
public int getX() {
return 0;

View File

@ -54,6 +54,7 @@ public class LimitExtent extends PassthroughExtent {
this.limit = limit;
}
@Override
public List<? extends Entity> getEntities(Region region) {
limit.THROW_MAX_CHECKS(region.getArea());
try {
@ -66,6 +67,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public List<? extends Entity> getEntities() {
limit.THROW_MAX_CHECKS();
try {
@ -78,6 +80,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
@Nullable
public Entity createEntity(Location location, BaseEntity entity) {
limit.THROW_MAX_CHANGES();
@ -507,6 +510,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public BlockState getBlock(int x, int y, int z) {
limit.THROW_MAX_CHECKS();
try {
@ -532,6 +536,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public BaseBlock getFullBlock(int x, int y, int z) {
limit.THROW_MAX_CHECKS();
try {
@ -544,6 +549,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public BiomeType getBiome(BlockVector2 position) {
limit.THROW_MAX_CHECKS();
try {
@ -556,6 +562,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public BiomeType getBiomeType(int x, int z) {
limit.THROW_MAX_CHECKS();
try {
@ -568,6 +575,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
@Deprecated
public <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 position, T block) throws WorldEditException {
limit.THROW_MAX_CHANGES();
@ -582,6 +590,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public <T extends BlockStateHolder<T>> boolean setBlock(int x, int y, int z, T block) throws WorldEditException {
limit.THROW_MAX_CHANGES();
if (block.hasNbtData()) limit.MAX_BLOCKSTATES();
@ -595,6 +604,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public boolean setTile(int x, int y, int z, CompoundTag tile) throws WorldEditException {
limit.THROW_MAX_CHANGES();
limit.MAX_BLOCKSTATES();
@ -608,6 +618,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public boolean setBiome(BlockVector2 position, BiomeType biome) {
limit.THROW_MAX_CHANGES();
try {
@ -620,6 +631,7 @@ public class LimitExtent extends PassthroughExtent {
}
}
@Override
public boolean setBiome(int x, int y, int z, BiomeType biome) {
limit.THROW_MAX_CHANGES();
try {

View File

@ -1,37 +1,33 @@
package com.boydti.fawe.beta.implementation.queue;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.beta.IQueueChunk;
import com.boydti.fawe.beta.implementation.filter.block.CharFilterBlock;
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
import com.boydti.fawe.beta.IBatchProcessor;
import com.boydti.fawe.beta.IChunk;
import com.boydti.fawe.beta.IChunkCache;
import com.boydti.fawe.beta.IChunkGet;
import com.boydti.fawe.beta.IChunkSet;
import com.boydti.fawe.beta.IQueueChunk;
import com.boydti.fawe.beta.IQueueExtent;
import com.boydti.fawe.beta.IChunkCache;
import com.boydti.fawe.beta.implementation.chunk.NullChunk;
import com.boydti.fawe.beta.implementation.blocks.CharSetBlocks;
import com.boydti.fawe.beta.implementation.chunk.ChunkHolder;
import com.boydti.fawe.beta.implementation.chunk.NullChunk;
import com.boydti.fawe.beta.implementation.chunk.ReferenceChunk;
import com.boydti.fawe.beta.implementation.processors.BatchProcessorHolder;
import com.boydti.fawe.beta.implementation.filter.block.CharFilterBlock;
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
import com.boydti.fawe.beta.implementation.processors.EmptyBatchProcessor;
import com.boydti.fawe.beta.implementation.processors.ExtentBatchProcessorHolder;
import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.changeset.FaweChangeSet;
import com.boydti.fawe.util.MathMan;
import com.boydti.fawe.util.MemUtil;
import com.google.common.util.concurrent.Futures;
import com.sk89q.worldedit.extent.Extent;
import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
/**
* Single threaded implementation for IQueueExtent (still abstract) - Does not implement creation of
* chunks (that has to implemented by the platform e.g. Bukkit)
* chunks (that has to implemented by the platform e.g., Bukkit)
* <p>
* This queue is reusable {@link #init(IChunkCache)}
*/

View File

@ -163,7 +163,7 @@ public class AnvilCommands {
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
)
@CommandPermissions("worldedit.anvil.deleteallunvisited")
public void deleteAllUnvisited(Player player, String folder, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis) throws WorldEditException {
public void deleteAllUnvisited(Player player, String folder, int inhabitedTicks, @Arg(desc = "int", def = "60000") int fileDurationMillis) throws WorldEditException {
// DeleteUninhabitedFilter filter = new DeleteUninhabitedFilter(fileDurationMillis, inhabitedTicks, fileDurationMillis); TODO NOT IMPLEMENTED
// DeleteUninhabitedFilter result = runWithWorld(player, folder, filter, true);
// if (result != null) {
@ -182,7 +182,7 @@ public class AnvilCommands {
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
)
@CommandPermissions("worldedit.anvil.deleteallunclaimed")
public void deleteAllUnclaimed(Player player, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis, @Switch(name = 'd', desc = "TODO") boolean debug) throws WorldEditException {
public void deleteAllUnclaimed(Player player, int inhabitedTicks, @Arg(desc = "int", def = "60000") int fileDurationMillis, @Switch(name = 'd', desc = "TODO") boolean debug) throws WorldEditException {
// String folder = player.getWorld().getName(); TODO NOT IMPLEMENTED
// DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis);
// if (debug) {
@ -205,7 +205,7 @@ public class AnvilCommands {
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
)
@CommandPermissions("worldedit.anvil.deleteunclaimed")
public void deleteUnclaimed(Player player, EditSession editSession, @Selection Region selection, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis, @Switch(name = 'd', desc = "TODO") boolean debug) throws WorldEditException {
public void deleteUnclaimed(Player player, EditSession editSession, @Selection Region selection, int inhabitedTicks, @Arg(desc = "int", def = "60000") int fileDurationMillis, @Switch(name = 'd', desc = "TODO") boolean debug) throws WorldEditException {
// DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis); TODO NOT IMPLEMENTED
// if (debug) {
// filter.enableDebug();
@ -221,7 +221,7 @@ public class AnvilCommands {
aliases = {"deloldreg" },
desc = "Delete regions which haven't been accessed in a certain amount of time",
descFooter = "You can use seconds (s), minutes (m), hours (h), days (d), weeks (w), years (y)\n" +
"(months are not a unit of time) E.g. 8h5m12s\n"
"(months are not a unit of time) e.g., 8h5m12s\n"
)
@CommandPermissions("worldedit.anvil.deletealloldregions")
public void deleteAllOldRegions(Player player, String folder, String time) throws WorldEditException {

View File

@ -1,5 +1,9 @@
package com.boydti.fawe.command;
import static com.boydti.fawe.util.image.ImageUtil.load;
import static com.sk89q.worldedit.command.MethodCommands.getArguments;
import static com.sk89q.worldedit.util.formatting.text.TextComponent.newline;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweAPI;
import com.boydti.fawe.beta.implementation.filter.block.SingleFilterBlock;
@ -15,7 +19,6 @@ import com.boydti.fawe.util.StringMan;
import com.boydti.fawe.util.TaskManager;
import com.boydti.fawe.util.TextureUtil;
import com.boydti.fawe.util.image.ImageUtil;
import com.google.common.collect.ImmutableSet;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.sk89q.minecraft.util.commands.CommandException;
@ -25,7 +28,6 @@ import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.command.util.CommandPermissions;
import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator;
import com.sk89q.worldedit.command.util.PermissionCondition;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext;
@ -37,7 +39,6 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.internal.command.CommandRegistrationHandler;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.registry.state.PropertyKey;
@ -47,7 +48,6 @@ import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.formatting.component.TextComponentProducer;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.TextComponent.Builder;
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
import com.sk89q.worldedit.util.formatting.text.event.ClickEvent;
import com.sk89q.worldedit.util.formatting.text.event.HoverEvent;
import com.sk89q.worldedit.util.formatting.text.format.TextColor;
@ -56,18 +56,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.CommandManagerService;
import org.enginehub.piston.annotation.Command;
import org.enginehub.piston.annotation.CommandContainer;
import org.enginehub.piston.annotation.param.Arg;
import org.enginehub.piston.annotation.param.Switch;
import org.enginehub.piston.exception.StopExecutionException;
import org.enginehub.piston.inject.InjectedValueAccess;
import org.enginehub.piston.part.SubCommandPart;
import org.jetbrains.annotations.NotNull;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.io.ByteArrayOutputStream;
@ -85,17 +73,22 @@ import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static com.boydti.fawe.util.image.ImageUtil.load;
import static com.sk89q.worldedit.command.MethodCommands.getArguments;
import static com.sk89q.worldedit.util.formatting.text.TextComponent.newline;
import javax.imageio.ImageIO;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.enginehub.piston.annotation.Command;
import org.enginehub.piston.annotation.CommandContainer;
import org.enginehub.piston.annotation.param.Arg;
import org.enginehub.piston.annotation.param.Switch;
import org.enginehub.piston.exception.StopExecutionException;
import org.enginehub.piston.inject.InjectedValueAccess;
import org.jetbrains.annotations.NotNull;
@CommandContainer(superTypes = CommandPermissionsConditionGenerator.Registration.class)
public class CFICommands {
private final WorldEdit worldEdit;
private final @NonNull TextComponent doubleNewLine = TextComponent.of("\n\n");
/**
* Create a new instance.
@ -252,14 +245,14 @@ public class CFICommands {
desc = "Set the floor and main block"
)
@CommandPermissions("worldedit.anvil.cfi")
public void column(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
public void column(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
if (image != null) {
gen.setColumn(load(image), patternArg, !disableWhiteOnly);
} else if (maskOpt != null) {
gen.setColumn(maskOpt, patternArg);
gen.setColumn(load(image), pattern, !disableWhiteOnly);
} else if (mask != null) {
gen.setColumn(mask, pattern);
} else {
gen.setColumn(patternArg);
gen.setColumn(pattern);
}
player.print("Set column!");
assertSettings(player).resetComponent();
@ -271,21 +264,21 @@ public class CFICommands {
desc = "Set the floor (default: grass)"
)
@CommandPermissions("worldedit.anvil.cfi")
public void floorCmd(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
floor(player, patternArg, image, maskOpt, disableWhiteOnly);
public void floorCmd(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
floor(player, pattern, image, mask, disableWhiteOnly);
player.print("Set floor!");
assertSettings(player).resetComponent();
component(player);
}
private void floor(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) {
private void floor(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) {
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
if (image != null) {
gen.setFloor(load(image), patternArg, !disableWhiteOnly);
} else if (maskOpt != null) {
gen.setFloor(maskOpt, patternArg);
gen.setFloor(load(image), pattern, !disableWhiteOnly);
} else if (mask != null) {
gen.setFloor(mask, pattern);
} else {
gen.setFloor(patternArg);
gen.setFloor(pattern);
}
}
@ -294,21 +287,21 @@ public class CFICommands {
desc = "Set the main block (default: stone)"
)
@CommandPermissions("worldedit.anvil.cfi")
public void mainCmd(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
main(player, patternArg, image, maskOpt, disableWhiteOnly);
public void mainCmd(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
main(player, pattern, image, maskOpt, disableWhiteOnly);
player.print("Set main!");
assertSettings(player).resetComponent();
component(player);
}
public void main(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
public void main(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
if (image != null) {
gen.setMain(load(image), patternArg, !disableWhiteOnly);
gen.setMain(load(image), pattern, !disableWhiteOnly);
} else if (maskOpt != null) {
gen.setMain(maskOpt, patternArg);
gen.setMain(maskOpt, pattern);
} else {
gen.setMain(patternArg);
gen.setMain(pattern);
}
}
@ -317,17 +310,17 @@ public class CFICommands {
aliases = {"setoverlay"},
desc = "Set the overlay block",
descFooter = "Change the block directly above the floor (default: air)\n" +
"e.g. Tallgrass"
"e.g., Tallgrass"
)
@CommandPermissions("worldedit.anvil.cfi")
public void overlay(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
public void overlay(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
if (image != null) {
gen.setOverlay(load(image), patternArg, !disableWhiteOnly);
} else if (maskOpt != null) {
gen.setOverlay(maskOpt, patternArg);
gen.setOverlay(load(image), pattern, !disableWhiteOnly);
} else if (mask != null) {
gen.setOverlay(mask, pattern);
} else {
gen.setOverlay(patternArg);
gen.setOverlay(pattern);
}
player.print("Set overlay!");
component(player);
@ -342,18 +335,18 @@ public class CFICommands {
" - A good value for radius and iterations would be 1 8."
)
@CommandPermissions("worldedit.anvil.cfi")
public void smoothCmd(Player player, int radius, int iterations, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
smooth(player, radius, iterations, image, maskOpt, disableWhiteOnly);
public void smoothCmd(Player player, int radius, int iterations, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
smooth(player, radius, iterations, image, mask, disableWhiteOnly);
assertSettings(player).resetComponent();
component(player);
}
private void smooth(Player player, int radius, int iterations, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
private void smooth(Player player, int radius, int iterations, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
if (image != null) {
gen.smooth(load(image), !disableWhiteOnly, radius, iterations);
} else {
gen.smooth(maskOpt, radius, iterations);
gen.smooth(mask, radius, iterations);
}
}
@ -362,11 +355,11 @@ public class CFICommands {
desc = "Create some snow"
)
@CommandPermissions("worldedit.anvil.cfi")
public void snow(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
public void snow(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
floor(player, BlockTypes.SNOW.getDefaultState().with(PropertyKey.LAYERS, 7), image, maskOpt, disableWhiteOnly);
main(player, BlockTypes.SNOW_BLOCK, image, maskOpt, disableWhiteOnly);
smooth(player, 1, 8, image, maskOpt, disableWhiteOnly);
floor(player, BlockTypes.SNOW.getDefaultState().with(PropertyKey.LAYERS, 7), image, mask, disableWhiteOnly);
main(player, BlockTypes.SNOW_BLOCK, image, mask, disableWhiteOnly);
smooth(player, 1, 8, image, mask, disableWhiteOnly);
player.print(TextComponent.of("Added snow!"));
assertSettings(player).resetComponent();
component(player);
@ -390,7 +383,7 @@ public class CFICommands {
name = "paletteblocks",
desc = "Set the blocks used for coloring",
descFooter = "Allow only specific blocks to be used for coloring\n" +
"`blocks` is a list of blocks e.g. stone,bedrock,wool\n" +
"`blocks` is a list of blocks e.g., stone,bedrock,wool\n" +
"`#clipboard` will only use the blocks present in your clipboard."
)
@CommandPermissions("worldedit.anvil.cfi")
@ -516,7 +509,7 @@ public class CFICommands {
" - The distance is the spacing between each schematic"
)
@CommandPermissions("worldedit.anvil.cfi")
public void schem(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask") Mask mask, String schematic, int rarity, int distance, boolean rotate)throws IOException, WorldEditException {
public void schem(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask") Mask mask, String schematic, int rarity, int distance, boolean rotate)throws IOException, WorldEditException {
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
World world = player.getWorld();
@ -542,14 +535,14 @@ public class CFICommands {
" - If a mask is used, the biome will be set anywhere the mask applies"
)
@CommandPermissions("worldedit.anvil.cfi")
public void biome(Player player, @Arg(name = "biome", desc = "Biome type") BiomeType biomeType, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
public void biome(Player player, @Arg(desc = "Biome type") BiomeType biome, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
if (image != null) {
gen.setBiome(load(image), biomeType, !disableWhiteOnly);
} else if (maskOpt != null) {
gen.setBiome(maskOpt, biomeType);
gen.setBiome(load(image), biome, !disableWhiteOnly);
} else if (mask != null) {
gen.setBiome(mask, biome);
} else {
gen.setBiome(biomeType);
gen.setBiome(biome);
}
player.print(TextComponent.of("Set biome!"));
assertSettings(player).resetComponent();
@ -573,8 +566,8 @@ public class CFICommands {
descFooter = "Use a specific pattern and settings to generate ore"
)
@CommandPermissions("worldedit.anvil.cfi")
public void ore(Player player, @Arg(name = "mask", desc = "Mask") Mask mask, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, int size, int frequency, int rariry, int minY, int maxY) throws WorldEditException {
assertSettings(player).getGenerator().addOre(mask, patternArg, size, frequency, rariry, minY, maxY);
public void ore(Player player, @Arg(desc = "Mask") Mask mask, @Arg(desc = "Pattern") Pattern pattern, int size, int frequency, int rarity, int minY, int maxY) throws WorldEditException {
assertSettings(player).getGenerator().addOre(mask, pattern, size, frequency, rarity, minY, maxY);
player.print(TextComponent.of("Added ore!"));
populate(player);
}
@ -584,7 +577,7 @@ public class CFICommands {
desc = "Generate the vanilla ores"
)
@CommandPermissions("worldedit.anvil.cfi")
public void ores(Player player, @Arg(name = "mask", desc = "Mask") Mask mask) throws WorldEditException {
public void ores(Player player, @Arg(desc = "Mask") Mask mask) throws WorldEditException {
assertSettings(player).getGenerator().addDefaultOres(mask);
player.print(TextComponent.of("Added ores!"));
populate(player);
@ -609,7 +602,7 @@ public class CFICommands {
@Command(
name = "water",
desc = "Change the block used for water\ne.g. Lava"
desc = "Change the block used for water\n e.g., Lava"
)
@CommandPermissions("worldedit.anvil.cfi")
public void waterId(Player player, @Arg(desc = "block") BlockStateHolder block) throws WorldEditException {
@ -642,8 +635,8 @@ public class CFICommands {
" - A value of 0 is the default and will not modify the height"
)
@CommandPermissions("worldedit.anvil.cfi")
public void worldthickness(Player player, @Arg(name = "height", desc = "brush height") int heightArg) throws WorldEditException {
assertSettings(player).getGenerator().setWorldThickness(heightArg);
public void worldthickness(Player player, @Arg(desc = "brush height") int height) throws WorldEditException {
assertSettings(player).getGenerator().setWorldThickness(height);
player.print("Set world thickness!");
component(player);
}
@ -655,8 +648,8 @@ public class CFICommands {
" - A value of 0 is the default and will only set the top block"
)
@CommandPermissions("worldedit.anvil.cfi")
public void floorthickness(Player player, @Arg(name = "height", desc = "brush height") int heightArg) throws WorldEditException {
assertSettings(player).getGenerator().setFloorThickness(heightArg);
public void floorthickness(Player player, @Arg( desc = "brush height") int height) throws WorldEditException {
assertSettings(player).getGenerator().setFloorThickness(height);
player.print("Set floor thickness!");
component(player);
}
@ -696,8 +689,8 @@ public class CFICommands {
" - By default water is disabled (with a value of 0)"
)
@CommandPermissions("worldedit.anvil.cfi")
public void waterheight(Player player, @Arg(name = "height", desc = "brush height") int heightArg) throws WorldEditException {
assertSettings(player).getGenerator().setWaterHeight(heightArg);
public void waterheight(Player player, @Arg(desc = "brush height") int height) throws WorldEditException {
assertSettings(player).getGenerator().setWaterHeight(height);
player.print("Set water height!");
component(player);
}
@ -709,7 +702,7 @@ public class CFICommands {
)
// ![79,174,212,5:3,5:4,18,161,20]
@CommandPermissions("worldedit.anvil.cfi")
public void glass(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
public void glass(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
CFISettings settings = assertSettings(player);
settings.getGenerator().setColorWithGlass(load(image));
player.print("Set color with glass!");
@ -726,13 +719,13 @@ public class CFICommands {
"The -w (disableWhiteOnly) will randomly apply depending on the pixel luminance"
)
@CommandPermissions("worldedit.anvil.cfi")
public void color(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
public void color(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
CFISettings settings = assertSettings(player);
HeightMapMCAGenerator gen = settings.getGenerator();
if (imageMask != null) {
gen.setColor(load(image), load(imageMask), !disableWhiteOnly);
} else if (maskOpt != null) {
gen.setColor(load(image), maskOpt);
} else if (mask != null) {
gen.setColor(load(image), mask);
} else {
gen.setColor(load(image));
}
@ -750,9 +743,9 @@ public class CFICommands {
"The -w (disableWhiteOnly) will randomly apply depending on the pixel luminance"
)
@CommandPermissions("worldedit.anvil.cfi")
public void blockbiome(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
public void blockbiome(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
CFISettings settings = assertSettings(player);
settings.getGenerator().setBlockAndBiomeColor(load(image), maskOpt, load(imageMask), !disableWhiteOnly);
settings.getGenerator().setBlockAndBiomeColor(load(image), mask, load(imageMask), !disableWhiteOnly);
player.print(TextComponent.of("Set color with blocks and biomes!"));
settings.resetColoring();
mainMenu(player);
@ -766,7 +759,7 @@ public class CFICommands {
" - If you changed the block to something other than grass you will not see anything."
)
@CommandPermissions("worldedit.anvil.cfi")
public void biomecolor(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
public void biomecolor(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
CFISettings settings = assertSettings(player);
settings.getGenerator().setBiomeColor(load(image));
player.print(TextComponent.of("Set color with biomes!"));
@ -821,17 +814,28 @@ public class CFICommands {
String blockList = materials.size() > 100 ? materials.size() + " blocks" : StringMan.join(materials, ',');
int biomePriority = gen.getBiomePriority();
//TODO fix this so it can execute commands and show tooltips.
@NotNull Builder builder = TextComponent.builder(">> Current Settings <<").append(newline())
.append("Randomization ").append("[" + Boolean.toString(rand).toUpperCase() + "]")//.cmdTip("/cfi randomization " + (!rand))
.append(newline())
.append("Mask ").append("[" + mask + "]")//.cmdTip("/cfi mask")
.append(newline())
.append("Blocks ").append("[" + blocks + "]")//.tooltip(blockList).command("/cfi paletteBlocks")
.append(newline())
.append("BiomePriority ").append("[" + biomePriority + "]")//.cmdTip("/cfi biomepriority")
.append(newline());
TextComponent.empty().clickEvent(ClickEvent.runCommand(
"/cfi randomization " + !rand)).hoverEvent(HoverEvent.showText(
TextComponent.of("/cfi randomization " + !rand)));
@NotNull Builder builder = TextComponent.builder(">> Current Settings <<");
builder.append(newline());
builder.append(TextComponent.of("Randomization [" + Boolean.toString(rand).toUpperCase() + "]")
.clickEvent(ClickEvent.runCommand(
"/cfi randomization " + !rand)).hoverEvent(HoverEvent.showText(
TextComponent.of("/cfi randomization " + !rand))));
builder.append(newline());
builder.append(TextComponent.of("Mask [" + mask + "]").clickEvent(ClickEvent.runCommand(
"/cfi mask")).hoverEvent(HoverEvent.showText(
TextComponent.of("/cfi mask"))));
builder.append(newline());
builder.append(TextComponent.of("Blocks [" + blocks + "]").clickEvent(ClickEvent.runCommand(
"/cfi mask")).hoverEvent(HoverEvent.showText(
TextComponent.of("/cfi mask"))));
builder.append(newline());
builder.append(TextComponent.of("Biome Priority [" + biomePriority + "]").clickEvent(ClickEvent.runCommand(
"/cfi mask")).hoverEvent(HoverEvent.showText(
TextComponent.of("/cfi biomepriority"))));
builder.append(newline());
if (settings.image != null) {
StringBuilder colorArgs = new StringBuilder(" " + settings.imageArg);
@ -845,6 +849,7 @@ public class CFICommands {
colorArgs.append(" -w");
}
//TODO
builder.append("Image: ")
.append("[" + settings.imageArg + "]")//.cmdTip("/cfi " + Commands.getAlias(CFICommands.class, "image"))
.append(newline()).append(newline())
@ -857,7 +862,7 @@ public class CFICommands {
.append("You MUST provide an image: ")
.append("[None]");//.cmdTip("/cfi " + Commands.getAlias(Command.class, "image")).append(newline());
}
builder.append("< [Back]");//.cmdTip(alias()).send(fp);
builder.append("< [Back]");//.cmdTip(alias()).send(player);
player.print(builder.build());
}
@ -866,14 +871,14 @@ public class CFICommands {
desc = "Select a mask"
)
@CommandPermissions("worldedit.anvil.cfi")
public void mask(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly, InjectedValueAccess context){
public void mask(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly, InjectedValueAccess context){
CFISettings settings = assertSettings(player);
String[] split = getArguments(context).split(" ");
int index = 2;
settings.imageMask = imageMask;
settings.imageMaskArg = imageMask != null ? split[index++] : null;
settings.mask = maskOpt;
settings.maskArg = maskOpt != null ? split[index++] : null;
settings.mask = mask;
settings.maskArg = mask != null ? split[index++] : null;
settings.whiteOnly = !disableWhiteOnly;
String s = "/cfi mask http://";
@ -901,16 +906,16 @@ public class CFICommands {
desc = "Select a pattern"
)
@CommandPermissions("worldedit.anvil.cfi")
public void pattern(Player player, @Arg(name = "pattern", desc = "Pattern", def = "") Pattern patternArg, InjectedValueAccess context)throws CommandException {
public void pattern(Player player, @Arg(desc = "Pattern", def = "") Pattern pattern, InjectedValueAccess context)throws CommandException {
CFISettings settings = assertSettings(player);
String[] split = getArguments(context).split(" ");
int index = 2;
settings.pattern = patternArg;
settings.patternArg = patternArg == null ? null : split[index++];
settings.pattern = pattern;
settings.patternArg = pattern == null ? null : split[index++];
StringBuilder cmd = new StringBuilder("/cfi pattern ");
if (patternArg != null) {
if (pattern != null) {
settings.getCategory().accept(player);
} else {
String s = cmd + " stone";
@ -1043,8 +1048,7 @@ public class CFICommands {
.append("Pattern ").append(TextComponent.of("[" + pattern + "]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi pattern")))
.clickEvent(ClickEvent.runCommand("/cfi pattern")))
.append(newline())
.append(newline())
.append(doubleNewLine)
.append(">> Components <<")
.append(newline())
.append(TextComponent.of("[Height]")
@ -1067,39 +1071,58 @@ public class CFICommands {
if (pattern != null) {
String disabled = "You must specify a pattern";
msg.append(TextComponent.of("[WaterId]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline())
.append(TextComponent.of("[BedrockId]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
.append(TextComponent.of("[Floor]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
.append(TextComponent.of("[Main]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
.append(TextComponent.of("[Column]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
.append(TextComponent.of("[Overlay]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline());
msg.append(TextComponent.of("[WaterId]", TextColor.RED)
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
msg.append(newline());
msg.append(TextComponent.of("[BedrockId]", TextColor.RED)
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
msg.append(doubleNewLine);
msg.append(TextComponent.of("[Floor]", TextColor.RED)
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
msg.append(doubleNewLine);
msg.append(TextComponent.of("[Main]", TextColor.RED)
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
msg.append(doubleNewLine);
msg.append(TextComponent.of("[Column]", TextColor.RED)
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
msg.append(doubleNewLine);
msg.append(TextComponent.of("[Overlay]", TextColor.RED)
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
msg.append(doubleNewLine);
} else {
StringBuilder compArgs = new StringBuilder();
compArgs.append(" " + settings.patternArg + maskArgs);
msg
.append(TextComponent.of("[WaterId]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi waterId " + pattern)))
.clickEvent(ClickEvent.runCommand("/cfi waterId " + pattern)))
.append(" - Water id for whole map")
.append(newline())
.append(TextComponent.of("[BedrockId]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi baseId " + pattern)))
.clickEvent(ClickEvent.runCommand("/cfi baseId " + pattern)))
.append(TextComponent.of(" - Bedrock id for whole map"))
.append(newline())
.append(TextComponent.of("[Floor]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi floor " + compArgs)))
.clickEvent(ClickEvent.runCommand("/cfi floor " + compArgs)))
.append(TextComponent.of(" - Set the floor in the masked areas")).append(newline())
.append(TextComponent.of("[Main]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi main " + compArgs)))
.clickEvent(ClickEvent.runCommand("/cfi main " + compArgs)))
.append(TextComponent.of(" - Set the main block in the masked areas")).append(newline())
.append(TextComponent.of("[Column]").hoverEvent(HoverEvent.showText(TextComponent.of("/cfi column" + compArgs)))
.clickEvent(ClickEvent.runCommand("/cfi column" + compArgs))).append(" - Set the columns in the masked areas").append(newline())
.append(TextComponent.of("[Overlay]").hoverEvent(HoverEvent.showText(TextComponent.of("/cfi overlay" + compArgs)))
.clickEvent(ClickEvent.runCommand("/cfi overlay" + compArgs))).append(" - Set the overlay in the masked areas").append(newline());
msg.append(TextComponent.of("[WaterId]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi waterId " + pattern)))
.clickEvent(ClickEvent.runCommand("/cfi waterId " + pattern)));
msg.append(" - Water id for whole map");
msg.append(newline());
msg.append(TextComponent.of("[BedrockId]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi baseId " + pattern)))
.clickEvent(ClickEvent.runCommand("/cfi baseId " + pattern)));
msg.append(TextComponent.of(" - Bedrock id for whole map"));
msg.append(newline());
msg.append(TextComponent.of("[Floor]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi floor " + compArgs)))
.clickEvent(ClickEvent.runCommand("/cfi floor " + compArgs)));
msg.append(TextComponent.of(" - Set the floor in the masked areas"));
msg.append(newline());
msg.append(TextComponent.of("[Main]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi main " + compArgs)))
.clickEvent(ClickEvent.runCommand("/cfi main " + compArgs)));
msg.append(TextComponent.of(" - Set the main block in the masked areas"));
msg.append(newline());
msg.append(TextComponent.of("[Column]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi column" + compArgs)))
.clickEvent(ClickEvent.runCommand("/cfi column" + compArgs)));
msg.append(" - Set the columns in the masked areas");
msg.append(newline());
msg.append(TextComponent.of("[Overlay]")
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi overlay" + compArgs)))
.clickEvent(ClickEvent.runCommand("/cfi overlay" + compArgs)));
msg.append(" - Set the overlay in the masked areas");
msg.append(newline());
}
msg.append(newline())
@ -1263,17 +1286,19 @@ public class CFICommands {
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of(option))));
}
producer.newline();
producer.newline().append(TextComponent.of("<> [View]", TextColor.DARK_AQUA)
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "download"))
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("View full res image"))));
producer.newline().append(TextComponent.of(">< [Cancel]", TextColor.RED)
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "cancel"))
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("cancel"))));
producer.newline().append(TextComponent.of(">> [Done]", TextColor.DARK_GREEN)
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "done"))
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("done"))));
producer.newline();
producer.append(TextComponent.of("<> [View]", TextColor.DARK_AQUA)
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "download"))
.hoverEvent(HoverEvent
.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("View full res image"))));
producer.newline();
producer.append(TextComponent.of(">< [Cancel]", TextColor.RED)
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "cancel"))
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("cancel"))));
producer.newline();
producer.append(TextComponent.of(">> [Done]", TextColor.DARK_GREEN)
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "done"))
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("done"))));
actor.print(producer.create());
}

View File

@ -1,6 +1,7 @@
package com.boydti.fawe.config;
import com.boydti.fawe.Fawe;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.configuration.MemorySection;
import com.boydti.fawe.configuration.file.YamlConfiguration;
import com.sk89q.worldedit.extension.platform.Actor;
@ -114,7 +115,7 @@ public enum BBC {
BRUSH_TARGET_MASK_SET("Set target mask to %s0", "WorldEdit.Brush"),
BRUSH_TARGET_OFFSET_SET("Set target offset to %s0", "WorldEdit.Brush"),
BRUSH_EQUIPPED("Equipped brush %s0", "WorldEdit.Brush"),
BRUSH_TRY_OTHER("There are other more suitable brushes e.g.\n - //br height [radius=5] [#clipboard|file=null] [rotation=0] [yscale=1.00]", "WorldEdit.Brush"),
BRUSH_TRY_OTHER("There are other more suitable brushes e.g.,\n - //br height [radius=5] [#clipboard|file=null] [rotation=0] [yscale=1.00]", "WorldEdit.Brush"),
BRUSH_COPY("Left click the base of an object to copy, right click to paste. Increase the brush radius if necessary.", "WorldEdit.Brush"),
BRUSH_HEIGHT_INVALID("Invalid height map file (%s0)", "WorldEdit.Brush"),
BRUSH_SMOOTH("Note: Use the blend brush if you want to smooth overhangs or caves.", "WorldEdit.Brush"),
@ -484,7 +485,7 @@ public enum BBC {
return;
}
if (actor == null) {
Fawe.debug(this.format(args));
getLogger(BBC.class).debug(this.format(args));
} else {
try {
Method method = actor.getClass().getMethod("print", String.class);
@ -501,7 +502,7 @@ public enum BBC {
return;
}
if (player == null) {
Fawe.debug(this.format(args));
getLogger(BBC.class).debug(this.format(args));
} else {
player.print(this.format(args));
}

View File

@ -20,9 +20,13 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Config {
private final Logger log = LoggerFactory.getLogger(Config.class);
public Config() {
save(new PrintWriter(new ByteArrayOutputStream(0)), getClass(), this, 0);
}
@ -48,7 +52,7 @@ public class Config {
}
}
}
Fawe.debug("Failed to get config option: " + key);
log.debug("Failed to get config option: " + key);
return null;
}
@ -80,7 +84,7 @@ public class Config {
}
}
}
Fawe.debug("Failed to set config option: " + key + ": " + value + " | " + instance + " | " + root.getSimpleName() + ".yml");
log.debug("Failed to set config option: " + key + ": " + value + " | " + instance + " | " + root.getSimpleName() + ".yml");
}
public boolean load(File file) {
@ -339,8 +343,8 @@ public class Config {
Field field = instance.getClass().getField(toFieldName(split[split.length - 1]));
setAccessible(field);
return field;
} catch (Throwable e) {
Fawe.debug("Invalid config field: " + StringMan.join(split, ".") + " for " + toNodeName(instance.getClass().getSimpleName()));
} catch (Throwable ignored) {
log.debug("Invalid config field: " + StringMan.join(split, ".") + " for " + toNodeName(instance.getClass().getSimpleName()));
return null;
}
}

View File

@ -1,11 +1,16 @@
package com.boydti.fawe.database;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.config.Config;
import com.sk89q.worldedit.world.World;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DBHandler {
private final Logger log = LoggerFactory.getLogger(Config.class);
public final static DBHandler IMP = new DBHandler();
private Map<String, RollbackDatabase> databases = new ConcurrentHashMap<>(8, 0.9f, 1);
@ -21,11 +26,7 @@ public class DBHandler {
databases.put(worldName, database);
return database;
} catch (Throwable e) {
Fawe.debug("============ NO JDBC DRIVER! ============");
Fawe.debug("TODO: Bundle driver with FAWE (or disable database)");
Fawe.debug("=========================================");
e.printStackTrace();
Fawe.debug("=========================================");
log.error("No JDBC driver found!\n TODO: Bundle driver with FAWE (or disable database)", e);
return null;
}
}

View File

@ -22,9 +22,14 @@ import java.sql.SQLException;
import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RollbackDatabase extends AsyncNotifyQueue {
private static final Logger log = LoggerFactory.getLogger(RollbackDatabase.class);
private final String prefix;
private final File dbLocation;
private final String worldName;
@ -113,27 +118,55 @@ public class RollbackDatabase extends AsyncNotifyQueue {
public void purge(int diff) {
long now = System.currentTimeMillis() / 1000;
final int then = (int) (now - diff);
addTask(new Runnable() {
@Override
public void run() {
try (PreparedStatement stmt = connection.prepareStatement(PURGE)) {
stmt.setInt(1, then);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
addTask(() -> {
try (PreparedStatement stmt = connection.prepareStatement(PURGE)) {
stmt.setInt(1, then);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
});
}
public void getPotentialEdits(UUID uuid, long minTime, BlockVector3 pos1, BlockVector3 pos2, RunnableVal<DiskStorageHistory> onEach, Runnable whenDone, boolean delete, boolean ascending) {
final World world = FaweAPI.getWorld(this.worldName);
addTask(new Runnable() {
@Override
public void run() {
String stmtStr = ascending ? uuid == null ? GET_EDITS_ASC : GET_EDITS_USER_ASC :
uuid == null ? GET_EDITS : GET_EDITS_USER;
try (PreparedStatement stmt = connection.prepareStatement(stmtStr)) {
addTask(() -> {
String stmtStr = ascending ? uuid == null ? GET_EDITS_ASC : GET_EDITS_USER_ASC :
uuid == null ? GET_EDITS : GET_EDITS_USER;
try (PreparedStatement stmt = connection.prepareStatement(stmtStr)) {
stmt.setInt(1, pos1.getBlockX());
stmt.setInt(2, pos2.getBlockX());
stmt.setByte(3, (byte) (pos1.getBlockY() - 128));
stmt.setByte(4, (byte) (pos2.getBlockY() - 128));
stmt.setInt(5, pos1.getBlockZ());
stmt.setInt(6, pos2.getBlockZ());
stmt.setInt(7, (int) (minTime / 1000));
if (uuid != null) {
byte[] uuidBytes = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
stmt.setBytes(8, uuidBytes);
}
ResultSet result = stmt.executeQuery();
if (!result.next()) {
TaskManager.IMP.taskNow(whenDone, false);
return;
}
do {
byte[] uuidBytes = result.getBytes(1);
int index = result.getInt(2);
ByteBuffer bb = ByteBuffer.wrap(uuidBytes);
long high = bb.getLong();
long low = bb.getLong();
DiskStorageHistory history = new DiskStorageHistory(world, new UUID(high, low), index);
if (history.getBDFile().exists()) {
onEach.run(history);
}
} while (result.next());
TaskManager.IMP.taskNow(whenDone, false);
} catch (SQLException e) {
e.printStackTrace();
}
if (delete && uuid != null) {
try (PreparedStatement stmt = connection.prepareStatement(DELETE_EDITS_USER)) {
stmt.setInt(1, pos1.getBlockX());
stmt.setInt(2, pos2.getBlockX());
stmt.setByte(3, (byte) (pos1.getBlockY() - 128));
@ -141,45 +174,11 @@ public class RollbackDatabase extends AsyncNotifyQueue {
stmt.setInt(5, pos1.getBlockZ());
stmt.setInt(6, pos2.getBlockZ());
stmt.setInt(7, (int) (minTime / 1000));
if (uuid != null) {
byte[] uuidBytes = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
stmt.setBytes(8, uuidBytes);
}
ResultSet result = stmt.executeQuery();
if (!result.next()) {
TaskManager.IMP.taskNow(whenDone, false);
return;
}
do {
byte[] uuidBytes = result.getBytes(1);
int index = result.getInt(2);
ByteBuffer bb = ByteBuffer.wrap(uuidBytes);
long high = bb.getLong();
long low = bb.getLong();
DiskStorageHistory history = new DiskStorageHistory(world, new UUID(high, low), index);
if (history.getBDFile().exists()) {
onEach.run(history);
}
} while (result.next());
TaskManager.IMP.taskNow(whenDone, false);
byte[] uuidBytes = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
stmt.setBytes(8, uuidBytes);
} catch (SQLException e) {
e.printStackTrace();
}
if (delete && uuid != null) {
try (PreparedStatement stmt = connection.prepareStatement(DELETE_EDITS_USER)) {
stmt.setInt(1, pos1.getBlockX());
stmt.setInt(2, pos2.getBlockX());
stmt.setByte(3, (byte) (pos1.getBlockY() - 128));
stmt.setByte(4, (byte) (pos2.getBlockY() - 128));
stmt.setInt(5, pos1.getBlockZ());
stmt.setInt(6, pos2.getBlockZ());
stmt.setInt(7, (int) (minTime / 1000));
byte[] uuidBytes = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
stmt.setBytes(8, uuidBytes);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
});
}
@ -216,10 +215,8 @@ public class RollbackDatabase extends AsyncNotifyQueue {
return false;
}
RollbackOptimizedHistory[] copy = new RollbackOptimizedHistory[size];
for (int i = 0; i < size; i++) {
copy[i] = historyChanges.poll();
}
RollbackOptimizedHistory[] copy = IntStream.range(0, size)
.mapToObj(i -> historyChanges.poll()).toArray(RollbackOptimizedHistory[]::new);
try (PreparedStatement stmt = connection.prepareStatement(INSERT_EDIT)) {
for (RollbackOptimizedHistory change : copy) {
@ -276,7 +273,7 @@ public class RollbackDatabase extends AsyncNotifyQueue {
dbLocation.createNewFile();
} catch (IOException e) {
e.printStackTrace();
Fawe.debug("&cUnable to create database!");
log.debug("Unable to create the database!");
}
}
Class.forName("org.sqlite.JDBC");
@ -330,7 +327,6 @@ public class RollbackDatabase extends AsyncNotifyQueue {
* Checks if a connection is open with the database
*
* @return true if the connection is open
* @throws SQLException if the connection cannot be checked
*/
public boolean checkConnection() {
try {

View File

@ -18,9 +18,12 @@ import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.GZIPInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CorruptSchematicStreamer {
private final Logger log = LoggerFactory.getLogger(CorruptSchematicStreamer.class);
private final InputStream stream;
private final UUID uuid;
private LinearClipboard fc;
@ -65,10 +68,9 @@ public class CorruptSchematicStreamer {
matchIndex = 0;
}
}
Fawe.debug(" - Recover " + matchTag + " = success");
log.debug(" - Recover " + matchTag + " = success");
} catch (Throwable e) {
Fawe.debug(" - Recover " + matchTag + " = partial failure");
e.printStackTrace();
log.error(" - Recover " + matchTag + " = partial failure", e);
}
}
@ -78,7 +80,7 @@ public class CorruptSchematicStreamer {
}
BlockVector3 dimensions = guessDimensions(volume.get(), width.get(), height.get(), length.get());
if (width.get() == 0 || height.get() == 0 || length.get() == 0) {
Fawe.debug("No dimensions found! Estimating based on factors:" + dimensions);
log.debug("No dimensions found! Estimating based on factors:" + dimensions);
}
if (Settings.IMP.CLIPBOARD.USE_DISK) {
fc = new DiskOptimizedClipboard(dimensions, uuid);

View File

@ -173,10 +173,12 @@ public class MCAChunk implements IChunk {
return root;
}
@Override
public int getX() {
return chunkX;
}
@Override
public int getZ() {
return chunkZ;
}
@ -435,6 +437,7 @@ public class MCAChunk implements IChunk {
return true;
}
@Override
public void setEntity(CompoundTag entityTag) {
setModified();
long least = entityTag.getLong("UUIDLeast");
@ -464,6 +467,7 @@ public class MCAChunk implements IChunk {
return true;
}
@Override
public Set<CompoundTag> getEntities() {
return new HashSet<>(entities.values());
}
@ -505,6 +509,7 @@ public class MCAChunk implements IChunk {
return null;
}
@Override
public Set<UUID> getEntityRemoves() {
return new HashSet<>();
}
@ -542,6 +547,7 @@ public class MCAChunk implements IChunk {
Arrays.fill(this.biomes, biome);
}
@Override
public void removeEntity(UUID uuid) {
entities.remove(uuid);
}

View File

@ -1,6 +1,7 @@
package com.boydti.fawe.jnbt.anvil;
import com.boydti.fawe.Fawe;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.beta.Trimable;
import com.boydti.fawe.beta.implementation.IChunkExtent;
@ -18,7 +19,6 @@ import com.sk89q.worldedit.world.World;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
@ -40,7 +40,7 @@ import java.util.zip.InflaterInputStream;
/**
* Chunk format: http://minecraft.gamepedia.com/Chunk_format#Entity_format
* e.g.: `.Level.Entities.#` (Starts with a . as the root tag is unnamed)
* e.g., `.Level.Entities.#` (Starts with a . as the root tag is unnamed)
* Note: This class isn't thread safe. You can use it in an async thread, but not multiple at the same time
*/
public class MCAFile extends ExtentBatchProcessorHolder implements Trimable, IChunkExtent {
@ -291,7 +291,7 @@ public class MCAFile extends ExtentBatchProcessorHolder implements Trimable, ICh
if (offset < offsets.length) {
offsets[offset] = i;
} else {
Fawe.debug("Ignoring invalid offset " + offset);
getLogger(MCAFile.class).debug("Ignoring invalid offset " + offset);
}
}
}
@ -707,4 +707,4 @@ public class MCAFile extends ExtentBatchProcessorHolder implements Trimable, ICh
}
}
}
}
}

View File

@ -51,9 +51,9 @@ public class ClipboardSpline extends Spline {
* to the first node, 0.25 to the second, 0.5 to the third, ... .<br>
* By providing this method with the amount of nodes used by the interpolation implementation the distribution of the
* nodes is converted to a proportional distribution based on the length between two adjacent nodes calculated by {@link Interpolation#arcLength(double, double)}.<br>
* This means that the distance between two positions used to paste the clipboard (e.g. 0.75 - 0.5 = 0.25) on the curve
* will always amount to that part of the length (e.g. 40 units) of the curve. In this example it would amount to
* 0.25 * 40 = 10 units of curve length between these two positions.
* This means that the distance between two positions used to paste the clipboard (e.g., 0.75 - 0.5 = 0.25) on the curve
* will always amount to that part of the length (e.g., 40 units) of the curve. In this example it would amount to
* 0.25 × 40 = 10 units of curve length between these two positions.
* <p>
* Be advised that currently subsequent changes to the interpolation parameters may not be supported.
* @param editSession The EditSession which will be used when pasting the clipboard content
@ -115,4 +115,4 @@ public class ClipboardSpline extends Spline {
return operation instanceof ForwardExtentCopy ? ((ForwardExtentCopy) operation).getAffected() : 0;
}
}
}

View File

@ -49,7 +49,7 @@ public abstract class Spline {
* to the first node, 0.25 to the second, 0.5 to the third, ... .<br>
* By providing this method with the amount of nodes used by the interpolation implementation the distribution of the
* nodes is converted to a proportional distribution based on the length between two adjacent nodes calculated by {@link Interpolation#arcLength(double, double)}.<br>
* This means that the distance between two positions used to paste the clipboard (e.g. 0.75 - 0.5 = 0.25) on the curve
* This means that the distance between two positions used to paste the clipboard (e.g., 0.75 - 0.5 = 0.25) on the curve
* will always amount to that part of the length (e.g. 40 units) of the curve. In this example it would amount to
* 0.25 * 40 = 10 units of curve length between these two positions.
* <p>
@ -73,7 +73,7 @@ public abstract class Spline {
* Set the forward direction of the structure.<br>
* This direction is used to determine the rotation of the clipboard to align to the curve. The horizontal slope
* of the curve for a specific point is calculated by {@link Interpolation#get1stDerivative(double)}.
* Subsequently this angle between this vector and the gradient vector is calculated and the clipboard content
* Subsequently, this angle between this vector, and the gradient vector is calculated, and the clipboard content
* is rotated by that angle to follow the curve slope.
* <p>
* The default direction is a (1;0) vector (pointing in the positive x-direction).
@ -87,7 +87,7 @@ public abstract class Spline {
* Get the forward direction of the structure.<br>
* This direction is used to determine the rotation of the clipboard to align to the curve. The horizontal slope
* of the curve for a specific point is calculated by {@link Interpolation#get1stDerivative(double)}.
* Subsequently this angle between this vector and the gradient vector is calculated and the clipboard content
* Subsequently, this angle between this vector, and the gradient vector is calculated, and the clipboard content
* is rotated by that angle to follow the curve slope.
* <p>
* The default direction is a (1;0) vector (pointing in the positive x-direction).
@ -192,4 +192,4 @@ public abstract class Spline {
this.flexLength = flexLength;
}
}
}
}

View File

@ -1,5 +1,7 @@
package com.boydti.fawe.object.brush.visualization.cfi;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.beta.IBlocks;
@ -1982,7 +1984,7 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
@Override
public IChunkGet get(int x, int z) {
Fawe.debug("Should not be using buffering with HMMG");
getLogger(HeightMapMCAGenerator.class).debug("Should not be using buffering with HMMG");
return new FallbackChunkGet(this, x, z);
}
}

View File

@ -1,6 +1,8 @@
package com.boydti.fawe.object.change;
import com.boydti.fawe.Fawe;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
import com.boydti.fawe.util.ExtentTraverser;
import com.sk89q.worldedit.WorldEditException;
@ -9,9 +11,6 @@ import com.sk89q.worldedit.history.change.Change;
import java.io.File;
import java.io.IOException;
import static com.google.common.base.Preconditions.checkNotNull;
public class CFIChange implements Change {
private final File file;
@ -25,7 +24,7 @@ public class CFIChange implements Change {
if (found != null) {
return found.get();
}
Fawe.debug("FAWE does not support: " + context.getExtent() + " for " + getClass() + " (bug Empire92)");
getLogger(CFIChange.class).debug("FAWE does not support: " + context.getExtent() + " for " + getClass() + " (bug Empire92)");
return null;
}

View File

@ -1,6 +1,7 @@
package com.boydti.fawe.object.change;
import com.boydti.fawe.Fawe;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.beta.IQueueExtent;
import com.boydti.fawe.util.MathMan;
import com.sk89q.jnbt.CompoundTag;
@ -15,7 +16,6 @@ import com.sk89q.worldedit.history.change.Change;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.entity.EntityType;
import com.sk89q.worldedit.world.entity.EntityTypes;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@ -59,7 +59,7 @@ public class MutableEntityChange implements Change {
most = ((LongTag) map.get("PersistentIDMSB")).getValue();
least = ((LongTag) map.get("PersistentIDLSB")).getValue();
} else {
Fawe.debug("Skipping entity without uuid.");
getLogger(MutableEntityChange.class).debug("Skipping entity without uuid.");
return;
}
List<DoubleTag> pos = (List<DoubleTag>) map.get("Pos").getValue();
@ -74,7 +74,7 @@ public class MutableEntityChange implements Change {
Map<String, Tag> map = tag.getValue();
Tag posTag = map.get("Pos");
if (posTag == null) {
Fawe.debug("Missing pos tag: " + tag);
getLogger(MutableEntityChange.class).debug("Missing pos tag: " + tag);
return;
}
List<DoubleTag> pos = (List<DoubleTag>) posTag.getValue();

View File

@ -1,5 +1,7 @@
package com.boydti.fawe.object.changeset;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweAPI;
import com.boydti.fawe.FaweCache;
@ -270,7 +272,7 @@ public abstract class FaweChangeSet implements ChangeSet, IBatchProcessor {
} else if (change.getClass() == EntityRemove.class) {
add((EntityRemove) change);
} else {
Fawe.debug("Unknown change: " + change.getClass());
getLogger(FaweChangeSet.class).debug("Unknown change: " + change.getClass());
}
}

View File

@ -5,7 +5,7 @@
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>

View File

@ -1,6 +1,7 @@
package com.boydti.fawe.object.schematic;
import com.boydti.fawe.Fawe;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.util.ReflectionUtils;
import com.sk89q.jnbt.CompoundTag;
@ -59,6 +60,7 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
return read(UUID.randomUUID());
}
@Override
public Clipboard read(UUID clipboardId) throws IOException {
NamedTag rootTag = inputStream.readNamedTag();
@ -158,7 +160,7 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
int height = region.getHeight();
int length = region.getLength();
if (width > WARN_SIZE || height > WARN_SIZE || length > WARN_SIZE) {
Fawe.debug("A structure longer than 32 is unsupported by minecraft (but probably still works)");
getLogger(MinecraftStructure.class).debug("A structure longer than 32 is unsupported by minecraft (but probably still works)");
}
Map<String, Object> structure = FaweCache.IMP.asMap("version", 1, "author", owner);
// ignored: version / owner

View File

@ -1,7 +1,7 @@
package com.boydti.fawe.regions.general.integrations.plotquared;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweAPI;
import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.regions.FaweMaskManager;
import com.boydti.fawe.regions.general.RegionFilter;
@ -25,24 +25,31 @@ import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionIntersection;
import com.sk89q.worldedit.world.World;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import com.sk89q.worldedit.world.World;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlotSquaredFeature extends FaweMaskManager {
private static final Logger log = LoggerFactory.getLogger(PlotSquaredFeature.class);
public PlotSquaredFeature() {
super("PlotSquared");
Fawe.debug("Optimizing PlotSquared");
log.debug("Optimizing PlotSquared");
if (com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_HOOK) {
Settings.Enabled_Components.WORLDEDIT_RESTRICTIONS = false;
setupBlockQueue();
setupSchematicHandler();
setupChunkManager();
try {
setupBlockQueue();
setupSchematicHandler();
setupChunkManager();
} catch (Throwable ignored) {
log.debug("Please update PlotSquared: http://ci.athion.net/job/PlotSquared/");
}
if (Settings.PLATFORM.equalsIgnoreCase("bukkit")) {
new FaweTrim();
}
@ -57,7 +64,7 @@ public class PlotSquaredFeature extends FaweMaskManager {
new ReplaceAll();
}
} catch (Throwable e) {
Fawe.debug("You need to update PlotSquared to access the CFI and REPLACEALL commands");
log.debug("You need to update PlotSquared to access the CFI and REPLACEALL commands");
}
*/
}
@ -66,35 +73,23 @@ public class PlotSquaredFeature extends FaweMaskManager {
return UUIDHandler.getName(uuid);
}
private void setupBlockQueue() {
try {
// If it's going to fail, throw an error now rather than later
QueueProvider provider = QueueProvider.of(FaweLocalBlockQueue.class, null);
GlobalBlockQueue.IMP.setProvider(provider);
HybridPlotManager.REGENERATIVE_CLEAR = false;
Fawe.debug(" - QueueProvider: " + FaweLocalBlockQueue.class);
Fawe.debug(" - HybridPlotManager.REGENERATIVE_CLEAR: " + HybridPlotManager.REGENERATIVE_CLEAR);
} catch (Throwable e) {
Fawe.debug("Please update PlotSquared: http://ci.athion.net/job/PlotSquared/");
}
private void setupBlockQueue() throws RuntimeException {
// If it's going to fail, throw an error now rather than later
QueueProvider provider = QueueProvider.of(FaweLocalBlockQueue.class, null);
GlobalBlockQueue.IMP.setProvider(provider);
HybridPlotManager.REGENERATIVE_CLEAR = false;
log.debug(" - QueueProvider: " + FaweLocalBlockQueue.class);
log.debug(" - HybridPlotManager.REGENERATIVE_CLEAR: " + HybridPlotManager.REGENERATIVE_CLEAR);
}
private void setupChunkManager() {
try {
ChunkManager.manager = new FaweChunkManager(ChunkManager.manager);
Fawe.debug(" - ChunkManager: " + ChunkManager.manager);
} catch (Throwable e) {
Fawe.debug("Please update PlotSquared: http://ci.athion.net/job/PlotSquared/");
}
private void setupChunkManager() throws RuntimeException {
ChunkManager.manager = new FaweChunkManager(ChunkManager.manager);
log.debug(" - ChunkManager: " + ChunkManager.manager);
}
private void setupSchematicHandler() {
try {
SchematicHandler.manager = new FaweSchematicHandler();
Fawe.debug(" - SchematicHandler: " + SchematicHandler.manager);
} catch (Throwable e) {
Fawe.debug("Please update PlotSquared: http://ci.athion.net/job/PlotSquared/");
}
private void setupSchematicHandler() throws RuntimeException {
SchematicHandler.manager = new FaweSchematicHandler();
log.debug(" - SchematicHandler: " + SchematicHandler.manager);
}
public boolean isAllowed(Player player, Plot plot, MaskType type) {
@ -128,9 +123,9 @@ public class PlotSquaredFeature extends FaweMaskManager {
PlotArea area = pp.getApplicablePlotArea();
int min = area != null ? area.MIN_BUILD_HEIGHT : 0;
int max = area != null ? Math.min(255, area.MAX_BUILD_HEIGHT) : 255;
final HashSet<com.boydti.fawe.object.RegionWrapper> faweRegions = new HashSet<>();
final HashSet<RegionWrapper> faweRegions = new HashSet<>();
for (CuboidRegion current : regions) {
faweRegions.add(new com.boydti.fawe.object.RegionWrapper(current.getMinimumX(), current.getMaximumX(), min, max, current.getMinimumZ(), current.getMaximumZ()));
faweRegions.add(new RegionWrapper(current.getMinimumX(), current.getMaximumX(), min, max, current.getMinimumZ(), current.getMaximumZ()));
}
final CuboidRegion region = regions.iterator().next();
final BlockVector3 pos1 = BlockVector3.at(region.getMinimumX(), min, region.getMinimumZ());

View File

@ -1,6 +1,7 @@
package com.boydti.fawe.util;
import com.boydti.fawe.Fawe;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.object.brush.BrushSettings;
import com.google.gson.Gson;
@ -12,7 +13,6 @@ import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.blocks.BaseItem;
import com.sk89q.worldedit.command.tool.BrushTool;
import com.sk89q.worldedit.entity.Player;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
@ -51,8 +51,7 @@ public final class BrushCache {
brushCache.put(key, tool);
return tool;
} catch (Exception throwable) {
throwable.printStackTrace();
Fawe.debug("Invalid brush for " + player + " holding " + item.getType() + ": " + json.getValue());
getLogger(BrushCache.class).debug("Invalid brush for " + player + " holding " + item.getType() + ": " + json.getValue(), throwable);
item.setNbtData(null);
brushCache.remove(key);
} finally {

View File

@ -94,7 +94,7 @@ public final class DocumentationPrinter {
stream.print(" - `[arg]` - An optional parameter \n");
stream.print(" - `<arg1|arg2>` - Multiple parameters options \n");
stream.print(" - `<arg=value>` - Default or suggested value \n");
stream.print(" - `-a` - A command flag e.g. `//<command> -a [flag-value]`");
stream.print(" - `-a` - A command flag e.g., `//<command> -a [flag-value]`");
stream.println();
stream.print("## See also\n");
stream.print(" - [Masks](https://github.com/boy0001/FastAsyncWorldedit/wiki/WorldEdit---FAWE-mask-list)\n");

View File

@ -242,16 +242,16 @@ public class EditSessionBuilder {
return toReturn;
}
}
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");
Fawe.debug("&8 - &7To allow this plugin add it to the FAWE `allowed-plugins` list");
Fawe.debug("&8 - &7To hide this message set `debug` to false in the FAWE config.yml");
if (Settings.IMP.EXTENT.DEBUG && event.getActor() != null) {
event.getActor().printDebug("Potentially unsafe extent blocked: " + toReturn.getClass().getName());
event.getActor().printDebug(" - For area restrictions, it is recommended to use the FaweAPI");
event.getActor().printDebug(" - For block logging, it is recommended to use use BlocksHub");
event.getActor().printDebug(" - To allow this plugin add it to the FAWE `allowed-plugins` list");
event.getActor().printDebug(" - To hide this message set `debug` to false in the FAWE config.yml");
if (toReturn.getClass().getName().contains("CoreProtect")) {
Fawe.debug("Note on CoreProtect: ");
Fawe.debug(" - If you disable CP's WE logger (CP config) and this still shows, please update CP");
Fawe.debug(" - Use BlocksHub and set `debug` false in the FAWE config");
event.getActor().printDebug("Note on CoreProtect: ");
event.getActor().printDebug(" - If you disable CP's WE logger (CP config) and this still shows, please update CP");
event.getActor().printDebug(" - Use BlocksHub and set `debug` false in the FAWE config");
}
}
}

View File

@ -1,6 +1,7 @@
package com.boydti.fawe.util;
import com.boydti.fawe.Fawe;
import static org.slf4j.LoggerFactory.getLogger;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.URL;
@ -10,35 +11,36 @@ import java.util.Base64;
public enum Jars {
MM_v1_7_3("https://github.com/InventivetalentDev/MapManager/releases/download/1.7.3-SNAPSHOT/MapManager_v1.7.3-SNAPSHOT.jar",
"M3YLUQZZ66K2DMVDCYLEU38U3ZKRKHRAXQGGPVKFO6G=", 554831),
MM_v1_7_3(
"https://github.com/InventivetalentDev/MapManager/releases/download/1.7.3-SNAPSHOT/MapManager_v1.7.3-SNAPSHOT.jar",
"M3YLUQZZ66K2DMVDCYLEU38U3ZKRKHRAXQGGPVKFO6G=", 554831),
PL_v3_7_3("https://github.com/InventivetalentDev/PacketListenerAPI/releases/download/3.7.3-SNAPSHOT/PacketListenerAPI_v3.7.3-SNAPSHOT.jar",
"ETDBRZLN5PRVDFR/MSQDPM6JJER3WQOKHCN8FUXO5ZM=", 167205),
PL_v3_7_3(
"https://github.com/InventivetalentDev/PacketListenerAPI/releases/download/3.7.3-SNAPSHOT/PacketListenerAPI_v3.7.3-SNAPSHOT.jar",
"ETDBRZLN5PRVDFR/MSQDPM6JJER3WQOKHCN8FUXO5ZM=", 167205),
;
public final String url;
public final int filesize;
public final int fileSize;
public final String digest;
/**
* @param url
* Where this jar can be found and downloaded
* @param digest
* The SHA-256 hexadecimal digest
* @param filesize
* Size of this jar in bytes
* @param url Where this jar can be found and downloaded
* @param digest The SHA-256 hexadecimal digest
* @param fileSize Size of this jar in bytes
*/
Jars(String url, String digest, int filesize) {
Jars(String url, String digest, int fileSize) {
this.url = url;
this.digest = digest.toUpperCase();
this.filesize = filesize;
this.fileSize = fileSize;
}
/** download a jar, verify hash, return byte[] containing the jar */
/**
* Download a jar, verify hash, return byte[] containing the jar
*/
public byte[] download() throws IOException {
byte[] jarBytes = new byte[this.filesize];
byte[] jarBytes = new byte[this.fileSize];
URL url = new URL(this.url);
try (DataInputStream dis = new DataInputStream(url.openConnection().getInputStream())) {
dis.readFully(jarBytes);
@ -51,14 +53,13 @@ public enum Jars {
String jarDigest = Base64.getEncoder().encodeToString(jarDigestBytes).toUpperCase();
if (this.digest.equals(jarDigest)) {
Fawe.debug("++++ HASH CHECK ++++");
Fawe.debug(this.url);
Fawe.debug(this.digest);
getLogger(Jars.class).debug("++++ HASH CHECK ++++");
getLogger(Jars.class).debug(this.url);
getLogger(Jars.class).debug(this.digest);
return jarBytes;
} else {
Fawe.debug(jarDigest + " | " + url);
throw new IllegalStateException("downloaded jar does not match the hash");
getLogger(Jars.class).debug(jarDigest + " | " + url);
throw new IllegalStateException("The downloaded jar does not match the hash");
}
} catch (NoSuchAlgorithmException e) {
// Shouldn't ever happen, Minecraft won't even run on such a JRE

View File

@ -1,5 +1,8 @@
package com.boydti.fawe.util;
import static java.lang.System.arraycopy;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.config.Settings;
@ -24,18 +27,7 @@ import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
import com.sk89q.worldedit.history.changeset.ChangeSet;
import com.sk89q.worldedit.util.Location;
import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream;
import net.jpountz.lz4.LZ4BlockInputStream;
import net.jpountz.lz4.LZ4BlockOutputStream;
import net.jpountz.lz4.LZ4Compressor;
import net.jpountz.lz4.LZ4Factory;
import net.jpountz.lz4.LZ4FastDecompressor;
import net.jpountz.lz4.LZ4InputStream;
import net.jpountz.lz4.LZ4Utils;
import javax.annotation.Nullable;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@ -84,8 +76,15 @@ import java.util.zip.GZIPInputStream;
import java.util.zip.Inflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import static java.lang.System.arraycopy;
import javax.annotation.Nullable;
import javax.imageio.ImageIO;
import net.jpountz.lz4.LZ4BlockInputStream;
import net.jpountz.lz4.LZ4BlockOutputStream;
import net.jpountz.lz4.LZ4Compressor;
import net.jpountz.lz4.LZ4Factory;
import net.jpountz.lz4.LZ4FastDecompressor;
import net.jpountz.lz4.LZ4InputStream;
import net.jpountz.lz4.LZ4Utils;
public class MainUtil {
@ -374,7 +373,7 @@ public class MainUtil {
public static URL upload(String urlStr, boolean save, String uuid, String file, String extension, final RunnableVal<OutputStream> writeTask) {
if (writeTask == null) {
Fawe.debug("&cWrite task cannot be null");
getLogger(MainUtil.class).debug("Write task cannot be null");
return null;
}
String filename = (file == null ? "plot" : file) + (extension != null ? "." + extension : "");
@ -422,7 +421,7 @@ public class MainUtil {
content = scanner.next().trim();
}
if (!content.startsWith("<")) {
Fawe.debug(content);
getLogger(MainUtil.class).debug(content);
}
if (responseCode == 200) {
return url;
@ -600,8 +599,7 @@ public class MainUtil {
return newFile;
}
} catch (IOException e) {
e.printStackTrace();
Fawe.debug("&cCould not save " + resource);
getLogger(MainUtil.class).debug("Could not save " + resource, e);
}
return null;
}

View File

@ -1,5 +1,7 @@
package com.boydti.fawe.util;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
import com.boydti.fawe.config.Settings;
@ -66,7 +68,7 @@ public abstract class TaskManager {
}
/**
* Run a buch of tasks in parallel using the shared thread pool
* Run a bunch of tasks in parallel using the shared thread pool
*
* @param runnables
*/
@ -80,8 +82,8 @@ public abstract class TaskManager {
/**
* Run a bunch of tasks in parallel
*
* @param runnables The tasks to run
* @param numThreads Number of threads (null = config.yml parallel threads)
* @param runnables the tasks to run
* @param numThreads number of threads (null = config.yml parallel threads)
*/
@Deprecated
public void parallel(Collection<Runnable> runnables, @Nullable Integer numThreads) {
@ -136,7 +138,6 @@ public abstract class TaskManager {
/**
* Disable async catching for a specific task
*
* @param queue
* @param run
*/
public void runUnsafe(Runnable run) {
@ -231,10 +232,9 @@ public abstract class TaskManager {
* Break up a task and run it in fragments of 5ms.<br>
* - Each task will run on the main thread.<br>
*
* @param objects - The list of objects to run the task for
* @param task - The task to run on each object
* @param whenDone - When the object task completes
* @param <T>
* @param objects the list of objects to run the task for
* @param task the task to run on each object
* @param whenDone when the object task completes
*/
public <T> void objectTask(Collection<T> objects, final RunnableVal<T> task, final Runnable whenDone) {
final Iterator<T> iterator = objects.iterator();
@ -264,7 +264,7 @@ public abstract class TaskManager {
running.wait(timeout);
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");
getLogger(TaskManager.class).debug("For full debug information use: /fawe threads");
}
}
}
@ -291,11 +291,9 @@ public abstract class TaskManager {
/**
* Run a task on the main thread when the TPS is high enough, and wait for execution to finish:<br>
* - Useful if you need to access something from the Bukkit API from another thread<br>
* - Usualy wait time is around 25ms<br>
* - Usually wait time is around 25ms<br>
*
* @param function
* @param timeout - How long to wait for execution
* @param <T>
* @return
*/
public <T> T syncWhenFree(@NotNull final RunnableVal<T> function) {
@ -313,11 +311,9 @@ public abstract class TaskManager {
/**
* Quickly run a task on the main thread, and wait for execution to finish:<br>
* - Useful if you need to access something from the Bukkit API from another thread<br>
* - Usualy wait time is around 25ms<br>
* - Usually wait time is around 25ms<br>
*
* @param function
* @param timeout - How long to wait for execution
* @param <T>
* @return
*/
public <T> T sync(@NotNull final RunnableVal<T> function) {
@ -330,7 +326,6 @@ public abstract class TaskManager {
* - Usually wait time is around 25ms<br>
*
* @param function
* @param <T>
* @return
*/
public <T> T sync(final Supplier<T> function) {

View File

@ -1,5 +1,7 @@
package com.boydti.fawe.util;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.beta.implementation.filter.block.SingleFilterBlock;
import com.boydti.fawe.config.Settings;
@ -18,8 +20,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntArraySet;
import it.unimi.dsi.fastutil.longs.LongArrayList;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
@ -607,8 +607,8 @@ public class TextureUtil implements TextureHolder {
}
}
if (files.length == 0) {
Fawe.debug(
"Please create a `FastAsyncWorldEdit/textures` folder with `.minecraft/versions/1.13.jar` jar or mods in it. If the file exists, please make sure the server has read access to the directory");
getLogger(TextureUtil.class).debug(
"Please create a `FastAsyncWorldEdit/textures` folder with `.minecraft/versions/1.14.jar` jar or mods in it. If the file exists, please make sure the server has read access to the directory");
} else {
for (File file : files) {
ZipFile zipFile = new ZipFile(file);

View File

@ -33,9 +33,9 @@ public class ImageUtil {
BufferedImage scaledImage = image;
int width, height;
if (higherQuality) {
// Use multi-step technique: start with original size, then
// scale down in multiple passes with drawImage()
// until the target size is reached
/* Use multi-step technique: start with original size, then
scale down in multiple passes with drawImage()
until the target size is reached. */
width = scaledImage.getWidth();
height = scaledImage.getHeight();
} else {

View File

@ -80,7 +80,7 @@ public class TaskBuilder extends Metadatable {
/**
* Run some sync tasks in parallel<br>
* - All sync parallel tasks which occur directly after each other will be run at the same time
* - All sync parallel tasks, which occur directly after each other will be run at the same time
*
* @param run
* @return this
@ -200,7 +200,7 @@ public class TaskBuilder extends Metadatable {
/**
* Have all async tasks run on a new thread<br>
* - As opposed to trying to using the current thread
* - As opposed to trying to use the current thread
*/
public void buildAsync() {
TaskManager.IMP.async(this::build);

View File

@ -20,10 +20,8 @@
package com.sk89q.jnbt;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.util.Location;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@ -269,7 +267,7 @@ public class CompoundTag extends Tag {
*
* <p>If the key does not exist or its value is not a list tag,
* then an empty list will be returned. If the given key references
* a list but the list of of a different type, then an empty
* a list but the list of a different type, then an empty
* list will also be returned.</p>
*
* @param key the key
@ -295,7 +293,7 @@ public class CompoundTag extends Tag {
/**
* Get a {@code long[]} named with the given key.
*
* <p>If the key does not exist or its value is not an long array tag,
* <p>If the key does not exist or its value is not a long array tag,
* then an empty array will be returned.</p>
*
* @param key the key

View File

@ -19,8 +19,6 @@
package com.sk89q.jnbt;
import com.sk89q.worldedit.math.BlockVector3;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

View File

@ -53,7 +53,7 @@ public class CommandException extends Exception {
/**
* Gets the command that was called, which will include the sub-command
* (i.e. "/br sphere").
* (i.e., "/br sphere").
*
* @param prefix the command shebang character (such as "/") -- may be empty
* @param spacedSuffix a suffix to put at the end (optional) -- may be null

View File

@ -62,11 +62,11 @@ public class YAMLNode {
/**
* Gets a property at a location. This will either return an Object
* or null, with null meaning that no configuration value exists at
* or null, with null meaning no configuration value exists at
* that location. This could potentially return a default value (not yet
* implemented) as defined by a plugin, if this is a plugin-tied
* configuration.
*
*
* @param path path to node (dot notation)
* @return object or null
*/
@ -107,7 +107,7 @@ public class YAMLNode {
/**
* Prepare a value for serialization, in case it's not a native type
* (and we don't want to serialize objects as YAML objects).
*
*
* @param value the value to serialize
* @return the new object
*/
@ -146,7 +146,7 @@ public class YAMLNode {
/**
* Set the property at a location. This will override existing
* configuration data to have it conform to key/value mappings.
*
*
* @param path the path
* @param value the new value
*/
@ -185,7 +185,7 @@ public class YAMLNode {
* Adds a new node to the given path. The returned object is a reference
* to the new node. This method will replace an existing node at
* the same path. See {@code setProperty}.
*
*
* @param path the path
* @return a node for the path
*/
@ -197,11 +197,11 @@ public class YAMLNode {
}
/**
* Gets a string at a location. This will either return an String
* Gets a string at a location. This will either return a String
* or null, with null meaning that no configuration value exists at
* that location. If the object at the particular location is not actually
* a string, it will be converted to its string representation.
*
*
* @param path path to node (dot notation)
* @return string or null
*/
@ -214,10 +214,10 @@ public class YAMLNode {
}
/**
* Gets a vector at a location. This will either return an Vector
* Gets a vector at a location. This will either return a Vector
* or a null. If the object at the particular location is not
* actually a string, it will be converted to its string representation.
*
*
* @param path path to node (dot notation)
* @return string or default
*/
@ -239,10 +239,10 @@ public class YAMLNode {
}
/**
* Gets a 2D vector at a location. This will either return an Vector
* Gets a 2D vector at a location. This will either return a Vector
* or a null. If the object at the particular location is not
* actually a string, it will be converted to its string representation.
*
*
* @param path path to node (dot notation)
* @return string or default
*/
@ -263,10 +263,10 @@ public class YAMLNode {
}
/**
* Gets a string at a location. This will either return an Vector
* Gets a string at a location. This will either return a Vector
* or the default value. If the object at the particular location is not
* actually a string, it will be converted to its string representation.
*
*
* @param path path to node (dot notation)
* @param def default value
* @return string or default
@ -281,10 +281,10 @@ public class YAMLNode {
}
/**
* Gets a string at a location. This will either return an String
* Gets a string at a location. This will either return a String
* or the default value. If the object at the particular location is not
* actually a string, it will be converted to its string representation.
*
*
* @param path path to node (dot notation)
* @param def default value
* @return string or default
@ -303,7 +303,7 @@ public class YAMLNode {
* or null. If the object at the particular location is not
* actually a integer, the default value will be returned. However, other
* number types will be casted to an integer.
*
*
* @param path path to node (dot notation)
* @return integer or null
*/
@ -321,7 +321,7 @@ public class YAMLNode {
* or the default value. If the object at the particular location is not
* actually a integer, the default value will be returned. However, other
* number types will be casted to an integer.
*
*
* @param path path to node (dot notation)
* @param def default value
* @return int or default
@ -337,11 +337,11 @@ public class YAMLNode {
}
/**
* Gets a double at a location. This will either return an double
* Gets a double at a location. This will either return a double
* or null. If the object at the particular location is not
* actually a double, the default value will be returned. However, other
* number types will be casted to an double.
*
* number types will be casted to a double.
*
* @param path path to node (dot notation)
* @return double or null
*/
@ -355,11 +355,11 @@ public class YAMLNode {
}
/**
* Gets a double at a location. This will either return an double
* Gets a double at a location. This will either return a double
* or the default value. If the object at the particular location is not
* actually a double, the default value will be returned. However, other
* number types will be casted to an double.
*
* number types will be casted to a double.
*
* @param path path to node (dot notation)
* @param def default value
* @return double or default
@ -375,10 +375,10 @@ public class YAMLNode {
}
/**
* Gets a boolean at a location. This will either return an boolean
* Gets a boolean at a location. This will either return a boolean
* or null. If the object at the particular location is not
* actually a boolean, the default value will be returned.
*
*
* @param path path to node (dot notation)
* @return boolean or null
*/
@ -392,10 +392,10 @@ public class YAMLNode {
}
/**
* Gets a boolean at a location. This will either return an boolean
* Gets a boolean at a location. This will either return a boolean
* or the default value. If the object at the particular location is not
* actually a boolean, the default value will be returned.
*
*
* @param path path to node (dot notation)
* @param def default value
* @return boolean or default
@ -413,7 +413,7 @@ public class YAMLNode {
/**
* Get a list of keys at a location. If the map at the particular location
* does not exist or it is not a map, null will be returned.
*
*
* @param path path to node (dot notation)
* @return list of keys
*/
@ -433,7 +433,7 @@ public class YAMLNode {
/**
* Gets a list of objects at a location. If the list is not defined,
* null will be returned. The node must be an actual list.
*
*
* @param path path to node (dot notation)
* @return boolean or default
*/
@ -456,7 +456,7 @@ public class YAMLNode {
* and an empty list will be returned instead. If an item in the list
* is not a string, it will be converted to a string. The node must be
* an actual list and not just a string.
*
*
* @param path path to node (dot notation)
* @param def default value or null for an empty list as default
* @return list of strings
@ -486,7 +486,7 @@ public class YAMLNode {
* default will be returned. 'null' can be passed for the default
* and an empty list will be returned instead. The node must be
* an actual list and not just an integer.
*
*
* @param path path to node (dot notation)
* @param def default value or null for an empty list as default
* @return list of integers
@ -515,7 +515,7 @@ public class YAMLNode {
* default will be returned. 'null' can be passed for the default
* and an empty list will be returned instead. The node must be
* an actual list and cannot be just a double.
*
*
* @param path path to node (dot notation)
* @param def default value or null for an empty list as default
* @return list of integers
@ -544,7 +544,7 @@ public class YAMLNode {
* default will be returned. 'null' can be passed for the default
* and an empty list will be returned instead. The node must be
* an actual list and cannot be just a boolean,
*
*
* @param path path to node (dot notation)
* @param def default value or null for an empty list as default
* @return list of integers
@ -573,7 +573,7 @@ public class YAMLNode {
* default will be returned. 'null' can be passed for the default
* and an empty list will be returned instead. The node must be
* an actual node and cannot be just a vector,
*
*
* @param path path to node (dot notation)
* @param def default value or null for an empty list as default
* @return list of integers
@ -603,7 +603,7 @@ public class YAMLNode {
* default will be returned. 'null' can be passed for the default
* and an empty list will be returned instead. The node must be
* an actual node and cannot be just a vector,
*
*
* @param path path to node (dot notation)
* @param def default value or null for an empty list as default
* @return list of integers
@ -633,7 +633,7 @@ public class YAMLNode {
* default will be returned. 'null' can be passed for the default
* and an empty list will be returned instead. The node must be
* an actual node and cannot be just a vector,
*
*
* @param path path to node (dot notation)
* @param def default value or null for an empty list as default
* @return list of integers
@ -663,7 +663,7 @@ public class YAMLNode {
* default will be returned. 'null' can be passed for the default
* and an empty list will be returned instead. The node must be
* an actual node and cannot be just a boolean,
*
*
* @param path path to node (dot notation)
* @param def default value or null for an empty list as default
* @return list of integers
@ -690,7 +690,7 @@ public class YAMLNode {
* Get a configuration node at a path. If the node doesn't exist or the
* path does not lead to a node, null will be returned. A node has
* key/value mappings.
*
*
* @param path the path
* @return node or null
*/
@ -708,7 +708,7 @@ public class YAMLNode {
/**
* Get a list of nodes at a location. If the map at the particular location
* does not exist or it is not a map, null will be returned.
*
*
* @param path path to node (dot notation)
* @return map of nodes
*/
@ -736,7 +736,7 @@ public class YAMLNode {
/**
* Casts a value to an integer. May return null.
*
*
* @param o the object
* @return an integer or null
*/
@ -788,7 +788,7 @@ public class YAMLNode {
/**
* Remove the property at a location. This will override existing
* configuration data to have it conform to key/value mappings.
*
*
* @param path a path
*/
@SuppressWarnings("unchecked")

View File

@ -445,6 +445,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
* @return whether the queue is enabled
* @deprecated Use {@link EditSession#getReorderMode()} with MULTI_STAGE instead.
*/
@Override
@Deprecated
public boolean isQueueEnabled() {
return true;
@ -456,6 +457,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
* Uses {@link ReorderMode#MULTI_STAGE}
* @deprecated Use {@link EditSession#setReorderMode(ReorderMode)} with MULTI_STAGE instead.
*/
@Override
@Deprecated
public void enableQueue() {
super.enableQueue();
@ -464,6 +466,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
/**
* Disable the queue. This will close the queue.
*/
@Override
@Deprecated
public void disableQueue() {
super.disableQueue();
@ -1537,7 +1540,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
/**
* Drain nearby pools of water or lava, optionally removed waterlogged states from blocks.
*
* @param origin the origin to drain from, which will search a 3x3 area
* @param origin the origin to drain from, which will search a 3×3 area
* @param radius the radius of the removal, where a value should be 0 or greater
* @param waterlogged true to make waterlogged blocks non-waterlogged as well
* @return number of blocks affected
@ -1566,7 +1569,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
}
RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1));
// Around the origin in a 3x3 block
// Around the origin in a 3×3 block
for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
if (mask.test(position)) {
visitor.visit(position);
@ -1607,7 +1610,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
BlockReplace replace = new BlockReplace(this, fluid.getDefaultState());
NonRisingVisitor visitor = new NonRisingVisitor(mask, replace);
// Around the origin in a 3x3 block
// Around the origin in a 3×3 block
for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
if (liquidMask.test(position)) {
visitor.visit(position);

View File

@ -39,7 +39,6 @@ import com.boydti.fawe.util.StringMan;
import com.boydti.fawe.util.TextureHolder;
import com.boydti.fawe.util.TextureUtil;
import com.boydti.fawe.wrappers.WorldWrapper;
import com.google.common.collect.Maps;
import com.sk89q.jchronic.Chronic;
import com.sk89q.jchronic.Options;
import com.sk89q.jchronic.utils.Span;
@ -88,10 +87,8 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
@ -889,7 +886,7 @@ public class LocalSession implements TextureHolder {
/**
* Get the position use for commands that take a center point
* (i.e. //forestgen, etc.).
* (i.e., //forestgen, etc.).
*
* @param actor the actor
* @return the position to use

View File

@ -157,7 +157,7 @@ public class BrushCommands {
aliases = {"bb", "blend"},
desc = "Smooths and blends terrain",
descFooter = "Smooths and blends terrain\n" +
"Pic: https://i.imgur.com/cNUQUkj.png -> https://i.imgur.com/hFOFsNf.png"
"Pic: https://i.imgur.com/cNUQUkj.png https://i.imgur.com/hFOFsNf.png"
)
@CommandPermissions("worldedit.brush.blendball")
public void blendBallBrush(InjectedValueAccess context,
@ -203,7 +203,7 @@ public class BrushCommands {
@Command(
name = "circle",
desc = "Creates a circle which revolves around your facing direction"
desc = "Creates a circle, which revolves around your facing direction"
)
@CommandPermissions("worldedit.brush.sphere")
public void circleBrush(Player player, InjectedValueAccess context,
@ -285,7 +285,7 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.sweep")
public void sweepBrush(Player player, InjectedValueAccess context,
@Arg(name = "copies", desc = "int", def = "-1") int copies) throws WorldEditException {
@Arg(desc = "int", def = "-1") int copies) throws WorldEditException {
player.print(BBC.BRUSH_SPLINE.s());
set(context, new SweepBrush(copies));
}
@ -324,10 +324,11 @@ public class BrushCommands {
@CommandPermissions("worldedit.brush.surfacespline") // 0, 0, 0, 10, 0,
public void surfaceSpline(Player player, InjectedValueAccess context, Pattern fill,
@Arg(desc = "The radius to sample for blending", def = "0")
Expression radius, @Arg(name = "tension", desc = "double", def = "0") double tension,
@Arg(name = "bias", desc = "double", def = "0") double bias,
@Arg(name = "continuity", desc = "double", def = "0") double continuity,
@Arg(name = "quality", desc = "double", def = "10") double quality) throws WorldEditException {
Expression radius,
@Arg(desc = "double", def = "0") double tension,
@Arg(desc = "double", def = "0") double bias,
@Arg(desc = "double", def = "0") double continuity,
@Arg(desc = "double", def = "10") double quality) throws WorldEditException {
player.print(BBC.BRUSH_SPLINE.format(radius));
worldEdit.checkMaxBrushRadius(radius);
set(context,
@ -343,13 +344,13 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.rock")
public void blobBrush(InjectedValueAccess context, Pattern fill,
@Arg(name = "radius", desc = "Vector3", def = "10")
@Arg(desc = "Vector3", def = "10")
Vector3 radius,
@Arg(name = "sphericity", desc = "double", def = "100")
@Arg(desc = "double", def = "100")
double sphericity,
@Arg(name = "frequency", desc = "double", def = "30")
@Arg(desc = "double", def = "30")
double frequency,
@Arg(name = "amplitude", desc = "double", def = "50")
@Arg(desc = "double", def = "50")
double amplitude) throws WorldEditException {
double max = MathMan.max(radius.getX(), radius.getY(), radius.getZ());
worldEdit.checkMaxBrushRadius(max);
@ -424,10 +425,10 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.stencil")
public void stencilBrush(LocalSession session, InjectedValueAccess context, Pattern fill,
@Arg(name = "radius", desc = "Expression", def = "5") Expression radius,
@Arg(name = "image", desc = "String", def = "") String image,
@Arg(desc = "Expression", def = "5") Expression radius,
@Arg(desc = "String", def = "") String image,
@Arg(def = "0", desc = "rotation") @Range(min = 0, max = 360) int rotation,
@Arg(name = "yscale", desc = "double", def = "1") double yscale,
@Arg(desc = "double", def = "1") double yscale,
@Switch(name = 'w', desc = "Apply at maximum saturation") boolean onlyWhite,
@Switch(name = 'r', desc = "Apply random rotation") boolean randomRotate) throws WorldEditException, FileNotFoundException {
worldEdit.checkMaxBrushRadius(radius);
@ -454,7 +455,7 @@ public class BrushCommands {
descFooter = "Use a height map to paint any surface.\n")
@CommandPermissions("worldedit.brush.stencil")
public void imageBrush(LocalSession session, InjectedValueAccess context,
@Arg(name = "radius", desc = "Expression", def = "5")
@Arg(desc = "Expression", def = "5")
Expression radius,
ProvideBindings.ImageUri imageUri,
@Arg(def = "1", desc = "scale height") @Range(min = Double.MIN_NORMAL)
@ -487,7 +488,7 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.surface")
public void surfaceBrush(InjectedValueAccess context, Pattern fill,
@Arg(name = "radius", desc = "Expression", def = "5")
@Arg(desc = "Expression", def = "5")
Expression radius) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
set(context, new SurfaceSphereBrush()).setFill(fill).setSize(radius);
@ -501,16 +502,16 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.scatter")
public void scatterBrush(InjectedValueAccess context, Pattern fill,
@Arg(name = "radius", desc = "Expression", def = "5") Expression radius,
@Arg(name = "points", desc = "double", def = "5") double pointsOpt,
@Arg(name = "distance", desc = "double", def = "1") double distanceOpt,
@Arg(desc = "Expression", def = "5") Expression radius,
@Arg(desc = "double", def = "5") double points,
@Arg(desc = "double", def = "1") double distance,
@Switch(name = 'o', desc = "Overlay the block") boolean overlay) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
Brush brush;
if (overlay) {
brush = new ScatterOverlayBrush((int) pointsOpt, (int) distanceOpt);
brush = new ScatterOverlayBrush((int) points, (int) distance);
} else {
brush = new ScatterBrush((int) pointsOpt, (int) distanceOpt);
brush = new ScatterBrush((int) points, (int) distance);
}
set(context, brush).setSize(radius).setFill(fill);
}
@ -523,8 +524,8 @@ public class BrushCommands {
@CommandPermissions("worldedit.brush.populateschematic")
public void scatterSchemBrush(Player player, InjectedValueAccess context, Mask mask,
@Arg(name = "clipboard", desc = "Clipboard uri") String clipboardStr,
@Arg(name = "radius", desc = "Expression", def = "30") Expression radius,
@Arg(name = "density", desc = "double", def = "50") double density,
@Arg(desc = "Expression", def = "30") Expression radius,
@Arg(desc = "double", def = "50") double density,
@Switch(name = 'r', desc = "Apply random rotation") boolean rotate) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
try {
@ -555,7 +556,7 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.layer")
public void surfaceLayer(InjectedValueAccess context,
@Arg(name = "radius", desc = "Expression") Expression radius, List<BlockState> blockLayers) throws WorldEditException {
@Arg(desc = "Expression") Expression radius, List<BlockState> blockLayers) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
set(context, new LayerBrush(blockLayers.toArray(new BlockState[0]))).setSize(radius);
}
@ -570,12 +571,12 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.splatter")
public void splatterBrush(InjectedValueAccess context, Pattern fill,
@Arg(name = "radius", desc = "Expression", def = "5") Expression radius,
@Arg(name = "points", desc = "double", def = "1") double pointsOpt,
@Arg(name = "recursion", desc = "double", def = "5") double recursion,
@Arg(name = "solid", desc = "boolean", def = "true") boolean solid) throws WorldEditException {
@Arg(desc = "Expression", def = "5") Expression radius,
@Arg(desc = "double", def = "1") double points,
@Arg(desc = "double", def = "5") double recursion,
@Arg(desc = "boolean", def = "true") boolean solid) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
set(context, new SplatterBrush((int) pointsOpt, (int) recursion, solid)).setSize(radius).setFill(fill);
set(context, new SplatterBrush((int) points, (int) recursion, solid)).setSize(radius).setFill(fill);
}
@Command(
@ -590,7 +591,7 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.scattercommand")
public void scatterCommandBrush(Player player, InjectedValueAccess context,
@Arg(name = "radius", desc = "Expression") Expression radius, double points,
@Arg(desc = "Expression") Expression radius, double points,
double distance, List<String> commandStr) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
set(context,
@ -732,7 +733,7 @@ public class BrushCommands {
"Snow Pic: https://i.imgur.com/Hrzn0I4.png"
)
@CommandPermissions("worldedit.brush.height")
public void heightBrush(LocalSession session, @Arg(name = "radius", desc = "Expression", def = "5") Expression radius, @Arg(name = "image", desc = "String", def = "") String image, @Arg(def = "0", desc = "rotation") @Range(min = 0, max = 360) int rotation, @Arg(name = "yscale", desc = "double", def = "1") double yscale, @Switch(name = 'r', desc = "TODO") boolean randomRotate, @Switch(name = 'l', desc = "TODO") boolean layers, @Switch(name = 's', desc = "TODO") boolean dontSmooth, InjectedValueAccess context) throws WorldEditException, FileNotFoundException {
public void heightBrush(LocalSession session, @Arg(desc = "Expression", def = "5") Expression radius, @Arg(desc = "String", def = "") String image, @Arg(def = "0", desc = "rotation") @Range(min = 0, max = 360) int rotation, @Arg(desc = "double", def = "1") double yscale, @Switch(name = 'r', desc = "TODO") boolean randomRotate, @Switch(name = 'l', desc = "TODO") boolean layers, @Switch(name = 's', desc = "TODO") boolean dontSmooth, InjectedValueAccess context) throws WorldEditException, FileNotFoundException {
terrainBrush(session, radius, image, rotation, yscale, false, randomRotate, layers, !dontSmooth, ScalableHeightMap.Shape.CONE, context);
}
@ -744,13 +745,13 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.height")
public void cliffBrush(LocalSession session,
@Arg(name = "radius", desc = "Expression", def = "5")
@Arg(desc = "Expression", def = "5")
Expression radius,
@Arg(name = "image", desc = "String", def = "")
@Arg(desc = "String", def = "")
String image,
@Arg(def = "0", desc = "rotation") @Step(90) @Range(min = 0, max = 360)
int rotation,
@Arg(name = "yscale", desc = "double", def = "1")
@Arg(desc = "double", def = "1")
double yscale,
@Switch(name = 'r', desc = "Enables random off-axis rotation")
boolean randomRotate,
@ -767,7 +768,7 @@ public class BrushCommands {
desc = "This brush raises or lowers land towards the clicked point"
)
@CommandPermissions("worldedit.brush.height")
public void flattenBrush(LocalSession session, @Arg(name = "radius", desc = "Expression", def = "5") Expression radius, @Arg(name = "image", desc = "String", def = "") String image, @Arg(def = "0", desc = "rotation") @Step(90) @Range(min = 0, max = 360) int rotation, @Arg(name = "yscale", desc = "double", def = "1") double yscale,
public void flattenBrush(LocalSession session, @Arg(desc = "Expression", def = "5") Expression radius, @Arg(desc = "String", def = "") String image, @Arg(def = "0", desc = "rotation") @Step(90) @Range(min = 0, max = 360) int rotation, @Arg(desc = "double", def = "1") double yscale,
@Switch(name = 'r', desc = "Enables random off-axis rotation")
boolean randomRotate,
@Switch(name = 'l', desc = "Will work on snow layers")
@ -778,7 +779,7 @@ public class BrushCommands {
}
private void terrainBrush(LocalSession session,
@Arg(name = "radius", desc = "Expression") Expression radius, String image, int rotation,
@Arg(desc = "Expression") Expression radius, String image, int rotation,
double yscale, boolean flat, boolean randomRotate, boolean layers, boolean smooth,
Shape shape, InjectedValueAccess context) throws WorldEditException, FileNotFoundException {
worldEdit.checkMaxBrushRadius(radius);
@ -826,7 +827,7 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.copy")
public void copy(Player player, LocalSession session, InjectedValueAccess context,
@Arg(name = "radius", desc = "Expression", def = "5") Expression radius,
@Arg(desc = "Expression", def = "5") Expression radius,
@Switch(name = 'r', desc = "Apply random rotation on paste") boolean randomRotate,
@Switch(name = 'a', desc = "Apply auto view based rotation on paste") boolean autoRotate) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
@ -847,7 +848,7 @@ public class BrushCommands {
)
@CommandPermissions("worldedit.brush.command")
public void command(InjectedValueAccess context,
@Arg(name = "radius", desc = "Expression") Expression radius,
@Arg(desc = "Expression") Expression radius,
@Arg(desc = "Command to run") List<String> input) throws WorldEditException {
worldEdit.checkMaxBrushRadius(radius);
String cmd = StringMan.join(input, " ");

View File

@ -189,7 +189,7 @@ public class GeneralCommands {
} else {
session.setUseServerCUI(true);
session.updateServerCUI(player);
player.print("Server CUI enabled. This only supports cuboid regions, with a maximum size of 32x32x32.");
player.print("Server CUI enabled. This only supports cuboid regions, with a maximum size of 32×32×32.");
}
}
@ -211,7 +211,7 @@ public class GeneralCommands {
@Command(
name = "gmask",
aliases = {"/gmask"},
descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e. the blocks in the world).",
descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e., the blocks in the world).",
desc = "Set the global mask"
)
@CommandPermissions({"worldedit.global-mask", "worldedit.mask.global"})
@ -308,7 +308,7 @@ public class GeneralCommands {
@Command(
name = "/gtexture",
aliases = {"gtexture"},
descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e. the blocks in the world).",
descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e., the blocks in the world).",
desc = "Set the global mask"
)
@CommandPermissions("worldedit.global-texture")
@ -368,7 +368,7 @@ public class GeneralCommands {
name = "/gsmask",
aliases = {"gsmask", "globalsourcemask", "/globalsourcemask"},
desc = "Set the global source mask",
descFooter = "The global source mask applies to all edits you do and masks based on the source blocks (e.g. the blocks in your clipboard)"
descFooter = "The global source mask applies to all edits you do and masks based on the source blocks (e.g., the blocks in your clipboard)"
)
@CommandPermissions({"worldedit.global-mask", "worldedit.mask.global"})
public void gsmask(Player player, LocalSession session, EditSession editSession, @Arg(desc = "The mask to set", def = "") Mask maskOpt) throws WorldEditException {

View File

@ -130,8 +130,8 @@ public class GenerationCommands {
)
@CommandPermissions("worldedit.generation.image")
@Logging(PLACEMENT)
public void image(Actor actor, LocalSession session, EditSession editSession, String argStr, @Arg(name = "randomize", desc = "boolean", def = "true") boolean randomize,
@Arg(desc = "TODO", def = "100") int threshold, @Arg(name = "dimensions", desc = "BlockVector2", def = "") BlockVector2 dimensions) throws WorldEditException, IOException {
public void image(Actor actor, LocalSession session, EditSession editSession, String argStr, @Arg(desc = "boolean", def = "true") boolean randomize,
@Arg(desc = "TODO", def = "100") int threshold, @Arg(desc = "BlockVector2", def = "") BlockVector2 dimensions) throws WorldEditException, IOException {
TextureUtil tu = Fawe.get().getCachedTextureUtil(randomize, 0, threshold);
URL url = new URL(argStr);
if (!url.getHost().equalsIgnoreCase("i.imgur.com") && !url.getHost().equalsIgnoreCase("empcraft.com")) {
@ -171,7 +171,7 @@ public class GenerationCommands {
)
@CommandPermissions("worldedit.generation.ore")
@Logging(PLACEMENT)
public void ore(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, Pattern material, @Arg(name="size", desc="Ore vein size") @Range(min = 0) int size, int freq, @Range(min = 0, max = 100) int rarity, @Range(min = 0, max = 255) int minY, @Range(min = 0, max = 255) int maxY, InjectedValueAccess context) throws WorldEditException {
public void ore(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, Pattern material, @Arg(desc="Ore vein size") @Range(min = 0) int size, int freq, @Range(min = 0, max = 100) int rarity, @Range(min = 0, max = 255) int minY, @Range(min = 0, max = 255) int maxY, InjectedValueAccess context) throws WorldEditException {
actor.checkConfirmationRegion(() -> {
editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY);
BBC.VISITOR_BLOCK.send(actor, editSession.getBlockChangeCount());
@ -190,7 +190,7 @@ public class GenerationCommands {
BlockVector2 radius,
@Arg(desc = "The height of the cylinder", def = "1")
int height,
@Range(min = 1) @Arg(name = "thickness", desc = "double", def = "1") double thickness, InjectedValueAccess context) throws WorldEditException {
@Range(min = 1) @Arg(desc = "double", def = "1") double thickness, InjectedValueAccess context) throws WorldEditException {
double max = MathMan.max(radius.getBlockX(), radius.getBlockZ());
worldEdit.checkMaxRadius(max);
BlockVector3 pos = session.getPlacementPosition(actor);
@ -274,15 +274,15 @@ public class GenerationCommands {
@CommandPermissions("worldedit.generation.forest")
@Logging(POSITION)
public int forestGen(Actor actor, LocalSession session, EditSession editSession,
@Arg(name = "size", desc = "The size of the forest, in blocks", def = "10")
int sizeOpt,
@Arg(desc = "The size of the forest, in blocks", def = "10")
int size,
@Arg(desc = "The type of forest", def = "tree")
TreeType type,
@Range(min = 0, max = 100) @Arg(desc = "The density of the forest, between 0 and 100", def = "5")
double density) throws WorldEditException {
checkCommandArgument(0 <= density && density <= 100, "Density must be between 0 and 100");
density /= 100;
int affected = editSession.makeForest(session.getPlacementPosition(actor), sizeOpt, density, type);
int affected = editSession.makeForest(session.getPlacementPosition(actor), size, density, type);
actor.print(affected + " trees created.");
return affected;
}
@ -294,8 +294,8 @@ public class GenerationCommands {
@CommandPermissions("worldedit.generation.pumpkins")
@Logging(POSITION)
public int pumpkins(Actor actor, LocalSession session, EditSession editSession,
@Arg(name = "size", desc = "The size of the patch", def = "10")
int sizeOpt,
@Arg(desc = "The size of the patch", def = "10")
int size,
@Arg(desc = "//TODO", def = "10")
int apothem,
@Arg(desc = "//TODO ", def = "0.02")

View File

@ -67,7 +67,7 @@ import org.enginehub.piston.annotation.param.Arg;
// descFooter = "Patterns determine what blocks are placed\n" +
// " - Use [brackets] for arguments\n" +
// " - Use , to OR multiple\n" +
// "e.g. #surfacespread[10][#existing],andesite\n" +
// "e.g., #surfacespread[10][#existing],andesite\n" +
// "More Info: https://git.io/vSPmA"
//)
@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class)
@ -78,7 +78,7 @@ public class PatternCommands {
aliases = {"#*", "*", ".*"},
desc = "Use the block that is already there"
)
public Pattern existing(Extent extent, @Arg(name = "properties", desc = "String", def = "") String properties) { // TODO FIXME , @Arg(name = "properties", desc = "String", def = "") String properties
public Pattern existing(Extent extent, @Arg(desc = "String", def = "") String properties) { // TODO FIXME , @Arg(name = "properties", desc = "String", def = "") String properties
if (properties == null) return new ExistingPattern(extent);
return new PropertyPattern(extent).addRegex(".*[" + properties + "]");
}
@ -119,16 +119,16 @@ public class PatternCommands {
name = "#anglecolor",
desc = "A darker block based on the existing terrain angle"
)
public Pattern anglecolor(Extent extent, LocalSession session, @Arg(name = "distance", desc = "int", def = "1") int distanceOpt) {
return new AngleColorPattern(extent, session, distanceOpt);
public Pattern anglecolor(Extent extent, LocalSession session, @Arg(desc = "int", def = "1") int distance) {
return new AngleColorPattern(extent, session, distance);
}
@Command(
name = "#angledata",
desc = "Block data based on the existing terrain angle"
)
public Pattern angledata(Extent extent, @Arg(name = "distance", desc = "int", def = "1") int distanceOpt) {
return new DataAnglePattern(extent, distanceOpt);
public Pattern angledata(Extent extent, @Arg(desc = "int", def = "1") int distance) {
return new DataAnglePattern(extent, distance);
}
@Command(
@ -153,7 +153,7 @@ public class PatternCommands {
name = "#desaturate",
desc = "Desaturated color of the existing block"
)
public Pattern desaturate(Extent extent, LocalSession session, @Arg(name = "percent", desc = "double", def = "100") double percent) {
public Pattern desaturate(Extent extent, LocalSession session, @Arg(desc = "double", def = "100") double percent) {
return new DesaturatePattern(extent, percent / 100d, session);
}
@ -177,7 +177,7 @@ public class PatternCommands {
name = "#fullcopy",
desc = "Places your full clipboard at each block"
)
public Pattern fullcopy(Player player, Extent extent, LocalSession session, @Arg(name = "location", desc = "String", def = "#copy") String location, @Arg(name = "rotate", desc = "boolean", def = "false") boolean rotate, @Arg(name = "flip", desc = "boolean", def = "false") boolean flip) throws EmptyClipboardException, InputParseException, IOException {
public Pattern fullcopy(Player player, Extent extent, LocalSession session, @Arg(desc = "String", def = "#copy") String location, @Arg(desc = "boolean", def = "false") boolean rotate, @Arg(desc = "boolean", def = "false") boolean flip) throws EmptyClipboardException, InputParseException, IOException {
List<ClipboardHolder> clipboards;
switch (location.toLowerCase()) {
case "#copy":
@ -313,14 +313,14 @@ public class PatternCommands {
name = "#offset",
desc = "Offset a pattern"
)
public Pattern offset(@Arg(name = "x", desc = "x offset") double x, @Arg(name = "y", desc = "y offset") double y, @Arg(name = "z", desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
public Pattern offset(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
return new OffsetPattern(pattern, (int) x, (int) y, (int) z);
}
@Command(
name = "#surfacespread",
desc = "Applies to only blocks on a surface. Selects a block from provided pattern with a given ranomized offset `[0, <distance>)`. e.g. Use `#existing` to randomly offset blocks in the world, or `#copy` to offset blocks in your clipboard"
desc = "Applies to only blocks on a surface. Selects a block from provided pattern with a given randomized offset `[0, <distance>)`. e.g., Use `#existing` to randomly offset blocks in the world, or `#copy` to offset blocks in your clipboard"
)
public Pattern surfacespread(@Arg(desc = "spread distance (blocks)") double distance, @Arg(desc = "Pattern")Pattern pattern) {
@ -331,7 +331,7 @@ public class PatternCommands {
name = "#solidspread",
desc = "Randomly spread solid blocks"
)
public Pattern solidspread(@Arg(name = "x", desc = "x offset") double x, @Arg(name = "y", desc = "y offset") double y, @Arg(name = "z", desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
public Pattern solidspread(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
return new SolidRandomOffsetPattern(pattern, (int) x, (int) y, (int) z);
}
@ -341,7 +341,7 @@ public class PatternCommands {
aliases = {"#randomoffset"},
desc = "Randomly spread blocks"
)
public Pattern spread(@Arg(name = "x", desc = "x offset") double x, @Arg(name = "y", desc = "y offset") double y, @Arg(name = "z", desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
public Pattern spread(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
return new RandomOffsetPattern(pattern, (int) x, (int) y, (int) z);
}

View File

@ -221,7 +221,7 @@ public class UtilityCommands {
descFooter = "Patterns determine what blocks are placed\n" +
" - Use [brackets] for arguments\n" +
" - Use , to OR multiple\n" +
"e.g. #surfacespread[10][#existing],andesite\n" +
"e.g., #surfacespread[10][#existing],andesite\n" +
"More Info: https://git.io/vSPmA"
)
@CommandQueued(false)
@ -237,7 +237,7 @@ public class UtilityCommands {
" - Use [brackets] for arguments\n" +
" - Use , to OR multiple\n" +
" - Use & to AND multiple\n" +
"e.g. >[stone,dirt],#light[0][5],$jungle\n" +
"e.g., >[stone,dirt],#light[0][5],$jungle\n" +
"More Info: https://git.io/v9r4K"
)
@CommandQueued(false)

View File

@ -20,6 +20,7 @@
package com.sk89q.worldedit.command.tool;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.config.BBC;
@ -83,7 +84,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool
// TODO:
// Serialize methods
// serialize BrushSettings (primary and secondary only if different)
// set transient values e.g. context
// set transient values e.g., context
public enum BrushAction {
PRIMARY,
@ -126,7 +127,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool
}.getType();
Map<String, Object> root = gson.fromJson(json, type);
if (root == null) {
Fawe.debug("Failed to load " + json);
getLogger(BrushTool.class).debug("Failed to load " + json);
return new BrushTool();
}
Map<String, Object> primary = (Map<String, Object>) root.get("primary");

View File

@ -354,7 +354,7 @@ public interface Player extends Entity, Actor {
}
/**
* Get the World the player is editing in (may not match the world they are in)<br/> - e.g. If
* Get the World the player is editing in (may not match the world they are in)<br/> - e.g., If
* they are editing a CFI world.<br/>
*
* @return Editing world
@ -439,12 +439,12 @@ public interface Player extends Entity, Actor {
getSession().setClipboard(holder);
}
} catch (Exception event) {
Fawe.debug("====== INVALID CLIPBOARD ======");
printError("====== INVALID CLIPBOARD ======");
event.printStackTrace();
Fawe.debug("===============---=============");
Fawe.debug("This shouldn't result in any failure");
Fawe.debug("File: " + file.getName() + " (len:" + file.length() + ")");
Fawe.debug("===============---=============");
printError("===============---=============");
printError("This shouldn't result in any failure");
printError("File: " + file.getName() + " (len:" + file.length() + ")");
printError("===============---=============");
}
}
}

View File

@ -1,6 +1,9 @@
package com.sk89q.worldedit.extension.platform.binding;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.StringMan;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.internal.annotation.Selection;
@ -56,7 +59,7 @@ public class Bindings {
Annotation annotation = annotations[0] == binding ? annotations[1] : annotations[0];
key = Key.of(ret, annotation);
} else {
Fawe.debug("Cannot annotate: " + method + " with " + StringMan.getString(annotations));
getLogger(Bindings.class).debug("Cannot annotate: " + method + " with " + StringMan.getString(annotations));
return false;
}

View File

@ -20,14 +20,15 @@
package com.sk89q.worldedit.extent;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.beta.IBatchProcessor;
import com.boydti.fawe.object.HistoryExtent;
import com.boydti.fawe.object.changeset.FaweChangeSet;
import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.object.extent.LightingExtent;
import com.boydti.fawe.util.ExtentTraverser;
import com.boydti.fawe.util.MainUtil;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.entity.BaseEntity;
@ -81,6 +82,7 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
Queue based methods
TODO NOT IMPLEMENTED: IQueueExtent and such need to implement these
*/
@Override
public boolean isQueueEnabled() {
return extent.isQueueEnabled();
}
@ -97,7 +99,7 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
Extent next = ((AbstractDelegateExtent) extent).getExtent();
new ExtentTraverser(this).setNext(next);
} else {
Fawe.debug("Cannot disable queue");
getLogger(AbstractDelegateExtent.class).debug("Cannot disable queue");
}
}
@ -197,9 +199,7 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
return extent.setBiome(position.getX(), 0, position.getZ(), biome);
}
/*
Light
*/
@Override
public int getSkyLight(int x, int y, int z) {
if (extent instanceof LightingExtent) {
return ((LightingExtent) extent).getSkyLight(x, y, z);
@ -207,12 +207,14 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
return 0;
}
@Override
public int getBlockLight(int x, int y, int z) {
if (extent instanceof LightingExtent) {
return ((LightingExtent) extent).getBlockLight(x, y, z);
}
return getBrightness(x, y, z);
}
@Override
public int getOpacity(int x, int y, int z) {
if (extent instanceof LightingExtent) {
return ((LightingExtent) extent).getOpacity(x, y, z);

View File

@ -211,6 +211,7 @@ public class PassthroughExtent extends AbstractDelegateExtent {
}
// special
@Override
public Extent disableHistory() {
return super.disableHistory();
}
@ -235,14 +236,17 @@ public class PassthroughExtent extends AbstractDelegateExtent {
return getExtent().cancel();
}
@Override
public boolean isQueueEnabled() {
return getExtent().isQueueEnabled();
}
@Override
public void enableQueue() {
getExtent().enableQueue();
}
@Override
public void disableQueue() {
getExtent().disableQueue();
}

View File

@ -103,9 +103,9 @@ public interface ClipboardFormat {
Set<String> getFileExtensions();
/**
* Set the actor's clipboard
* Sets the actor's clipboard.
* @param actor
* @param uri
* @param uri the URI of the schematic to hold
* @param inputStream the input stream
* @throws IOException thrown on I/O error
*/

View File

@ -20,11 +20,8 @@
package com.sk89q.worldedit.extent.clipboard.io;
import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.math.BlockVector3;
import java.io.Closeable;
import java.io.IOException;
import java.util.UUID;
@ -48,12 +45,7 @@ public interface ClipboardReader extends Closeable {
}
default Clipboard read(UUID uuid) throws IOException {
return read(uuid, new Function<BlockVector3, Clipboard>() {
@Override
public Clipboard apply(BlockVector3 dimensions) {
return new DiskOptimizedClipboard(dimensions);
}
});
return read(uuid, DiskOptimizedClipboard::new);
}
default Clipboard read(UUID uuid, Function<BlockVector3, Clipboard> createOutput) throws IOException {

View File

@ -19,7 +19,9 @@
package com.sk89q.worldedit.extent.clipboard.io;
import com.boydti.fawe.Fawe;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.jnbt.streamer.InfoReader;
import com.boydti.fawe.jnbt.streamer.IntValueReader;
@ -51,7 +53,6 @@ import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockCategories;
import com.sk89q.worldedit.world.block.BlockID;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypeSwitch;
import com.sk89q.worldedit.world.block.BlockTypeSwitchBuilder;
@ -59,9 +60,6 @@ import com.sk89q.worldedit.world.entity.EntityType;
import com.sk89q.worldedit.world.entity.EntityTypes;
import com.sk89q.worldedit.world.registry.BlockMaterial;
import com.sk89q.worldedit.world.registry.LegacyMapper;
import net.jpountz.lz4.LZ4BlockInputStream;
import net.jpountz.lz4.LZ4BlockOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@ -69,8 +67,8 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import static com.google.common.base.Preconditions.checkNotNull;
import net.jpountz.lz4.LZ4BlockInputStream;
import net.jpountz.lz4.LZ4BlockOutputStream;
/**
* Reads schematic files based that are compatible with MCEdit and other editors.
@ -180,21 +178,12 @@ public class SchematicReader implements ClipboardReader {
StreamDelegate tilesDelegate = schematic.add("TileEntities");
tilesDelegate.withInfo((length, type) -> tiles = new ArrayList<>(length));
tilesDelegate.withElem(new ValueReader<Map<String, Object>>() {
@Override
public void apply(int index, Map<String, Object> tile) {
tiles.add(tile);
}
});
tilesDelegate.withElem((ValueReader<Map<String, Object>>) (index, tile) -> tiles.add(tile));
StreamDelegate entitiesDelegate = schematic.add("Entities");
entitiesDelegate.withInfo((length, type) -> entities = new ArrayList<>(length));
entitiesDelegate.withElem(new ValueReader<Map<String, Object>>() {
@Override
public void apply(int index, Map<String, Object> entity) {
entities.add(entity);
}
});
entitiesDelegate.withElem(
(ValueReader<Map<String, Object>>) (index, entity) -> entities.add(entity));
return root;
}
@ -370,7 +359,7 @@ public class SchematicReader implements ClipboardReader {
Location loc = ent.getEntityLocation(clipboard);
clipboard.createEntity(loc, state);
} else {
Fawe.debug("Invalid entity: " + id);
getLogger(SchematicReader.class).debug("Invalid entity: " + id);
}
}
}
@ -396,10 +385,10 @@ public class SchematicReader implements ClipboardReader {
Direction left = facing.getLeft();
Direction right = facing.getRight();
BlockStateHolder forwardBlock = fc.getBlock(x + forward.getBlockX(), y + forward.getBlockY(), z + forward.getBlockZ());
BlockState forwardBlock = fc.getBlock(x + forward.getBlockX(), y + forward.getBlockY(), z + forward.getBlockZ());
BlockType forwardType = forwardBlock.getBlockType();
if (forwardType.hasProperty(PropertyKey.SHAPE) && forwardType.hasProperty(PropertyKey.FACING)) {
Direction forwardFacing = (Direction) forwardBlock.getState(PropertyKey.FACING);
Direction forwardFacing = forwardBlock.getState(PropertyKey.FACING);
if (forwardFacing == left) {
BlockState rightBlock = fc.getBlock(x + right.toBlockVector().getBlockX(), y + right.toBlockVector().getBlockY(), z + right.toBlockVector().getBlockZ());
BlockType rightType = rightBlock.getBlockType();

View File

@ -335,7 +335,7 @@ public class SpongeSchematicReader extends NBTSchematicReader {
Location loc = ent.getEntityLocation(clipboard);
clipboard.createEntity(loc, state);
} else {
Fawe.debug("Invalid entity: " + id);
log.debug("Invalid entity: " + id);
}
}
}

View File

@ -20,8 +20,8 @@
package com.sk89q.worldedit.function.mask;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import com.boydti.fawe.Fawe;
import com.sk89q.worldedit.math.BlockVector3;
import java.util.AbstractMap;
import java.util.ArrayList;
@ -150,7 +150,7 @@ public class MaskIntersection extends AbstractMask {
while (changed |= combineMasks(pairingFunction(), failedCombines) && --maxIteration > 0);
if (maxIteration == 0) {
Fawe.debug("Failed optimize MaskIntersection");
getLogger(MaskIntersection.class).debug("Failed optimize MaskIntersection");
for (Mask mask : masks) {
System.out.println(mask.getClass() + " / " + mask);
}

View File

@ -31,12 +31,12 @@ import java.util.List;
public final class Polygons {
private Polygons() {
}
/**
* Calculates the polygon shape of a cylinder which can then be used for e.g. intersection detection.
*
* Calculates the polygon shape of a cylinder, which can then be used for e.g., intersection detection.
*
* @param center the center point of the cylinder
* @param radius the radius of the cylinder
* @param maxPoints max points to be used for the calculation
@ -60,5 +60,5 @@ public final class Polygons {
return points;
}
}

View File

@ -1,10 +1,6 @@
package com.sk89q.worldedit.registry.state;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.util.ReflectionUtils;
import com.sk89q.util.ReflectionUtil;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
@ -102,19 +98,18 @@ public enum PropertyKey {
/**
* Get or create the property key
* @param id The name of the property (e.g. `waterlogged`)
* @param id The name of the property (e.g., `waterlogged`)
* @return PropertyKey enum
*/
public static final PropertyKey getOrCreate(String id) {
public static PropertyKey getOrCreate(String id) {
PropertyKey property = PropertyKey.get(id);
if (property == null) {
Fawe.debug("Registering property " + id);
property = ReflectionUtils.addEnum(PropertyKey.class, id.toUpperCase(Locale.ROOT));
if (property.getId() == null) {
try {
ReflectionUtils.setFailsafeFieldValue(PropertyKey.class.getDeclaredField("id"), property, property.name().toLowerCase());
} catch (Throwable e) {
throw new RuntimeException(e);
throw new RuntimeException("Could not register property with an id of " + id , e);
}
}
keys.put(property.name().toLowerCase(), property);

View File

@ -82,7 +82,7 @@ public class BlockState implements BlockStateHolder<BlockState>, FawePattern {
/**
* Returns a temporary BlockState for a given type and string
* @param state String e.g. minecraft:water[level=4]
* @param state String e.g., minecraft:water[level=4]
* @return BlockState
*/
public static BlockState get(String state) throws InputParseException {
@ -92,8 +92,8 @@ public class BlockState implements BlockStateHolder<BlockState>, FawePattern {
/**
* Returns a temporary BlockState for a given type and string
* - It's faster if a BlockType is provided compared to parsing the string
* @param type BlockType e.g. BlockTypes.STONE (or null)
* @param state String e.g. minecraft:water[level=4]
* @param type BlockType e.g., BlockTypes.STONE (or null)
* @param state String e.g., minecraft:water[level=4]
* @return BlockState
*/
public static BlockState get(@Nullable BlockType type, String state) throws InputParseException {
@ -103,8 +103,8 @@ public class BlockState implements BlockStateHolder<BlockState>, FawePattern {
/**
* Returns a temporary BlockState for a given type and string
* - It's faster if a BlockType is provided compared to parsing the string
* @param type BlockType e.g. BlockTypes.STONE (or null)
* @param state String e.g. minecraft:water[level=4]
* @param type BlockType e.g., BlockTypes.STONE (or null)
* @param state String e.g., minecraft:water[level=4]
* @return BlockState
*/
public static BlockState get(@Nullable BlockType type, String state, BlockState defaultState) throws InputParseException {