All pastes #739936 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-10-17 16:03 UTC
rendered paste body
Index: java/config/altsettings.properties
===================================================================
--- java/config/altsettings.properties	(revision 1224)
+++ java/config/altsettings.properties	(working copy)
@@ -256,7 +256,7 @@
 #-----------------------------------
 # Minimal party size to enter rift. Min = 2, Max = 9.
 # If in rift party will become smaller all members will be teleported back
-RiftMinPartySize = 5
+RiftMinPartySize = 2
 
 # Number of maximum jumps between rooms allowed, after this time party will be teleported back
 MaxRiftJumps = 4
Index: java/config/sevensigns.properties
===================================================================
--- java/config/sevensigns.properties	(revision 1224)
+++ java/config/sevensigns.properties	(working copy)
@@ -8,11 +8,11 @@
 # -----------------------------------------
 
 # Require a player to be in a castle/alliance-owning clan to be able to sign for Dawn.
-AltRequireCastleForDawn = False
+AltDenyDuskForCastle = True
 
 # Determines whether castle ownership is determined by clan or by alliance.
 # Default is by alliance, as on official servers.
-AltRequireClanCastle = False
+AltRequireClanCastle = True
 
 # -----------------------------------------
 # Festival Rules.
@@ -56,4 +56,4 @@
 
 # At what point the Chests Spawn in.
 #   Default : 15 minutes
-AltFestivalChestspawn = 900000
+AltFestivalChestSpawn = 900000
Index: java/net/sf/l2j/Config.java
===================================================================
--- java/net/sf/l2j/Config.java	(revision 1224)
+++ java/net/sf/l2j/Config.java	(working copy)
@@ -165,8 +165,8 @@
     /** Alternative gameing - magic dmg failures */
     public static boolean ALT_GAME_MAGICFAILURES;
 
-    /** Alternative gaming - player must be in a castle-owning clan or ally to sign up for Dawn. */
-    public static boolean ALT_GAME_REQUIRE_CASTLE_DAWN;
+    /** Alternative gaming - player must not be in a castle-owning clan or ally to sign up for Dusk. */
+    public static boolean ALT_GAME_DENY_DUSK_CASTLE;
 
     /** Alternative gaming - allow clan-based castle ownage check rather than ally-based. */
     public static boolean ALT_GAME_REQUIRE_CLAN_CASTLE;
@@ -1720,8 +1720,8 @@
                 SevenSettings.load(is);
                 is.close();
 
-                ALT_GAME_REQUIRE_CASTLE_DAWN    = Boolean.parseBoolean(SevenSettings.getProperty("AltRequireCastleForDawn", "False"));
-                ALT_GAME_REQUIRE_CLAN_CASTLE    = Boolean.parseBoolean(SevenSettings.getProperty("AltRequireClanCastle", "False"));
+                ALT_GAME_DENY_DUSK_CASTLE    = Boolean.parseBoolean(SevenSettings.getProperty("AltDenyDuskForCastle", "True"));
+                ALT_GAME_REQUIRE_CLAN_CASTLE    = Boolean.parseBoolean(SevenSettings.getProperty("AltRequireClanCastle", "True"));
                 ALT_FESTIVAL_MIN_PLAYER         = Integer.parseInt(SevenSettings.getProperty("AltFestivalMinPlayer", "5"));
                 ALT_MAXIMUM_PLAYER_CONTRIB      = Integer.parseInt(SevenSettings.getProperty("AltMaxPlayerContrib", "1000000"));
                 ALT_FESTIVAL_MANAGER_START      = Long.parseLong(SevenSettings.getProperty("AltFestivalManagerStart", "120000"));
@@ -2325,7 +2325,7 @@
         else if (pName.equalsIgnoreCase("AltKarmaPlayerCanTeleport")) ALT_GAME_KARMA_PLAYER_CAN_TELEPORT = Boolean.valueOf(pValue);
         else if (pName.equalsIgnoreCase("AltKarmaPlayerCanTrade")) ALT_GAME_KARMA_PLAYER_CAN_TRADE = Boolean.valueOf(pValue);
         else if (pName.equalsIgnoreCase("AltKarmaPlayerCanUseWareHouse")) ALT_GAME_KARMA_PLAYER_CAN_USE_WAREHOUSE = Boolean.valueOf(pValue);
-        else if (pName.equalsIgnoreCase("AltRequireCastleForDawn")) ALT_GAME_REQUIRE_CASTLE_DAWN = Boolean.valueOf(pValue);
+        else if (pName.equalsIgnoreCase("AltDenyDuskForCastle")) ALT_GAME_DENY_DUSK_CASTLE = Boolean.valueOf(pValue);
         else if (pName.equalsIgnoreCase("AltRequireClanCastle")) ALT_GAME_REQUIRE_CLAN_CASTLE = Boolean.valueOf(pValue);
         else if (pName.equalsIgnoreCase("AltFreeTeleporting")) ALT_GAME_FREE_TELEPORT = Boolean.valueOf(pValue);
         else if (pName.equalsIgnoreCase("AltSubClassWithoutQuests")) ALT_GAME_SUBCLASS_WITHOUT_QUESTS = Boolean.valueOf(pValue);
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2FestivalGuideInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2FestivalGuideInstance.java	(revision 1224)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2FestivalGuideInstance.java	(working copy)
@@ -61,7 +61,7 @@
             case 31132:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_31;
                 _festivalOracle = SevenSigns.CABAL_DAWN;
-		_blueStonesNeeded = 900;
+                _blueStonesNeeded = 900;
                 _greenStonesNeeded = 540;
                 _redStonesNeeded = 270;
                 break;
@@ -69,7 +69,7 @@
             case 31133:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_42;
                 _festivalOracle = SevenSigns.CABAL_DAWN;
-		_blueStonesNeeded = 1500;
+                _blueStonesNeeded = 1500;
                 _greenStonesNeeded = 900;
                 _redStonesNeeded = 450;
                 break;
@@ -77,7 +77,7 @@
             case 31134:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_53;
                 _festivalOracle = SevenSigns.CABAL_DAWN;
-		_blueStonesNeeded = 3000;
+                _blueStonesNeeded = 3000;
                 _greenStonesNeeded = 1800;
                 _redStonesNeeded = 900;
                 break;
@@ -85,7 +85,7 @@
             case 31135:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_64;
                 _festivalOracle = SevenSigns.CABAL_DAWN;
-		_blueStonesNeeded = 4500;
+                _blueStonesNeeded = 4500;
                 _greenStonesNeeded = 2700;
                 _redStonesNeeded = 1350;
                 break;
@@ -93,7 +93,7 @@
             case 31136:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_NONE;
                 _festivalOracle = SevenSigns.CABAL_DAWN;
-		_blueStonesNeeded = 6000;
+                _blueStonesNeeded = 6000;
                 _greenStonesNeeded = 3600;
                 _redStonesNeeded = 1800;
                 break;
@@ -102,7 +102,7 @@
             case 31142:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_31;
                 _festivalOracle = SevenSigns.CABAL_DUSK;
-		_blueStonesNeeded = 900;
+                _blueStonesNeeded = 900;
                 _greenStonesNeeded = 540;
                 _redStonesNeeded = 270;
                 break;
@@ -110,7 +110,7 @@
             case 31143:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_42;
                 _festivalOracle = SevenSigns.CABAL_DUSK;
-		_blueStonesNeeded = 1500;
+                _blueStonesNeeded = 1500;
                 _greenStonesNeeded = 900;
                 _redStonesNeeded = 450;
                 break;
@@ -118,7 +118,7 @@
             case 31144:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_53;
                 _festivalOracle = SevenSigns.CABAL_DUSK;
-		_blueStonesNeeded = 3000;
+                _blueStonesNeeded = 3000;
                 _greenStonesNeeded = 1800;
                 _redStonesNeeded = 900;
                 break;
@@ -126,7 +126,7 @@
             case 31145:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_64;
                 _festivalOracle = SevenSigns.CABAL_DUSK;
-		_blueStonesNeeded = 4500;
+                _blueStonesNeeded = 4500;
                 _greenStonesNeeded = 2700;
                 _redStonesNeeded = 1350;
                 break;
@@ -134,7 +134,7 @@
             case 31146:
                 _festivalType = SevenSignsFestival.FESTIVAL_LEVEL_MAX_NONE;
                 _festivalOracle = SevenSigns.CABAL_DUSK;
-		_blueStonesNeeded = 6000;
+                _blueStonesNeeded = 6000;
                 _greenStonesNeeded = 3600;
                 _redStonesNeeded = 1800;
                 break;
@@ -158,7 +158,7 @@
             switch (val) {
                 case 1: // Become a Participant
                     // Check if the festival period is active, if not then don't allow registration.
-                    if (SevenSigns.getInstance().isSealValidationPeriod())
+                    if (!SevenSigns.getInstance().isCompetitionPeriod())
                     {
                         showChatWindow(player, 2, "a", false);
                         return;
@@ -237,7 +237,7 @@
                     break;
                 case 3: // Score Registration
                     // Check if the festival period is active, if not then don't register the score.
-                    if (SevenSigns.getInstance().isSealValidationPeriod())
+                    if (!SevenSigns.getInstance().isCompetitionPeriod())
                     {
                         showChatWindow(player, 3, "a", false);
                         return;
@@ -286,6 +286,7 @@
                     offeringCount = bloodOfferings.getCount();
                     
                     int offeringScore = offeringCount * SevenSignsFestival.FESTIVAL_OFFERING_VALUE;
+                    SevenSignsFestival.getInstance().addAccumulatedBonus(_festivalType, offeringScore);
                     boolean isHighestScore = SevenSignsFestival.getInstance().setFinalScore(player, _festivalOracle, _festivalType, offeringScore);
                     
                     player.destroyItem("SevenSigns", bloodOfferings, this, false);
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2SignsPriestInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2SignsPriestInstance.java	(revision 1224)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2SignsPriestInstance.java	(working copy)
@@ -141,6 +141,12 @@
                     showChatWindow(player, val, SevenSigns.getCabalShortName(cabal), false);
                     break;
                 case 4: // Join a Cabal - SevenSigns 4 [0]1 x
+                	if (!SevenSigns.getInstance().isCompetitionPeriod())
+                	{
+                		player.sendMessage("You can join a cabal only during the competition period.");
+                		return;
+                	}
+                	
                     int newSeal = Integer.parseInt(command.substring(15));
                     int oldCabal = SevenSigns.getInstance().getPlayerCabal(player);
 
@@ -156,68 +162,56 @@
                         player.sendMessage("You must have already completed your first class transfer.");
                         break;
                     }
-                    else if (player.getClassId().level() >= 2)
+                    else
                     {
-                        if (Config.ALT_GAME_REQUIRE_CASTLE_DAWN)
-                        {
-                            if (getPlayerAllyHasCastle(player))
+                    	if (cabal == SevenSigns.CABAL_DUSK)
+                    	{
+                            if (Config.ALT_GAME_DENY_DUSK_CASTLE && getPlayerClanHasCastle(player))
                             {
-                                if (cabal == SevenSigns.CABAL_DUSK)
-                                {
-                                    player.sendMessage("You must not be a member of a castle-owning clan to join the Revolutionaries of Dusk.");
-                                    return;
-                                }
+                                player.sendMessage("You must not be a member of a castle-owning clan to join the Revolutionaries of Dusk.");
+                                return;
                             }
-                            /*if (!getPlayerAllyHasCastle(player))
+                    	}
+                    	else if (cabal == SevenSigns.CABAL_DAWN)
+                    	{
+                            /*
+                             * If the player is trying to join the Lords of Dawn, check if they are
+                             * carrying a Lord's certificate.
+                             * 
+                             * If not then try to take the required amount of adena instead.
+                             */
+                            if (player.getClassId().level() >= 2)
                             {
-                            	if (cabal == SevenSigns.CABAL_DAWN)
-                            	{
-                            		player.sendMessage("You must be a member of a castle-owning clan to join the Lords Of Dawn.");
-                            		return;
-                            	}
-                            }
-*/
-                            else
-                            {
-                                /*
-                                 * If the player is trying to join the Lords of Dawn, check if they are
-                                 * carrying a Lord's certificate.
-                                 * 
-                                 * If not then try to take the required amount of adena instead.
-                                 */
-                                if (cabal == SevenSigns.CABAL_DAWN)
+                                boolean allowJoinDawn = false;
+
+                                if (player.destroyItemByItemId(
+                                                               "SevenSigns",
+                                                               SevenSigns.CERTIFICATE_OF_APPROVAL_ID,
+                                                               1, this, false))
                                 {
-                                    boolean allowJoinDawn = false;
+                                    sm = new SystemMessage(SystemMessageId.DISSAPEARED_ITEM);
+                                    sm.addNumber(1);
+                                    sm.addItemName(SevenSigns.CERTIFICATE_OF_APPROVAL_ID);
+                                    player.sendPacket(sm);
+                                    allowJoinDawn = true;
+                                }
+                                else if (player.reduceAdena("SevenSigns",
+                                                            SevenSigns.ADENA_JOIN_DAWN_COST, this,
+                                                            false))
+                                {
+                                    sm = new SystemMessage(SystemMessageId.DISSAPEARED_ADENA);
+                                    sm.addNumber(SevenSigns.ADENA_JOIN_DAWN_COST);
+                                    player.sendPacket(sm);
+                                    allowJoinDawn = true;
+                                }
 
-                                    if (player.destroyItemByItemId(
-                                                                   "SevenSigns",
-                                                                   SevenSigns.CERTIFICATE_OF_APPROVAL_ID,
-                                                                   1, this, false))
-                                    {
-                                        sm = new SystemMessage(SystemMessageId.DISSAPEARED_ITEM);
-                                        sm.addNumber(1);
-                                        sm.addItemName(SevenSigns.CERTIFICATE_OF_APPROVAL_ID);
-                                        player.sendPacket(sm);
-                                        allowJoinDawn = true;
-                                    }
-                                    else if (player.reduceAdena("SevenSigns",
-                                                                SevenSigns.ADENA_JOIN_DAWN_COST, this,
-                                                                false))
-                                    {
-                                        sm = new SystemMessage(SystemMessageId.DISSAPEARED_ADENA);
-                                        sm.addNumber(SevenSigns.ADENA_JOIN_DAWN_COST);
-                                        player.sendPacket(sm);
-                                        allowJoinDawn = true;
-                                    }
-
-                                    if (!allowJoinDawn)
-                                    {
-                                        player.sendMessage("You must be a member of a castle-owning clan, have a Certificate of Lord's Approval, or pay 50000 adena to join the Lords of Dawn.");
-                                        return;
-                                    }
+                                if (!allowJoinDawn)
+                                {
+                                    player.sendMessage("You must be a member of a castle-owning clan, have a Certificate of Lord's Approval, or pay 50000 adena to join the Lords of Dawn.");
+                                    return;
                                 }
                             }
-                        }
+                    	}
                     }
 
                     SevenSigns.getInstance().setPlayerInfo(player, cabal, newSeal);
@@ -587,7 +581,7 @@
         }
     }
 
-    private final boolean getPlayerAllyHasCastle(L2PcInstance player)
+    private final boolean getPlayerClanHasCastle(L2PcInstance player)
     {
         L2Clan playerClan = player.getClan();
 
Index: java/net/sf/l2j/gameserver/serverpackets/SSQStatus.java
===================================================================
--- java/net/sf/l2j/gameserver/serverpackets/SSQStatus.java	(revision 1224)
+++ java/net/sf/l2j/gameserver/serverpackets/SSQStatus.java	(working copy)
@@ -25,7 +25,6 @@
 import net.sf.l2j.gameserver.SevenSignsFestival;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.network.SystemMessageId;
-import net.sf.l2j.gameserver.templates.StatsSet;
 
 /**
  * Seven Signs Record Update
@@ -193,14 +192,13 @@
                     // Dusk Score \\
                     writeD(duskScore);
                     
-                    StatsSet highScoreData = SevenSignsFestival.getInstance().getHighestScoreData(SevenSigns.CABAL_DUSK, i);
-                    String[] partyMembers = highScoreData.getString("members").split(",");
+                    String[] duskPartyMembers = SevenSignsFestival.getInstance().getHighestScoreData(SevenSigns.CABAL_DUSK, i).getString("members").split(",");
                     
-                    if (partyMembers != null)
+                    if (duskPartyMembers != null && !duskPartyMembers[0].equals(""))
                     {
-                        writeC(partyMembers.length);
+                        writeC(duskPartyMembers.length);
                         
-                        for (String partyMember : partyMembers) 
+                        for (String partyMember : duskPartyMembers) 
                             writeS(partyMember);
                     }
                     else 
@@ -211,14 +209,13 @@
                     // Dawn Score \\
                     writeD(dawnScore);
                     
-                    highScoreData = SevenSignsFestival.getInstance().getHighestScoreData(SevenSigns.CABAL_DAWN, i);
-                    partyMembers = highScoreData.getString("members").split(",");
+                    String[] dawnPartyMembers = SevenSignsFestival.getInstance().getHighestScoreData(SevenSigns.CABAL_DAWN, i).getString("members").split(",");
                     
-                    if (partyMembers != null)
+                    if (dawnPartyMembers != null && !dawnPartyMembers[0].equals(""))
                     {
-                        writeC(partyMembers.length);
+                        writeC(dawnPartyMembers.length);
                         
-                        for (String partyMember : partyMembers) 
+                        for (String partyMember : dawnPartyMembers) 
                             writeS(partyMember);
                     }
                     else 
Index: java/net/sf/l2j/gameserver/SevenSigns.java
===================================================================
--- java/net/sf/l2j/gameserver/SevenSigns.java	(revision 1224)
+++ java/net/sf/l2j/gameserver/SevenSigns.java	(working copy)
@@ -478,6 +478,16 @@
 	{
 		return (_activePeriod == PERIOD_SEAL_VALIDATION);
 	}
+	
+	public final boolean isRecruitingPeriod()
+	{
+		return (_activePeriod == PERIOD_COMP_RECRUITING);
+	}
+	
+	public final boolean isCompetitionPeriod()
+	{
+		return (_activePeriod == PERIOD_COMPETITION);
+	}
 		
 	public final boolean isCompResultsPeriod() 
 	{
@@ -1369,6 +1379,8 @@
                     _log.info("SevenSigns: The " + getCabalName(_previousWinner) + " have won the competition with " + getCurrentScore(_previousWinner) + " points!");
 	                break;			
 	            case PERIOD_SEAL_VALIDATION: // Reset for New Cycle
+
+	            	_currentCycle++;
                     
 	            	SevenSignsFestival.getInstance().rewardHighestRanked(); // reward highest ranking members from cycle
 	            	
@@ -1391,8 +1403,6 @@
 	                
 	                _dawnFestivalScore = 0;
 	                _duskFestivalScore = 0;
-	                
-	                _currentCycle++;
 	                break;
 	        }
 	        
Index: java/net/sf/l2j/gameserver/SevenSignsFestival.java
===================================================================
--- java/net/sf/l2j/gameserver/SevenSignsFestival.java	(revision 1224)
+++ java/net/sf/l2j/gameserver/SevenSignsFestival.java	(working copy)
@@ -23,6 +23,8 @@
 import java.sql.SQLException;
 import java.util.List;
 import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
 import java.util.concurrent.ScheduledFuture;
 import java.util.logging.Logger;
 
@@ -816,7 +818,7 @@
         
         restoreFestivalData();
         
-        if (SevenSigns.getInstance().isSealValidationPeriod()) 
+        if (!SevenSigns.getInstance().isCompetitionPeriod()) 
         { 
             _log.info("SevenSignsFestival: Initialization bypassed due to Seal Validation in effect.");
             return; 
@@ -1330,7 +1332,7 @@
     
     public final int getMinsToNextCycle() 
     {
-        if (SevenSigns.getInstance().isSealValidationPeriod()) 
+        if (!SevenSigns.getInstance().isCompetitionPeriod()) 
             return -1;
         
         return Math.round((_nextFestivalCycleStart - System.currentTimeMillis()) / 60000);
@@ -1338,7 +1340,7 @@
     
     public final int getMinsToNextFestival() 
     {
-        if (SevenSigns.getInstance().isSealValidationPeriod()) 
+        if (!SevenSigns.getInstance().isCompetitionPeriod()) 
             return -1;
         
         return Math.round((_nextFestivalStart - System.currentTimeMillis()) / 60000) + 1;
@@ -1346,7 +1348,7 @@
     
     public final String getTimeToNextFestivalStr() 
     {
-        if (SevenSigns.getInstance().isSealValidationPeriod()) 
+        if (!SevenSigns.getInstance().isCompetitionPeriod()) 
             return "<font color=\"FF0000\">This is the Seal Validation period. Festivals will resume next week.</font>";
         
         return "<font color=\"FF0000\">The next festival will begin in " + getMinsToNextFestival() + " minute(s).</font>";            
@@ -1398,7 +1400,7 @@
     
     public final boolean isParticipant(L2PcInstance player)
     {
-        if (SevenSigns.getInstance().isSealValidationPeriod())
+        if (!SevenSigns.getInstance().isCompetitionPeriod())
             return false;
         
         if (_managerInstance == null)
@@ -1598,11 +1600,6 @@
         // Check if this is the highest score for this level range so far for the player's cabal.
         if (offeringScore > thisCabalHighScore)
         {
-            // If the current score is greater than that for the other cabal, 
-            // then they already have the points from this festival.
-            if (thisCabalHighScore > otherCabalHighScore)
-                return false;
-            
             partyMembers = new FastList<String>();
             List<L2PcInstance> prevParticipants = getPreviousParticipants(oracle, festivalId);
             
@@ -1620,14 +1617,14 @@
                     offeringScore + ") so far for " + SevenSigns.getCabalName(oracle) + " in " + getFestivalName(festivalId));            
             
             // Only add the score to the cabal's overall if it's higher than the other cabal's score.
-            if (offeringScore > otherCabalHighScore) 
+            if (offeringScore > otherCabalHighScore && !(thisCabalHighScore > otherCabalHighScore)) 
             {
                 int contribPoints = FESTIVAL_LEVEL_SCORES[festivalId];
                 
                 // Give this cabal the festival points, while deducting them from the other.
                 SevenSigns.getInstance().addFestivalScore(oracle, contribPoints);
                 
-                //if (Config.DEBUG)
+                if (Config.DEBUG)
                     _log.info("SevenSignsFestival: This is the highest score overall so far for the " + getFestivalName(festivalId) + " festival!");
             }
             
@@ -1675,6 +1672,12 @@
         _accumulatedBonuses.set(festivalId, newTotalBonus);
     }
     
+    public void addAccumulatedBonus(int festivalId, int amount)
+    {
+        int newTotalBonus = _accumulatedBonuses.get(festivalId) + amount;
+        _accumulatedBonuses.set(festivalId, newTotalBonus);
+    }
+    
     /**
      * Calculate and return the proportion of the accumulated bonus for the festival 
      * where the player was in the winning party, if the winning party's cabal won the event.
@@ -1785,6 +1788,20 @@
     private class FestivalManager implements Runnable 
     {
         protected Map<Integer, L2DarknessFestival> _festivalInstances;
+        Timer _festivalStart;
+        TimerTask _festivalStartTask;
+        Timer _festivalFirstSpawn;
+        TimerTask _festivalFirstSpawnTask;
+        Timer _festivalFirstSwarm;
+        TimerTask _festivalFirstSwarmTask;
+        Timer _festivalSecondSpawn;
+        TimerTask _festivalSecondSpawnTask;
+        Timer _festivalSecondSwarm;
+        TimerTask _festivalSecondSwarmTask;
+        Timer _festivalChestSpawn;
+        TimerTask _festivalChestSpawnTask;
+        Timer _festivalEnd;
+        TimerTask _festivalEndTask;
         
         public FestivalManager()
         {
@@ -1799,12 +1816,12 @@
             setNextFestivalStart(Config.ALT_FESTIVAL_CYCLE_LENGTH - FESTIVAL_SIGNUP_TIME);
         }
         
-        public synchronized void run()
+        public void run()
         {
             // The manager shouldn't be running if Seal Validation is in effect.
-            if (SevenSigns.getInstance().isSealValidationPeriod())
-                return;
-            
+        	if (!SevenSigns.getInstance().isCompetitionPeriod())
+        		return;
+        	
             // If the next period is due to start before the end of this 
             // festival cycle, then don't run it.
             if (SevenSigns.getInstance().getMilliToPeriodChange() < Config.ALT_FESTIVAL_CYCLE_LENGTH)
@@ -1814,154 +1831,269 @@
                 _log.info("SevenSignsFestival: Festival manager initialized. Those wishing to participate have " + getMinsToNextFestival() + " minute(s) to sign up.");
             
             sendMessageToAll("Festival Guide", "The main event will start in " + getMinsToNextFestival() + " minutes. Please register now.");
-            
-            // Stand by until the allowed signup period has elapsed.
-            try {
-                wait(FESTIVAL_SIGNUP_TIME); 
-            } 
-            catch (InterruptedException e) { }
-            
-            // Clear past participants, they can no longer register their score if not done so already.
-            _dawnPreviousParticipants.clear();
-            _duskPreviousParticipants.clear();
-            
-            // Get rid of random monsters that avoided deletion after last festival
-            for (L2DarknessFestival festivalInst : _festivalInstances.values()) 
-            	festivalInst.unspawnMobs();
-            
-            /* INITIATION */
-            // Set the festival timer to 0, as it is just beginning.
-            long elapsedTime = 0;
-            
-            // Create the instances for the festivals in both Oracles,
-            // but only if they have participants signed up for them.
-            for (int i = 0; i < FESTIVAL_COUNT; i++) 
-            {
-                if (_duskFestivalParticipants.get(i) != null)
-                    _festivalInstances.put(10 + i, new L2DarknessFestival(SevenSigns.CABAL_DUSK, i));
-                
-                if (_dawnFestivalParticipants.get(i) != null)
-                    _festivalInstances.put(20 + i, new L2DarknessFestival(SevenSigns.CABAL_DAWN, i));
-            }
-            
-            // Prevent future signups while festival is in progress.
-            _festivalInitialized = true;
-            
-            setNextFestivalStart(Config.ALT_FESTIVAL_CYCLE_LENGTH);
-            sendMessageToAll("Festival Guide", "The main event is now starting.");
-            
-            if (Config.DEBUG)
-                _log.info("SevenSignsFestival: The current set of festivals will begin in " + (Config.ALT_FESTIVAL_FIRST_SPAWN / 60000) + " minute(s).");
-            
-            // Stand by for a short length of time before starting the festival.
-            try {
-                wait(Config.ALT_FESTIVAL_FIRST_SPAWN); 
-            } 
-            catch (InterruptedException e) { }
-            
-            elapsedTime = Config.ALT_FESTIVAL_FIRST_SPAWN;
-            
-            // Participants can now opt to increase the challenge, if desired.
-            _festivalInProgress = true;
-            
-            
-            /* PROPOGATION */
-            // Sequentially set all festivals to begin, spawn the Festival Witch and notify participants.
-            for (L2DarknessFestival festivalInst : _festivalInstances.values())
-            {
-                festivalInst.festivalStart();
-                festivalInst.sendMessageToParticipants("The festival is about to begin!");
-            }
-            
-            if (Config.DEBUG)
-                _log.info("SevenSignsFestival: Each of the festivals will end in " + (Config.ALT_FESTIVAL_LENGTH / 60000) + " minutes. New participants can signup then.");
-            
-            
-            // After a short time period, move all idle spawns to the center of the arena.
-            try {
-                wait(Config.ALT_FESTIVAL_FIRST_SWARM - Config.ALT_FESTIVAL_FIRST_SPAWN); 
-            } 
-            catch (InterruptedException e) { }
-            
-            elapsedTime += Config.ALT_FESTIVAL_FIRST_SWARM - Config.ALT_FESTIVAL_FIRST_SPAWN;
-            
-            for (L2DarknessFestival festivalInst : _festivalInstances.values()) 
-                festivalInst.moveMonstersToCenter();
-            
-            
-            // Stand by until the time comes for the second spawn.
-            try {
-                wait(Config.ALT_FESTIVAL_SECOND_SPAWN - Config.ALT_FESTIVAL_FIRST_SWARM); 
-            } 
-            catch (InterruptedException e) { }
-            
-            // Spawn an extra set of monsters (archers) on the free platforms with 
-            // a faster respawn when killed.
-            for (L2DarknessFestival festivalInst : _festivalInstances.values())
-            {
-                festivalInst.spawnFestivalMonsters(FESTIVAL_DEFAULT_RESPAWN / 2, 2);
-                festivalInst.sendMessageToParticipants("The festival will end in " + ((Config.ALT_FESTIVAL_LENGTH - Config.ALT_FESTIVAL_SECOND_SPAWN) / 60000) + " minute(s).");
-            }
-            
-            elapsedTime += Config.ALT_FESTIVAL_SECOND_SPAWN - Config.ALT_FESTIVAL_FIRST_SWARM;
-            
-            
-            // After another short time period, again move all idle spawns to the center of the arena.
-            try {
-                wait(Config.ALT_FESTIVAL_SECOND_SWARM - Config.ALT_FESTIVAL_SECOND_SPAWN); 
-            } 
-            catch (InterruptedException e) { }
-            
-            for (L2DarknessFestival festivalInst : _festivalInstances.values()) 
-                festivalInst.moveMonstersToCenter();
-            
-            elapsedTime += Config.ALT_FESTIVAL_SECOND_SWARM - Config.ALT_FESTIVAL_SECOND_SPAWN;
-            
-            
-            // Stand by until the time comes for the chests to be spawned.
-            try {
-                wait(Config.ALT_FESTIVAL_CHEST_SPAWN - Config.ALT_FESTIVAL_SECOND_SWARM); 
-            } 
-            catch (InterruptedException e) { }
-            
-            // Spawn the festival chests, which enable the team to gain greater rewards
-            // for each chest they kill.
-            for (L2DarknessFestival festivalInst : _festivalInstances.values())
-            {
-                festivalInst.spawnFestivalMonsters(FESTIVAL_DEFAULT_RESPAWN, 3);
-                festivalInst.sendMessageToParticipants("The chests have spawned! Be quick, the festival will end soon.");
-            }
-            
-            elapsedTime += Config.ALT_FESTIVAL_CHEST_SPAWN - Config.ALT_FESTIVAL_SECOND_SWARM;
-            
-            // Stand by and wait until it's time to end the festival.
-            try {
-                wait(Config.ALT_FESTIVAL_LENGTH - elapsedTime); 
-            } 
-            catch (InterruptedException e) { }
-            
-            // Participants can no longer opt to increase the challenge, as the festival will soon close.
-            _festivalInProgress = false;
-            
-            
-            /* TERMINATION */
-            // Sequentially begin the ending sequence for all running festivals.
-            for (L2DarknessFestival festivalInst : _festivalInstances.values()) 
-                festivalInst.festivalEnd();
-            
-            // Clear the participants list for the next round of signups.
-            _dawnFestivalParticipants.clear();
-            _duskFestivalParticipants.clear();
-            
-            // Allow signups for the next festival cycle.
-            _festivalInitialized = false;
-            
-            sendMessageToAll("Festival Witch", "That will do! I'll move you to the outside soon.");
-            
-            if (Config.DEBUG)
-                _log.info("SevenSignsFestival: The next set of festivals begin in " + getMinsToNextFestival() + " minute(s).");
+
+            createStartTask();
+        	createFirstSpawnTask();
+        	createFirstSwarmTask();
+        	createSecondSpawnTask();
+        	createSecondSwarmTask();
+        	createChestSpawnTask();
+        	createEndTask();
         }
         
+        private void createStartTask()
+        {
+    		if(_festivalStartTask != null)
+    		{
+    			_festivalStartTask.cancel();
+    			_festivalStartTask = null;
+    		}
+
+    		if(_festivalStart != null)
+    		{
+    			_festivalStart.cancel();
+    			_festivalStart = null;
+    		}
+        	
+    		_festivalStart = new Timer();
+    		_festivalStartTask = new TimerTask()
+    		{
+    			@Override
+    			public void run()
+    			{
+		            // Clear past participants, they can no longer register their score if not done so already.
+		            _dawnPreviousParticipants.clear();
+		            _duskPreviousParticipants.clear();
+		            
+		            // Get rid of random monsters that avoided deletion after last festival
+		            for (L2DarknessFestival festivalInst : _festivalInstances.values()) 
+		            	festivalInst.unspawnMobs();
+		            
+		            // Create the instances for the festivals in both Oracles,
+		            // but only if they have participants signed up for them.
+		            for (int i = 0; i < FESTIVAL_COUNT; i++) 
+		            {
+		                if (_duskFestivalParticipants.get(i) != null)
+		                    _festivalInstances.put(10 + i, new L2DarknessFestival(SevenSigns.CABAL_DUSK, i));
+		                
+		                if (_dawnFestivalParticipants.get(i) != null)
+		                    _festivalInstances.put(20 + i, new L2DarknessFestival(SevenSigns.CABAL_DAWN, i));
+		            }
+		            
+		            // Prevent future signups while festival is in progress.
+		            _festivalInitialized = true;
+		            
+		            setNextFestivalStart(Config.ALT_FESTIVAL_CYCLE_LENGTH);
+		            sendMessageToAll("Festival Guide", "The main event is now starting.");
+		            
+		            if (Config.DEBUG)
+		                _log.info("SevenSignsFestival: The current set of festivals will begin in " + (Config.ALT_FESTIVAL_FIRST_SPAWN / 60000) + " minute(s).");
+    			}
+    		};
+    		_festivalStart.schedule(_festivalStartTask, FESTIVAL_SIGNUP_TIME);
+        }
+        
+        private void createFirstSpawnTask()
+        {
+    		if(_festivalFirstSpawnTask != null)
+    		{
+    			_festivalFirstSpawnTask.cancel();
+    			_festivalFirstSpawnTask = null;
+    		}
+
+    		if(_festivalFirstSpawn != null)
+    		{
+    			_festivalFirstSpawn.cancel();
+    			_festivalFirstSpawn = null;
+    		}
+        	
+    		_festivalFirstSpawn = new Timer();
+    		_festivalFirstSpawnTask = new TimerTask()
+    		{
+    			@Override
+    			public void run()
+    			{
+    	            // Participants can now opt to increase the challenge, if desired.
+    	            _festivalInProgress = true;
+    	            
+    	            
+    	            /* PROPOGATION */
+    	            // Sequentially set all festivals to begin, spawn the Festival Witch and notify participants.
+    	            for (L2DarknessFestival festivalInst : _festivalInstances.values())
+    	            {
+    	                festivalInst.festivalStart();
+    	                festivalInst.sendMessageToParticipants("The festival is about to begin!");
+    	            }
+    	            
+    	            if (Config.DEBUG)
+    	                _log.info("SevenSignsFestival: Each of the festivals will end in " + (Config.ALT_FESTIVAL_LENGTH / 60000) + " minutes. New participants can signup then.");
+    			}
+    		};
+    		_festivalFirstSpawn.schedule(_festivalFirstSpawnTask, (FESTIVAL_SIGNUP_TIME + Config.ALT_FESTIVAL_FIRST_SPAWN));
+        }
+        
+        private void createFirstSwarmTask()
+        {
+    		if(_festivalFirstSwarmTask != null)
+    		{
+    			_festivalFirstSwarmTask.cancel();
+    			_festivalFirstSwarmTask = null;
+    		}
+
+    		if(_festivalFirstSwarm != null)
+    		{
+    			_festivalFirstSwarm.cancel();
+    			_festivalFirstSwarm = null;
+    		}
+        	
+    		_festivalFirstSwarm = new Timer();
+    		_festivalFirstSwarmTask = new TimerTask()
+    		{
+    			@Override
+    			public void run()
+    			{
+    	            for (L2DarknessFestival festivalInst : _festivalInstances.values()) 
+    	                festivalInst.moveMonstersToCenter();
+    			}
+    		};
+    		_festivalFirstSwarm.schedule(_festivalFirstSwarmTask, (FESTIVAL_SIGNUP_TIME + Config.ALT_FESTIVAL_FIRST_SWARM));
+        }
+        
+        private void createSecondSpawnTask()
+        {
+    		if(_festivalSecondSpawnTask != null)
+    		{
+    			_festivalSecondSpawnTask.cancel();
+    			_festivalSecondSpawnTask = null;
+    		}
+
+    		if(_festivalSecondSpawn != null)
+    		{
+    			_festivalSecondSpawn.cancel();
+    			_festivalSecondSpawn = null;
+    		}
+        	
+    		_festivalSecondSpawn = new Timer();
+    		_festivalSecondSpawnTask = new TimerTask()
+    		{
+    			@Override
+    			public void run()
+    			{
+    	            // Spawn an extra set of monsters (archers) on the free platforms with 
+    	            // a faster respawn when killed.
+    	            for (L2DarknessFestival festivalInst : _festivalInstances.values())
+    	            {
+    	                festivalInst.spawnFestivalMonsters(FESTIVAL_DEFAULT_RESPAWN / 2, 2);
+    	                festivalInst.sendMessageToParticipants("The festival will end in " + ((Config.ALT_FESTIVAL_LENGTH - Config.ALT_FESTIVAL_SECOND_SPAWN) / 60000) + " minute(s).");
+    	            }
+    			}
+    		};
+    		_festivalSecondSpawn.schedule(_festivalSecondSpawnTask, (FESTIVAL_SIGNUP_TIME + Config.ALT_FESTIVAL_SECOND_SPAWN));
+        }
+        
+        private void createSecondSwarmTask()
+        {
+    		if(_festivalSecondSwarmTask != null)
+    		{
+    			_festivalSecondSwarmTask.cancel();
+    			_festivalSecondSwarmTask = null;
+    		}
+
+    		if(_festivalSecondSwarm != null)
+    		{
+    			_festivalSecondSwarm.cancel();
+    			_festivalSecondSwarm = null;
+    		}
+        	
+    		_festivalSecondSwarm = new Timer();
+    		_festivalSecondSwarmTask = new TimerTask()
+    		{
+    			@Override
+    			public void run()
+    			{
+    	            for (L2DarknessFestival festivalInst : _festivalInstances.values()) 
+    	                festivalInst.moveMonstersToCenter();
+    			}
+    		};
+    		_festivalSecondSwarm.schedule(_festivalSecondSwarmTask, (FESTIVAL_SIGNUP_TIME + Config.ALT_FESTIVAL_SECOND_SWARM));
+        }
+        
+        private void createChestSpawnTask()
+        {
+    		if(_festivalChestSpawnTask != null)
+    		{
+    			_festivalChestSpawnTask.cancel();
+    			_festivalChestSpawnTask = null;
+    		}
+
+    		if(_festivalChestSpawn != null)
+    		{
+    			_festivalChestSpawn.cancel();
+    			_festivalChestSpawn = null;
+    		}
+        	
+    		_festivalChestSpawn = new Timer();
+    		_festivalChestSpawnTask = new TimerTask()
+    		{
+    			@Override
+    			public void run()
+    			{
+    	            // Spawn the festival chests, which enable the team to gain greater rewards
+    	            // for each chest they kill.
+    	            for (L2DarknessFestival festivalInst : _festivalInstances.values())
+    	            {
+    	                festivalInst.spawnFestivalMonsters(FESTIVAL_DEFAULT_RESPAWN, 3);
+    	                festivalInst.sendMessageToParticipants("The chests have spawned! Be quick, the festival will end soon.");
+    	            }
+    			}
+    		};
+    		_festivalChestSpawn.schedule(_festivalChestSpawnTask, (FESTIVAL_SIGNUP_TIME + Config.ALT_FESTIVAL_CHEST_SPAWN));
+        }
+        
+        private void createEndTask()
+        {
+    		if(_festivalEndTask != null)
+    		{
+    			_festivalEndTask.cancel();
+    			_festivalEndTask = null;
+    		}
+
+    		if(_festivalEnd != null)
+    		{
+    			_festivalEnd.cancel();
+    			_festivalEnd = null;
+    		}
+        	
+    		_festivalEnd = new Timer();
+    		_festivalEndTask = new TimerTask()
+    		{
+    			@Override
+    			public void run()
+    			{
+    	            // Participants can no longer opt to increase the challenge, as the festival will soon close.
+    	            _festivalInProgress = false;
+    	            
+    	            sendMessageToAll("Festival Witch", "That will do! I'll move you to the outside soon.");
+    	            
+    	            /* TERMINATION */
+    	            // Sequentially begin the ending sequence for all running festivals.
+    	            for (L2DarknessFestival festivalInst : _festivalInstances.values()) 
+    	                festivalInst.festivalEnd();
+    	            
+    	            // Clear the participants list for the next round of signups.
+    	            _dawnFestivalParticipants.clear();
+    	            _duskFestivalParticipants.clear();
+    	            
+    	            // Allow signups for the next festival cycle.
+    	            _festivalInitialized = false;
+    	            
+    	            if (Config.DEBUG)
+    	                _log.info("SevenSignsFestival: The next set of festivals begin in " + getMinsToNextFestival() + " minute(s).");
+    			}
+    		};
+    		_festivalEnd.schedule(_festivalEndTask, (FESTIVAL_SIGNUP_TIME + Config.ALT_FESTIVAL_LENGTH));
+        }
+        
         /**
          * Returns the running instance of a festival for the given Oracle and festivalID.
          * <BR>
@@ -2057,7 +2189,7 @@
                 _log.info("SevenSignsFestival: Initializing festival for " + SevenSigns.getCabalShortName(_cabal) + " (" + getFestivalName(_levelRange) + ")");
             
             // Teleport all players to arena and notify them.
-            if (_participants.size() > 0) 
+            if (_participants != null && _participants.size() > 0) 
             {
                 for (L2PcInstance participant : _participants)
                 { 
@@ -2130,7 +2262,7 @@
             _witchInst.broadcastPacket(msu);
             
             // Send a message to all participants from the witch.
-            sendMessageToParticipants("The festival will begin in 2 minutes.");
+            sendMessageToParticipants("The festival will begin in " + (Config.ALT_FESTIVAL_FIRST_SPAWN / 60000) + " minute(s).");
         }
         
         protected void festivalStart() 
@@ -2293,7 +2425,7 @@
         
         public void sendMessageToParticipants(String message)
         {
-            if (_participants.size() > 0)
+            if (_participants != null && _participants.size() > 0)
             {
                 CreatureSay cs = new CreatureSay(_witchInst.getObjectId(), 0, "Festival Witch", message);
                 
@@ -2307,7 +2439,7 @@
             if (Config.DEBUG)
                 _log.info("SevenSignsFestival: Ending festival for " + SevenSigns.getCabalShortName(_cabal) + " (" + getFestivalName(_levelRange) + ")");
             
-            if (_participants.size() > 0) 
+            if (_participants != null && _participants.size() > 0) 
             {
                 for (L2PcInstance participant : _participants)
                 {
Index: java/net/sf/l2j/gameserver/Shutdown.java
===================================================================
--- java/net/sf/l2j/gameserver/Shutdown.java	(revision 1224)
+++ java/net/sf/l2j/gameserver/Shutdown.java	(working copy)
@@ -406,7 +406,7 @@
 		disconnectAllCharacters();
 		
         // Seven Signs data is now saved along with Festival data.
-        if (!SevenSigns.getInstance().isSealValidationPeriod())
+        if (SevenSigns.getInstance().isCompetitionPeriod())
             SevenSignsFestival.getInstance().saveFestivalData(false);
 
         // Save Seven Signs data before closing. :)
Index: java/net/sf/l2j/gameserver/taskmanager/tasks/TaskSevenSignsUpdate.java
===================================================================
--- java/net/sf/l2j/gameserver/taskmanager/tasks/TaskSevenSignsUpdate.java	(revision 1224)
+++ java/net/sf/l2j/gameserver/taskmanager/tasks/TaskSevenSignsUpdate.java	(working copy)
@@ -49,7 +49,7 @@
         try {
             SevenSigns.getInstance().saveSevenSignsData(null, true);
 
-            if (!SevenSigns.getInstance().isSealValidationPeriod())
+            if (SevenSigns.getInstance().isCompetitionPeriod())
                 SevenSignsFestival.getInstance().saveFestivalData(false);
             
             _log.info("SevenSigns: Data updated successfully.");