Skip to content

Commit

Permalink
Rename to SideEffect and clean up usage of the set
Browse files Browse the repository at this point in the history
  • Loading branch information
me4502 committed Feb 28, 2020
1 parent b97c81d commit 6488310
Show file tree
Hide file tree
Showing 13 changed files with 156 additions and 91 deletions.
Expand Up @@ -26,12 +26,12 @@
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.extent.world.WorldApplyingExtent;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.SideEffectApplier;
import com.sk89q.worldedit.util.TreeGenerator;
import com.sk89q.worldedit.world.AbstractWorld;
import com.sk89q.worldedit.world.biome.BiomeType;
Expand Down Expand Up @@ -60,7 +60,6 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import static com.google.common.base.Preconditions.checkNotNull;

Expand Down Expand Up @@ -415,24 +414,24 @@ public com.sk89q.worldedit.world.block.BlockState getBlock(BlockVector3 position
}

@Override
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block, Set<WorldApplyingExtent.BlockUpdateOptions> blockUpdateOptions) throws WorldEditException {
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block, SideEffectApplier sideEffectApplier) throws WorldEditException {
BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter();
if (adapter != null) {
try {
return adapter.setBlock(BukkitAdapter.adapt(getWorld(), position), block, blockUpdateOptions);
return adapter.setBlock(BukkitAdapter.adapt(getWorld(), position), block, sideEffectApplier);
} catch (Exception e) {
if (block instanceof BaseBlock && ((BaseBlock) block).getNbtData() != null) {
logger.warn("Tried to set a corrupt tile entity at " + position.toString());
logger.warn(((BaseBlock) block).getNbtData().toString());
}
e.printStackTrace();
Block bukkitBlock = getWorld().getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
bukkitBlock.setBlockData(BukkitAdapter.adapt(block), !blockUpdateOptions.isEmpty());
bukkitBlock.setBlockData(BukkitAdapter.adapt(block), !sideEffectApplier.isNone());
return true;
}
} else {
Block bukkitBlock = getWorld().getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
bukkitBlock.setBlockData(BukkitAdapter.adapt(block), !blockUpdateOptions.isEmpty());
bukkitBlock.setBlockData(BukkitAdapter.adapt(block), !sideEffectApplier.isNone());
return true;
}
}
Expand All @@ -448,11 +447,10 @@ public BaseBlock getFullBlock(BlockVector3 position) {
}

@Override
public boolean notifyBlock(BlockVector3 position, com.sk89q.worldedit.world.block.BlockState previousType,
Set<WorldApplyingExtent.BlockUpdateOptions> blockUpdateOptions) throws WorldEditException {
public boolean notifyBlock(BlockVector3 position, com.sk89q.worldedit.world.block.BlockState previousType, SideEffectApplier sideEffectApplier) throws WorldEditException {
BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter();
if (adapter != null) {
adapter.notifyAndLightBlock(BukkitAdapter.adapt(getWorld(), position), previousType, blockUpdateOptions);
adapter.notifyAndLightBlock(BukkitAdapter.adapt(getWorld(), position), previousType, sideEffectApplier);
return true;
}

Expand Down
Expand Up @@ -24,11 +24,11 @@
import com.sk89q.worldedit.blocks.BaseItem;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.extent.world.WorldApplyingExtent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.registry.state.Property;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.SideEffectApplier;
import com.sk89q.worldedit.world.DataFixer;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
Expand All @@ -43,7 +43,6 @@

import java.util.Map;
import java.util.OptionalInt;
import java.util.Set;

import javax.annotation.Nullable;

Expand Down Expand Up @@ -93,20 +92,20 @@ default void tickWatchdog() {
*
* @param location the location
* @param state the block
* @param blockUpdateOptionsSet block updates to apply
* @param sideEffectApplier side effects to apply
* @return true if a block was likely changed
*/
boolean setBlock(Location location, BlockStateHolder<?> state, Set<WorldApplyingExtent.BlockUpdateOptions> blockUpdateOptionsSet);
boolean setBlock(Location location, BlockStateHolder<?> state, SideEffectApplier sideEffectApplier);

/**
* 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
* @param blockUpdateOptionsSet block updates to apply
* @param sideEffectApplier side effects to apply
*/
void notifyAndLightBlock(Location position, BlockState previousType, Set<WorldApplyingExtent.BlockUpdateOptions> blockUpdateOptionsSet);
void notifyAndLightBlock(Location position, BlockState previousType, SideEffectApplier sideEffectApplier);

/**
* Get the state for the given entity.
Expand Down
Binary file modified worldedit-bukkit/src/main/resources/worldedit-adapters.jar
Binary file not shown.
Expand Up @@ -29,12 +29,12 @@
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
import com.sk89q.worldedit.extent.world.WorldApplyingExtent;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.SideEffectApplier;
import com.sk89q.worldedit.util.TreeGenerator;
import com.sk89q.worldedit.world.AbstractWorld;
import com.sk89q.worldedit.world.biome.BiomeType;
Expand All @@ -47,7 +47,6 @@
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import javax.annotation.Nullable;

Expand Down Expand Up @@ -76,14 +75,13 @@ public String getId() {
}

@Override
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block, Set<WorldApplyingExtent.BlockUpdateOptions> blockUpdateOptionsSet)
throws WorldEditException {
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block, SideEffectApplier sideEffectApplier) throws WorldEditException {
dirty = true;
return clipboard.setBlock(position, block);
}

@Override
public boolean notifyBlock(BlockVector3 position, BlockState previousType, Set<WorldApplyingExtent.BlockUpdateOptions> blockUpdateOptionsSet) throws WorldEditException {
public boolean notifyBlock(BlockVector3 position, BlockState previousType, SideEffectApplier sideEffectApplier) throws WorldEditException {
return false;
}

Expand Down
Expand Up @@ -104,6 +104,7 @@
import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment;
import com.sk89q.worldedit.util.Countable;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.SideEffectApplier;
import com.sk89q.worldedit.util.TreeGenerator;
import com.sk89q.worldedit.util.collection.DoubleArrayList;
import com.sk89q.worldedit.util.eventbus.EventBus;
Expand Down Expand Up @@ -468,7 +469,7 @@ public SurvivalModeExtent getSurvivalExtent() {
@Deprecated
public void setFastMode(boolean enabled) {
if (worldApplyingExtent != null) {
worldApplyingExtent.setBlockUpdateOptions(enabled ? WorldApplyingExtent.ALL_UPDATES : WorldApplyingExtent.NO_UPDATES);
worldApplyingExtent.setSideEffectApplier(enabled ? SideEffectApplier.ALL : SideEffectApplier.NONE);
}
}

Expand All @@ -478,11 +479,11 @@ public void setFastMode(boolean enabled) {
* <p>Fast mode may skip lighting checks or adjacent block
* notification.</p>
*
* @param blockUpdateOptions options to enable
* @param sideEffectApplier side effects to enable
*/
public void setBlockUpdateOptions(Set<WorldApplyingExtent.BlockUpdateOptions> blockUpdateOptions) {
public void setSideEffectApplier(SideEffectApplier sideEffectApplier) {
if (worldApplyingExtent != null) {
worldApplyingExtent.setBlockUpdateOptions(blockUpdateOptions);
worldApplyingExtent.setSideEffectApplier(sideEffectApplier);
}
}

Expand All @@ -496,14 +497,14 @@ public void setBlockUpdateOptions(Set<WorldApplyingExtent.BlockUpdateOptions> bl
*/
@Deprecated
public boolean hasFastMode() {
return worldApplyingExtent != null && worldApplyingExtent.getUpdateOptions().size() == WorldApplyingExtent.ALL_UPDATES.size();
return worldApplyingExtent != null && worldApplyingExtent.getSideEffectApplier().isAll();
}

public Set<WorldApplyingExtent.BlockUpdateOptions> getBlockUpdateOptions() {
public SideEffectApplier getSideEffectApplier() {
if (worldApplyingExtent == null) {
return WorldApplyingExtent.NO_UPDATES;
return SideEffectApplier.NONE;
}
return worldApplyingExtent.getUpdateOptions();
return worldApplyingExtent.getSideEffectApplier();
}

/**
Expand Down
Expand Up @@ -21,13 +21,14 @@

import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.collect.Sets;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.RunContext;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.util.SideEffect;
import com.sk89q.worldedit.util.SideEffectApplier;
import com.sk89q.worldedit.util.collection.BlockMap;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockState;
Expand All @@ -44,21 +45,15 @@
*/
public class WorldApplyingExtent extends AbstractDelegateExtent {

public static Set<WorldApplyingExtent.BlockUpdateOptions> NO_UPDATES =
Sets.immutableEnumSet(EnumSet.noneOf(WorldApplyingExtent.BlockUpdateOptions.class));
public static Set<WorldApplyingExtent.BlockUpdateOptions> ALL_UPDATES =
Sets.immutableEnumSet(EnumSet.allOf(WorldApplyingExtent.BlockUpdateOptions.class));

private final World world;
private final Map<BlockVector3, BlockState> positions = BlockMap.create();
private final Set<BlockVector2> dirtyChunks = new HashSet<>();
private final Set<BlockUpdateOptions> blockUpdateOptions = EnumSet.of(
BlockUpdateOptions.CONNECTIONS,
BlockUpdateOptions.LIGHTING,
BlockUpdateOptions.NEIGHBOURS
);
private SideEffectApplier sideEffectApplier = new SideEffectApplier(EnumSet.of(
SideEffect.CONNECTIONS,
SideEffect.LIGHTING,
SideEffect.NEIGHBOURS
));
private boolean postEditSimulation;
private boolean requiresCleanup = blockUpdateOptions.stream().anyMatch(BlockUpdateOptions::requiresCleanup);

/**
* Create a new instance.
Expand All @@ -79,25 +74,24 @@ public void setPostEditSimulationEnabled(boolean enabled) {
this.postEditSimulation = enabled;
}

public Set<BlockUpdateOptions> getUpdateOptions() {
return this.blockUpdateOptions;
public SideEffectApplier getSideEffectApplier() {
return this.sideEffectApplier;
}

public void setBlockUpdateOptions(Set<BlockUpdateOptions> blockUpdateOptions) {
this.blockUpdateOptions.clear();
this.blockUpdateOptions.addAll(blockUpdateOptions);
public void setSideEffectApplier(SideEffectApplier sideEffectApplier) {
this.sideEffectApplier = sideEffectApplier;
}

@Override
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B block) throws WorldEditException {
if (requiresCleanup) {
if (sideEffectApplier.doesRequireCleanup()) {
dirtyChunks.add(BlockVector2.at(location.getBlockX() >> 4, location.getBlockZ() >> 4));
}
if (postEditSimulation) {
positions.put(location, world.getBlock(location));
}

return world.setBlock(location, block, postEditSimulation ? NO_UPDATES : blockUpdateOptions);
return world.setBlock(location, block, postEditSimulation ? SideEffectApplier.NONE : sideEffectApplier);
}

public boolean commitRequired() {
Expand All @@ -120,7 +114,7 @@ public Operation resume(RunContext run) throws WorldEditException {
Iterator<Map.Entry<BlockVector3, BlockState>> positionIterator = positions.entrySet().iterator();
while (run.shouldContinue() && positionIterator.hasNext()) {
Map.Entry<BlockVector3, BlockState> position = positionIterator.next();
world.notifyBlock(position.getKey(), position.getValue(), blockUpdateOptions);
world.notifyBlock(position.getKey(), position.getValue(), sideEffectApplier);
positionIterator.remove();
}

Expand All @@ -135,22 +129,4 @@ public void cancel() {
}
};
}

public enum BlockUpdateOptions {
LIGHTING(false),
NEIGHBOURS(false),
CONNECTIONS(false),
ENTITY_AI(false),
PLUGIN_EVENTS(false);

private boolean dirty;

BlockUpdateOptions(boolean dirty) {
this.dirty = dirty;
}

public boolean requiresCleanup() {
return this.dirty;
}
}
}
@@ -0,0 +1,38 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* Copyright (C) WorldEdit team and contributors
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package com.sk89q.worldedit.util;

public enum SideEffect {
LIGHTING(false),
NEIGHBOURS(false),
CONNECTIONS(false),
ENTITY_AI(false),
PLUGIN_EVENTS(false);

private boolean dirty;

SideEffect(boolean dirty) {
this.dirty = dirty;
}

public boolean requiresCleanup() {
return this.dirty;
}
}

0 comments on commit 6488310

Please sign in to comment.