shift some code to EditSessionBuilder

This commit is contained in:
Jesse Boyd 2019-05-13 00:21:01 +10:00
parent c797dcb194
commit 43a6541763
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
7 changed files with 200 additions and 358 deletions

View File

@ -35,7 +35,6 @@ public class HistoryExtent extends AbstractDelegateExtent {
private FaweChangeSet changeSet; private FaweChangeSet changeSet;
private final FaweQueue queue; private final FaweQueue queue;
private final EditSession session;
/** /**
* Create a new instance. * Create a new instance.
@ -43,12 +42,11 @@ public class HistoryExtent extends AbstractDelegateExtent {
* @param extent the extent * @param extent the extent
* @param changeSet the change set * @param changeSet the change set
*/ */
public HistoryExtent(final EditSession session, final Extent extent, final FaweChangeSet changeSet, FaweQueue queue) { public HistoryExtent(final Extent extent, final FaweChangeSet changeSet, FaweQueue queue) {
super(extent); super(extent);
checkNotNull(changeSet); checkNotNull(changeSet);
this.queue = queue; this.queue = queue;
this.changeSet = changeSet; this.changeSet = changeSet;
this.session = session;
} }
public FaweChangeSet getChangeSet() { public FaweChangeSet getChangeSet() {
@ -61,9 +59,9 @@ public class HistoryExtent extends AbstractDelegateExtent {
@Override @Override
public <B extends BlockStateHolder<B>> boolean setBlock(int x, int y, int z, B block) throws WorldEditException { public <B extends BlockStateHolder<B>> boolean setBlock(int x, int y, int z, B block) throws WorldEditException {
BaseBlock previous = queue.getFullBlock(mutable.setComponents(x, y, z)).toBaseBlock(); BaseBlock previous = queue.getFullBlock(x, y, z);
if (previous.getInternalId() == block.getInternalId()) { if (previous.getInternalId() == block.getInternalId()) {
if (!previous.hasNbtData() && (block instanceof BaseBlock && !((BaseBlock)block).hasNbtData())) { if (!previous.hasNbtData() && (block instanceof BaseBlock && !block.hasNbtData())) {
return false; return false;
} }
} }

View File

@ -40,7 +40,7 @@ public class VisualExtent extends AbstractDelegateExtent {
@Override @Override
public boolean setBlock(int x, int y, int z, BlockStateHolder block) throws WorldEditException { public boolean setBlock(int x, int y, int z, BlockStateHolder block) throws WorldEditException {
BlockStateHolder previous = super.getLazyBlock(x, y, z); BlockStateHolder previous = super.getBlock(x, y, z);
int cx = x >> 4; int cx = x >> 4;
int cz = z >> 4; int cz = z >> 4;
long chunkPair = MathMan.pairInt(cx, cz); long chunkPair = MathMan.pairInt(cx, cz);

View File

@ -56,17 +56,6 @@ public abstract class FaweRegionExtent extends ResettableExtent {
return contains(p.getBlockX(), p.getBlockZ()); return contains(p.getBlockX(), p.getBlockZ());
} }
@Override
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B block) throws WorldEditException {
if (!contains(location)) {
if (!limit.MAX_FAILS()) {
WEManager.IMP.cancelEditSafe(this, BBC.WORLDEDIT_CANCEL_REASON_OUTSIDE_REGION);
}
return false;
}
return super.setBlock(location, block);
}
@Override @Override
public <B extends BlockStateHolder<B>> boolean setBlock(int x, int y, int z, B block) throws WorldEditException { public <B extends BlockStateHolder<B>> boolean setBlock(int x, int y, int z, B block) throws WorldEditException {
if (!contains(x, y, z)) { if (!contains(x, y, z)) {
@ -78,17 +67,6 @@ public abstract class FaweRegionExtent extends ResettableExtent {
return super.setBlock(x, y, z, block); return super.setBlock(x, y, z, block);
} }
@Override
public boolean setBiome(BlockVector2 position, BiomeType biome) {
if (!contains(position)) {
if (!limit.MAX_FAILS()) {
WEManager.IMP.cancelEditSafe(this, BBC.WORLDEDIT_CANCEL_REASON_OUTSIDE_REGION);
}
return false;
}
return super.setBiome(position, biome);
}
@Override @Override
public boolean setBiome(int x, int y, int z, BiomeType biome) { public boolean setBiome(int x, int y, int z, BiomeType biome) {
if (!contains(x, y, z)) { if (!contains(x, y, z)) {
@ -111,6 +89,17 @@ public abstract class FaweRegionExtent extends ResettableExtent {
return super.getBiome(position); return super.getBiome(position);
} }
@Override
public BiomeType getBiome(int x, int z) {
if (!contains(x, z)) {
if (!limit.MAX_FAILS()) {
WEManager.IMP.cancelEditSafe(this, BBC.WORLDEDIT_CANCEL_REASON_OUTSIDE_REGION);
}
return null;
}
return super.getBiome(x, z);
}
@Override @Override
public BaseBlock getFullBlock(BlockVector3 position) { public BaseBlock getFullBlock(BlockVector3 position) {
if (!contains(position)) { if (!contains(position)) {
@ -133,28 +122,6 @@ public abstract class FaweRegionExtent extends ResettableExtent {
return super.getBlock(position); return super.getBlock(position);
} }
@Override
public BlockState getLazyBlock(BlockVector3 position) {
if (!contains(position)) {
if (!limit.MAX_FAILS()) {
WEManager.IMP.cancelEditSafe(this, BBC.WORLDEDIT_CANCEL_REASON_OUTSIDE_REGION);
}
return EditSession.nullBlock;
}
return super.getLazyBlock(position);
}
@Override
public BlockState getLazyBlock(int x, int y, int z) {
if (!contains(x, y, z)) {
if (!limit.MAX_FAILS()) {
WEManager.IMP.cancelEditSafe(this, BBC.WORLDEDIT_CANCEL_REASON_OUTSIDE_REGION);
}
return EditSession.nullBlock;
}
return super.getLazyBlock(x, y, z);
}
@Override @Override
public int getBlockLight(int x, int y, int z) { public int getBlockLight(int x, int y, int z) {
if (!contains(x, y, z)) { if (!contains(x, y, z)) {

View File

@ -79,6 +79,12 @@ public class EditSessionBuilder {
this.worldName = Fawe.imp().getWorldName(world); this.worldName = Fawe.imp().getWorldName(world);
} }
public EditSessionBuilder(World world, String worldName) {
if (world == null && worldName == null) throw new NullPointerException("Both world and worldname cannot be null");
this.world = world;
this.worldName = worldName;
}
public EditSessionBuilder(@Nonnull String worldName) { public EditSessionBuilder(@Nonnull String worldName) {
checkNotNull(worldName); checkNotNull(worldName);
this.worldName = worldName; this.worldName = worldName;
@ -253,8 +259,16 @@ public class EditSessionBuilder {
return extent; return extent;
} }
public EditSessionBuilder commit() { private FaweChangeSet changeTask;
// reset private AbstractDelegateExtent extent;
private int maxY;
private HistoryExtent history;
private AbstractDelegateExtent bypassHistory;
private AbstractDelegateExtent bypassAll;
public EditSessionBuilder compile() {
if (extent != null) return this;
wrapped = false; wrapped = false;
// //
if (worldName == null) { if (worldName == null) {
@ -336,9 +350,6 @@ public class EditSessionBuilder {
// If the edit uses items from the inventory we can't use a delayed task // If the edit uses items from the inventory we can't use a delayed task
&& this.blockBag == null; && this.blockBag == null;
} }
// if (Settings.IMP.EXPERIMENTAL.ANVIL_QUEUE_MODE && !(queue instanceof MCAQueue)) {
// queue = new MCAQueue(queue);
// }
if (!Settings.IMP.QUEUE.PROGRESS.DISPLAY.equalsIgnoreCase("false") && player != null) { if (!Settings.IMP.QUEUE.PROGRESS.DISPLAY.equalsIgnoreCase("false") && player != null) {
switch (Settings.IMP.QUEUE.PROGRESS.DISPLAY.toLowerCase()) { switch (Settings.IMP.QUEUE.PROGRESS.DISPLAY.toLowerCase()) {
case "chat": case "chat":
@ -350,76 +361,131 @@ public class EditSessionBuilder {
this.queue.setProgressTask(new DefaultProgressTracker(player)); this.queue.setProgressTask(new DefaultProgressTracker(player));
} }
} }
// this.bypassAll = wrapExtent(new FastWorldEditExtent(world, queue), eventBus, event, EditSession.Stage.BEFORE_CHANGE); this.bypassAll = wrapExtent(new FastWorldEditExtent(world, queue), eventBus, event, EditSession.Stage.BEFORE_CHANGE);
// this.bypassHistory = (this.extent = wrapExtent(bypassAll, eventBus, event, EditSession.Stage.BEFORE_REORDER)); this.bypassHistory = (this.extent = wrapExtent(bypassAll, eventBus, event, EditSession.Stage.BEFORE_REORDER));
// if (!this.fastMode || changeSet != null) { if (!this.fastmode || changeSet != null) {
// if (changeSet == null) { if (changeSet == null) {
// if (Settings.IMP.HISTORY.USE_DISK) { if (Settings.IMP.HISTORY.USE_DISK) {
// UUID uuid = player == null ? EditSession.CONSOLE : player.getUUID(); UUID uuid = player == null ? EditSession.CONSOLE : player.getUUID();
// if (Settings.IMP.HISTORY.USE_DATABASE) { if (Settings.IMP.HISTORY.USE_DATABASE) {
// changeSet = new RollbackOptimizedHistory(world, uuid); changeSet = new RollbackOptimizedHistory(world, uuid);
// } else { } else {
// changeSet = new DiskStorageHistory(world, uuid); changeSet = new DiskStorageHistory(world, uuid);
// } }
// } else if (combineStages && Settings.IMP.HISTORY.COMPRESSION_LEVEL == 0 && !(queue instanceof MCAQueue)) { } else if (combineStages && Settings.IMP.HISTORY.COMPRESSION_LEVEL == 0 && !(queue instanceof MCAQueue)) {
// changeSet = new CPUOptimizedChangeSet(world); changeSet = new CPUOptimizedChangeSet(world);
// } else { } else {
// changeSet = new MemoryOptimizedHistory(world); changeSet = new MemoryOptimizedHistory(world);
// } }
// } }
// if (this.limit.SPEED_REDUCTION > 0) { if (this.limit.SPEED_REDUCTION > 0) {
// this.bypassHistory = new SlowExtent(this.bypassHistory, this.limit.SPEED_REDUCTION); this.bypassHistory = new SlowExtent(this.bypassHistory, this.limit.SPEED_REDUCTION);
// } }
// if (changeSet instanceof NullChangeSet && Fawe.imp().getBlocksHubApi() != null && player != null) { if (changeSet instanceof NullChangeSet && Fawe.imp().getBlocksHubApi() != null && player != null) {
// changeSet = LoggingChangeSet.wrap(player, changeSet); changeSet = LoggingChangeSet.wrap(player, changeSet);
// } }
// if (!(changeSet instanceof NullChangeSet)) { if (!(changeSet instanceof NullChangeSet)) {
// if (!(changeSet instanceof LoggingChangeSet) && player != null && Fawe.imp().getBlocksHubApi() != null) { if (!(changeSet instanceof LoggingChangeSet) && player != null && Fawe.imp().getBlocksHubApi() != null) {
// changeSet = LoggingChangeSet.wrap(player, changeSet); changeSet = LoggingChangeSet.wrap(player, changeSet);
// } }
if (this.blockBag != null) {
changeSet = new BlockBagChangeSet(changeSet, blockBag, limit.INVENTORY_MODE == 1);
}
if (combineStages) {
changeTask = changeSet;
changeSet.addChangeTask(queue);
} else {
this.extent = (history = new HistoryExtent(bypassHistory, changeSet, queue));
// if (this.blockBag != null) { // if (this.blockBag != null) {
// changeSet = new BlockBagChangeSet(changeSet, blockBag, limit.INVENTORY_MODE == 1); // this.extent = new BlockBagExtent(this.extent, blockBag, limit.INVENTORY_MODE == 1);
// } // }
// if (combineStages) { }
// changeTask = changeSet; }
// changeSet.addChangeTask(queue); }
// } else { if (allowedRegions == null) {
// this.extent = (history = new HistoryExtent(this, bypassHistory, changeSet, queue)); if (player != null && !player.hasPermission("fawe.bypass") && !player.hasPermission("fawe.bypass.regions") && !(queue instanceof VirtualWorld)) {
//// if (this.blockBag != null) { allowedRegions = player.getCurrentRegions();
//// this.extent = new BlockBagExtent(this.extent, blockBag, limit.INVENTORY_MODE == 1); }
//// } }
// } this.maxY = world == null ? 255 : world.getMaxY();
// } if (allowedRegions != null) {
// } if (allowedRegions.length == 0) {
// if (allowedRegions == null) { this.extent = new NullExtent(this.extent, BBC.WORLDEDIT_CANCEL_REASON_NO_REGION);
// if (player != null && !player.hasPermission("fawe.bypass") && !player.hasPermission("fawe.bypass.regions") && !(queue instanceof VirtualWorld)) { } else {
// allowedRegions = player.getCurrentRegions(); this.extent = new ProcessedWEExtent(this.extent, this.limit);
// } if (allowedRegions.length == 1) {
// } this.extent = new SingleRegionExtent(this.extent, this.limit, allowedRegions[0]);
// this.maxY = getWorld() == null ? 255 : world.getMaxY(); } else {
// if (allowedRegions != null) { this.extent = new MultiRegionExtent(this.extent, this.limit, allowedRegions);
// if (allowedRegions.length == 0) { }
// this.extent = new NullExtent(this.extent, BBC.WORLDEDIT_CANCEL_REASON_NO_REGION); }
// } else { } else {
// this.extent = new ProcessedWEExtent(this.extent, this.limit); this.extent = new HeightBoundExtent(this.extent, this.limit, 0, maxY);
// if (allowedRegions.length == 1) { }
// Region region = allowedRegions[0]; if (this.limit.STRIP_NBT != null && !this.limit.STRIP_NBT.isEmpty()) {
// this.extent = new SingleRegionExtent(this.extent, this.limit, allowedRegions[0]); this.extent = new StripNBTExtent(this.extent, this.limit.STRIP_NBT);
// } else { }
// this.extent = new MultiRegionExtent(this.extent, this.limit, allowedRegions); this.extent = wrapExtent(this.extent, eventBus, event, EditSession.Stage.BEFORE_HISTORY);
// }
// }
// } else {
// this.extent = new HeightBoundExtent(this.extent, this.limit, 0, maxY);
// }
// if (this.limit.STRIP_NBT != null && !this.limit.STRIP_NBT.isEmpty()) {
// this.extent = new StripNBTExtent(this.extent, this.limit.STRIP_NBT);
// }
// this.extent = wrapExtent(this.extent, bus, event, Stage.BEFORE_HISTORY);
return this; return this;
} }
public EditSession build() { public EditSession build() {
return new EditSession(worldName, world, queue, player, limit, changeSet, allowedRegions, autoQueue, fastmode, checkMemory, combineStages, blockBag, eventBus, event); return new EditSession(this);
}
public Extent getExtent() {
return extent;
}
public World getWorld() {
return world;
}
public String getWorldName() {
return worldName;
}
public FaweQueue getQueue() {
return queue;
}
public boolean isWrapped() {
return wrapped;
}
public boolean hasFastMode() {
return fastmode;
}
public HistoryExtent getHistory() {
return history;
}
public AbstractDelegateExtent getBypassHistory() {
return bypassHistory;
}
public AbstractDelegateExtent getBypassAll() {
return bypassAll;
}
public FaweLimit getLimit() {
return limit;
}
public FawePlayer getPlayer() {
return player;
}
public FaweChangeSet getChangeTask() {
return changeTask;
}
public BlockBag getBlockBag() {
return blockBag;
}
public int getMaxY() {
return maxY;
} }
} }

View File

@ -204,19 +204,18 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
private final FaweQueue queue; private final FaweQueue queue;
private final boolean wrapped; private final boolean wrapped;
private final boolean fastMode; private final boolean fastMode;
private final AbstractDelegateExtent extent;
private final HistoryExtent history; private final HistoryExtent history;
private final AbstractDelegateExtent bypassHistory; private AbstractDelegateExtent bypassHistory;
private final AbstractDelegateExtent bypassAll; private AbstractDelegateExtent bypassAll;
private final FaweLimit originalLimit; private final FaweLimit originalLimit;
private final FaweLimit limit; private final FaweLimit limit;
private final FawePlayer player; private final FawePlayer player;
private final FaweChangeSet changeTask; private final FaweChangeSet changeTask;
private MutableBlockVector3 mutablebv = new MutableBlockVector3(); private final MutableBlockVector3 mutablebv = new MutableBlockVector3();
private int changes = 0; private int changes = 0;
private BlockBag blockBag; private final BlockBag blockBag;
private final int maxY; private final int maxY;
@ -234,163 +233,26 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
} }
public EditSession(@Nullable String worldName, @Nullable World world, @Nullable FaweQueue queue, @Nullable FawePlayer player, @Nullable FaweLimit limit, @Nullable FaweChangeSet changeSet, @Nullable Region[] allowedRegions, @Nullable Boolean autoQueue, @Nullable Boolean fastmode, @Nullable Boolean checkMemory, @Nullable Boolean combineStages, @Nullable BlockBag blockBag, @Nullable EventBus bus, @Nullable EditSessionEvent event) { public EditSession(@Nullable String worldName, @Nullable World world, @Nullable FaweQueue queue, @Nullable FawePlayer player, @Nullable FaweLimit limit, @Nullable FaweChangeSet changeSet, @Nullable Region[] allowedRegions, @Nullable Boolean autoQueue, @Nullable Boolean fastmode, @Nullable Boolean checkMemory, @Nullable Boolean combineStages, @Nullable BlockBag blockBag, @Nullable EventBus bus, @Nullable EditSessionEvent event) {
super(world); this(new EditSessionBuilder(world, worldName).queue(queue).player(player).limit(limit).changeSet(changeSet).allowedRegions(allowedRegions).autoQueue(autoQueue).fastmode(fastmode).checkMemory(checkMemory).combineStages(combineStages).blockBag(blockBag).eventBus(bus).event(event));
this.worldName = worldName == null ? world == null ? queue == null ? "" : queue.getWorldName() : Fawe.imp().getWorldName(world) : worldName;
if (world == null && this.worldName != null) world = FaweAPI.getWorld(this.worldName);
this.world = world;
if (bus == null) {
bus = WorldEdit.getInstance().getEventBus();
}
if (event == null) {
event = new EditSessionEvent(world, player == null ? null : (player.getPlayer()), -1, null);
}
if (player == null && event.getActor() != null) {
player = FawePlayer.wrap(event.getActor());
}
this.player = player;
if (limit == null) {
if (player == null) {
limit = FaweLimit.MAX;
} else {
limit = player.getLimit();
}
}
if (autoQueue == null) {
autoQueue = true;
}
if (fastmode == null) {
if (player == null) {
fastmode = !Settings.IMP.HISTORY.ENABLE_FOR_CONSOLE;
} else {
fastmode = player.getSession().hasFastMode();
}
}
this.fastMode = fastmode;
if (checkMemory == null) {
checkMemory = player != null && !this.fastMode;
}
if (checkMemory) {
if (MemUtil.isMemoryLimitedSlow()) {
if (Perm.hasPermission(player, "worldedit.fast")) {
BBC.WORLDEDIT_OOM_ADMIN.send(player);
}
throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_LOW_MEMORY);
}
}
this.originalLimit = limit;
this.blockBag = limit.INVENTORY_MODE != 0 ? blockBag : null;
this.limit = limit.copy();
if (queue == null) {
boolean placeChunks = this.fastMode || this.limit.FAST_PLACEMENT;
World unwrapped = WorldWrapper.unwrap(world);
if (unwrapped instanceof FaweQueue) {
queue = (FaweQueue) unwrapped;
} else if (unwrapped instanceof MCAWorld) {
queue = ((MCAWorld) unwrapped).getQueue();
} else if (player != null && world.equals(player.getWorld())) {
queue = player.getFaweQueue(placeChunks, autoQueue);
} else {
queue = SetQueue.IMP.getNewQueue(world, placeChunks, autoQueue);
}
}
if (combineStages == null) {
combineStages =
// If it's enabled in the settings
Settings.IMP.HISTORY.COMBINE_STAGES
// If fast placement is disabled, it's slower to perform a copy on each chunk
&& this.limit.FAST_PLACEMENT
// If the specific queue doesn't support it
&& queue.supports(FaweQueue.Capability.CHANGE_TASKS)
// If the edit uses items from the inventory we can't use a delayed task
&& this.blockBag == null;
}
if (Settings.IMP.EXPERIMENTAL.ANVIL_QUEUE_MODE && !(queue instanceof MCAQueue)) {
queue = new MCAQueue(queue);
}
this.queue = queue;
this.queue.addEditSession(this);
if (!Settings.IMP.QUEUE.PROGRESS.DISPLAY.equalsIgnoreCase("false") && player != null) {
switch (Settings.IMP.QUEUE.PROGRESS.DISPLAY.toLowerCase()) {
case "chat":
this.queue.setProgressTask(new ChatProgressTracker(player));
break;
case "title":
case "true":
default:
this.queue.setProgressTask(new DefaultProgressTracker(player));
}
}
this.bypassAll = wrapExtent(new FastWorldEditExtent(world, queue), bus, event, Stage.BEFORE_CHANGE);
this.bypassHistory = (this.extent = wrapExtent(bypassAll, bus, event, Stage.BEFORE_REORDER));
if (!this.fastMode || changeSet != null) {
if (changeSet == null) {
if (Settings.IMP.HISTORY.USE_DISK) {
UUID uuid = player == null ? CONSOLE : player.getUUID();
if (Settings.IMP.HISTORY.USE_DATABASE) {
changeSet = new RollbackOptimizedHistory(world, uuid);
} else {
changeSet = new DiskStorageHistory(world, uuid);
}
} else if (combineStages && Settings.IMP.HISTORY.COMPRESSION_LEVEL == 0 && !(queue instanceof MCAQueue)) {
changeSet = new CPUOptimizedChangeSet(world);
} else {
changeSet = new MemoryOptimizedHistory(world);
}
}
if (this.limit.SPEED_REDUCTION > 0) {
this.bypassHistory = new SlowExtent(this.bypassHistory, this.limit.SPEED_REDUCTION);
}
if (changeSet instanceof NullChangeSet && Fawe.imp().getBlocksHubApi() != null && player != null) {
changeSet = LoggingChangeSet.wrap(player, changeSet);
}
if (!(changeSet instanceof NullChangeSet)) {
if (!(changeSet instanceof LoggingChangeSet) && player != null && Fawe.imp().getBlocksHubApi() != null) {
changeSet = LoggingChangeSet.wrap(player, changeSet);
}
if (this.blockBag != null) {
changeSet = new BlockBagChangeSet(changeSet, blockBag, limit.INVENTORY_MODE == 1);
}
if (combineStages) {
changeTask = changeSet;
changeSet.addChangeTask(queue);
} else {
this.extent = (history = new HistoryExtent(this, bypassHistory, changeSet, queue));
// if (this.blockBag != null) {
// this.extent = new BlockBagExtent(this.extent, blockBag, limit.INVENTORY_MODE == 1);
// }
}
}
}
if (allowedRegions == null) {
if (player != null && !player.hasPermission("fawe.bypass") && !player.hasPermission("fawe.bypass.regions") && !(queue instanceof VirtualWorld)) {
allowedRegions = player.getCurrentRegions();
}
}
this.maxY = getWorld() == null ? 255 : world.getMaxY();
if (allowedRegions != null) {
if (allowedRegions.length == 0) {
this.extent = new NullExtent(this.extent, BBC.WORLDEDIT_CANCEL_REASON_NO_REGION);
} else {
this.extent = new ProcessedWEExtent(this.extent, this.limit);
if (allowedRegions.length == 1) {
Region region = allowedRegions[0];
this.extent = new SingleRegionExtent(this.extent, this.limit, allowedRegions[0]);
} else {
this.extent = new MultiRegionExtent(this.extent, this.limit, allowedRegions);
}
}
} else {
this.extent = new HeightBoundExtent(this.extent, this.limit, 0, maxY);
}
if (this.limit.STRIP_NBT != null && !this.limit.STRIP_NBT.isEmpty()) {
this.extent = new StripNBTExtent(this.extent, this.limit.STRIP_NBT);
}
this.extent = wrapExtent(this.extent, bus, event, Stage.BEFORE_HISTORY);
} }
public EditSession(EditSessionBuilder builder) { public EditSession(EditSessionBuilder builder) {
super(builder.) super(builder.compile().getExtent());
this.world = builder.getWorld();
this.worldName = builder.getWorldName();
this.queue = builder.getQueue();
this.wrapped = builder.isWrapped();
this.fastMode = builder.hasFastMode();
this.history = builder.getHistory();
this.bypassHistory = builder.getBypassHistory();
this.bypassAll = builder.getBypassAll();
this.originalLimit = builder.getLimit();
this.limit = builder.getLimit().copy();
this.player = builder.getPlayer();
this.changeTask = builder.getChangeTask();
this.maxY = builder.getMaxY();
this.blockBag = builder.getBlockBag();
} }
/** /**
@ -442,7 +304,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
public void resetLimit() { public void resetLimit() {
this.limit.set(this.originalLimit); this.limit.set(this.originalLimit);
ExtentTraverser<ProcessedWEExtent> find = new ExtentTraverser(extent).find(ProcessedWEExtent.class); ExtentTraverser<ProcessedWEExtent> find = new ExtentTraverser(this).find(ProcessedWEExtent.class);
if (find != null && find.get() != null) { if (find != null && find.get() != null) {
find.get().setLimit(this.limit); find.get().setLimit(this.limit);
} }
@ -481,7 +343,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
* @return FaweRegionExtent (may be null) * @return FaweRegionExtent (may be null)
*/ */
public FaweRegionExtent getRegionExtent() { public FaweRegionExtent getRegionExtent() {
ExtentTraverser<FaweRegionExtent> traverser = new ExtentTraverser(this.extent).find(FaweRegionExtent.class); ExtentTraverser<FaweRegionExtent> traverser = new ExtentTraverser(this).find(FaweRegionExtent.class);
return traverser == null ? null : traverser.get(); return traverser == null ? null : traverser.get();
} }
@ -504,18 +366,17 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
} }
public boolean cancel() { public boolean cancel() {
ExtentTraverser traverser = new ExtentTraverser(this.extent); ExtentTraverser traverser = new ExtentTraverser(this);
NullExtent nullExtent = new NullExtent(world, BBC.WORLDEDIT_CANCEL_REASON_MANUAL); NullExtent nullExtent = new NullExtent(world, BBC.WORLDEDIT_CANCEL_REASON_MANUAL);
while (traverser != null) { while (traverser != null) {
ExtentTraverser next = traverser.next();
Extent get = traverser.get(); Extent get = traverser.get();
if (get instanceof AbstractDelegateExtent && !(get instanceof NullExtent)) { if (get instanceof AbstractDelegateExtent && !(get instanceof NullExtent)) {
traverser.setNext(nullExtent); traverser.setNext(nullExtent);
} }
ExtentTraverser next = traverser.next();
traverser = next; traverser = next;
} }
bypassHistory = nullExtent; bypassHistory = nullExtent;
this.extent = nullExtent;
bypassAll = nullExtent; bypassAll = nullExtent;
dequeue(); dequeue();
if (!queue.isEmpty()) { if (!queue.isEmpty()) {
@ -569,46 +430,6 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
return queue; return queue;
} }
@Deprecated
private AbstractDelegateExtent wrapExtent(final AbstractDelegateExtent extent, final EventBus eventBus, EditSessionEvent event, final Stage stage) {
event = event.clone(stage);
event.setExtent(extent);
eventBus.post(event);
if (event.isCancelled()) {
return new NullExtent(extent, BBC.WORLDEDIT_CANCEL_REASON_MANUAL);
}
final Extent toReturn = event.getExtent();
if(toReturn instanceof com.sk89q.worldedit.extent.NullExtent) {
return new NullExtent(toReturn, null);
}
if (!(toReturn instanceof AbstractDelegateExtent)) {
Fawe.debug("Extent " + toReturn + " must be AbstractDelegateExtent");
return extent;
}
if (toReturn != extent) {
String className = toReturn.getClass().getName().toLowerCase();
for (String allowed : Settings.IMP.EXTENT.ALLOWED_PLUGINS) {
if (className.contains(allowed.toLowerCase())) {
this.wrapped = true;
return (AbstractDelegateExtent) 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 (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");
}
}
}
return extent;
}
// pkg private for TracedEditSession only, may later become public API // pkg private for TracedEditSession only, may later become public API
boolean commitRequired() { boolean commitRequired() {
return false; return false;
@ -910,20 +731,6 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
return this.blockBag; return this.blockBag;
} }
/**
* Set a {@link BlockBag} to use.
*
* @param blockBag the block bag to set, or null to use none
*/
public void setBlockBag(final BlockBag blockBag) {
this.blockBag = blockBag;
}
@Override
public String toString() {
return super.toString() + ":" + extent;
}
/** /**
* Gets the list of missing blocks and clears the list for the next * Gets the list of missing blocks and clears the list for the next
* operation. * operation.
@ -1005,19 +812,19 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
@Override @Override
public BiomeType getBiome(final BlockVector2 position) { public BiomeType getBiome(final BlockVector2 position) {
return this.extent.getBiome(position); return this.getExtent().getBiome(position);
} }
@Override @Override
public boolean setBiome(final BlockVector2 position, final BiomeType biome) { public boolean setBiome(final BlockVector2 position, final BiomeType biome) {
this.changes++; this.changes++;
return this.extent.setBiome(position, biome); return this.getExtent().setBiome(position, biome);
} }
@Override @Override
public boolean setBiome(int x, int y, int z, BiomeType biome) { public boolean setBiome(int x, int y, int z, BiomeType biome) {
this.changes++; this.changes++;
return this.extent.setBiome(x, y, z, biome); return this.getExtent().setBiome(x, y, z, biome);
} }
@Override @Override
@ -1046,17 +853,17 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
} }
public BlockState getBlock(int x, int y, int z) { public BlockState getBlock(int x, int y, int z) {
return extent.getBlock(x, y, z); return getExtent().getBlock(x, y, z);
} }
@Override @Override
public BlockState getBlock(BlockVector3 position) { public BlockState getBlock(BlockVector3 position) {
return extent.getBlock(position); return getExtent().getBlock(position);
} }
@Override @Override
public BaseBlock getFullBlock(BlockVector3 position) { public BaseBlock getFullBlock(BlockVector3 position) {
return extent.getFullBlock(position); return getExtent().getFullBlock(position);
} }
/** /**
@ -1131,7 +938,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
this.changes++; this.changes++;
switch (stage) { switch (stage) {
case BEFORE_HISTORY: case BEFORE_HISTORY:
return this.extent.setBlock(position, block); return this.getExtent().setBlock(position, block);
case BEFORE_CHANGE: case BEFORE_CHANGE:
return this.bypassHistory.setBlock(position, block); return this.bypassHistory.setBlock(position, block);
case BEFORE_REORDER: case BEFORE_REORDER:
@ -1177,7 +984,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block) throws MaxChangedBlocksException { public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block) throws MaxChangedBlocksException {
this.changes++; this.changes++;
try { try {
return this.extent.setBlock(position, block); return this.getExtent().setBlock(position, block);
} catch (MaxChangedBlocksException e) { } catch (MaxChangedBlocksException e) {
throw e; throw e;
} catch (WorldEditException e) { } catch (WorldEditException e) {
@ -1188,7 +995,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
public <B extends BlockStateHolder<B>> boolean setBlock(int x, int y, int z, B block) { public <B extends BlockStateHolder<B>> boolean setBlock(int x, int y, int z, B block) {
this.changes++; this.changes++;
try { try {
return this.extent.setBlock(x, y, z, block); return this.getExtent().setBlock(x, y, z, block);
} catch (WorldEditException e) { } catch (WorldEditException e) {
throw new RuntimeException("Unexpected exception", e); throw new RuntimeException("Unexpected exception", e);
} }
@ -1198,7 +1005,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
this.changes++; this.changes++;
try { try {
BlockVector3 bv = mutablebv.setComponents(x, y, z); BlockVector3 bv = mutablebv.setComponents(x, y, z);
return pattern.apply(extent, bv, bv); return pattern.apply(getExtent(), bv, bv);
} catch (WorldEditException e) { } catch (WorldEditException e) {
throw new RuntimeException("Unexpected exception", e); throw new RuntimeException("Unexpected exception", e);
} }
@ -1208,7 +1015,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
public boolean setBlock(final BlockVector3 position, final Pattern pattern) { public boolean setBlock(final BlockVector3 position, final Pattern pattern) {
this.changes++; this.changes++;
try { try {
return pattern.apply(this.extent, position, position); return pattern.apply(this.getExtent(), position, position);
} catch (WorldEditException e) { } catch (WorldEditException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -1216,7 +1023,7 @@ public class EditSession extends AbstractDelegateExtent implements HasFaweQueue,
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public int setBlocks(final Set<BlockVector3> vset, final Pattern pattern) { public int setBlocks(final Set<BlockVector3> vset, final Pattern pattern) {
RegionVisitor visitor = new RegionVisitor(vset, new BlockReplace(extent, pattern), this); RegionVisitor visitor = new RegionVisitor(vset, new BlockReplace(getExtent(), pattern), this);
Operations.completeBlindly(visitor); Operations.completeBlindly(visitor);
changes += visitor.getAffected(); changes += visitor.getAffected();
return changes; return changes;

View File

@ -602,15 +602,19 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool
Brush brush = current.getBrush(); Brush brush = current.getBrush();
if (brush == null) return; if (brush == null) return;
FawePlayer<Object> fp = FawePlayer.wrap(player); FawePlayer<Object> fp = FawePlayer.wrap(player);
EditSession editSession = new EditSessionBuilder(player.getWorld()) EditSessionBuilder builder = new EditSessionBuilder(player.getWorld())
.player(fp) .player(fp)
.allowedRegionsEverywhere() .allowedRegionsEverywhere()
.autoQueue(false) .autoQueue(false)
.blockBag(null) .blockBag(null)
.changeSetNull() .changeSetNull()
.combineStages(false) .combineStages(false);
.build();
VisualExtent newVisualExtent = new VisualExtent(editSession.getExtent(), editSession.getQueue()); builder.commit();
EditSession editSession = builder.build();
VisualExtent newVisualExtent = new VisualExtent(builder.getExtent(), builder.getQueue());
BlockVector3 position = getPosition(editSession, player); BlockVector3 position = getPosition(editSession, player);
if (position != null) { if (position != null) {
editSession.setExtent(newVisualExtent); editSession.setExtent(newVisualExtent);

View File

@ -100,8 +100,8 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
} }
@Override @Override
public boolean setBiome(int x, int z, BiomeType biome) { public boolean setBiome(int x, int y, int z, BiomeType biome) {
return extent.setBiome(x, z, biome); return extent.setBiome(x, y, z, biome);
} }
/* /*