Permalink
Browse files

Added "fast mode corrections"

  • Loading branch information...
me4502 committed Oct 15, 2018
1 parent aff05d6 commit 98e6de3792bf5edc57be0ec885001bd41606640a
@@ -437,6 +437,17 @@ public boolean setBlock(Vector position, BlockStateHolder block, boolean notifyA
}
}
@Override
public boolean notifyAndLightBlock(Vector position, com.sk89q.worldedit.world.block.BlockState previousType) throws WorldEditException {
BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter();
if (adapter != null) {
adapter.notifyAndLightBlock(BukkitAdapter.adapt(getWorld(), position), previousType);
return true;
}
return false;
}
@Override
public BaseBlock getFullBlock(Vector position) {
BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter();
@@ -24,6 +24,7 @@
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.registry.state.Property;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
import org.bukkit.Location;
@@ -78,6 +79,15 @@
*/
boolean setBlock(Location location, BlockStateHolder state, boolean notifyAndLight);
/**
* Notifies the simulation that the block at the given location has
* been changed and it must be re-lighted (and issue other events).
*
* @param position position of the block
* @param previousType the type of the previous block that was there
*/
void notifyAndLightBlock(Location position, BlockState previousType);
/**
* Get the state for the given entity.
*
@@ -25,8 +25,6 @@
import static com.sk89q.worldedit.regions.Regions.maximumBlockY;
import static com.sk89q.worldedit.regions.Regions.minimumBlockY;
import com.sk89q.worldedit.function.block.BlockDistributionCounter;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.event.extent.EditSessionEvent;
@@ -48,6 +46,7 @@
import com.sk89q.worldedit.extent.world.SurvivalModeExtent;
import com.sk89q.worldedit.function.GroundFunction;
import com.sk89q.worldedit.function.RegionMaskingFilter;
import com.sk89q.worldedit.function.block.BlockDistributionCounter;
import com.sk89q.worldedit.function.block.BlockReplace;
import com.sk89q.worldedit.function.block.Counter;
import com.sk89q.worldedit.function.block.Naturalizer;
@@ -113,8 +112,6 @@
import com.sk89q.worldedit.world.registry.LegacyMapper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
@@ -169,6 +166,8 @@
private final Extent bypassHistory;
private final Extent bypassNone;
private final boolean useFastModeCorrections;
private Mask oldMask;
/**
@@ -186,12 +185,13 @@
checkNotNull(event);
this.world = world;
this.useFastModeCorrections = false;
if (world != null) {
Extent extent;
// These extents are ALWAYS used
extent = fastModeExtent = new FastModeExtent(world, false);
extent = fastModeExtent = new FastModeExtent(world, useFastModeCorrections);
extent = survivalExtent = new SurvivalModeExtent(extent, world);
extent = quirkExtent = new BlockQuirkExtent(extent, world);
extent = chunkLoadingExtent = new ChunkLoadingExtent(extent, world);
@@ -287,14 +287,16 @@ public void setBlockChangeLimit(int limit) {
* @return whether the queue is enabled
*/
public boolean isQueueEnabled() {
return reorderExtent.isEnabled();
return !useFastModeCorrections && reorderExtent.isEnabled();
}
/**
* Queue certain types of block for better reproduction of those blocks.
*/
public void enableQueue() {
reorderExtent.setEnabled(true);
if (!useFastModeCorrections) {
reorderExtent.setEnabled(true);
}
}
/**
@@ -304,7 +306,7 @@ public void disableQueue() {
if (isQueueEnabled()) {
flushQueue();
}
reorderExtent.setEnabled(true);
reorderExtent.setEnabled(false);
}
/**
@@ -349,7 +351,14 @@ public SurvivalModeExtent getSurvivalExtent() {
*/
public void setFastMode(boolean enabled) {
if (fastModeExtent != null) {
fastModeExtent.setEnabled(enabled);
// If fast mode corrections are enabled, we're using fast mode for
// multipass support. Thus, we do not actually ever turn the fast mode
// extent off, we instead toggle post edit simulation
if (useFastModeCorrections) {
fastModeExtent.setPostEditSimulationEnabled(!enabled);
} else {
fastModeExtent.setEnabled(enabled);
}
}
}
@@ -29,9 +29,12 @@
import com.sk89q.worldedit.function.operation.RunContext;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.List;
import java.util.Queue;
import java.util.Set;
/**
@@ -40,8 +43,10 @@
public class FastModeExtent extends AbstractDelegateExtent {
private final World world;
private final Queue<Vector> positions = new ArrayDeque<>();
private final Set<BlockVector2D> dirtyChunks = new HashSet<>();
private boolean enabled = true;
private boolean postEditSimulation;
/**
* Create a new instance with fast mode enabled.
@@ -63,6 +68,9 @@ public FastModeExtent(World world, boolean enabled) {
checkNotNull(world);
this.world = world;
this.enabled = enabled;
if (enabled) {
this.postEditSimulation = true;
}
}
/**
@@ -83,11 +91,27 @@ public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean isPostEditSimulationEnabled() {
return postEditSimulation;
}
public void setPostEditSimulationEnabled(boolean enabled) {
this.postEditSimulation = enabled;
}
@Override
public boolean setBlock(Vector location, BlockStateHolder block) throws WorldEditException {
if (enabled) {
dirtyChunks.add(new BlockVector2D(location.getBlockX() >> 4, location.getBlockZ() >> 4));
return world.setBlock(location, block, false);
if (world.setBlock(location, block, false)) {
if (postEditSimulation) {
positions.offer(location);
}
return true;
}
return false;
} else {
return world.setBlock(location, block, true);
}
@@ -101,6 +125,16 @@ public Operation resume(RunContext run) throws WorldEditException {
if (!dirtyChunks.isEmpty()) {
world.fixAfterFastMode(dirtyChunks);
}
if (postEditSimulation) {
while (run.shouldContinue() && !positions.isEmpty()) {
Vector position = positions.poll(); // Remove from queue
world.notifyAndLightBlock(position, BlockTypes.AIR.getDefaultState());
}
return !positions.isEmpty() ? this : null;
}
return null;
}
@@ -42,6 +42,7 @@
* @return whether or not the ChangeSet is set to record changes
*/
boolean isRecordingChanges();
/**
* Tell the change set whether to record changes or not.
*
@@ -63,6 +63,11 @@ public boolean setBlock(Vector position, BlockStateHolder block, boolean notifyA
return false;
}
@Override
public boolean notifyAndLightBlock(Vector position, BlockState previousType) throws WorldEditException {
return false;
}
@Override
public int getBlockLightLevel(Vector position) {
return 0;
@@ -32,6 +32,7 @@
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.TreeGenerator;
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.weather.WeatherType;
@@ -94,6 +95,16 @@
*/
boolean setBlock(Vector position, BlockStateHolder block, boolean notifyAndLight) throws WorldEditException;
/**
* Notifies the simulation that the block at the given location has
* been changed and it must be re-lighted (and issue other events).
*
* @param position position of the block
* @param previousType the type of the previous block that was there
* @return true if the block was successfully notified
*/
boolean notifyAndLightBlock(Vector position, BlockState previousType) throws WorldEditException;
/**
* Get the light level at the given block.
*
@@ -213,6 +213,12 @@ public boolean setBlock(Vector position, BlockStateHolder block, boolean notifyA
return successful;
}
@Override
public boolean notifyAndLightBlock(Vector position, BlockState previousType) throws WorldEditException {
// TODO Implement
return false;
}
// Can't get the "Object" to be right for withProperty w/o this
@SuppressWarnings({ "rawtypes", "unchecked" })
private IBlockState applyProperties(BlockStateContainer stateContainer, IBlockState newState, Map<Property<?>, Object> states) {
@@ -161,6 +161,12 @@ public boolean setBlock(Vector position, BlockStateHolder block, boolean notifyA
return true;
}
@Override
public boolean notifyAndLightBlock(Vector position, com.sk89q.worldedit.world.block.BlockState previousType) throws WorldEditException {
// TODO Move this to adapter
return false;
}
@Override
public boolean regenerate(Region region, EditSession editSession) {
return false;

0 comments on commit 98e6de3

Please sign in to comment.