2 changed files with 66 additions and 48 deletions
@ -1,6 +1,66 @@ |
|||||||
package ru.simsonic.rscPermissions; |
package ru.simsonic.rscPermissions; |
||||||
|
import static java.lang.Thread.MIN_PRIORITY; |
||||||
|
import java.util.logging.Level; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
import org.bukkit.event.Listener; |
||||||
|
import ru.simsonic.utilities.MovingPlayersCatcher; |
||||||
|
|
||||||
public class RegionUpdateObserver |
public class RegionUpdateObserver implements Runnable, Listener |
||||||
{ |
{ |
||||||
|
private static final long granularityMin = 20; |
||||||
|
private static final long granularityMax = 10000; |
||||||
|
private final MainPluginClass rscp; |
||||||
|
private final MovingPlayersCatcher movedPlayers = new MovingPlayersCatcher(); |
||||||
|
private Thread thread; |
||||||
|
RegionUpdateObserver(MainPluginClass rscp) |
||||||
|
{ |
||||||
|
this.rscp = rscp; |
||||||
|
} |
||||||
|
public void registerListeners() |
||||||
|
{ |
||||||
|
rscp.getServer().getPluginManager().registerEvents(this, rscp); |
||||||
|
rscp.getServer().getPluginManager().registerEvents(movedPlayers, rscp); |
||||||
|
} |
||||||
|
public void start() |
||||||
|
{ |
||||||
|
stop(); |
||||||
|
thread = new Thread(this); |
||||||
|
thread.start(); |
||||||
|
} |
||||||
|
public void stop() |
||||||
|
{ |
||||||
|
if(thread != null) |
||||||
|
{ |
||||||
|
if(thread.isAlive()) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
thread.interrupt(); |
||||||
|
thread.join(); |
||||||
|
} catch(InterruptedException ex) { |
||||||
|
MainPluginClass.consoleLog.log(Level.SEVERE, "[rscp] Exception in RegionUpdateObserver: {0}", ex); |
||||||
|
} |
||||||
|
} |
||||||
|
thread = null; |
||||||
|
} |
||||||
|
} |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
Thread.currentThread().setName("rscp:RegionUpdateObserver"); |
||||||
|
Thread.currentThread().setPriority(MIN_PRIORITY); |
||||||
|
long granularity = rscp.settings.getRegionFinderGranularity(); |
||||||
|
if(granularity < granularityMin) |
||||||
|
granularity = granularityMin; |
||||||
|
if(granularity > granularityMax) |
||||||
|
granularity = granularityMax; |
||||||
|
for(; !Thread.interrupted(); Thread.sleep(granularity)) |
||||||
|
for(Player player : movedPlayers.getMovedPlayersAsync()) |
||||||
|
if(rscp.regionListProvider.isRegionListChanged(player)) |
||||||
|
rscp.cache.calculatePlayerPermissions(player); |
||||||
|
} catch(InterruptedException ex) { |
||||||
|
} |
||||||
|
} |
||||||
} |
} |
||||||
|
Loading…
Reference in new issue