@Override
	public boolean tick(Tickable ticking, int tickID)
	{
		if(!CMLib.sessions().all().hasNext())
			return true;
		try
		{
			MOB mob=null;
			Faction F=null;
			Faction.FactionChangeEvent CE=null;
			final Vector<Faction.FactionChangeEvent> outSiders=new Vector<Faction.FactionChangeEvent>();
			final Vector<Faction.FactionChangeEvent> timers=new Vector<Faction.FactionChangeEvent>();
			final HashSet<Faction> factionsDone=new HashSet<Faction>();
			for(final Enumeration<Faction> e=factionSet.elements();e.hasMoreElements();)
			{
				F=e.nextElement();
				if((F.getInternalFlags()&Faction.IFLAG_CUSTOMTICK)==0)
				{
					addOutsidersAndTimers(F, outSiders, timers);
					factionsDone.add(F);
				}
			}
			Room R;
			Faction[] Fs;
			for(final Session S : CMLib.sessions().allIterable())
			{
				mob=(!S.isStopped())?S.mob():null;
				R=(mob==null)?null:mob.location();
				if(R!=null)
				{
					Fs=getSpecialFactions(mob, R);
					if(Fs!=null)
					{
						for(final Faction sF : Fs)
						{
							if(!factionsDone.contains(sF))
							{
								addOutsidersAndTimers(sF, outSiders, timers);
								factionsDone.add(sF);
							}
						}
					}
					for(int o=0;o<outSiders.size();o++)
					{
						CE=outSiders.elementAt(o);
						if((CE.applies(mob,mob))
						&&(!CE.getFaction().hasFaction(mob)))
							CE.getFaction().executeChange(mob,mob,CE);
					}
					for(int o=0;o<timers.size();o++)
					{
						CE=timers.elementAt(o);
						if((CE.applies(mob,mob))
						&&(CE.getFaction().hasFaction(mob)))
							CE.getFaction().executeChange(mob,mob,CE);
					}
				}
			}
		}
		catch (final Exception e)
		{
			Log.errOut("Factions", e);
		}
		return true;
	}