Anvil paste (undo/restrictions)

This commit is contained in:
Jesse Boyd 2017-08-20 15:26:27 +10:00
parent 7359100159
commit 3b77a09e27
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
3 changed files with 51 additions and 26 deletions

View File

@ -19,19 +19,18 @@ import com.boydti.fawe.jnbt.anvil.filters.RemapFilter;
import com.boydti.fawe.jnbt.anvil.filters.RemoveLayerFilter; import com.boydti.fawe.jnbt.anvil.filters.RemoveLayerFilter;
import com.boydti.fawe.jnbt.anvil.filters.ReplacePatternFilter; import com.boydti.fawe.jnbt.anvil.filters.ReplacePatternFilter;
import com.boydti.fawe.jnbt.anvil.filters.ReplaceSimpleFilter; import com.boydti.fawe.jnbt.anvil.filters.ReplaceSimpleFilter;
import com.boydti.fawe.jnbt.anvil.history.IAnvilHistory;
import com.boydti.fawe.jnbt.anvil.history.NullAnvilHistory;
import com.boydti.fawe.object.FawePlayer; import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.FaweQueue; import com.boydti.fawe.object.FaweQueue;
import com.boydti.fawe.object.RegionWrapper; import com.boydti.fawe.object.RegionWrapper;
import com.boydti.fawe.object.RunnableVal4; import com.boydti.fawe.object.RunnableVal4;
import com.boydti.fawe.object.changeset.AnvilHistory; import com.boydti.fawe.object.changeset.AnvilHistory;
import com.boydti.fawe.object.clipboard.ClipboardRemapper; import com.boydti.fawe.object.clipboard.ClipboardRemapper;
import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.object.mask.FaweBlockMatcher; import com.boydti.fawe.object.mask.FaweBlockMatcher;
import com.boydti.fawe.regions.FaweMaskManager;
import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.MainUtil;
import com.boydti.fawe.util.SetQueue; import com.boydti.fawe.util.SetQueue;
import com.boydti.fawe.util.StringMan; import com.boydti.fawe.util.StringMan;
import com.boydti.fawe.util.WEManager;
import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandPermissions; import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EditSession;
@ -49,15 +48,15 @@ import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.command.binding.Switch; import com.sk89q.worldedit.util.command.binding.Switch;
import com.sk89q.worldedit.util.command.parametric.Optional; import com.sk89q.worldedit.util.command.parametric.Optional;
import com.sk89q.worldedit.world.World;
import java.io.IOException; import java.io.IOException;
import java.io.RandomAccessFile; import java.io.RandomAccessFile;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
@ -129,23 +128,22 @@ public class AnvilCommands {
FaweQueue tmp = SetQueue.IMP.getNewQueue(worldName, true, false); FaweQueue tmp = SetQueue.IMP.getNewQueue(worldName, true, false);
MCAQueue queue = new MCAQueue(tmp); MCAQueue queue = new MCAQueue(tmp);
FawePlayer<Object> fp = FawePlayer.wrap(player); FawePlayer<Object> fp = FawePlayer.wrap(player);
fp.checkAllowedRegion(selection);
recordHistory(fp, editSession.getWorld(), iAnvilHistory -> {
queue.filterCopy(filter, wrappedRegion, iAnvilHistory);
});
return filter;
}
public static void recordHistory(FawePlayer fp, World world, Consumer<IAnvilHistory> run) {
LocalSession session = fp.getSession(); LocalSession session = fp.getSession();
if (session == null || session.hasFastMode()) { if (session == null || session.hasFastMode()) {
queue.filterCopy(filter, wrappedRegion); run.accept(new NullAnvilHistory());
} else { } else {
RegionWrapper[] allowed = WEManager.IMP.getMask(fp, FaweMaskManager.MaskType.OWNER); AnvilHistory history = new AnvilHistory(Fawe.imp().getWorldName(world), fp.getUUID());
HashSet<RegionWrapper> allowedSet = new HashSet<>(Arrays.asList(allowed)); run.accept(history);
RegionWrapper wrappedSelection = new RegionWrapper(selection.getMinimumPoint(), selection.getMaximumPoint()); session.remember(fp.getPlayer(), world, history, fp.getLimit());
if (allowed.length == 0) {
throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_NO_REGION);
} else if (!WEManager.IMP.regionContains(wrappedSelection, allowedSet)) {
throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_FAILS);
} }
AnvilHistory history = new AnvilHistory(worldName, player.getUniqueId());
queue.filterCopy(filter, wrappedRegion, history);
session.remember(player, editSession.getWorld(), history, fp.getLimit());
}
return filter;
} }
@Command( @Command(
@ -590,7 +588,12 @@ public class AnvilCommands {
MCAQueue copyQueue = clipboard.getQueue(); MCAQueue copyQueue = clipboard.getQueue();
MCAQueue pasteQueue = new MCAQueue(tmpTo); MCAQueue pasteQueue = new MCAQueue(tmpTo);
pasteQueue.pasteRegion(copyQueue, copyRegion, offset); fp.checkAllowedRegion(pasteRegion);
recordHistory(fp, editSession.getWorld(), iAnvilHistory -> {
try {
pasteQueue.pasteRegion(copyQueue, copyRegion, offset, iAnvilHistory);
} catch (IOException e) { throw new RuntimeException(e); }
});
BBC.COMMAND_PASTE.send(player, player.getPosition()); BBC.COMMAND_PASTE.send(player, player.getPosition());
} }
} }

View File

@ -155,6 +155,10 @@ public class MCAQueue extends NMSMappedFaweQueue<FaweQueue, FaweChunk, FaweChunk
} }
public void pasteRegion(MCAQueue from, final RegionWrapper regionFrom, Vector offset) throws IOException { public void pasteRegion(MCAQueue from, final RegionWrapper regionFrom, Vector offset) throws IOException {
pasteRegion(from, regionFrom, offset, new NullAnvilHistory());
}
public void pasteRegion(MCAQueue from, final RegionWrapper regionFrom, Vector offset, IAnvilHistory history) throws IOException {
int oX = offset.getBlockX(); int oX = offset.getBlockX();
int oZ = offset.getBlockZ(); int oZ = offset.getBlockZ();
int oY = offset.getBlockY(); int oY = offset.getBlockY();
@ -199,12 +203,14 @@ public class MCAQueue extends NMSMappedFaweQueue<FaweQueue, FaweChunk, FaweChunk
if (bx >= regionTo.minX && tx <= regionTo.maxX && bz >= regionTo.minZ && tz <= regionTo.maxZ) { if (bx >= regionTo.minX && tx <= regionTo.maxX && bz >= regionTo.minZ && tz <= regionTo.maxZ) {
FaweChunk chunk = from.getFaweChunk(cx - oCX, cz - oCZ); FaweChunk chunk = from.getFaweChunk(cx - oCX, cz - oCZ);
if (!(chunk instanceof NullFaweChunk)) { if (!(chunk instanceof NullFaweChunk)) {
if (regionTo.minY == 0 && regionTo.maxY == 255) { // if (regionTo.minY == 0 && regionTo.maxY == 255) {
MCAChunk mcaChunk = (MCAChunk) chunk; // System.out.println("Vertical");
mcaChunk.setLoc(null, cx, cz); // MCAChunk mcaChunk = (MCAChunk) chunk;
mcaChunk.setModified(); // mcaChunk.setLoc(null, cx, cz);
mcaFile.setChunk(mcaChunk); // mcaChunk.setModified();
} else { // mcaFile.setChunk(mcaChunk);
// } else
{
MCAChunk newChunk = mcaFile.getChunk(cx, cz); MCAChunk newChunk = mcaFile.getChunk(cx, cz);
if (newChunk == null) { if (newChunk == null) {
newChunk = new MCAChunk(MCAQueue.this, cx, cz); newChunk = new MCAChunk(MCAQueue.this, cx, cz);
@ -277,7 +283,7 @@ public class MCAQueue extends NMSMappedFaweQueue<FaweQueue, FaweChunk, FaweChunk
} }
return null; return null;
} }
}, regionTo); }, regionTo, history);
from.clear(); from.clear();
} }

View File

@ -38,6 +38,8 @@ import com.sk89q.worldedit.world.registry.WorldData;
import java.io.File; import java.io.File;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -173,6 +175,20 @@ public abstract class FawePlayer<T> extends Metadatable {
} }
} }
public void checkAllowedRegion(Region selection) {
checkAllowedRegion(new RegionWrapper(selection.getMinimumPoint(), selection.getMaximumPoint()));
}
public void checkAllowedRegion(RegionWrapper wrappedSelection) {
RegionWrapper[] allowed = WEManager.IMP.getMask(this, FaweMaskManager.MaskType.OWNER);
HashSet<RegionWrapper> allowedSet = new HashSet<>(Arrays.asList(allowed));
if (allowed.length == 0) {
throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_NO_REGION);
} else if (!WEManager.IMP.regionContains(wrappedSelection, allowedSet)) {
throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_FAILS);
}
}
public boolean confirm() { public boolean confirm() {
String confirm = deleteMeta("cmdConfirm"); String confirm = deleteMeta("cmdConfirm");
if (confirm == null) { if (confirm == null) {