From b2f8238f5d3a20628c4b314103d8e598e4119ea2 Mon Sep 17 00:00:00 2001 From: boy0001 Date: Tue, 25 Aug 2015 12:23:10 +1000 Subject: [PATCH] fix undo --- .../worldedit/ProcessedWEExtent.java | 40 +++++++++- .../listeners/worldedit/WESubscriber.java | 71 +++++++++++++++++- target/PlotSquared-Bukkit.jar | Bin 1319083 -> 1321463 bytes target/PlotSquared-Sponge.jar | Bin 1083974 -> 1083974 bytes 4 files changed, 107 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/plotsquared/bukkit/listeners/worldedit/ProcessedWEExtent.java b/src/main/java/com/plotsquared/bukkit/listeners/worldedit/ProcessedWEExtent.java index b878673ec..af64ef1a7 100644 --- a/src/main/java/com/plotsquared/bukkit/listeners/worldedit/ProcessedWEExtent.java +++ b/src/main/java/com/plotsquared/bukkit/listeners/worldedit/ProcessedWEExtent.java @@ -1,5 +1,6 @@ package com.plotsquared.bukkit.listeners.worldedit; +import java.lang.reflect.Field; import java.util.HashSet; import com.intellectualcrafters.plot.PS; @@ -27,11 +28,20 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { boolean BSblocked = false; boolean Eblocked = false; private String world; + private int max; + private int count; + private Extent parent; - public ProcessedWEExtent(String world, HashSet mask, Extent extent) { - super(extent); + public ProcessedWEExtent(String world, HashSet mask, int max, Extent child, Extent parent) { + super(child); this.mask = mask; this.world = world; + if (max == -1) { + max = Integer.MAX_VALUE; + } + this.max = max; + this.count = 0; + this.parent = parent; } @Override @@ -82,6 +92,19 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { PS.debug("&cPlotSquared detected unsafe WorldEdit: " + (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); } break; @@ -91,6 +114,19 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { int y = location.getBlockY(); int z = 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) { case 0: case 2: diff --git a/src/main/java/com/plotsquared/bukkit/listeners/worldedit/WESubscriber.java b/src/main/java/com/plotsquared/bukkit/listeners/worldedit/WESubscriber.java index 6a5db5250..b3dbd1fe7 100644 --- a/src/main/java/com/plotsquared/bukkit/listeners/worldedit/WESubscriber.java +++ b/src/main/java/com/plotsquared/bukkit/listeners/worldedit/WESubscriber.java @@ -1,7 +1,10 @@ package com.plotsquared.bukkit.listeners.worldedit; +import java.lang.reflect.Field; import java.util.HashSet; +import org.bukkit.entity.Player; + import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.config.C; 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.Permissions; 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.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.Subscribe; +import com.sk89q.worldedit.world.World; public class WESubscriber { @Subscribe(priority=Priority.VERY_EARLY) public void onEditSession(EditSessionEvent event) { - String world = event.getWorld().getName(); + World worldObj = event.getWorld(); + String world = worldObj.getName(); if (!PS.get().isPlotWorld(world)) { return; } @@ -41,7 +62,53 @@ public class WESubscriber { return; } 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 { event.setExtent(new WEExtent(mask, event.getExtent())); diff --git a/target/PlotSquared-Bukkit.jar b/target/PlotSquared-Bukkit.jar index 5405230fb5da9bffeca9e7f110fa66d9d5786674..3275a41357817af09ca2d590b1b40754be9a90d7 100644 GIT binary patch delta 8281 zcmZvh2|QF?_{SNFvCV23%h>lN`%aeZ+4n65*+VExm=qGBkV}Z{itJfZG{}<3zGPQX z*`g5A|9ZWzxA*`5`+Oev{Jzg~&Uwx`_uRR2=E*CgogpJCBRvvQ3ZkRG0H=FY+z@}K zDv5P6$T!CtE^=EEP}W3J-hqJEn=qPNFdAaeAfSR~jnYsv^>97cv5z>5&aoh}@=~UkN`f`VcbzElT@VgRl^6Df-ovNInp>(P!ixL0c*J8}b6I%CJR$%D^qqDs<*bn*bJf!rcu%##OH`WCntWE+ej{?Nb=+$O)2kZ52$|1 zgDgJ2u5&@gS?by1Q!WjUL|vFf`S>!Ox5Td)Tn(U~sBu$%k3F2g?>oz9uY~viwDHJH ztIXhCYF-bzHoJ3eed%qILm0Fbl4Uv%w?gV~@9i(>;3dMfGz~G?huTHOysmqTRka>m zcg!a7mg2PQlJXut`T`iKL67_zDfsyLCq)#1ij=ALj!@HKV*E44(WVyVWNFjTVQ=vT z&3YfkZ82iYiic~627y|g7SkQKUaP4VJ40V8Cf9P62-(r>cW=-4z{wM*s<_&zoS{Rp zoe3ow_<_ZN)R~LbC1EhUc=hd~UtS4oR^kH>2KV>wm|bESFlQnRxWr7v=U!J}Bl}4` zudRq#6_fXPWY2a+RMxDF5*mDoe<3vQJ*%{7)j64a0oz|PJ>m-%);L$i#04c|lvnnL za68FX9Im5Kt~XkPeR=mCY0Lt~O$InNybYLtYvG0QasEw=DcLb(2Iq&2u5(0IZ)O>M zQqMi7uB>>+z8sg8@b+CUPSLqW(hlc5=593S>YW$^Z5V9)MTn+U{O*zN&iZ6jUTY_hS^OkS~*Vp@twfU}UW5&a&XqbyCy+xbqm-=-0d z?H>L#Ljo)_wAQU~#x21-OmnVhp3dU(i`I68g@r1WtDVUcG}@!hd#(~r?joa3*{Cjl zf4ad!rSKPZ=wxN=u!T`p2qZIKGe>7F#o{t&hRpkJi`S4SYM<>~VtoO|Q?5${U3H>2 zeA~~dQ_MASwigh+o&Hm0H>z8ws$M8QI3I}b(7qMpk&GN-v}jdV9%(ojH5Zg0Ewi6y zAirf9-Lus->u)*WODyK}1rFT5cMy4O!7xX02U3bH?A7@OYdUvTAF z<%Fd4XdyW$#J-n|a~a7$n;wmlYPY_qTa4%qymnV5C$6BC@P_>LXsfQ$qadb&W`(=R zcMa}RJg6e9o{^)WaDQ6yP1@Cvxll(k{9Upjr<%Cud|qMxnXelj@;FT1c+PL4gV5KM z>>~)pW0;qLLC>D$1-{uC>_?XpQ=0YgN{2pI1ke;2>^Iova_bRzv z5JuPf{_ReZP0yWq;_cpkTh$T5jWFXjV1q5;HvPxp_%qd$0t|JWZo3~0!mK;m@Wb%1 zYI%kYMl6mFwWp0Jy8q=tX`$$56=hOsaG-njdo|>aXE3t^H+wP$nb-P>LC?g$j=X^C z1yH-q^|Humhv?0tH;mhJ{QlT@ZZCl@HTiGU)OwYvzk(}bd}+QdO84>iyYJGyHr1pq zvqf1k*{!28S+M%7mB8xD@t!O0_AjJ|(e4z|*D6{2OM@-uCaaVtHlJ3y`0Ksy zVi0O0jwA?OKo+pR|E^$G<}Wat6(!V@Wu7zU7tCfU{kdrEm1{$3;**$pQsR|+I@G?nCG!iAx0|&LNmFpf1Ck<*B-XjSa%_2Ks z;${C)N!LucL9=EfEIVKmS+#binSo-85%E=J!J|#%oLS*Rrpd3Kc<7;%i=Za zt@wN(@Nw+C!w9r@+x(%5^=)U?shLfAhi<6ZhD~9Gkz8b>mhfgo=$KVrFHiE2b}t9A zBt1Rt-7=$Hg1Ak_O^Vcf3T3nWakr1arN;i~~Mq2DQX~A0;K;m`I{=AmX z`=0s75yNBm75ka`2fgT&Ov!UR5OuhFQ60!MZCQ0fG;&nC!Hgge^}SoEO5lNJa!Yde zY6mAp*>X>@&)-BUbIrFQl{w}`psXnyP-sr7UwxFJ&TehgHEu-?{Jb$VX~IZS{5y-* zXDnY|+skK*d{?LYu;;qOrfON0bK<9#CDks?nDbT@RkO}Vlx;m-?>tSoLf9V&pV4rux9Rfq;-*AZ&($Ieop{=PV?)O^uaa%~7oQ_s=$=#9KaH3&U0(P()KIa?wYJ_# zPt)3__ba%Iw@WH%UJxI3R+V6Gk=;H9lSpBtf06UlINdtonylB-H@#{LO7r+S`D7{K z1V?-SShG)dMEgN8eicesVzQ0-{*9lf+8z#UyS|sna(Gtf-CW%*m3F7GM|m~g79pchX)-WVS6C~F>zQ9MAPQ)~H8Yh$| zGI|FLJ3U|2oLXvtDln@m=9YCn*Cky_RX)(sS?uqb-i@!O#+$Eo&ZfTDeZEQ6CrI`U z_7Q&QLEE7$kZ%@$I*tQ(w)L`ze^j>0S@Sa*a@SMr&^l|~c-d(BIgV1=rk@^!KDqvd zTeV-1>vFTLN#v&OAxm$9Z;Q(4c;y)BSnNl6(!OO3K8yUw;rp!xZc;V0+7sZ=db-2{ zamiwUZMjqSO!)G5gT9=P5jh3ODapZ1h4`^8b-c(^#v(>%y_(8+6D>sw;;wHrHaG_LEpCzw(geT+)2mgR|XhitE zb1gVG=DW)jGXk4)v_JXKiy{kll3k7D>vKVLOB@GS{9Wp-Z1`})T#`lc_8R!Y$Y%vx zV@3EnVYE)E(`o+#-}cQhL_|u*Z{ILG7!~0669va-TS3E^%`w06nfk6l5^@iug-L|D zjC3a@C(>pzu?5{RF`qaxdGzH7E)qIL6DvMJt{$ePC9!b}HBKSoEI+Zpjz+K78=g~v2o$nS@^p24Y3!t@j8A;iuxyGk7w>O zu5C#N`HtP-VRtLXj=ud7RaPCnO6sOxptZ$D>4TZ*Vn<6ZbT}V6(9AhndKdoIzA~1D)>go>2>QDDFuVp!KWjHgXeG1 zNhtV%Q;Y6$Ztd%~BIT00uQ7cD^IL5QQz=Z;sWNRn37;?QnSMc28;N=yYK?hfO30zN zk5YY7@@>?-P1=;$g{51#Z}+$;t{#r|iQunzsTY&gTuzIUiz*zlFpRlTV_l;Bb_LE5 zMTzgBE24d46C#}Z*siyu5%~$xr$AkDXUjsjlLys03HKsmyC+kWAlg7`zL(8>|Q>goV#@ z-BvLld#$w}(|CvpCOv~XErnK6cyX2S1oMu`I~C?xmUyD>&6AKN1h}0~KpyaZxm0{< zm87MDHD+B|dadPy*@r2Cj95Ubfw)M{w+L>6xHj4Z?4 zdE!T+=%8<-FvZM04b0^$D(bW4)(GQuH749M?rR?#?%tnPHy#mHbnmo)vY1MQ#M3bi zmnS=REw@XHWc_;lZF>#FpDt1})quoX>NUhwI{N#+(r&O^-x}>&CP+=W$Um@U^88iz ze5KP z83~sod4Jw`TW}C#Ot?yj^Ju?hs)*jS9hoIz@iCq`eK86#KP)aer0fK^xF>ewU*eP+ zFilk?F{FJRar_>ys=TV_n5}shrVhNMFL_K(jSNoOEy742$Q5{GvNf8%7P)-k%k1QW zZ@KSxnL2Zsz!7t@$)?97+4@rUi|lM4W`!478u~=2`G20tDpO7pWSh^z62;82zcf$+Xv7Zi*v9`ZODxb5Gyds2QeXX^UH~md|c93eDnGEO3 z+Q!QjmL=+IqJqh3FW!Ak_-@!7caiS{Z%Wl#jEMg!0K_M?eK zF{5k#70T(G(>`G|^*Xx;?TwD8f^a@++Yb>(h$2rsU$ zJJ0vdS0UBjn+oS5rX!zUoVpnvMr)C8{FF9J&_luJwD^>DORq_)oh66+w4i(V4=&^) z-J5f2b`32ei%h#k;kQenmu=a4@mYTR)zX+i(jC2qq?D}!PRuM4s8@@uh~dO#mkat_ zRx2~cI4``rsABT2W>yr#|q-0d|SZ97F{FC}Up+&r5 zuMkv<;Z9W-x!b**Sm#Wujpt-I+8H_iu& ze8^k&P?NRl(hLG6_V#ob4Za2W`nLA26mC^=xwf4{O}V_dEysV+H(6$q%BObewi#V< z=tTT(HhhlTc+XIws*+YQn7DHa2MW4+O2O2>Q#X>#nyjr3?Nx<6ZSWoI4x=S3brMF@ zG_{vahqw+hE4^)kW>V`MI`Pq~GjpYNLJ5UME~om0ycjNG`W)d)HqMdN9t{fFql>-X z#Y&%Ov%h#Lo2^zo^$%5NaWfl#;LKu-El4xi|I&FF&*O$!%9T>=J@5SX&glm$i3BT? zv-_e*rk+4AZ3oR$PSto5f9Ho(V$MpmS3iF|_^>QZHX&+#^NYyK$!}5jr@h7$xScOK zuPLnNscq;ldG$x#Xm`b<8g(C_T9Wg(4uh&fpjFqv$o1b6^W%-8DAxJXj9eJwakk*${Bs_3fIw)(BA&Ly6lTVahtkC(K1&<68zM3Stib5kD}*3WYiu< zAlp!Li(U}uQ@~%RSD;tW`es|`h(5!+(HY)QWQBb#ccaxIL!~h{w*ix5yz@wN<+reo z)wlCpUyc1UAZPp~hGu=g?s$eE&$;uE)<%a-IElx@9M)_5g4fRy9GH#jWviJDe6AY^ zGB~Kx{uWt)3oWtP^;$ls=$-G%zQuj;3@zv~?Xts-T8>*op;le5!SLlrZSR&5-v?03 z#csJnTZ+^8mMCH^Izkz4_})#HM7#7vN<>g9uGpFSs;y2?xkUzDs=UHx<<1Ef2dwCJ8ncw=%WKvzp-=T zW(ZQ7;LYUC{QC6WN-Y9ARLiPgremj8>8CH-lVt|AJDcC9s5>*_uOY)OZ`$-tE!q`T z8$wVqDA%O;*+$8v94tIrk2~;?yXQCYEu{z;Xz+Ta2t?6)@DRNIqcxI)_^1H2MZTv$ zDtz)sT2LPql&>Ru7>)`Q8AuM9qk_mg?_Nga6<;HV2w z@U*=?6N6G91qm?Df|5P*AhD>!@&D({oP7tSc>4Ib9C+D}!T|6c6c+MLA5i^?5(eyd zP|R%qJsTz>Qv2(C|M*`)WQ_4~D0os#4@~c%1R(RaN8}73yNi;B+;%t?IlEvUQGv&T z{3i;-_J6)X{HNKDYe%6T5SCj~Jz{UYe2GYIoUqS}h{X$7XI=}yc&#b^GfUaNQG*#}LU^2k>5CsKT4pE|z zfxZ7?6-XovP<4oMfP6w7U3pT`l)!j13I$lg;Ap_}H;Mux%y8n#2nIb(zfoA?$M+wh z#qU$1#UKKl|G4k_g3_1!L=J(nLga5r0VuveA&+PCJTaOPVt)C^!wn=5qopDB!AF7% z_)Lsefc%a)77kb8FhK7#8V-0szzUCI0AmugH~@=)lL0RwXaUG{>=BU!uq0qlOo>Or z4Z;H)U8R6^60|6U;Q_!-igt$RJv^@4Knh0o=N}7}Q=r%?JQ8AnV>bLW;JJl@1HdV; zGt;sodDn|Zk=}qTirKVJ~+Sx1*18Zj>(M~I4zJg4fc`@MPnhqzZ_$S1vvbV@oq!G zM)G!#ebN-*;^-e7i}Ecv#qr`)QGhWOGJr7(%?PMaqN#u_3UFd?E1nQlh=$6EpaM!M z(J~N}`U#-~$f&@~#vT45X=pepU`d5mg`nO31wI!LXrPx0oTg5{TAHChhx zHt-L^?~R}au2Ub~9g!y(4vbQRb50!f2a%)!`@EfSOs>!Sg8pc61t58yCj<^yA;B2O zo)ZECzE1zM)%uWVM&f$F2!&<^$Wdr5Na)y6oFjy3?l>O5iGTrfD6|9w`S}mBgFw>* z)@X2LTQ~l|U{~}&;}Oo>{sTj3!3?gnhtPiyHSPcb zr~Y?u*q!<#3g|ch$bS(W zu%!o^D53oqK>;{5k_>1%;u-XRawG#-yA$&#I)ea1yJ^8~#E(M$ne0B(pJDHgY6f8c zMdW}82E47fH~~it+JXQp<`v`> Ogc3naG|GSihx1s$LO delta 5881 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