mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-28 12:56:05 +01:00
fix undo
This commit is contained in:
parent
2b187f2066
commit
b2f8238f5d
@ -1,5 +1,6 @@
|
|||||||
package com.plotsquared.bukkit.listeners.worldedit;
|
package com.plotsquared.bukkit.listeners.worldedit;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
import com.intellectualcrafters.plot.PS;
|
import com.intellectualcrafters.plot.PS;
|
||||||
@ -27,11 +28,20 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
|
|||||||
boolean BSblocked = false;
|
boolean BSblocked = false;
|
||||||
boolean Eblocked = false;
|
boolean Eblocked = false;
|
||||||
private String world;
|
private String world;
|
||||||
|
private int max;
|
||||||
|
private int count;
|
||||||
|
private Extent parent;
|
||||||
|
|
||||||
public ProcessedWEExtent(String world, HashSet<RegionWrapper> mask, Extent extent) {
|
public ProcessedWEExtent(String world, HashSet<RegionWrapper> mask, int max, Extent child, Extent parent) {
|
||||||
super(extent);
|
super(child);
|
||||||
this.mask = mask;
|
this.mask = mask;
|
||||||
this.world = world;
|
this.world = world;
|
||||||
|
if (max == -1) {
|
||||||
|
max = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
this.max = max;
|
||||||
|
this.count = 0;
|
||||||
|
this.parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -82,6 +92,19 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
|
|||||||
PS.debug("&cPlotSquared detected unsafe WorldEdit: " + (location.getBlockX()) + "," + (location.getBlockZ()));
|
PS.debug("&cPlotSquared detected unsafe WorldEdit: " + (location.getBlockX()) + "," + (location.getBlockZ()));
|
||||||
}
|
}
|
||||||
if (WEManager.maskContains(mask, location.getBlockX(), location.getBlockZ())) {
|
if (WEManager.maskContains(mask, location.getBlockX(), location.getBlockZ())) {
|
||||||
|
if (count++ > max) {
|
||||||
|
if (parent != null) {
|
||||||
|
try {
|
||||||
|
Field field = AbstractDelegateExtent.class.getDeclaredField("extent");
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(parent, new NullExtent());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
parent = null;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return super.setBlock(location, block);
|
return super.setBlock(location, block);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -91,6 +114,19 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
|
|||||||
int y = location.getBlockY();
|
int y = location.getBlockY();
|
||||||
int z = location.getBlockZ();
|
int z = location.getBlockZ();
|
||||||
if (WEManager.maskContains(mask, location.getBlockX(), location.getBlockZ())) {
|
if (WEManager.maskContains(mask, location.getBlockX(), location.getBlockZ())) {
|
||||||
|
if (count++ > max) {
|
||||||
|
if (parent != null) {
|
||||||
|
try {
|
||||||
|
Field field = AbstractDelegateExtent.class.getDeclaredField("extent");
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(parent, new NullExtent());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
parent = null;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
switch(id) {
|
switch(id) {
|
||||||
case 0:
|
case 0:
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package com.plotsquared.bukkit.listeners.worldedit;
|
package com.plotsquared.bukkit.listeners.worldedit;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.intellectualcrafters.plot.PS;
|
import com.intellectualcrafters.plot.PS;
|
||||||
import com.intellectualcrafters.plot.config.C;
|
import com.intellectualcrafters.plot.config.C;
|
||||||
import com.intellectualcrafters.plot.config.Settings;
|
import com.intellectualcrafters.plot.config.Settings;
|
||||||
@ -10,16 +13,34 @@ import com.intellectualcrafters.plot.object.RegionWrapper;
|
|||||||
import com.intellectualcrafters.plot.util.MainUtil;
|
import com.intellectualcrafters.plot.util.MainUtil;
|
||||||
import com.intellectualcrafters.plot.util.Permissions;
|
import com.intellectualcrafters.plot.util.Permissions;
|
||||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||||
|
import com.plotsquared.bukkit.BukkitMain;
|
||||||
|
import com.sk89q.worldedit.EditSession;
|
||||||
|
import com.sk89q.worldedit.EditSession.Stage;
|
||||||
|
import com.sk89q.worldedit.LocalSession;
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitPlayer;
|
||||||
import com.sk89q.worldedit.event.extent.EditSessionEvent;
|
import com.sk89q.worldedit.event.extent.EditSessionEvent;
|
||||||
import com.sk89q.worldedit.extension.platform.Actor;
|
import com.sk89q.worldedit.extension.platform.Actor;
|
||||||
|
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
|
||||||
|
import com.sk89q.worldedit.extent.ChangeSetExtent;
|
||||||
|
import com.sk89q.worldedit.extent.Extent;
|
||||||
|
import com.sk89q.worldedit.extent.cache.LastAccessExtentCache;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.BlockBagExtent;
|
||||||
|
import com.sk89q.worldedit.extent.reorder.MultiStageReorder;
|
||||||
|
import com.sk89q.worldedit.extent.validation.DataValidatorExtent;
|
||||||
|
import com.sk89q.worldedit.extent.world.BlockQuirkExtent;
|
||||||
|
import com.sk89q.worldedit.extent.world.ChunkLoadingExtent;
|
||||||
|
import com.sk89q.worldedit.extent.world.FastModeExtent;
|
||||||
|
import com.sk89q.worldedit.extent.world.SurvivalModeExtent;
|
||||||
import com.sk89q.worldedit.util.eventbus.EventHandler.Priority;
|
import com.sk89q.worldedit.util.eventbus.EventHandler.Priority;
|
||||||
import com.sk89q.worldedit.util.eventbus.Subscribe;
|
import com.sk89q.worldedit.util.eventbus.Subscribe;
|
||||||
|
import com.sk89q.worldedit.world.World;
|
||||||
|
|
||||||
public class WESubscriber {
|
public class WESubscriber {
|
||||||
|
|
||||||
@Subscribe(priority=Priority.VERY_EARLY)
|
@Subscribe(priority=Priority.VERY_EARLY)
|
||||||
public void onEditSession(EditSessionEvent event) {
|
public void onEditSession(EditSessionEvent event) {
|
||||||
String world = event.getWorld().getName();
|
World worldObj = event.getWorld();
|
||||||
|
String world = worldObj.getName();
|
||||||
if (!PS.get().isPlotWorld(world)) {
|
if (!PS.get().isPlotWorld(world)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -41,7 +62,53 @@ public class WESubscriber {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Settings.CHUNK_PROCESSOR) {
|
if (Settings.CHUNK_PROCESSOR) {
|
||||||
event.setExtent(new ProcessedWEExtent(world, mask, event.getExtent()));
|
if (Settings.EXPERIMENTAL_FAST_ASYNC_WORLDEDIT) {
|
||||||
|
try {
|
||||||
|
AbstractDelegateExtent extent = (AbstractDelegateExtent) event.getExtent();
|
||||||
|
ChangeSetExtent history = null;
|
||||||
|
MultiStageReorder reorder = null;
|
||||||
|
boolean fast = ((BukkitMain) PS.get().IMP).worldEdit.getWorldEdit().getSession(name).hasFastMode();
|
||||||
|
while (extent.getExtent() != null && extent.getExtent() instanceof AbstractDelegateExtent) {
|
||||||
|
AbstractDelegateExtent tmp = (AbstractDelegateExtent) extent.getExtent();
|
||||||
|
if (tmp.getExtent() != null && tmp.getExtent() instanceof AbstractDelegateExtent) {
|
||||||
|
if (tmp instanceof ChangeSetExtent) {
|
||||||
|
history = (ChangeSetExtent) tmp;
|
||||||
|
}
|
||||||
|
if (tmp instanceof MultiStageReorder) {
|
||||||
|
reorder = (MultiStageReorder) tmp;
|
||||||
|
}
|
||||||
|
extent = tmp;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int max = event.getMaxBlocks();
|
||||||
|
Field field = AbstractDelegateExtent.class.getDeclaredField("extent");
|
||||||
|
field.setAccessible(true);
|
||||||
|
if (history == null) {
|
||||||
|
ExtentWrapper wrapper = new ExtentWrapper(event.getExtent());
|
||||||
|
event.setExtent(wrapper);
|
||||||
|
field.set(extent, new ProcessedWEExtent(world, mask, max, new FastModeExtent(worldObj, true), wrapper));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (fast) {
|
||||||
|
event.setExtent(new ExtentWrapper(extent));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExtentWrapper wrapper = new ExtentWrapper(history);
|
||||||
|
event.setExtent(wrapper);
|
||||||
|
field.set(history, reorder);
|
||||||
|
field.set(reorder, new ProcessedWEExtent(world, mask, max, new FastModeExtent(worldObj, true), wrapper));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event.setExtent(new ProcessedWEExtent(world, mask, event.getMaxBlocks(), event.getExtent(), event.getExtent()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
event.setExtent(new WEExtent(mask, event.getExtent()));
|
event.setExtent(new WEExtent(mask, event.getExtent()));
|
||||||
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user