Stanislav 11 years ago
parent
commit
ff79371b8d
  1. 50
      src/main/java/ru/simsonic/rscPermissions/MainPluginClass.java
  2. 64
      src/main/java/ru/simsonic/rscPermissions/RegionUpdateObserver.java

50
src/main/java/ru/simsonic/rscPermissions/MainPluginClass.java

@ -24,7 +24,6 @@ import org.mcstats.MetricsLite;
import ru.simsonic.rscPermissions.InternalCache.BrandNewCache;
import ru.simsonic.utilities.CommandAnswerException;
import ru.simsonic.utilities.LanguageUtility;
import ru.simsonic.utilities.MovingPlayersCatcher;
public final class MainPluginClass extends JavaPlugin implements Listener
{
@ -35,7 +34,7 @@ public final class MainPluginClass extends JavaPlugin implements Listener
public final CommandHelper commandHelper = new CommandHelper(this);
public final MaintenanceMode maintenance = new MaintenanceMode(this);
public final RegionListProviders regionListProvider = new RegionListProviders(this);
private final MovingPlayersCatcher movedPlayers = new MovingPlayersCatcher();
private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this);
public ConnectionHelper connectionList;
public Thread threadPermissions;
private MetricsLite metrics;
@ -66,13 +65,13 @@ public final class MainPluginClass extends JavaPlugin implements Listener
// Register event's dispatcher
getServer().getPluginManager().registerEvents(this, this);
getServer().getPluginManager().registerEvents(maintenance, this);
getServer().getPluginManager().registerEvents(movedPlayers, this);
regionUpdateObserver.registerListeners();
// WorldGuard, Residence and other possible region list providers
regionListProvider.integrate();
// Start all needed threads
cache.setDefaultGroup(settings.getDefaultGroup());
StartRecalcThread();
RegionFinderThreadStart();
regionUpdateObserver.start();
connectionList.threadFetchTablesData();
// Metrics
if(settings.isUseMetrics())
@ -92,7 +91,7 @@ public final class MainPluginClass extends JavaPlugin implements Listener
public void onDisable()
{
getServer().getServicesManager().unregisterAll(this);
RegionFinderThreadStop();
regionUpdateObserver.stop();
StopRecalcThread();
cache.clear();
connectionList.Disconnect();
@ -101,47 +100,6 @@ public final class MainPluginClass extends JavaPlugin implements Listener
metrics = null;
consoleLog.info("[rscp] rscPermissions has been disabled.");
}
private Thread hThreadRegionFinder = null;
private void RegionFinderThreadStart()
{
RegionFinderThreadStop();
hThreadRegionFinder = new Thread()
{
@Override
public void run()
{
this.setName("rscp:RegionFinder");
this.setPriority(MIN_PRIORITY);
long granularity = settings.getRegionFinderGranularity();
if(granularity < 20)
granularity = 20;
if(granularity > 10000)
granularity = 10000;
try
{
for(; !Thread.interrupted(); Thread.sleep(granularity))
for(Player player : movedPlayers.getMovedPlayersAsync())
if(regionListProvider.isRegionListChanged(player))
cache.calculatePlayerPermissions(player);
} catch(InterruptedException ex) {
}
}
};
hThreadRegionFinder.start();
}
public void RegionFinderThreadStop()
{
if(hThreadRegionFinder == null)
return;
try
{
hThreadRegionFinder.interrupt();
hThreadRegionFinder.join();
hThreadRegionFinder = null;
} catch(InterruptedException ex) {
consoleLog.log(Level.SEVERE, "[rscp] Exception in RegionFinderThread(): {0}", ex.getLocalizedMessage());
}
}
public void StopRecalcThread()
{
if(threadPermissions != null)

64
src/main/java/ru/simsonic/rscPermissions/RegionUpdateObserver.java

@ -1,6 +1,66 @@
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…
Cancel
Save