1
1
package org .dynmap .worldguard ;
2
2
3
3
import java .io .IOException ;
4
+ import java .util .ArrayList ;
4
5
import java .util .HashMap ;
5
6
import java .util .HashSet ;
6
7
import java .util .List ;
@@ -44,6 +45,7 @@ public class DynmapWorldGuardPlugin extends JavaPlugin {
44
45
MarkerAPI markerapi ;
45
46
WorldGuardPlugin wg ;
46
47
BooleanFlag boost_flag ;
48
+ int updatesPerTick = 20 ;
47
49
48
50
FileConfiguration cfg ;
49
51
MarkerSet set ;
@@ -99,13 +101,6 @@ public static void info(String msg) {
99
101
public static void severe (String msg ) {
100
102
log .log (Level .SEVERE , msg );
101
103
}
102
-
103
- private class WorldGuardUpdate implements Runnable {
104
- public void run () {
105
- if (!stop )
106
- updateRegions ();
107
- }
108
- }
109
104
110
105
private Map <String , AreaMarker > resareas = new HashMap <String , AreaMarker >();
111
106
@@ -269,17 +264,50 @@ else if(tn.equalsIgnoreCase("polygon")) {
269
264
}
270
265
}
271
266
272
- /* Update worldguard region information */
273
- private void updateRegions () {
267
+ private class UpdateJob implements Runnable {
274
268
Map <String ,AreaMarker > newmap = new HashMap <String ,AreaMarker >(); /* Build new map */
275
-
276
- /* Loop through worlds */
277
- for (World w : getServer ().getWorlds ()) {
278
- RegionManager rm = wg .getRegionManager (w ); /* Get region manager for world */
279
- if (rm == null ) continue ;
280
-
281
- Map <String ,ProtectedRegion > regions = rm .getRegions (); /* Get all the regions */
282
- for (ProtectedRegion pr : regions .values ()) {
269
+ List <World > worldsToDo = null ;
270
+ List <ProtectedRegion > regionsToDo = null ;
271
+ World curworld = null ;
272
+
273
+ public void run () {
274
+ if (stop ) {
275
+ return ;
276
+ }
277
+ // If worlds list isn't primed, prime it
278
+ if (worldsToDo == null ) {
279
+ worldsToDo = new ArrayList <World >(getServer ().getWorlds ());
280
+ }
281
+ while (regionsToDo == null ) { // No pending regions for world
282
+ if (worldsToDo .isEmpty ()) { // No more worlds?
283
+ /* Now, review old map - anything left is gone */
284
+ for (AreaMarker oldm : resareas .values ()) {
285
+ oldm .deleteMarker ();
286
+ }
287
+ /* And replace with new map */
288
+ resareas = newmap ;
289
+ // Set up for next update (new job)
290
+ getServer ().getScheduler ().scheduleSyncDelayedTask (DynmapWorldGuardPlugin .this , new UpdateJob (), updperiod );
291
+ return ;
292
+ }
293
+ else {
294
+ curworld = worldsToDo .remove (0 );
295
+ RegionManager rm = wg .getRegionManager (curworld ); /* Get region manager for world */
296
+ if (rm != null ) {
297
+ Map <String ,ProtectedRegion > regions = rm .getRegions (); /* Get all the regions */
298
+ if ((regions != null ) && (regions .isEmpty () == false )) {
299
+ regionsToDo = new ArrayList <ProtectedRegion >(regions .values ());
300
+ }
301
+ }
302
+ }
303
+ }
304
+ /* Now, process up to limit regions */
305
+ for (int i = 0 ; i < updatesPerTick ; i ++) {
306
+ if (regionsToDo .isEmpty ()) {
307
+ regionsToDo = null ;
308
+ break ;
309
+ }
310
+ ProtectedRegion pr = regionsToDo .remove (regionsToDo .size ()-1 );
283
311
int depth = 1 ;
284
312
ProtectedRegion p = pr ;
285
313
while (p .getParent () != null ) {
@@ -288,18 +316,11 @@ private void updateRegions() {
288
316
}
289
317
if (depth > maxdepth )
290
318
continue ;
291
- handleRegion (w , pr , newmap );
319
+ handleRegion (curworld , pr , newmap );
292
320
}
321
+ // Tick next step in the job
322
+ getServer ().getScheduler ().scheduleSyncDelayedTask (DynmapWorldGuardPlugin .this , this , 1 );
293
323
}
294
- /* Now, review old map - anything left is gone */
295
- for (AreaMarker oldm : resareas .values ()) {
296
- oldm .deleteMarker ();
297
- }
298
- /* And replace with new map */
299
- resareas = newmap ;
300
-
301
- getServer ().getScheduler ().scheduleSyncDelayedTask (this , new WorldGuardUpdate (), updperiod );
302
-
303
324
}
304
325
305
326
private class OurServerListener implements Listener {
@@ -413,6 +434,7 @@ private void activate() {
413
434
use3d = cfg .getBoolean ("use3dregions" , false );
414
435
infowindow = cfg .getString ("infowindow" , DEF_INFOWINDOW );
415
436
maxdepth = cfg .getInt ("maxdepth" , 16 );
437
+ updatesPerTick = cfg .getInt ("updates-per-tick" , 20 );
416
438
417
439
/* Get style information */
418
440
defstyle = new AreaStyle (cfg , "regionstyle" );
@@ -453,7 +475,7 @@ private void activate() {
453
475
updperiod = (long )(per *20 );
454
476
stop = false ;
455
477
456
- getServer ().getScheduler ().scheduleSyncDelayedTask (this , new WorldGuardUpdate (), 40 ); /* First time is 2 seconds */
478
+ getServer ().getScheduler ().scheduleSyncDelayedTask (this , new UpdateJob (), 40 ); /* First time is 2 seconds */
457
479
458
480
info ("version " + this .getDescription ().getVersion () + " is activated" );
459
481
}
0 commit comments