mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-10-31 17:43:44 +01:00 
			
		
		
		
	fix undo
This commit is contained in:
		| @@ -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.
										
									
								
							
		Reference in New Issue
	
	Block a user
	 boy0001
					boy0001