Make the recurring tasks non-tps-dependent.
This commit is contained in:
		@@ -122,22 +122,26 @@ public class FPlayerColl extends SenderColl<FPlayer>
 | 
				
			|||||||
			Long lastPlayed = Mixin.getLastPlayed(fplayer.getId());
 | 
								Long lastPlayed = Mixin.getLastPlayed(fplayer.getId());
 | 
				
			||||||
			if (lastPlayed == null) continue;
 | 
								if (lastPlayed == null) continue;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			if (fplayer.isOffline() && now - lastPlayed > toleranceMillis)
 | 
								if (fplayer.isOnline()) continue;
 | 
				
			||||||
 | 
								if (now - lastPlayed <= toleranceMillis) continue;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if (ConfServer.logFactionLeave || ConfServer.logFactionKick)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if (ConfServer.logFactionLeave || ConfServer.logFactionKick)
 | 
									Factions.get().log("Player "+fplayer.getName()+" was auto-removed due to inactivity.");
 | 
				
			||||||
					Factions.get().log("Player "+fplayer.getName()+" was auto-removed due to inactivity.");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// if player is faction leader, sort out the faction since he's going away
 | 
					 | 
				
			||||||
				if (fplayer.getRole() == Rel.LEADER)
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					Faction faction = fplayer.getFaction();
 | 
					 | 
				
			||||||
					if (faction != null)
 | 
					 | 
				
			||||||
						fplayer.getFaction().promoteNewLeader();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				fplayer.leave(false);
 | 
					 | 
				
			||||||
				fplayer.detach();
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// if player is faction leader, sort out the faction since he's going away
 | 
				
			||||||
 | 
								if (fplayer.getRole() == Rel.LEADER)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Faction faction = fplayer.getFaction();
 | 
				
			||||||
 | 
									if (faction != null)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										fplayer.getFaction().promoteNewLeader();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								fplayer.leave(false);
 | 
				
			||||||
 | 
								fplayer.detach();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -189,7 +189,8 @@ public class FactionColl extends Coll<Faction>
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	public void econLandRewardRoutine()
 | 
						public void econLandRewardRoutine()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if ( ! Econ.shouldBeUsed()) return;
 | 
							if (!Econ.shouldBeUsed()) return;
 | 
				
			||||||
 | 
							if (ConfServer.econLandReward == 0.0) return;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		Factions.get().log("Running econLandRewardRoutine...");
 | 
							Factions.get().log("Running econLandRewardRoutine...");
 | 
				
			||||||
		for (Faction faction : this.getAll())
 | 
							for (Faction faction : this.getAll())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,10 +47,6 @@ public class Factions extends MPlugin
 | 
				
			|||||||
	public FactionsEntityListener entityListener;
 | 
						public FactionsEntityListener entityListener;
 | 
				
			||||||
	public FactionsExploitListener exploitListener;
 | 
						public FactionsExploitListener exploitListener;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Task Ids
 | 
					 | 
				
			||||||
	private Integer AutoLeaveTask = null;
 | 
					 | 
				
			||||||
	private Integer econLandRewardTaskID = null;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// -------------------------------------------- //
 | 
						// -------------------------------------------- //
 | 
				
			||||||
	// OVERRIDE
 | 
						// OVERRIDE
 | 
				
			||||||
	// -------------------------------------------- //
 | 
						// -------------------------------------------- //
 | 
				
			||||||
@@ -82,11 +78,9 @@ public class Factions extends MPlugin
 | 
				
			|||||||
			Worldguard.init(this);
 | 
								Worldguard.init(this);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// start up task which runs the autoLeaveAfterDaysOfInactivity routine
 | 
							// Schedule recurring non-tps-dependent tasks
 | 
				
			||||||
		startAutoLeaveTask(false);
 | 
							AutoLeaveTask.get().schedule(this);
 | 
				
			||||||
 | 
							EconLandRewardTask.get().schedule(this);
 | 
				
			||||||
		// start up task which runs the econLandRewardRoutine
 | 
					 | 
				
			||||||
		startEconLandRewardTask(false);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Register Event Handlers
 | 
							// Register Event Handlers
 | 
				
			||||||
		MainListener.get().setup();
 | 
							MainListener.get().setup();
 | 
				
			||||||
@@ -119,54 +113,6 @@ public class Factions extends MPlugin
 | 
				
			|||||||
		;
 | 
							;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Override
 | 
					 | 
				
			||||||
	public void onDisable()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (AutoLeaveTask != null)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			this.getServer().getScheduler().cancelTask(AutoLeaveTask);
 | 
					 | 
				
			||||||
			AutoLeaveTask = null;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		super.onDisable();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void startAutoLeaveTask(boolean restartIfRunning)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (AutoLeaveTask != null)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			if ( ! restartIfRunning) return;
 | 
					 | 
				
			||||||
			this.getServer().getScheduler().cancelTask(AutoLeaveTask);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (ConfServer.autoLeaveRoutineRunsEveryXMinutes > 0.0)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			long ticks = (long)(20 * 60 * ConfServer.autoLeaveRoutineRunsEveryXMinutes);
 | 
					 | 
				
			||||||
			AutoLeaveTask = getServer().getScheduler().scheduleSyncRepeatingTask(this, new AutoLeaveTask(), ticks, ticks);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public void startEconLandRewardTask(boolean restartIfRunning)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (econLandRewardTaskID != null)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			if (!restartIfRunning) return;
 | 
					 | 
				
			||||||
			this.getServer().getScheduler().cancelTask(econLandRewardTaskID);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if
 | 
					 | 
				
			||||||
		(
 | 
					 | 
				
			||||||
			ConfServer.econEnabled &&
 | 
					 | 
				
			||||||
			ConfServer.econLandRewardTaskRunsEveryXMinutes > 0.0 &&
 | 
					 | 
				
			||||||
			ConfServer.econLandReward > 0.0
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			long ticks = (long)(20 * 60 * ConfServer.econLandRewardTaskRunsEveryXMinutes);
 | 
					 | 
				
			||||||
			econLandRewardTaskID = getServer().getScheduler().scheduleSyncRepeatingTask(this, new EconLandRewardTask(), ticks, ticks);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// -------------------------------------------- //
 | 
						// -------------------------------------------- //
 | 
				
			||||||
	// Functions for other plugins to hook into
 | 
						// Functions for other plugins to hook into
 | 
				
			||||||
	// -------------------------------------------- //
 | 
						// -------------------------------------------- //
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,24 +2,38 @@ package com.massivecraft.factions.task;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.massivecraft.factions.ConfServer;
 | 
					import com.massivecraft.factions.ConfServer;
 | 
				
			||||||
import com.massivecraft.factions.FPlayerColl;
 | 
					import com.massivecraft.factions.FPlayerColl;
 | 
				
			||||||
import com.massivecraft.factions.Factions;
 | 
					import com.massivecraft.mcore.ModuloRepeatTask;
 | 
				
			||||||
 | 
					import com.massivecraft.mcore.util.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class AutoLeaveTask implements Runnable
 | 
					public class AutoLeaveTask extends ModuloRepeatTask
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	double rate;
 | 
						// -------------------------------------------- //
 | 
				
			||||||
 | 
						// INSTANCE & CONSTRUCT
 | 
				
			||||||
 | 
						// -------------------------------------------- //
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public AutoLeaveTask()
 | 
						private static AutoLeaveTask i = new AutoLeaveTask();
 | 
				
			||||||
 | 
						public static AutoLeaveTask get() { return i; }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// -------------------------------------------- //
 | 
				
			||||||
 | 
						// OVERRIDE: MODULO REPEAT TASK
 | 
				
			||||||
 | 
						// -------------------------------------------- //
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public long getDelayMillis()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		this.rate = ConfServer.autoLeaveRoutineRunsEveryXMinutes;
 | 
							return (long) (ConfServer.autoLeaveRoutineRunsEveryXMinutes * TimeUnit.MILLIS_PER_MINUTE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public void run()
 | 
						@Override
 | 
				
			||||||
 | 
						public void setDelayMillis(long delayMillis)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							throw new RuntimeException("operation not supported");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void invoke()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		FPlayerColl.get().autoLeaveOnInactivityRoutine();
 | 
							FPlayerColl.get().autoLeaveOnInactivityRoutine();
 | 
				
			||||||
 | 
					 | 
				
			||||||
		// TODO: Make it a polling and non-tps-dependent system instead.
 | 
					 | 
				
			||||||
		// maybe setting has been changed? if so, restart task at new rate
 | 
					 | 
				
			||||||
		if (this.rate != ConfServer.autoLeaveRoutineRunsEveryXMinutes)
 | 
					 | 
				
			||||||
			Factions.get().startAutoLeaveTask(true);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,30 +2,38 @@ package com.massivecraft.factions.task;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.massivecraft.factions.ConfServer;
 | 
					import com.massivecraft.factions.ConfServer;
 | 
				
			||||||
import com.massivecraft.factions.FactionColl;
 | 
					import com.massivecraft.factions.FactionColl;
 | 
				
			||||||
import com.massivecraft.factions.Factions;
 | 
					import com.massivecraft.mcore.ModuloRepeatTask;
 | 
				
			||||||
 | 
					import com.massivecraft.mcore.util.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class EconLandRewardTask implements Runnable
 | 
					public class EconLandRewardTask extends ModuloRepeatTask
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	double rate;
 | 
						// -------------------------------------------- //
 | 
				
			||||||
 | 
						// INSTANCE & CONSTRUCT
 | 
				
			||||||
 | 
						// -------------------------------------------- //
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public EconLandRewardTask()
 | 
						private static EconLandRewardTask i = new EconLandRewardTask();
 | 
				
			||||||
 | 
						public static EconLandRewardTask get() { return i; }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// -------------------------------------------- //
 | 
				
			||||||
 | 
						// OVERRIDE: MODULO REPEAT TASK
 | 
				
			||||||
 | 
						// -------------------------------------------- //
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public long getDelayMillis()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		this.rate = ConfServer.econLandRewardTaskRunsEveryXMinutes;
 | 
							return (long) (ConfServer.econLandRewardTaskRunsEveryXMinutes * TimeUnit.MILLIS_PER_MINUTE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void run()
 | 
						public void setDelayMillis(long delayMillis)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							throw new RuntimeException("operation not supported");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void invoke()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		FactionColl.get().econLandRewardRoutine();
 | 
							FactionColl.get().econLandRewardRoutine();
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		// TODO: This technique is TPS dependent and wrong.
 | 
					 | 
				
			||||||
		// Instead of restarting a TPS dependent task the task should poll every once in a while for the system millis.
 | 
					 | 
				
			||||||
		// With such a setup the need for restarts are gone.
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		// maybe setting has been changed? if so, restart task at new rate
 | 
					 | 
				
			||||||
		if (this.rate != ConfServer.econLandRewardTaskRunsEveryXMinutes)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			Factions.get().startEconLandRewardTask(true);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user